U
    ;`Ô>  ã                   @   s`  d Z ddlmZ ddlZe dd¡ ddlmZmZmZ ddl	m
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mZ ddlmZ G dd„ deƒZej d¡rdejkrzddlmZ W n  e k
r   e !d¡ Y nX ej d¡rTdejkrTzddl"m"Z" W n  e k
rR   e !d¡ Y nX dd„ Z#dS )z2Integration of package managers into UpdateManageré    )Úabsolute_importNÚSnapdÚ1)ÚGLibÚGtkr   )ÚCache)Úgettext)ÚThread)ÚMyCache)Úinhibit_sleepÚget_dist_version)ÚDialogc                   @   sr   e Zd Zd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d„ Zdd„ Zddd„ZdS )ÚInstallBackendr   é   é   c                 C   s   t  | |¡ || _d | _d S ©N)r   Ú__init__ÚactionÚsleep_cookie)ÚselfÚwindow_mainr   © r   ú@/usr/lib/python3/dist-packages/UpdateManager/backend/__init__.pyr       s    zInstallBackend.__init__c              	   C   s„  dt jd< tƒ | _| j| jkr˜| jj}t| jjj	d}g }g }| jj
D ]B}|| }|| }|jrr|jsr| |¡ qF|jrF|jrF| |¡ qF|  ||¡ nè| j| jkrxg }g }	g }
t| jjj	d}| jjD ]œ}z€|jr||j js|j}|jrú|d7 }| |¡ nF|jr*||j jr*|	 |j¡ n"|jrL||j jrL|
 |j¡ W qÊ tk
rd   Y qÊX qÊ|  ||	|
¡ n|  ¡  d S )NZnoneZAPT_LISTCHANGES_FRONTEND)Úrootdirz#auto)ÚosÚenvironr   r   r   ÚACTION_PRE_INSTALLr   Úcacher   r   Zoem_metapackagesZmarked_installÚis_installedÚappendZmarked_upgradeZis_upgradableÚ
commit_oemÚACTION_INSTALLÚnameÚis_auto_installedÚmarked_deleteÚKeyErrorÚcommitÚupdate)r   Zunfresh_cacheZfresh_cacheÚpkgs_install_oemÚpkgs_upgrade_oemÚpkgZunfresh_pkgZ	fresh_pkgÚpkgs_installÚpkgs_upgradeÚpkgs_removeZpkgnamer   r   r   Ústart%   sZ    
ÿÿ
ÿ
ÿ
ÿzInstallBackend.startc                 C   s   t ‚dS )z(Run a update to refresh the package listN©ÚNotImplementedError©r   r   r   r   r'   Y   s    zInstallBackend.updatec                 C   s   | j | jdddddd dS )z Install these OEM packages TN)Ú
authorizedÚsuccessÚerror_stringÚ
error_descÚtrans_failed)Ú_action_doner   )r   r(   r)   r   r   r   r    ]   s      ýzInstallBackend.commit_oemc                 C   s   t ‚dS )zCommit the cache changes Nr/   )r   r+   r,   r-   r   r   r   r&   d   s    zInstallBackend.commitc              
   C   sØ   i }i }dt ƒ  }zŒtddƒ}t |¡}| ¡  |d D ]4}|d | }| dd ¡}| d|¡}	||	f||< q8|d D ]$}|d | }
|
 d|¡}|||< qvW n0 tk
rÎ } zt d	| ¡ W 5 d }~X Y nX ||fS )
Nzstable/ubuntu-z0/usr/share/ubuntu-release-upgrader/deb2snap.jsonÚrZseededÚdebÚ
to_channelZunseededÚfrom_channelz%error reading deb2snap.json file (%s))	r   ÚopenÚjsonÚloadÚcloseÚgetÚ	ExceptionÚloggingÚdebug)r   Úseeded_snapsÚunseeded_snapsZcurr_channelZd2s_fileZd2sÚsnapZseedr9   r:   Zunseedr;   Úer   r   r   Úget_snap_seedsh   s,    
 ÿ
 zInstallBackend.get_snap_seedsc           
   
   C   s  z@| j jd krtd ƒ| j _n| j j d ¡ | j j ¡  | j j}W n8 tk
rx } zt d| ¡ g  W Y ¢S d }~X Y nX g }|  ¡ \}}| 	¡ D ]l\}\}}||kr’|| j
r’d}||  ¡  | ¡ D ]}	|	j
rÈ|	jrÈ|	jsÈd} qèqÈ| ¡  |r’| |¡ q’|S )Nzerror reading cache (%s)TF)r   r   r
   r<   Z_initDepCacherA   rB   rC   rH   Úitemsr   Zmark_deleteZget_changesr$   r#   Úclearr   )
r   r   rG   Ú
duplicatesrD   Ú_rF   r9   Zdeb_is_autor*   r   r   r   Úget_deb2snap_dupsƒ   s2    ÿz InstallBackend.get_deb2snap_dupsc                 C   sÞ  i }|   ¡ \}}| ¡ D ]v\}\}}i }tjdd|gdtjd ¡ }t d|d tj¡rjt	 
d| ¡ qq|| jjkrd|d	< ||d
< |||< q| ¡ D ]>\}}	i }tjdd|gdtjd ¡ }t d|d tj¡r˜t	 
d| ¡ d}
t d|
 |d tj¡st	 
d| ¡ q˜d|d	< tjdd|gdtjd ¡ }|d  d¡D ]Š}| ¡ }t|ƒdkrbqD|d }|d }| |d ¡rD| d¡d }|dkrD||krDt	 
d||f ¡ d|d	< d|d
<  qÐqD|||< q˜|S )NrF   ÚinfoT)Zuniversal_newlinesÚstdoutz^installed: r   zSnap %s is installedÚinstallÚcommandÚchannelz#stable/ubuntu-[0-9][0-9].[0-9][0-9]z^tracking:.*%sz+Snap %s is not tracking the release channelÚremoveZconnectionsÚ
é   r   r   ú:ú-z9Snap %s is being used by %s. Switching it to stable trackÚrefreshZstable)rH   rI   Ú
subprocessÚPopenÚPIPEZcommunicateÚreÚsearchÚ	MULTILINErB   rC   r   Úduplicate_packagesÚsplitÚlenÚ
startswith)r   Ú	snap_listrD   rE   rF   r9   r:   Úsnap_objectZ	snap_infor;   Z
re_channelZconnsZconnZ	conn_colsZplugZslotZ	plug_snapr   r   r   Úget_snap_transitions©   sp    þ

þ

 ÿÿþ

ÿþ

z#InstallBackend.get_snap_transitionsc                 C   sv   |\}}}|sd S d}d}	|  ¡ D ]}
||
 ¡ 7 }|	|
 ¡ 7 }	q"|	| }|| ||  }|| ¡ krrt |j|¡ d S )Nr   )Z	get_tasksZget_progress_totalZget_progress_doneZget_fractionr   Úidle_addÚset_fraction)r   ÚclientZchangerL   Z	user_dataÚindexÚcountÚprogress_barZ
task_totalZ	task_doneZtaskZtask_fractionZtotal_fractionr   r   r   Úupdate_snap_cbê   s    
zInstallBackend.update_snap_cbc              
      sÂ  ‡ fdd„}dd„ }|t dƒƒ d }d }ˆ j ¡ }|r\t|d tjƒr\|d }t d||¡}ˆ  ¡ }|r|t 	|¡ | 
d¡ zÜt ¡ }| ¡  d}t|ƒ}	| ¡ D ]²\}
}|d }|d	krê|t d
|
 ƒƒ |j|
|d ˆ j||	|fd nb|dkr|t d|
 ƒƒ |j|
ˆ j||	|fd n.|t d|
 ƒƒ |j|
|d ˆ j||	|fd |d7 }q¢W nV tjk
r® } z4t d| ¡ t ˆ jjdt dƒt dƒ¡ W Y ¢d S d }~X Y nX t ˆ jj¡ d S )Nc                    s   t  ˆ jj| ¡ d S r   )r   rf   Zlabel_detailsZ	set_label)Zstatusr1   r   r   Úupdate_status  s    z2InstallBackend.update_snaps.<locals>.update_statusc                 S   s   |   ¡  dS )NT)Zpulse)rk   r   r   r   Úupdate_progress  s    z4InstallBackend.update_snaps.<locals>.update_progresszUpdating snapsr   éd   rQ   rX   zRefreshing %s snaprR   )Zprogress_callback_datarS   zRemoving %s snapzInstalling %s snapr   zerror updating snaps (%s)Fz!Upgrade only partially completed.zMAn error occurred while updating snaps. Please check your network connection.)rL   Zprogressbar_slotZget_childrenÚ
isinstancer   ZProgressBarr   Útimeout_addre   Zsource_removerg   r   ZClientZconnect_syncra   rI   Zrefresh_syncrl   Zremove_syncZinstall_syncÚErrorrB   rC   rf   r   Ústart_errorÚstart_available)r   rm   rn   rk   Zprogress_timerZprogress_barsrc   rh   ri   rj   rF   rd   rQ   rG   r   r1   r   Úupdate_snaps   sj    
ÿ

ÿþ

ÿÿÿþþzInstallBackend.update_snapsFc                 C   sì   || j kr |r | j| _|  ¡  nÈ|| jkrŽ|rVtj d¡rVt| dƒrVt| j	d ¡  qè|rf| j
 ¡  qè|r|| j
 |||¡ qèt d| j
j¡ nZ|r¤| j
 d||¡ nD|rÖtj d¡rÖt| dƒrÖ|  ¡ | j
_| j
 ¡  n| }| j
 |¡ d S )Nz/usr/bin/snapZpane_update_progress)Útargetr   T)r   r!   r   r.   r   ÚpathÚexistsÚhasattrr	   ru   r   rt   rs   r   rq   ÚexitrM   r_   )r   r   r2   r3   r4   r5   r6   Zis_cancelled_updater   r   r   r7   @  s0    


ÿ
ÿÿzInstallBackend._action_doneN)F)Ú__name__Ú
__module__Ú__qualname__ZACTION_UPDATEr   r!   r   r.   r'   r    r&   rH   rM   re   rl   ru   r7   r   r   r   r   r      s   4&AA ÿr   ú/usr/sbin/aptdÚ%UPDATE_MANAGER_FORCE_BACKEND_SYNAPTICr   )ÚInstallBackendAptdaemonzimporting aptdaemonú/usr/sbin/synapticÚ&UPDATE_MANAGER_FORCE_BACKEND_APTDAEMON)ÚInstallBackendSynapticzimporting synapticc                  O   s†   t j d¡rBdt jkrBzt| |ŽW S  tk
r@   t d¡ Y nX t j d¡rzdt jkrzzt| |ŽW S  tk
rx   Y nX t	dƒ‚dS )z,Select and return a package manager backend.r~   r   zusing aptdaemon failedr   r‚   zENo working backend found, please try installing aptdaemon or synapticN)
r   rw   rx   r   r€   Ú	NameErrorrB   Ú	exceptionrƒ   rA   )ÚargsÚkwargsr   r   r   Úget_backendx  s    ÿÿrˆ   )$Ú__doc__Z
__future__r   ZgiZrequire_versionZgi.repositoryr   r   r   Zaptr   r=   rB   r   r\   rY   r   rL   Z	threadingr	   ZUpdateManager.Core.MyCacher
   ZUpdateManager.Core.utilsr   r   ZUpdateManager.Dialogsr   r   rw   rx   r   r€   ÚImportErrorr…   rƒ   rˆ   r   r   r   r   Ú<module>   sB     Oÿÿ