U
    ٪zce$                  
   @   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 rt }|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  qW 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rdt
jkr| jst  dd	lm} ||| | jd
}t|j | jr| std td t| | rd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:   !!