U
    B‹ú]&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rNeƒ 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 )é    N)ÚNoSectionErrorÚNoOptionError)ÚPIPEÚPopené   )ÚDistUpgradeViewÚInstallProgressÚAcquireProgress)Úget)ÚDistUpgradeConfigc                   @   s   e Zd Zdd„ ZdS )ÚNonInteractiveAcquireProgressc                 C   sT   t  | ||||¡ |tjkrPtd|| jt t| jƒ¡f ƒ t	j
 ¡ rPt	j
 ¡  d S )Nzfetched %s (%.2f/100) at %sb/s)r	   Úupdate_statusÚapt_pkgZ	STAT_DONEÚprintÚpercentZsize_to_strÚintZcurrent_cpsÚsysÚstdoutÚisattyÚflush)ÚselfZuriZdescrZ
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kr(dtjd< dtjd< dtjd< tdƒ| _|| _d	| _	z"| j 
d
dd¡rrtj dd¡ W n ttfk
rŒ   Y nX d| _z| j d
d¡| _W n tk
r¼   Y nX d S )Nz*setting up environ for non-interactive useZDEBIAN_FRONTENDZnoninteractiveZnoneZAPT_LISTCHANGES_FRONTENDÚ1ZRELEASE_UPRADER_NO_APPORTÚ.r   ÚNonInteractiveZForceOverwriteFzDPkg::Options::z--force-overwritei`	  ZTerminalTimeout)r   Ú__init__ÚloggingÚdebugÚosÚenvironr   ÚconfigÚlogdirÚinstall_run_numberÚgetWithDefaultr   Úsetr   r   ÚtimeoutZgetintÚ	Exception)r   r'   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|krbd}d	}d
}d|||f }n~d|kr„d}d}d}d||f }n\d|kr¨d}d}d}d|||f }n8d|krÌd}d}d}d|||f }ntd||f ƒ d S tj 	|¡sþt  d| ¡ d S t
|ƒ"}	|	 ¡ dd …  ¡  ¡ d }
W 5 Q R X d|
ksBd|
krJdg}n(d|
krddg}d|d < nt  d!|
 ¡ t
|ƒ}	|	 ¡ }W 5 Q R X d"|kr´d#|d$< d%|d&< d'}
d(dg}| |
¡ | |¡ | |¡ | |¡ |d	kr$td)| d*td*d+ ¡ d }|r„| | d,d-¡d-  ¡ ¡ n`|dkr„tj |¡}| d.¡d }td/| d*td*d+ ¡ d }|r„| | 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    ZDebugBrokenScriptsFr#   Z	PYCENTRALzpost-installationz/var/lib/dpkg/info/ZpostinstZ	configurez%s/%s.%szpre-installationz/var/lib/dpkg/tmp.ci/ZpreinstÚinstallz%s/%szpre-removalZprermÚremovezpost-removalZpostrmz3UNKNOWN (trigger?) dpkg/script failure for %s (%s) z+can not find failed maintainer script '%s' é   r   Zbashz/bin/shz-exZperlz-dzAutoTrace NonStopZPERLDB_OPTSzunknown interpreter: '%s'z. /usr/share/debconf/confmoduleZ	developerZDEBCONF_DEBUGr   ZDEBIAN_HAS_FRONTENDz/usr/share/debconf/frontendZshz%dpkg-query -s %s|grep ^Config-VersionT)Úshellr   Zuniversal_newlinesú:r   Ú_zdpkg-query -s %s|grep ^Versionzre-running '%s' (%s))Úenvz%s script returned: %s)r"   Úerrorr&   r)   Úcopyr$   r%   r   ÚpathÚexistsÚopenÚreadlineÚstripÚsplitÚwarningÚreadÚappendÚextendr   r   ZcommunicateÚbasenamer#   Ú
subprocessÚcall)r   ÚpkgZerrormsgr%   ÚcmdÚprefixÚnameZargumentZmaintainer_scriptÚfZinterpZ
debug_optsZmaintainer_script_textÚversionZretr   r   r   r4   W   sž      ÿ
&








 þþ
 þþz#NonInteractiveInstallProgress.errorc              
   C   sn   t  d| ¡ t d¡ z t | jd¡ t  d| ¡ W n0 tk
rh } zt  d| ¡ W 5 d }~X Y nX d S )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"   r<   ÚtimeÚsleepr$   ÚwriteÚ	master_fdr,   r4   )r   ZcurrentÚnewÚer   r   r   Úconffile·   s    ÿ
ÿ
z&NonInteractiveInstallProgress.conffilec                 C   s€   t  | ¡ t ¡ | _| j ddd¡}|rZtj | j	d| j
 ¡}t d| ¡ t|dƒ| _nttjdƒ| _| j dt ¡  ¡ d S )Nr    ZDpkgProgressLogFzdpkg-progress.%s.logz!writing dpkg progress log to '%s'Úwz
%s: Start
)r   Ústart_updaterJ   Úlast_activityr&   r)   r$   r6   Újoinr'   r(   r"   r#   r8   Údpkg_progress_logÚdevnullrL   )r   Zprogress_logÚfullpathr   r   r   rR   Ä   s    

z*NonInteractiveInstallProgress.start_updatec                 C   s:   t  | ¡ | j dt ¡  ¡ | j ¡  |  jd7  _d S )Nz%s: Finished
r   )r   Úfinish_updaterU   rL   rJ   Úcloser(   ©r   r   r   r   rX   Ï   s    

z+NonInteractiveInstallProgress.finish_updatec                 C   s    | j  dt ¡ |||f ¡ d S )Nz%s:%s:%s:%s
)rU   rL   rJ   )r   rC   r   Z
status_strr   r   r   Ústatus_changeÔ   s
    ýz+NonInteractiveInstallProgress.status_changec                 C   sî   t  | ¡ | jd krd S | j| j t ¡ k rTt d| j| jf ¡ t	 
| jtdƒ¡ t | jgg g d¡}t|d ƒdkràt ¡ | _z0t	 | jd¡}tj 
d|jt ¡ dd ¡ W n tk
rÈ   Y d S X t | jgg g d¡}qhtj ¡  d S )	Nz,no activity %s seconds (%s) - sending ctrl-cé   gš™™™™™¹?r   r   z%sÚignore)Úerrors)r   Úupdate_interfaceZstatusfdrS   r+   rJ   r"   r<   r   r$   rL   rM   ÚchrÚselectÚlenr=   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rHt  d| j ¡ | jS )Nzdoing a pty.fork()ZdumbZTERMÚtrueZPAGERr   z
pid is: %s)r"   r#   r$   r%   ÚptyÚforkÚpidrM   rZ   r   r   r   rk   ò   s    



z"NonInteractiveInstallProgress.forkN)r   r   r   Ú__doc__r!   r4   rP   rR   rX   r[   r_   rk   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_telemetryZset_updater_typer   r&   r   Ú_acquireProgressr   Ú_installProgressÚaptZprogressÚbaseZ
OpProgressÚ_opProgressÚ
excepthookr   Ú__excepthook__)r   Zdatadirr'   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"   Z	exceptionÚformat_exceptionr4   rT   ÚconfirmRestart)r   ÚtypeÚvalueÚtbrx   Úlinesr   r   r   ru     s
    z(DistUpgradeViewNonInteractive.excepthookc                 C   s   | j S )z5 return a OpProgress() subclass for the given graphic)rt   rZ   r   r   r   ÚgetOpCacheProgress  s    z0DistUpgradeViewNonInteractive.getOpCacheProgressc                 C   s   | j S )z# return an acquire progress object )rp   rZ   r   r   r   ÚgetAcquireProgress  s    z0DistUpgradeViewNonInteractive.getAcquireProgressc                 C   s   | j S )z" return a install progress object )rq   )r   Úcacher   r   r   ÚgetInstallProgress  s    z0DistUpgradeViewNonInteractive.getInstallProgressc                 C   s   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)Úsuperrn   Ú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   s   g | ]
}|j ‘qS r   ©rF   ©Ú.0Úpr   r   r   Ú
<listcomp>,  s     z@DistUpgradeViewNonInteractive.confirmChanges.<locals>.<listcomp>ztoupgrade: '%s'c                 S   s   g | ]
}|j ‘qS r   rŠ   r‹   r   r   r   rŽ   -  s     ztoremove: '%s'c                 S   s   g | ]
}|j ‘qS r   rŠ   r‹   r   r   r   rŽ   .  s     T)r   ÚconfirmChangesr"   r#   Z	toInstallZ	toUpgradeZtoRemove)r   ÚsummaryZchangesZ	demotionsZdownloadSizeZactionsZremoval_boldr   r   r   r   (  s     ÿz,DistUpgradeViewNonInteractive.confirmChangesÚNoc                 C   s   dS )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   s   dS )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    Z
RealRebootF)r"   r#   r&   r)   rZ   r   r   r   rz   9  s    
z,DistUpgradeViewNonInteractive.confirmRestartc                 C   s   t  d|||f ¡ dS )z display a error z
%s %s (%s)N©r"   r4   )r   r   rƒ   Zextended_msgr   r   r   r4   >  s    z#DistUpgradeViewNonInteractive.errorc                 C   s   t  d¡ d S )Nzview.abort calledr—   rZ   r   r   r   ÚabortA  s    z#DistUpgradeViewNonInteractive.abort)NN)N)NT)r‘   )r•   )N)r   r   r   rm   r!   ru   r   r€   r‚   r„   r†   r   r”   r–   rz   r4   r˜   Ú__classcell__r   r   rˆ   r   rn   þ   s    

   ÿ



rn   Ú__main__zxserver-xorgzpre-installation script failedr/   ))rr   r   r"   rd   rJ   r   r$   rj   ra   rA   r5   Zapt.progressÚconfigparserr   r   r   r   r   r   r	   Z	telemetryr
   ro   ZDistUpgradeConfigParserr   r   r   rn   r   ZviewZapZipr4   ZCacher   ÚargvrC   Zmark_installZcommitrK   Úexitr   r   r   r   Ú<module>   s>    IG

