
    &e&6                     (   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	e      Z G d
 de      Z G d de      Zedk(  r e       Z e       Z e       ZejA                  dd        e jB                         Z"ejF                  dd D ]  Z$e"e$   jK                           e"jM                  ee        ejN                  d        ejP                  d        yy)    N)NoSectionErrorNoOptionError)PIPEPopen   )DistUpgradeViewInstallProgressAcquireProgress)get)DistUpgradeConfigc                       e Zd Zd Zy)NonInteractiveAcquireProgressc           
      Z   t        j                  | ||||       |t        j                  k(  rt	        d|| j
                  t        j                  t        | j                              fz         t        j                  j                         rt        j                  j                          y y y )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statuss        K/usr/lib/python3/dist-packages/DistUpgrade/DistUpgradeViewNonInteractive.pyr   z+NonInteractiveAcquireProgress.update_status,   s    %%dC
FKW&&&2T\\7#6#6s4;K;K7L#M6O O Pzz  "

  " # '    N)__name__
__module____qualname__r    r"   r!   r   r   +   s    #r"   r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)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                 @   t        j                  |        t        j                  d       dt        j
                  vrdt        j
                  d<   dt        j
                  d<   dt        j
                  d<   t        d      | _        || _        d	| _	        	 | j                  j                  d
dd      r t        j                  j                  dd       d| _        	 | j                  j!                  d
d      | _        y # t        t        f$ r Y ;w xY w# t"        $ r Y y w xY 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   r:   s     r!   r4   z&NonInteractiveInstallProgress.__init__>   s      &BCBJJ.,<BJJ()17

-.25

./',"#	{{))*:;KUS""#45HI 	;;--.>?PQDL . 		  		s$   =C< !D <DD	DDc                    t        j                  d|d|d       | j                  j                  ddd      sy t	        j                  t
        j                        }d|d<   g }d	|v rd
}d}d}|d|d|}nOd|v rd}d}d}|d|}n=d|v rd
}d}d}|d|d|}n(d|v rd
}d}d}|d|d|}nt        d|d|d       y t
        j                  j                  |      st        j                  d|z         y t        |      5 }	|	j                         dd  j                         j                         d   }
d d d        d
v sd|
v rd g}n%d!|
v r	d"g}d#|d$<   nt        j                  d%|
z         t        |      5 }	|	j                         }d d d        d&v rd'|d(<   d)|d*<   d+}
d,d g}|j!                  |
       |j#                         |j!                  |       |j!                  |       |dk(  r\t%        d-|z  d.t&        d./      j)                         d   }|r|j!                  |j                  d0d1      d1   j                                n|dk(  rt
        j                  j+                  |      }|j                  d2      d   }t%        d3|z  d.t&        d./      j)                         d   }|r2|j!                  |j                  d0d1      d1   j                                t        j,                  d4|d5|d6       t/        j0                  ||7      }t        j,                  |d8|       y # 1 sw Y   xY w# 1 sw Y   xY w)9Nz got a error from dpkg for pkg: 'z': ''r1   DebugBrokenScriptsFr6   	PYCENTRALzpost-installationz/var/lib/dpkg/info/postinst	configure/r0   zpre-installationz/var/lib/dpkg/tmp.ci/preinstinstallzpre-removalprermremovezpost-removalpostrmz+UNKNOWN (trigger?) dpkg/script failure for  (z) 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 'z' ())envz script returned: )r5   errorr9   r<   copyr7   r8   r   pathexistsopenreadlinestripsplitwarningreadappendextendr   r   communicatebasenamer6   
subprocesscall)r   pkgerrormsgr8   cmdprefixnameargumentmaintainer_scriptfinterp
debug_optsmaintainer_script_textversionrets                  r!   r\   z#NonInteractiveInstallProgress.errorW   sE   S(ST{{))15: ))BJJ'& (**FD"H.4c4 @8+,FD H+14 8h&*FDH.4c4 @x'*FDH.4c4 @3PXYZ ww~~/0MMGJ[[\#$ 	9ZZ\!"%++-335a8F	9f)v"5JJ%8GM"OO7&@A #$ 	.%&VVX"	.,0FF'2GO$-0G)*2FuJ 	

6

:

$%

8 :CcI"&t/355@[]1FG 

7==Q/288:;Y''""3'C))C.#C<sB"&t/355@[]1FG 

7==Q/288:;W=>oocw/$s;<W	9 	9	. 	.s   3L6M6M Mc                 ,   t        j                  d|z         t        j                  d       	 t	        j
                  | j                  d       t        j                  d|z         y # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY 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)	r5   rd   timesleepr7   write	master_fdr@   r\   )r   currentnewes       r!   conffilez&NonInteractiveInstallProgress.conffile   s|    H  	! 	

1	M
((4>>6
*
//L!" # 	M
--I!K
L
L	Ms   8A( (	B1BBc                    t        j                  |        t        j                         | _        | j                  j                  ddd      }|rat        j                  j                  | j                  d| j                  z        }t        j                  d|z         t        |d      | _        nt        t        j                  d      | _        | j                  j!                  dt        j                         z         y )Nr1   DpkgProgressLogFzdpkg-progress.%s.logz!writing dpkg progress log to '%s'wz
%s: Start
)r	   start_updater{   last_activityr9   r<   r7   r^   joinr:   r;   r5   r6   r`   dpkg_progress_logdevnullr}   )r   progress_logfullpaths      r!   r   z*NonInteractiveInstallProgress.start_update   s    $$T*!YY[{{112BCTV[\ww||DKK1G$JaJa1abHMM=HI%)(C%8D"%)"**c%:D"$$]TYY[%@Ar"   c                     t        j                  |        | j                  j                  dt	        j                         z         | j                  j                          | xj                  dz  c_        y )Nz%s: Finished
r   )r	   finish_updater   r}   r{   closer;   r   s    r!   r   z+NonInteractiveInstallProgress.finish_update   sS    %%d+$$%5		%CD$$&1$r"   c           
      v    | j                   j                  t        j                         d|d|d|d       y )NrX   
)r   r}   r{   )r   rl   r   
status_strs       r!   status_changez+NonInteractiveInstallProgress.status_change   s.    $$		8?8;8B&D 	Er"   c                    t        j                  |        | j                  d k(  ry | j                  | j                  z   t        j
                         k  rYt        j                  d| j                  d| j                  d       t        j                  | j                  t        d             t        j                  | j                  gg g d      }t        |d         dkD  rt        j
                         | _        	 t        j                  | j                  d      }t         j"                  j                  d|j%                  t'        j(                         d	
      z         t        j                  | j                  gg g d      }t        |d         dkD  rt         j"                  j-                          y # t*        $ r Y y w xY w)Nzno activity z
 seconds (z) - sending ctrl-c   g?r   r   z%signore)errors)r	   update_interfacestatusfdr   r>   r{   r5   rd   r    r7   r}   r~   chrselectlenre   r   r   decodelocalegetpreferredencodingOSErrorr   )r   resss      r!   r   z.NonInteractiveInstallProgress.update_interface   sS   ((.==D -<OOLL$++/ 0 HHT^^CF+ mmT^^,R37#a&kAo $		4774>>1-qzzqxx//1( (0 (D !D E
 /2c:3 #a&kAo 	

	  s   ;A%F4 4	G ?G c                 4   t        j                  d       dt        j                  d<   dt        j                  d<   t	        j
                         \  | _        | _        | j                  dk7  r"t        j                  d| j                  z         | j                  S )Nzdoing a pty.fork()dumbTERMtruePAGERr   z
pid is: %s)r5   r6   r7   r8   ptyforkpidr~   r   s    r!   r   z"NonInteractiveInstallProgress.fork   sh    *+#

6$

7%(XXZ"4>88q=MM,12xxr"   N)r#   r$   r%   __doc__r4   r\   r   r   r   r   r   r   r&   r"   r!   r(   r(   6   s4    2^=@M
B%
E
2	r"   r(   c                   x     e Zd ZdZddZd Zd Zd ZddZd Z	 fdZ
	 dd	Zdd
ZddZd ZddZd Z xZS )DistUpgradeViewNonInteractivez- non-interactive version of the upgrade view c                 B   t        j                  |        t               j                  d       t	        d      | _        t               | _        t        |      | _	        t        j                  j                  j                         | _        | j                  t         _        y )Nr1   r0   )r   r4   get_telemetryset_updater_typer   r9   r   _acquireProgressr(   _installProgressaptprogressbase
OpProgress_opProgress
excepthookr   __excepthook__)r   datadirr:   s      r!   r4   z&DistUpgradeViewNonInteractive.__init__   sl      &(()9:', = ? =f E<<,,779!__r"   c                     ddl }t        j                  d|d|d       |j                  |||      }t        j                  ddj                  |      z         | j                          y)z2 on uncaught exceptions -> print error and reboot r   Nzgot exception 'z':  znot handled exception:
%s )	tracebackr5   	exceptionformat_exceptionr\   r   confirmRestart)r   typevaluetbr   liness         r!   r   z(DistUpgradeViewNonInteractive.excepthook  sR    tUCD**4;2RWWU^CDr"   c                     | j                   S )z5 return a OpProgress() subclass for the given graphic)r   r   s    r!   getOpCacheProgressz0DistUpgradeViewNonInteractive.getOpCacheProgress  s    r"   c                     | j                   S )z# return an acquire progress object )r   r   s    r!   getAcquireProgressz0DistUpgradeViewNonInteractive.getAcquireProgress      $$$r"   c                     | j                   S )z" return a install progress object )r   )r   caches     r!   getInstallProgressz0DistUpgradeViewNonInteractive.getInstallProgress  r   r"   c                      y)z\ update the current status of the distUpgrade based
            on the current view
        Nr&   )r   msgs     r!   updateStatusz*DistUpgradeViewNonInteractive.updateStatus  s     	r"   c                 ,    t         t        |   |       y)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__s     r!   r   z%DistUpgradeViewNonInteractive.setStep  s     	+T:4@r"   c                    t        j                  | |||||       t        j                  d| j                  D cg c]  }|j
                   c}z         t        j                  d| j                  D cg c]  }|j
                   c}z         t        j                  d| j                  D cg c]  }|j
                   c}z         yc c}w c c}w c c}w )Nztoinstall: '%s'ztoupgrade: '%s'ztoremove: '%s'T)r   confirmChangesr5   r6   	toInstallrp   	toUpgradetoRemove)r   summarychanges	demotionsdownloadSizeactionsremoval_boldps           r!   r   z,DistUpgradeViewNonInteractive.confirmChanges(  s    &&tWgy'3W	>'4>>*Ja166*JJK'4>>*Ja166*JJK&$--)HQ!&&)HHI +K*J)Hs   C

3C
-C
c                      y)z0 ask a Yes/No question and return True on 'Yes' Tr&   r   r   r   defaults       r!   askYesNoQuestionz.DistUpgradeViewNonInteractive.askYesNoQuestion0  s     r"   c                      yNTr&   r   s       r!   askCancelContinueQuestionz7DistUpgradeViewNonInteractive.askCancelContinueQuestion7  s    r"   c                 f    t        j                  d       | j                  j                  ddd      S )z2 generic ask about the restart, can be overridden zconfirmRestart() calledr1   
RealRebootF)r5   r6   r9   r<   r   s    r!   r   z,DistUpgradeViewNonInteractive.confirmRestart9  s)    /0{{))*:<OOr"   c                 @    t        j                  |d|d|d       y)z display a error r   rM   rZ   Nr5   r\   )r   r   r   extended_msgs       r!   r\   z#DistUpgradeViewNonInteractive.error>  s    gsLABr"   c                 .    t        j                  d       y )Nzview.abort calledr   r   s    r!   abortz#DistUpgradeViewNonInteractive.abortA  s    )*r"   )NN)Nr   )No)Cancel)r#   r$   r%   r   r4   r   r   r   r   r   r   r   r   r   r   r\   r   __classcell__)r   s   @r!   r   r      sN    3- %%
	 37P
C+r"   r   __main__zxserver-xorgzpre-installation script failedrN   ))r   r   r5   r   r{   r   r7   r   r   rj   r]   apt.progressconfigparserr   r   r   r   r   r	   r
   	telemetryr   r   DistUpgradeConfigParserr   r   r(   r   r#   viewapipr\   Cacher   argvrl   mark_installcommitr|   exitr&   r"   r!   <module>r     s  ,      
 	 
     6 " N N + 6#O #EO EPD+O D+N z	&	($$&"$&" ((>:;
#))+%XXab\ c 
#J	
 ,,r2$**Q-
#((1+# r"   