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re Ze Ze Ze dd e ! Z"ej#dd D ]Z$e"e$ %  qe"&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 sw   Y  d|
v sd|
v rdg}nd|
v rdg}d|d < nt d!|
  t
|}	|	 }W d    n1 sw   Y  d"|v rd#|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
