3
s_\e$              
   @   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& | j S )'z/ setup option parser and parse the commandline z-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   s.    




r   c       	      C   sN  |j ddd}tjj|s$tj| tj|d rtj }|d|j|j	|j
|j|jf  }tjj|sptj| x4tj|d D ]"}tj|tjj|tjj| qW tjj|d}| jr|d7 }t|d W d	Q R X tjtj|d
dd tjd|j  tjddjtj   tjjd	}|d jj}tjd|  tj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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') 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   s4    
 
"
r6   c             C   s   yddl m} W n tk
r.   tjd d S X tjj| d}tjd|  tj	d}| }|j
d|ddd	 tj	| yLtjd
dgtjddj d }ttjj| dd}|j| W d Q R X W n0 tk
r } ztjd|  W Y d d }~X 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)stdoutuniversal_newlinesr   z	lspci.txtr   zlspci failed: %s)Z	apt_cloner7   ImportErrorr)   errorr   r    r&   debugumaskZ
save_state
subprocessPopenPIPEcommunicater(   writeOSError)r2   r7   r:   Z	old_umaskZclonesr3   er   r   r   save_system_stater   s&    



rI   c       	      C   s   x| j g|jdd D ]}|s qy8ddlm} |d| d}t||}||| jd}P W q tk
r } z(tjd||f  t	d||f  W Y d	d	}~X qX qW tj
d
 t	d
 tjd |S )z0 setup view based on the config and commandline ZViewr   )import_moduler   ZDistUpgrade)r2   r   zcan't import view '%s' (%s)zcan't load %s (%s)Nz!No view can be imported, abortingr   )r   Zgetlist	importlibrJ   getattrr   	Exceptionr)   Zwarningprintr>   r.   exit)	r0   r1   r2   Zrequested_viewrJ   Z
view_modulZ
view_classinstancerH   r   r   r   
setup_view   s     
&

rQ   c              C   s   d} y0t jddgt jddj d }tjd|  W n tk
rR   tjd d	S X | |kr|tjd
 tj	ddddd| g dtj
d< dddddd| gtj }tjd|  tj	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-lsT)r;   r<   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-cZscreenrcz-Szre-exec inside screen: '%s')rA   rB   rC   rD   r)   r?   rF   r+   r   execvenvironr.   argv)Z
SCREENNAMEoutcmdr   r   r   %run_new_gnu_screen_window_or_reattach   s&    



rY   c        	      C   s  t  \} }t| j}t| |}ddlm} tjd|  tj	d | jdksV| jdkrtt
jjt
j d}tjd| t| ||}|jrdt
jkr| j rt  dd	lm} ||| | jd
}tj|j | jr|j stjd tjd t| |j  rdS dS )z main method r   )VERSIONz%release-upgrader version '%s' startedzubuntu-release-upgraderNr   ZmorS   )DistUpgradeController)r   r   )r   r   r   r6   ZDistUpgradeVersionrZ   r)   r+   r   
textdomainr   r    r&   getcwdbindtextdomainrQ   Zneeds_screenrU   Zdisable_gnu_screenrY   r[   atexitregisterZ_enableAptCronJobr   ZdoPartialUpgrader.   rO   rI   Zrun)	r0   argsr1   r2   rZ   Z	localedirZviewr[   Zappr   r   r   main   s2    







rb   )r   r_   r   r#   r)   r   r%   rA   r.   r   Zoptparser   r   ZSYSTEM_DIRSZDistUpgradeConfigParserr   r   r6   rI   rQ   rY   rb   r   r   r   r   <module>   s8   !!