3
_                 @   s  d Z dZd%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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lmZ ddlmZ dd ZejdZejdZd&Zej ej!ej"ej#ej$ej%ej&dZ'e(dd Z)G dd dej*j+j,Z-G dd dej*j+j.Z/G dd de/Z0G dd de1Z2G dd de2Z3G d d de2Z4G d!d de4Z5G d"d de5Z6G d#d$ d$e5Z7d
S )'z$Progress handlers for APT operationsz%Sebastian Heinlein <devel@glatzor.de>DaemonAcquireProgressDaemonOpenProgressDaemonInstallProgressDaemonDpkgInstallProgressDaemonForkProgressDaemonDpkgRecoverProgressDaemonLintianProgress    N)GLib   )enums)lock)mainloop)IsoCodesc             C   s   | S )N )sr   r   4/usr/lib/python3/dist-packages/aptdaemon/progress.py<lambda>+   s    r   zAptDaemon.WorkerzAptDaemon.Worker.Terminal
   <   )installZ	configureremoveZtrigprocpurgeZ	disappearZupgrade   z\[[;?0-9]*[A-Za-z]c               @   s,   e Zd ZdZdddZddd	Zd
d ZdS )r   z*Handles the progress of the cache opening.r   d   Fc                sT   t jjjj|  || _ fddd	D | _t | _| jj	d| _
d| _|| _dS )
aR  Initialize a new DaemonOpenProgress instance.

        Keyword arguments:
        transaction -- corresponding transaction D-Bus object
        begin -- begin of the progress range (defaults to 0)
        end -- end of the progress range (defaults to 100)
        quiet -- do not emit any progress information for the transaction
        c                s   g | ]}   |  qS r   r   ).0Zmodifier)beginendr   r   
<listcomp>L   s   z/DaemonOpenProgress.__init__.<locals>.<listcomp>      ?      ?      ?      ?r   N)r   r   r    r!   r!   )aptprogressbase
OpProgress__init___transactionstepsfloatprogress_beginpopprogress_endquiet)selftransactionr   r   r-   r   )r   r   r   r&   A   s    	

zDaemonOpenProgress.__init__Nc             C   s\   |p| j }|dk r@t| j|d | j| j   }| j|krDdS nd}|| _| jsX|| j_dS )zpCallback for progress updates.

        Keyword argument:
        percent - current progress in percent
        e   r   N)percentintr*   r,   r#   r-   r'   )r.   r1   r#   r   r   r   updateU   s    

zDaemonOpenProgress.updatec          	   C   s>   | j | _| j | _y| jjd| _ W n   tjd Y nX dS )zXCallback after completing a step.

        Sets the progress range to the next interval.r   z0An additional step to open the cache is requiredN)r,   r#   r*   r(   r+   logwarning)r.   r   r   r   doneh   s    zDaemonOpenProgress.done)r   r   F)N)__name__
__module____qualname____doc__r&   r3   r6   r   r   r   r   r   =   s   

c               @   sl   e Zd ZdZdddZd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d Zdd ZdS )r   z-
    Handle the package download process
    r   r   c             C   s,   t jjjj|  || _|| _|| _d| _d S )Nr   )r"   r#   r$   AcquireProgressr&   r/   r,   r*   )r.   r/   r   r   r   r   r   r&   z   s
    zDaemonAcquireProgress.__init__c             C   s   |j jtjjkr tj}|j j}nf|j jtjjkr8tj	}nN|j jtjj
krPtj}n6|j jtjjkrhtj}n|j jtjjkrtj}ntj}|j jtjjkr|j jr|j j}n|j jr|j j}nd}|j||j||j jB ||j jB |f| j_d S )N )ownerstatusapt_pkgAcquireItem	STAT_DONEr   DOWNLOAD_DONEfilesizeSTAT_AUTH_ERRORDOWNLOAD_AUTH_ERRORSTAT_FETCHINGDOWNLOAD_FETCHING
STAT_ERRORDOWNLOAD_ERROR	STAT_IDLEDOWNLOAD_IDLEDOWNLOAD_NETWORK_ERROR
error_textmodeuri	shortdescpartialsizer/   progress_download)r.   item
total_sizecurrent_sizer>   msgr   r   r   _emit_acquire_item   s,    





z(DaemonAcquireProgress._emit_acquire_itemc             C   sj   t  }x0|D ](}|jjr(|j|jj q|j|j qW |rf| jjddt|ddj|i }|| j_	dS )z$Emit the transaction status details.zDownloading %(files)sfiles N)
setr=   idaddrP   r/   ngettextlenjoinstatus_details)r.   itemsnamesrS   rV   r   r   r   _emit_status_details   s    

z*DaemonAcquireProgress._emit_status_detailsc             C   s   | j | dS )z<Invoked when an item is successfully and completely fetched.N)rW   )r.   rS   r   r   r   r6      s    zDaemonAcquireProgress.donec             C   s   | j | dS )z*Invoked when an item could not be fetched.N)rW   )r.   rS   r   r   r   fail   s    zDaemonAcquireProgress.failc             C   s   | j | dS )z0Invoked when some of the item's data is fetched.N)rW   )r.   rS   r   r   r   fetch   s    zDaemonAcquireProgress.fetchc             C   s   | j | dS )zInvoked when an item is confirmed to be up-to-date.

        Invoked when an item is confirmed to be up-to-date. For instance,
        when an HTTP download is informed that the file on the server was
        not modified.
        N)rW   )r.   rS   r   r   r   ims_hit   s    zDaemonAcquireProgress.ims_hitc             C   s   | j jrdS | j| j| j| j| j| jf| j _| j| j d t	| j| j  }t
| j|d | j| j   }| j|kr~d| j _n|| j _|| _g }x6|jD ],}|jsq| j|j|j|j |j|j qW | j| xtj j rtj j  qW dS )z'Callback to update progress informationFg      Y@r   r0   T)r/   	cancelledZcurrent_itemsZtotal_itemsZcurrent_bytesZtotal_bytesZcurrent_cpsZelapsed_timeprogress_detailsr)   r2   r*   r,   r#   ZworkersZcurrent_itemrW   rT   rU   appendrc   r	   main_context_defaultpending	iteration)r.   r=   r1   r#   ra   Zworkerr   r   r   pulse   s8    


zDaemonAcquireProgress.pulsec             C   s   t j| j_d| j_dS )z*Callback at the beginning of the operationTN)r   STATUS_DOWNLOADINGr/   r>   cancellable)r.   r   r   r   start   s    
zDaemonAcquireProgress.startc             C   s   d| j _| j| j _d| j _dS )z$Callback at the end of the operationr           FN)r   r   r   r   rq   r   )r/   rh   r,   r#   ro   )r.   r   r   r   stop   s    
zDaemonAcquireProgress.stopc             C   sR   ||f| j _d| j _tj| j _x| j jr6tj j  q W tj	| j _| j j
rNdS dS )zCallback for media changesTF)r/   Zrequired_mediumpausedr   ZSTATUS_WAITING_MEDIUMr>   r	   rj   rl   rn   rg   )r.   ZmediumZdriver   r   r   media_change   s    


z"DaemonAcquireProgress.media_changeN)r   r   )r   r   )r7   r8   r9   r:   r&   rW   rc   r6   rd   re   rf   rm   rp   rr   rt   r   r   r   r   r   v   s   

	#c               @   s4   e Zd ZdZdddZdd Zdd	 Zdd
dZdS )DaemonAcquireRepoProgressz*Handle the repository information downloadr   r   c             C   s6   t j| ||| tdddd| _tdd| _d| _d S )NZiso_639Ziso_639_1_codeZiso_639_2T_code)tagZfallback_tagZiso_3166Zalpha_2_coder0   )r   r&   r   	languagesregionsr#   )r.   r/   r   r   r   r   r   r&     s
    
z"DaemonAcquireRepoProgress.__init__c             C   s   t j| j_d| j_dS )z*Callback at the beginning of the operationTN)r   ZSTATUS_DOWNLOADING_REPOr/   r>   ro   )r.   r   r   r   rp   
  s    
zDaemonAcquireRepoProgress.startc             C   s   t  }xV|D ]N}y"|j|jj d jdd  W q tk
rX   |j| jjd Y qX qW |r| jjddt|dj	| }|| j_
dS )	z$Emit the transaction status details.r   z://r
   zlocal repositoryzDownloading from %srY   N)rZ   r\   descriptionsplit
IndexErrorr/   gettextr]   r^   r_   r`   )r.   ra   ZreposrS   rV   r   r   r   rc     s    
"z.DaemonAcquireRepoProgress._emit_status_detailsc             C   s  |j jtjjkr tj}|j j}nf|j jtjjkr8tj	}nN|j jtjj
krPtj}n6|j jtjjkrhtj}n|j jtjjkrtj}ntj}|j jtjjkr|j jr|j j}n|j jr|j j}nd}|jj dd \}}y|jdd }W n" tk
r   | jjd}Y nX d||f }	|jdkr6| jjd	|	 }nn|jd
krV| jjd|	 }nN|jdkrv| jjd|	 }n.|jjdr| jjd|	 }n|jjdr| jjd|	 }n|jdkr| jjd|	 }n|jjdr|jjddd }
y|
jd\}
}W n tk
r"   d }Y nX | jj|
| jj}| jj|| jj}|rl|rl| jjd|||	f }n0|r| jjd||	f }n| jjd|
|	f }n|j}|j||||j jB ||j j B |f| j_!d S )Nr<   r      z://r
   zlocal repositoryz%s %sZ	InReleasezStructure of %sZReleasezDescription of %szRelease.gpgzDescription signature of %sZPackageszAvailable packages from %sZSourceszAvailable sources from %sZTranslationIndexzAvailable translations from %szTranslation--_z Translations for %s (%s) from %szTranslations for %s from %szTranslations (%s) from %sry   )"r=   r>   r?   r@   rA   r   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rz   r{   r|   r/   r}   rP   
startswith
ValueErrorrw   Zget_localised_namelocalerx   rO   rQ   rR   )r.   rS   rT   rU   r>   rV   hostdistdescZrepoZ	lang_codeZregion_codeZlangZregionr   r   r   rW   !  sz    










z,DaemonAcquireRepoProgress._emit_acquire_itemN)r   r   )r   r   )r7   r8   r9   r:   r&   rp   rc   rW   r   r   r   r   ru      s
   
ru   c               @   sz   e Zd ZdZd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d Zdd Zdd Zdd Zdd ZdS ) r   a	  Forks and executes a given method in the child process while
    monitoring the output and return state.

    During the run() call the mainloop will be iterated.

    Furthermore a status file descriptor is available to communicate
    with the child process.
    2   r   c             C   sv   || _ d| _d| _|| _|| _d| _d| _d| _tj	 \| _
| _ttdrftj| j
d tj| jd d| _d| _d S )Nr<   r   r
   set_inheritableTry   )r/   r>   r#   r*   r,   _child_exitlast_activity	child_pidospipestatus_parent_fdstatus_child_fdhasattrr   output_line_buffer)r.   r/   r   r   r   r   r   r&     s    
zDaemonForkProgress.__init__c             C   s   | j   | S )N)start_update)r.   r   r   r   	__enter__  s    zDaemonForkProgress.__enter__c             C   s   | j   d S )N)finish_update)r.   etypeZevalueZetbr   r   r   __exit__  s    zDaemonForkProgress.__exit__c             C   s4   t jd tj| j_d| j_tj | _tj | _	d S )NzStart updateT)
r4   debugr   STATUS_COMMITTINGr/   r>   term_attachedtimer   Z
start_time)r.   r   r   r   r     s
    


zDaemonForkProgress.start_updatec             C   s   d| j _dS )z$Callback at the end of the operationFN)r/   r   )r.   r   r   r   r     s    z DaemonForkProgress.finish_updatec             G   s    ||  t jd tjd dS )zCall the given method or function with the
        corrsponding arguments in the child process.

        This method should be replace in subclasses.
        g      ?r   N)r   sleepr   _exit)r.   methodargsr   r   r   _child  s    
zDaemonForkProgress._childc       
   +   O   sR  t jd d}| jjrty:tj| jjtjtjB tjB }t	j
|}tj|t	j W n" tt	jfk
rr   d| j_Y nX | j }|dkrtj| j z:y| j  | j|| W n tk
r   tj  Y nX W dtjd tjtjj X n|| _tj| j t jd| g }t j!t j"B t j#B }| jjr@|j$t j%|t j&|| j' |j$t j%| j(t j&|| j)| |j$t j*t j&|| j+ |j$t j%| jt j&t j!| j, x| j-dkrt j. j/  qW x|D ]}t j0| qW |ryt	j1|t	j2| W n t	jk
r    Y nX xB| j(| j|gD ]0}	ytj|	 W n tt3fk
r>   Y nX qW tj4| j-S )zxSetup monitoring, fork and call the self._child() method in the
        child process with the given arguments.
        ZRunNr<   r   r
   zChild pid: %sry   )5r4   r   r/   terminalr   openO_RDWRO_NOCTTY
O_NONBLOCKtermiosZ	tcgetattrttyZsetrawZTCSANOWOSErrorerror_forkcloser   _setup_childr   	Exception	traceback	print_excr   r   r   r?   PackageManagerRESULT_FAILEDr   r   r	   IO_INZIO_ERRZIO_HUPri   Zio_add_watchZPRIORITY_HIGH_IDLE_copy_io	master_fd_copy_io_masterZchild_watch_add_on_child_exit_on_status_updater   rj   rl   Zsource_removeZ	tcsetattrZ	TCSADRAIN	TypeErrorWEXITSTATUS)
r.   r   kwargsZterminal_fdZterminal_attrpidZwatchersflagsr[   fdr   r   r   run  sp    










zDaemonForkProgress.runc             C   s   t jd| || _dS )NzChild exited: %sF)r4   r   r   )r.   r   	conditionr   r   r   r     s    z!DaemonForkProgress._on_child_exitc             C   s   dS )zCallback for changes on the status file descriptor.

        The method has to return True to keep the monitoring alive. If
        it returns False the monitoring will stop.

        Replace this method in your subclass if you use the status fd.
        Fr   )r.   sourcer   r   r   r   r      s    z$DaemonForkProgress._on_status_updatec             C   s   t j \}| _|S )zgFork and create a master/slave pty pair by which the forked process
        can be controlled.
        )r   forkptyr   )r.   r   r   r   r   r   
  s    zDaemonForkProgress._forkc             C   s  dd }t j t j| tjt_tj  dtjd< t	j
t	jd | jj	rVtjd| jj	 | jjsxtjdd tjd	d ntjd
d | jjrtjd| jj tjdd tjtjkrtjdd n| jjstjdd | jjrtjjd| jj d| jj| jjf }tjjd| dS )z+Setup the environment of the child process.c             S   s   t jtjj d S )N)r   r   r?   r   r   )Zsignumframer   r   r   interrupt_handler  s    z:DaemonForkProgress._setup_child.<locals>.interrupt_handler1ZDPKG_UNTRANSLATED_MESSAGESCZLANGZAPT_LISTCHANGES_FRONTENDZnoneZAPT_LISTBUGS_FRONTENDZTERMlinuxZDEBCONF_PIPEZDEBIAN_FRONTENDZpassthroughZDEBCONF_DEBUG.ZnoninteractivezAcquire::http::Proxyzaptdaemon role='%s' sender='%s'zCommandLine::AsStringN)signalSIGINTsys__excepthook__
excepthookr   quitr   environr   	setlocaleLC_ALLr/   putenvr   Zdebconfr4   levelloggingDEBUGZ
http_proxyr?   configrZ   ZroleZsender)r.   r   cmdr   r   r   r     s2    

zDaemonForkProgress._setup_childc             C   s   |t jkrtj | _ytj|d}W n tk
rB   tjd dS X |j	dd}|dkrt
jtd| j}|rtj| |  j|d 7  _d| _n|  j|7  _|rytj|| W n tk
r   tjd Y nX dS ytj| W n tk
r   Y nX d	S )
Nr
   zFaild to read from masterTzUTF-8ignore
r<   z'Failed to write to controlling terminalF)r	   r   r   r   r   readr   r4   r   decoderesubREGEX_ANSI_ESCAPE_CODEr   log_terminalr   writer   )r.   r   r   targetZ	char_bytecharliner   r   r   r   ?  s4    



z"DaemonForkProgress._copy_io_masterc             C   sp   |t jkrbytj|d}tj| j| W n tk
r<   Y n&X | jjr^| jj	r^d | j_
d| j_dS tj| dS )Nr
   FT)r	   r   r   r   r   r   r   r/   rs   config_file_conflictconfig_file_conflict_resolutionr   )r.   r   r   r   r   r   r   r   _  s    

zDaemonForkProgress._copy_ioN)r   r   )r7   r8   r9   r:   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   y  s   	

K
. c               @   s   e Zd ZdZdd ZdS )r   zPerforms a lintian call.c             C   s   yt j| jjg W n tk
r(   Y nX t j| jj t j| jj tj	 d dkr\d}nd}t j
d tjjdd}t j||dd	d
|| t jd d S )Nr
   Zdebianzdebian/aptdaemonzubuntu/aptdaemonHOMEzDir::Bin::Lintianz/usr/bin/lintianz--no-cfgz--fail-on-warningsz	--profile)r   	setgroupsr/   gidr   setgidsetuidZuidplatformr   unsetenvr?   r   Z	find_fileexeclpr   )r.   pathZprofileZlintian_pathr   r   r   r   u  s    

zDaemonLintianProgress._childN)r7   r8   r9   r:   r   r   r   r   r   r   q  s   c               @   sH   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S )r   z>Progress to execute APT package operations in a child process.c             C   s   t j|  tjj  d S )N)r   r   r   status_lockrelease)r.   r   r   r   r     s    
z"DaemonInstallProgress.start_updatec             C   s   t j|  tj| jtj dS )z$Callback at the end of the operationN)r   r   r   Zwait_for_lockr/   r   )r.   r   r   r   r     s    
z#DaemonInstallProgress.finish_updatec          	   C   s:   y|j | j}W n   tjtjj Y nX tj| d S )N)Z
do_installr   r   r   r?   r   r   )r.   Zpmresr   r   r   r     s
    zDaemonInstallProgress._childc             C   sR  t jd d}y6x0|jds@tj | _|tj|djdd7 }qW W n
   dS y|jdd	\}}}}W n t	k
r|   d
S X |j
 }|dkr| j|| nz|dkrtjd|}	|	r|	jd|	jd }
}| j|
| n<|dkr|jd rtj}n
|jdrtj}n|jdr$tj}n|jdr8tj}n|jdrLtj}n|jdr`tj}n|jdrttj}n|jdrtj}n~|jdrtj}nj|jdrtj}nV|jdrtj}nB|jdrtj}n.|jdrtj}n|jdr tj}ntj }| j!|t"|| | jt# tj k rN| j$rNt j%dt# tj&| j$d d
S ) z)Parse messages from APT on the status fd.UpdateInterfacer<   r   r
   zUTF-8r   F:   TZpmerrorZ
pmconffilez\s*'(.*)'\s*'(.*)'.*r~   ZpmstatusZ
InstallingZ	InstalledZConfiguringzPreparing to configurezPreparing for removal ofZRemovingZRemovedzPreparing to completely removezCompletely removingzCompletely removedZ	UnpackingZ	PreparingzNoting disappearance ofZRunningz#Killing child since timeout of %s s   )'r4   r   endswithr   r   r   r   r   r{   r   strip_errorr   matchgroup	_conffiler   r   PKG_INSTALLINGZPKG_INSTALLEDPKG_CONFIGURINGZPKG_PREPARING_CONFIGUREZPKG_PREPARING_REMOVEPKG_REMOVINGZPKG_REMOVEDZPKG_PREPARING_PURGEPKG_PURGINGZ
PKG_PURGEDZPKG_UNPACKINGZPKG_PREPARING_INSTALLPKG_DISAPPEARINGPKG_RUNNING_TRIGGERZPKG_UNKNOWN_status_changedr)   INSTALL_TIMEOUTr   criticalkill)r.   r   r   Z
status_msgr>   pkgr1   Zmessage_rawmessager   newoldstatus_enumr   r   r   r     sr    

 

z'DaemonInstallProgress._on_status_updatec             C   sx   t jd||| | j|d | j| j   }| j|k rFt|| j_|| _tj|}| jj	|| }|| j_
||f| j_dS )z%Callback to update status informationzAPT status: %s, %s, %sr   N)r4   r   r*   r,   r#   r2   r/   r   Zget_package_status_from_enumr}   r`   Zprogress_package)r.   r  r1   r	  r#   r   rV   r   r   r   r    s    

z%DaemonInstallProgress._status_changedc             C   s   t jd||f  ||f| j_d| j_tj| j_x| jjrHtj	 j
  q2W t jd| jj | jjdkrvtj| jd n| jjdkrtj| jd d| j_d| j_tj| j_dS )	z#Callback for a config file conflictzConfig file prompt: '%s' (%s)TzSending config file answer: %sreplaces   y
Zkeeps   n
N)r4   r5   r/   r   rs   r   Z!STATUS_WAITING_CONFIG_FILE_PROMPTr>   r	   rj   rl   r   r   r   r   r   r   )r.   Zcurrentr  r   r   r   r     s     



zDaemonInstallProgress._conffilec             C   s   t jd||f  dS )zCallback for an errorz%s: %sN)r4   r  )r.   r  rV   r   r   r   r     s    zDaemonInstallProgress._errorN)r7   r8   r9   r:   r   r   r   r   r  r   r   r   r   r   r   r     s   Bc               @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )r   z9Progress handler for a local Debian package installation.r0   c             C   s   t j| ||| d S )N)r   r&   )r.   r/   r   r   r   r   r   r&     s    z"DaemonDpkgInstallProgress.__init__c             C   sf   t jd dt| jg}|jt jjd | jjs>|jddg |jd|g tj	t jd f|  d S )NzDir::Bin::DPkgz--status-fdzDPkg::Optionsz--force-confdefz--force-confoldz-i)
r?   r   strr   extend
value_listr/   r   r   r   )r.   Zdebfiler   r   r   r   r     s    
z DaemonDpkgInstallProgress._childc       	      C   s:  t jd d}y,x&|jds6|tj|djdd7 }qW W n
   dS ydd	 |jd
dD }W n tk
rt   dS X |d dkr|d dkr| j|d |d  nB|d dkrt	j
d|d }|r|jd|jd }}| j|| nN|d dkr6yt|d  }W n tk
r"   tj}Y nX | j|d d| dS )Nr   r<   r   r
   zUTF-8r   Fc             S   s   g | ]}|j  qS r   )r   )r   r   r   r   r   r   $  s    z?DaemonDpkgInstallProgress._on_status_update.<locals>.<listcomp>r   r   Tr   r>   r~   r   conffilez\s*'(.*)'\s*'(.*)'.*Z
processingr0   )r4   r   r   r   r   r   r{   r   r   r   r   r   r   MAP_DPKG_STAGEKeyErrorr   ZPKG_UNKONWNr  )	r.   r   r   Z
status_rawr>   r   r  r  r	  r   r   r   r     s4    
 z+DaemonDpkgInstallProgress._on_status_updateN)r0   r0   )r7   r8   r9   r:   r&   r   r   r   r   r   r   r     s   
	c               @   s   e Zd ZdZdd ZdS )r   z-Progress handler for dpkg --confiure -a call.c             C   s\   t jd dt| jddg}|jt jjd | jjsB|jddg tj	t jd f|  d S )	NzDir::Bin::Dpkgz--status-fdz--configurez-azDpkg::Optionsz--force-confdefz--force-confoldzDir::Bin::DPkg)
r?   r   r  r   r  r  r/   r   r   r   )r.   r   r   r   r   r   D  s    
z DaemonDpkgRecoverProgress._childN)r7   r8   r9   r:   r   r   r   r   r   r   @  s   c               @   s   e Zd ZdZdd ZdS )DaemonDpkgReconfigureProgressz+Progress handler for dpkg-reconfigure call.c             C   s8   dg}|dkr|j d|g |j | tjd|  d S )N/usr/sbin/dpkg-reconfiguredefaultz
--priority)r  )r  r   r   )r.   ZpackagesZpriorityr   r   r   r   r   Q  s
    
z$DaemonDpkgReconfigureProgress._childN)r7   r8   r9   r:   r   r   r   r   r   r  M  s   r  )r   r   r   r   r   r   r   iX  )8r:   
__author____all__r   r   r   r   r   r   r   r   r   r   r   r?   Zapt.progress.baser"   Zapt.debfileZgi.repositoryr	   r<   r   r   Zloopr   Zutilsr   r   Z	getLoggerr4   r   r  r   r   r   r   r   r   ZPKG_UPGRADINGr  chrr   r#   r$   r%   r   r;   r   ru   objectr   r   r   r   r   r  r   r   r   r   <module>   s^   
   


9 
z y5