o
    ­î*d&6  ã                   @   sR  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	Z	d dl
Z
d dlZ d dlmZmZ d dl	mZmZ ddlmZmZmZ ddlmZ ddlmZ G dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZedkr§eƒ Zeƒ Zeƒ Ze  dd¡ e  !¡ Z"ej#dd… D ]Z$e"e$  %¡  qŒe" &ee¡ e 'd¡ e (d ¡ dS dS )é    N)ÚNoSectionErrorÚNoOptionError)ÚPIPEÚPopené   )ÚDistUpgradeViewÚInstallProgressÚAcquireProgress)Úget)ÚDistUpgradeConfigc                   @   s   e Zd Zdd„ ZdS )ÚNonInteractiveAcquireProgressc                 C   s\   t  | ||||¡ |tjkr*td|| jt t| jƒ¡f ƒ t	j
 ¡ r,t	j
 ¡  d S d S d S )Nzfetched %s (%.2f/100) at %sb/s)r	   Úupdate_statusÚapt_pkgÚ	STAT_DONEÚprintÚpercentÚsize_to_strÚintÚcurrent_cpsÚsysÚstdoutÚisattyÚflush)ÚselfÚuriÚdescrÚ
shortDescrÚstatus© r   úK/usr/lib/python3/dist-packages/DistUpgrade/DistUpgradeViewNonInteractive.pyr   ,   s   
ÿ
üz+NonInteractiveAcquireProgress.update_statusN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   +   s    r   c                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚNonInteractiveInstallProgresszÂ 
    Non-interactive version of the install progress class
    
    This ensures that conffile prompts are handled and that
    hanging scripts are killed after a (long) timeout via ctrl-c
    c              	   C   s¾   t  | ¡ t d¡ dtjvrdtjd< dtjd< dtjd< tdƒ| _|| _d	| _	z| j 
d
dd¡r9tj dd¡ W n ttfyE   Y nw d| _z| j d
d¡| _W d S  ty^   Y d S w )Nz*setting up environ for non-interactive useÚDEBIAN_FRONTENDÚnoninteractiveÚnoneÚAPT_LISTCHANGES_FRONTENDÚ1ÚRELEASE_UPRADER_NO_APPORTÚ.r   ÚNonInteractiveÚForceOverwriteFzDPkg::Options::z--force-overwritei`	  ÚTerminalTimeout)r   Ú__init__ÚloggingÚdebugÚosÚenvironr   ÚconfigÚlogdirÚinstall_run_numberÚgetWithDefaultr   Úsetr   r   ÚtimeoutÚgetintÚ	Exception)r   r4   r   r   r   r.   >   s,   






€ÿÿz&NonInteractiveInstallProgress.__init__c                 C   sÚ  t  d||f ¡ | j ddd¡sd S t tj¡}d|d< g }d|v r1d}d	}d
}d|||f }n?d|v rBd}d}d}d||f }n.d|v rTd}d}d}d|||f }nd|v rfd}d}d}d|||f }n
td||f ƒ d S tj 	|¡st  d| ¡ d S t
|ƒ�}	|	 ¡ dd …  ¡  ¡ d }
W d   ƒ n1 sœw   Y  d|
v s©d|
v r­dg}nd|
v r¹dg}d|d < nt  d!|
 ¡ t
|ƒ�}	|	 ¡ }W d   ƒ n1 sÓw   Y  d"|v rêd#|d$< d%|d&< d'}
d(dg}| |
¡ | |¡ | |¡ | |¡ |d	k�r"td)| d*td*d+� ¡ d }|�r!| | d,d-¡d-  ¡ ¡ n0|dk�rRtj |¡}| d.¡d }td/| d*td*d+� ¡ d }|�rR| | d,d-¡d-  ¡ ¡ t  d0||f ¡ tj||d1�}t  d2||f ¡ d S )3Nz)got a error from dpkg for pkg: '%s': '%s'r+   ÚDebugBrokenScriptsFr0   Ú	PYCENTRALzpost-installationz/var/lib/dpkg/info/ÚpostinstÚ	configurez%s/%s.%szpre-installationz/var/lib/dpkg/tmp.ci/ÚpreinstÚinstallz%s/%szpre-removalÚprermÚremovezpost-removalÚpostrmz3UNKNOWN (trigger?) dpkg/script failure for %s (%s) z+can not find failed maintainer script '%s' é   r   Úbashz/bin/shz-exÚperlz-dzAutoTrace NonStopÚPERLDB_OPTSzunknown interpreter: '%s'z. /usr/share/debconf/confmoduleÚ	developerÚDEBCONF_DEBUGr(   ÚDEBIAN_HAS_FRONTENDz/usr/share/debconf/frontendÚshz%dpkg-query -s %s|grep ^Config-VersionT)Úshellr   Úuniversal_newlinesú:r   Ú_zdpkg-query -s %s|grep ^Versionzre-running '%s' (%s))Úenvz%s script returned: %s)r/   Úerrorr3   r6   Úcopyr1   r2   r   ÚpathÚexistsÚopenÚreadlineÚstripÚsplitÚwarningÚreadÚappendÚextendr   r   ÚcommunicateÚbasenamer0   Ú
subprocessÚcall)r   ÚpkgÚerrormsgr2   ÚcmdÚprefixÚnameÚargumentÚmaintainer_scriptÚfÚinterpÚ
debug_optsÚmaintainer_script_textÚversionÚretr   r   r   rQ   W   sœ   ÿ
ÿ


ÿ




þþ€
þþz#NonInteractiveInstallProgress.errorc              
   C   sp   t  d| ¡ t d¡ zt | jd¡ t  d| ¡ W d S  ty7 } zt  d| ¡ W Y d }~d S d }~ww )Nz.got a conffile-prompt from dpkg for file: '%s'é   s   n
z0replied no to the conffile-prompt for file: '%s'z/error '%s' when trying to write to the conffile)	r/   rY   ÚtimeÚsleepr1   ÚwriteÚ	master_fdr:   rQ   )r   ÚcurrentÚnewÚer   r   r   Úconffile·   s   ÿ
ÿ€ÿz&NonInteractiveInstallProgress.conffilec                 C   s€   t  | ¡ t ¡ | _| j ddd¡}|r-tj | j	d| j
 ¡}t d| ¡ t|dƒ| _nttjdƒ| _| j dt ¡  ¡ d S )Nr+   ÚDpkgProgressLogFzdpkg-progress.%s.logz!writing dpkg progress log to '%s'Úwz
%s: Start
)r   Ústart_updatero   Úlast_activityr3   r6   r1   rS   Újoinr4   r5   r/   r0   rU   Údpkg_progress_logÚdevnullrq   )r   Úprogress_logÚfullpathr   r   r   ry   Ä   s   

z*NonInteractiveInstallProgress.start_updatec                 C   s:   t  | ¡ | j dt ¡  ¡ | j ¡  |  jd7  _d S )Nz%s: Finished
r   )r   Úfinish_updater|   rq   ro   Úcloser5   ©r   r   r   r   r€   Ï   s   

z+NonInteractiveInstallProgress.finish_updatec                 C   s    | j  dt ¡ |||f ¡ d S )Nz%s:%s:%s:%s
)r|   rq   ro   )r   ra   r   Ú
status_strr   r   r   Ústatus_changeÔ   s
   ýz+NonInteractiveInstallProgress.status_changec                 C   sú   t  | ¡ | jd krd S | j| j t ¡ k r*t d| j| jf ¡ t	 
| jtdƒ¡ t | jgg g d¡}t|d ƒdkrvt ¡ | _zt	 | jd¡}tj 
d|jt ¡ dd� ¡ W n
 tyc   Y d S w t | jgg g d¡}t|d ƒdks<tj ¡  d S )	Nz,no activity %s seconds (%s) - sending ctrl-cé   gš™™™™™¹?r   r   z%sÚignore)Úerrors)r   Úupdate_interfaceÚstatusfdrz   r8   ro   r/   rY   r   r1   rq   rr   ÚchrÚselectÚlenrZ   r   r   ÚdecodeÚlocaleÚgetpreferredencodingÚOSErrorr   )r   ÚresÚsr   r   r   rˆ   Ù   s,   

ÿ
ÿþ÷
z.NonInteractiveInstallProgress.update_interfacec                 C   sN   t  d¡ dtjd< dtjd< t ¡ \| _| _| jdkr$t  d| j ¡ | jS )Nzdoing a pty.fork()ÚdumbÚTERMÚtrueÚPAGERr   z
pid is: %s)r/   r0   r1   r2   ÚptyÚforkÚpidrr   r‚   r   r   r   r˜   ò   s   



z"NonInteractiveInstallProgress.forkN)r    r!   r"   Ú__doc__r.   rQ   rv   ry   r€   r„   rˆ   r˜   r   r   r   r   r#   6   s    `r#   c                       sŽ   e Zd ZdZd dd„Zdd„ Zdd„ Zd	d
„ Zd!dd„Zdd„ Z	‡ fdd„Z
	d"dd„Zd#dd„Zd$dd„Zdd„ Zd!dd„Zdd„ Z‡  ZS )%ÚDistUpgradeViewNonInteractivez- non-interactive version of the upgrade view Nc                 C   sL   t  | ¡ tƒ  d¡ tdƒ| _tƒ | _t|ƒ| _	t
jj ¡ | _| jt_d S )Nr+   r*   )r   r.   Úget_telemetryÚset_updater_typer   r3   r   Ú_acquireProgressr#   Ú_installProgressÚaptÚprogressÚbaseÚ
OpProgressÚ_opProgressÚ
excepthookr   Ú__excepthook__)r   Údatadirr4   r   r   r   r.      s   


z&DistUpgradeViewNonInteractive.__init__c                 C   sH   ddl }t d||f ¡ | |||¡}t dd |¡ ¡ |  ¡  dS )z2 on uncaught exceptions -> print error and reboot r   Nzgot exception '%s': %s znot handled exception:
%sÚ )Ú	tracebackr/   Ú	exceptionÚformat_exceptionrQ   r{   ÚconfirmRestart)r   ÚtypeÚvalueÚtbr©   Úlinesr   r   r   r¥     s
   z(DistUpgradeViewNonInteractive.excepthookc                 C   ó   | j S )z5 return a OpProgress() subclass for the given graphic)r¤   r‚   r   r   r   ÚgetOpCacheProgress  ó   z0DistUpgradeViewNonInteractive.getOpCacheProgressc                 C   r±   )z# return an acquire progress object )rž   r‚   r   r   r   ÚgetAcquireProgress  r³   z0DistUpgradeViewNonInteractive.getAcquireProgressc                 C   r±   )z" return a install progress object )rŸ   )r   Úcacher   r   r   ÚgetInstallProgress  r³   z0DistUpgradeViewNonInteractive.getInstallProgressc                 C   ó   dS )z\ update the current status of the distUpgrade based
            on the current view
        Nr   )r   Úmsgr   r   r   ÚupdateStatus  s   z*DistUpgradeViewNonInteractive.updateStatusc                    s   t t| ƒ |¡ dS )zÏ we have 5 steps current for a upgrade:
        1. Analyzing the system
        2. Updating repository information
        3. Performing the upgrade
        4. Post upgrade stuff
        5. Complete
        N)Úsuperr›   ÚsetStep)r   Ústep©Ú	__class__r   r   r»     s   z%DistUpgradeViewNonInteractive.setStepTc                 C   sf   t  | |||||¡ t ddd„ | jD ƒ ¡ t ddd„ | jD ƒ ¡ t ddd„ | jD ƒ ¡ dS )	Nztoinstall: '%s'c                 S   ó   g | ]}|j ‘qS r   ©re   ©Ú.0Úpr   r   r   Ú
<listcomp>,  ó    z@DistUpgradeViewNonInteractive.confirmChanges.<locals>.<listcomp>ztoupgrade: '%s'c                 S   r¿   r   rÀ   rÁ   r   r   r   rÄ   -  rÅ   ztoremove: '%s'c                 S   r¿   r   rÀ   rÁ   r   r   r   rÄ   .  rÅ   T)r   ÚconfirmChangesr/   r0   Ú	toInstallÚ	toUpgradeÚtoRemove)r   ÚsummaryÚchangesÚ	demotionsÚdownloadSizeÚactionsÚremoval_boldr   r   r   rÆ   (  s   ÿz,DistUpgradeViewNonInteractive.confirmChangesÚNoc                 C   r·   )z0 ask a Yes/No question and return True on 'Yes' Tr   ©r   rÊ   r¸   Údefaultr   r   r   ÚaskYesNoQuestion0  s   z.DistUpgradeViewNonInteractive.askYesNoQuestionÚCancelc                 C   r·   ©NTr   rÑ   r   r   r   ÚaskCancelContinueQuestion7  s   z7DistUpgradeViewNonInteractive.askCancelContinueQuestionc                 C   s   t  d¡ | j ddd¡S )z2 generic ask about the restart, can be overridden zconfirmRestart() calledr+   Ú
RealRebootF)r/   r0   r3   r6   r‚   r   r   r   r¬   9  s   
z,DistUpgradeViewNonInteractive.confirmRestartc                 C   s   t  d|||f ¡ dS )z display a error z
%s %s (%s)N©r/   rQ   )r   rÊ   r¸   Úextended_msgr   r   r   rQ   >  s   z#DistUpgradeViewNonInteractive.errorc                 C   s   t  d¡ d S )Nzview.abort calledrØ   r‚   r   r   r   ÚabortA  s   z#DistUpgradeViewNonInteractive.abort)NN)NrÕ   )rÐ   )rÔ   )r    r!   r"   rš   r.   r¥   r²   r´   r¶   r¹   r»   rÆ   rÓ   rÖ   r¬   rQ   rÚ   Ú__classcell__r   r   r½   r   r›   þ   s     


ÿ


r›   Ú__main__zxserver-xorgzpre-installation script failedrD   ))r    r   r/   rŽ   ro   r   r1   r—   r‹   r_   rR   Úapt.progressÚconfigparserr   r   r   r   r   r   r	   Ú	telemetryr
   rœ   ÚDistUpgradeConfigParserr   r   r#   r›   r    ÚviewÚapÚiprQ   ÚCacherµ   Úargvra   Úmark_installÚcommitrp   Úexitr   r   r   r   Ú<module>   sB    IG
ï