U
    XXbe$  ã                
   @   sÄ   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m	Z	 d dl
mZ d dlmZ ddddd	d
ddddg
ZddlmZ dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    N)Údatetime)ÚOptionParser)Úgettextz/binz/bootz/etcz/initrdz/libz/lib32z/lib64z/sbinz/usrz/varé   )ÚDistUpgradeConfigc                  C   sà   t ƒ } | jddddtdƒd | jddd	d
d | jddd	d | jdddd | jdddtdƒd | jdddtdƒd | jddd
d	tdƒd | jdd	d
tdƒd | jdd d!td"ƒd | jd#d	d$d
td%ƒd& |  ¡ S )'z/ setup option parser and parse the commandline ú-cz--cdromZ	cdromPathNzAUse the given path to search for a cdrom with upgradable packages)ÚdestÚdefaultÚhelpz--have-prerequistsZhavePrerequistsÚ
store_trueF)r   Úactionr	   z--with-networkZwithNetwork)r   r   z--without-networkZstore_falsez
--frontendÚfrontendz_Use frontend. Currently available: 
DistUpgradeViewText, DistUpgradeViewGtk, DistUpgradeViewKDEz--modeÚmodeZdesktopz(*DEPRECATED* this option will be ignoredz	--partialÚpartialz:Perform a partial upgrade only (no sources.list rewriting))r   r	   r   r
   z--disable-gnu-screenzDisable GNU screen support)r   r	   r
   z	--datadirÚdatadirÚ.zSet datadirz--devel-releaseZdevel_releasez"Upgrade to the development release)r   r   r	   r
   )r   Z
add_optionÚ_Ú
parse_args)Úparser© r   ú=/usr/lib/python3/dist-packages/DistUpgrade/DistUpgradeMain.pyÚdo_commandline6   sB    ÿ ÿ
ÿ
ÿ
þþ
ÿ þr   c           	   
   C   sJ  |  ddd¡}tj |¡s$t |¡ t |d ¡r¢t ¡ }|d|j|j	|j
|j|jf  }tj |¡spt |¡ t |d ¡D ]"}t |tj |tj |¡¡¡ q~tj |d¡}| jr¾|d7 }t|dƒ W 5 Q R X tjtj|d	d
d t d|j ¡ t dd t ¡ ¡ ¡ tj d¡}|d jj}t d| ¡ t dtj ¡ |S )z setup the logging ZFilesZLogDirz/var/log/dist-upgrade/z/*.logz/%04i%02i%02i-%02i%02izmain.logz.partialÚaz%%(asctime)s %(levelname)s %(message)sÚw)ÚlevelÚfilenameÚformatÚfilemodezUsing config files '%s'zuname information: '%s'ú NÚaptzapt version: '%s'zpython version: '%s') ZgetWithDefaultÚosÚpathÚexistsÚmkdirÚglobr   ÚnowZyearZmonthZdayZhourZminuteÚshutilZmoveÚjoinÚbasenamer   ÚopenÚloggingZbasicConfigÚDEBUGÚinfoZconfig_filesÚunamer   Úapt_pkgZCacheZcurrent_verZver_strÚsysÚversion)	ÚoptionsÚconfigÚlogdirr%   Z
backup_dirÚfÚfnameÚcacheZapt_versionr   r   r   Úsetup_loggingQ   s6    
 
 
ýr7   c              
   C   sü   zddl m} W n  tk
r0   t d¡ Y d S X tj | d¡}t d| ¡ t 	d¡}|ƒ }|j
d|ddd	 t 	|¡ zLtjd
dgtjdd ¡ d }ttj | d¡dƒ}| |¡ W 5 Q R X W n0 tk
rö } zt d| ¡ W 5 d }~X Y nX d S )Nr   )ÚAptClonezfailed to import AptClonezapt-clone_system_state.tar.gzzcreating statefile: '%s'é6   ú/T)Z	sourcedirÚtargetZwith_dpkg_statusZscrub_sourcesZlspciz-nn©ÚstdoutZuniversal_newlinesr   z	lspci.txtr   zlspci failed: %s)Z	apt_cloner8   ÚImportErrorr*   Úerrorr    r!   r'   ÚdebugÚumaskZ
save_stateÚ
subprocessÚPopenÚPIPEÚcommunicater)   ÚwriteÚOSError)r3   r8   r;   Z	old_umaskZcloneÚsr4   Úer   r   r   Úsave_system_stater   s.    


ÿ
ÿÿrJ   c           	      C   sÂ   | j g| dd¡ D ]Œ}|sqz<ddlm} |d| dƒ}t||ƒ}||| jd}W  q¾W q tk
rž } z&t d||f ¡ t	d||f ƒ W 5 d	}~X Y qX qt 
d
¡ t	d
ƒ t d¡ |S )z0 setup view based on the config and commandline ZViewr   )Úimport_moduler   ZDistUpgrade)r3   r   zcan't import view '%s' (%s)zcan't load %s (%s)Nz!No view can be imported, abortingr   )r   ZgetlistÚ	importlibrK   Úgetattrr   Ú	Exceptionr*   ZwarningÚprintr?   r/   Úexit)	r1   r2   r3   Zrequested_viewrK   Z
view_modulZ
view_classÚinstancerI   r   r   r   Ú
setup_viewŒ   s     

$

rR   c                  C   s¾   d} z0t jddgt jdd ¡ d }t d| ¡ W n  tk
rT   t d¡ Y d	S X | |kr~t d
¡ t 	ddddd| g¡ dtj
d< dddddd| gtj }t d| ¡ t 	d|¡ d	S )z… check if there is a upgrade already running inside gnu screen,
        if so, reattach
        if not, create new screen window
    z$ubuntu-release-upgrade-screen-windowZscreenz-lsTr<   r   zscreen returned: '%s'zscreen could not be runNz)found active screen session, re-attachingz/usr/bin/screenz-dz-rz-pÚ1ÚRELEASE_UPGRADER_NO_SCREENz-ez\0\0r   Zscreenrcz-Szre-exec inside screen: '%s')rB   rC   rD   rE   r*   r@   rG   r,   r    ÚexecvÚenvironr/   Úargv)Z
SCREENNAMEÚoutÚcmdr   r   r   Ú%run_new_gnu_screen_window_or_reattach¦   s:     þþ


   ýýrZ   c            	      C   sþ   t ƒ \} }t| jƒ}t| |ƒ}ddlm} t d| ¡ t 	d¡ | jdksV| jdkrtt
j t
 ¡ d¡}t d|¡ t| ||ƒ}|jrœdt
jkrœ| jsœtƒ  dd	lm} ||| | jd
}t |j¡ | jræ| ¡ sÜt d¡ t d¡ t|ƒ | ¡ rúdS dS )z main method r   )ÚVERSIONz%release-upgrader version '%s' startedzubuntu-release-upgraderNr   ZmorT   )ÚDistUpgradeController)r   r   )r   r   r   r7   ZDistUpgradeVersionr[   r*   r,   r   Ú
textdomainr    r!   r'   ÚgetcwdÚbindtextdomainrR   Zneeds_screenrV   Zdisable_gnu_screenrZ   r\   ÚatexitÚregisterZ_enableAptCronJobr   ZdoPartialUpgrader/   rP   rJ   Úrun)	r1   Úargsr2   r3   r[   Z	localedirZviewr\   Zappr   r   r   ÚmainÇ   s6    



ÿþ

rd   )r   r`   r   r$   r*   r    r&   rB   r/   r   Zoptparser   r   ZSYSTEM_DIRSZDistUpgradeConfigParserr   r   r7   rJ   rR   rZ   rd   r   r   r   r   Ú<module>   s:   ÷!!