o
    >I¼c�$  ã                   @   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 g d¢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)Úgettext)
z/binz/bootz/etcz/initrdz/libz/lib32z/lib64z/sbinz/usrz/varé   )ÚDistUpgradeConfigc                  C   sÈ   t ƒ } | 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 z--have-prerequistsÚhavePrerequistsÚ
store_trueF)ÚdestÚactionÚdefaultz--with-networkÚwithNetwork)r	   r
   z--without-networkÚstore_falsez
--frontendÚfrontendNz_Use frontend. Currently available: 
DistUpgradeViewText, DistUpgradeViewGtk, DistUpgradeViewKDE)r	   r   Úhelpz--modeÚmodeÚ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-releaseÚdevel_releasez"Upgrade to the development release)r
   r	   r   r   )r   Ú
add_optionÚ_Ú
parse_args)Úparser© r   ú=/usr/lib/python3/dist-packages/DistUpgrade/DistUpgradeMain.pyÚdo_commandline6   s8   ÿ
ÿ
ÿ
þþ
ÿþr   c           	   
   C   s^  |  ddd¡}tj |¡st |¡ t |d ¡rQt ¡ }|d|j|j	|j
|j|jf  }tj |¡s8t |¡ t |d ¡D ]}t |tj |tj |¡¡¡ q?tj |d¡}| jr_|d7 }t|dƒ� W d	  ƒ n1 sow   Y  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 ÚFilesÚLogDirz/var/log/dist-upgrade/z/*.logz/%04i%02i%02i-%02i%02izmain.logz.partialÚaNz%%(asctime)s %(levelname)s %(message)sÚw)ÚlevelÚfilenameÚformatÚfilemodezUsing config files '%s'zuname information: '%s'ú Úaptzapt version: '%s'zpython version: '%s') ÚgetWithDefaultÚosÚpathÚexistsÚmkdirÚglobr   ÚnowÚyearÚmonthÚdayÚhourÚminuteÚshutilÚmoveÚjoinÚbasenamer   ÚopenÚloggingÚbasicConfigÚDEBUGÚinfoÚconfig_filesÚunamer&   Úapt_pkgÚCacheÚcurrent_verÚver_strÚsysÚversion)	ÚoptionsÚconfigÚlogdirr-   Ú
backup_dirÚfÚfnameÚcacheÚapt_versionr   r   r   Úsetup_loggingO   s8   
 
 ÿýrL   c              
   C   s  zddl m} W n ty   t d¡ Y d S w tj | d¡}t d| ¡ t 	d¡}|ƒ }|j
d|ddd	� t 	|¡ z3tjd
dgtjdd� ¡ d }ttj | d¡dƒ�}| |¡ W d   ƒ W d S 1 shw   Y  W d S  ty‰ } zt d| ¡ W Y d }~d S d }~ww )Nr   )ÚAptClonezfailed to import AptClonezapt-clone_system_state.tar.gzzcreating statefile: '%s'é6   ú/T)Ú	sourcedirÚtargetÚwith_dpkg_statusÚscrub_sourcesÚlspciz-nn©ÚstdoutÚuniversal_newlinesr   z	lspci.txtr    zlspci failed: %s)Ú	apt_clonerM   ÚImportErrorr8   Úerrorr(   r)   r5   ÚdebugÚumaskÚ
save_stateÚ
subprocessÚPopenÚPIPEÚcommunicater7   ÚwriteÚOSError)rF   rM   rQ   Ú	old_umaskÚcloneÚsrH   Úer   r   r   Úsave_system_statep   s6   
þ

ÿ
ÿÿ&ÿ€ÿrh   c           	      C   sÀ   | j g| dd¡ D ]E}|sq
zddlm} |d| dƒ}t||ƒ}||| jd�}W  |S  tyO } zt d||f ¡ t	d||f ƒ W Y d	}~q
d	}~ww t 
d
¡ t	d
ƒ t d¡ |S )z0 setup view based on the config and commandline ÚViewr   )Úimport_moduler   ÚDistUpgrade)rF   r   zcan't import view '%s' (%s)zcan't load %s (%s)Nz!No view can be imported, abortingr   )r   ÚgetlistÚ	importlibrj   Úgetattrr   Ú	Exceptionr8   ÚwarningÚprintrZ   rB   Úexit)	rD   rE   rF   Úrequested_viewrj   Ú
view_modulÚ
view_classÚinstancerg   r   r   r   Ú
setup_viewŠ   s&   
ù€þ

rw   c                  C   s¼   d} zt jddgt jdd� ¡ d }t d| ¡ W n ty)   t d¡ Y d	S w | |v 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-windowÚscreenz-lsTrU   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\0z-cÚscreenrcz-Szre-exec inside screen: '%s')r^   r_   r`   ra   r8   r[   rc   r;   r(   ÚexecvÚenvironrB   Úargv)Ú
SCREENNAMEÚoutÚcmdr   r   r   Ú%run_new_gnu_screen_window_or_reattach¤   s4   
þþ
þ

ýýr‚   c            	      C   s  t ƒ \} }t| jƒ}t| |ƒ}ddlm} t d| ¡ t 	d¡ | jdu s+| jdkr:t
j t
 ¡ d¡}t d|¡ t| ||ƒ}|jrNdt
jvrN| jsNtƒ  t
 d	¡sXd
t
jd	< ddlm} ||| | jd�}t |j¡ | jr}| ¡ sxt d¡ t d¡ t|ƒ | ¡ r‡dS dS )z main method r   )ÚVERSIONz%release-upgrader version '%s' startedzubuntu-release-upgraderNr   Úmorz   ÚNEEDRESTART_SUSPENDÚy)ÚDistUpgradeController)r   r   )r   r   r   rL   ÚDistUpgradeVersionrƒ   r8   r;   r   Ú
textdomainr(   r)   r5   ÚgetcwdÚbindtextdomainrw   Úneeds_screenr}   Údisable_gnu_screenr‚   Úgetenvr‡   ÚatexitÚregisterÚ_enableAptCronJobr   ÚdoPartialUpgraderB   rr   rh   Úrun)	rD   ÚargsrE   rF   rƒ   Ú	localedirÚviewr‡   Úappr   r   r   ÚmainÅ   s8   




ÿ



r˜   )r&   r�   r   r,   r8   r(   r3   r^   rB   r   Úoptparser   r   ÚSYSTEM_DIRSÚDistUpgradeConfigParserr   r   rL   rh   rw   r‚   r˜   r   r   r   r   Ú<module>   s(   !!