o
    ïØ{fÔ@  ã                   @   s\  d Z ddlmZ ddlZe dd¡ 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vr†zddlmZ W n e y…   e !d¡ Y nw ej d¡r¨dejvr¨zddl"m"Z" W n e y§   e !d¡ Y nw dd„ Z#dS )z2Integration of package managers into UpdateManageré    )Úabsolute_importNÚGtkz3.0ÚSnapdÚ1)ÚGLibr   r   )ÚCache)Úgettext)ÚThread)ÚMyCache)Úinhibit_sleepÚget_dist_version)ÚDialogc                   @   st   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   st  dt jd< tƒ | _| j| jkrM| jj}t| jjj	d�}g }g }| jj
D ]!}|| }|| }|jr9|js9| |¡ q#|jrD|jrD| |¡ q#|  ||¡ d S | j| jkr´g }g }	g }
t| jjj	d�}| jjD ]E}z:|jr�||j js�|j}|jr{|d7 }| |¡ n|jr‘||j jr‘|	 |j¡ n|jr ||j jr |
 |j¡ W qe tyª   Y qew |  ||	|
¡ d S |  ¡  d S )NÚnoneÚAPT_LISTCHANGES_FRONTEND)Úrootdirz#auto)ÚosÚenvironr   r   r   ÚACTION_PRE_INSTALLr   Úcacher   r   Úoem_metapackagesÚmarked_installÚis_installedÚappendÚmarked_upgradeÚis_upgradableÚ
commit_oemÚACTION_INSTALLÚnameÚis_auto_installedÚmarked_deleteÚKeyErrorÚcommitÚupdate)r   Úunfresh_cacheÚfresh_cacheÚpkgs_install_oemÚpkgs_upgrade_oemÚpkgÚunfresh_pkgÚ	fresh_pkgÚpkgs_installÚpkgs_upgradeÚpkgs_removeÚpkgnamer   r   r   Ústart&   s`   
ÿÿ
€
ÿ
ÿ
ÿ€þzInstallBackend.startc                 C   ó   t ‚)z(Run a update to refresh the package list©ÚNotImplementedError©r   r   r   r   r-   Z   ó   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   r0   r1   r   r   r   r&   ^   s
   
ýzInstallBackend.commit_oemc                 C   r:   )zCommit the cache changes r;   )r   r5   r6   r7   r   r   r   r,   e   r>   zInstallBackend.commitc              
   C   s:  i }i }dt ƒ  }| jj}zstddƒ}t |¡}| ¡  |d D ]/}|d | }| dd ¡}	| d|¡}
| dd ¡}||vr?q |rI|| jdu rIq |	|
f||< q |d	 D ]'}|d	 | }| d
|¡}| dd ¡}||vrmqT|rw|| jdu rwqT|||< qTW ||fS  t	yœ } zt
 d| ¡ W Y d }~||fS d }~ww )Nzstable/ubuntu-z0/usr/share/ubuntu-release-upgrader/deb2snap.jsonÚrÚseededÚdebÚ
to_channelÚmetapkgFÚunseededÚfrom_channelz%error reading deb2snap.json file (%s))r   r   r   ÚopenÚjsonÚloadÚcloseÚgetr"   Ú	ExceptionÚloggingÚdebug)r   Úseeded_snapsÚunseeded_snapsÚcurr_channelr   Úd2s_fileÚd2sÚsnapÚseedrG   rH   rI   ÚunseedrK   Úer   r   r   Úget_snap_seedsi   sH   
ÿ

øý€ýzInstallBackend.get_snap_seedsc           
   
   C   s  z | j jd u rtd ƒ| j _n| j j d ¡ | j j ¡  | j j}W n ty; } zt d| ¡ g W  Y d }~S d }~ww g }|  ¡ \}}| 	¡ D ]6\}\}}||v r~|| j
r~d}||  ¡  | ¡ D ]}	|	j
rr|	jrr|	jsrd} nqc| ¡  |r~| |¡ qH|S )Nzerror reading cache (%s)TF)r   r   r
   rL   Ú_initDepCacherQ   rR   rS   r]   Úitemsr"   Úmark_deleteÚget_changesr*   r)   Úclearr#   )
r   r   r\   Ú
duplicatesrT   Ú_rY   rG   Údeb_is_autor2   r   r   r   Úget_deb2snap_dups�   s:   €üÿ€
€z InstallBackend.get_deb2snap_dupsc                 C   sÊ  i }|   ¡ \}}| ¡ D ]:\}\}}i }tjdd|gdtjd� ¡ }t d|d tj¡r4t	 
d| ¡ q|| jjv rFd|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| ¡ qKd|d	< tjdd|gdtjd� ¡ }|d  d¡D ]>}| ¡ }t|ƒdkr¬qŸ|d }|d }| |d ¡rÝ| d¡d }|dkrÝ||vrÝt	 
d||f ¡ d|d	< d|d
<  nqŸ|||< qK|S )NrY   ÚinfoT)Ú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ÚremoveÚconnectionsÚ
é   r   r   ú:ú-z9Snap %s is being used by %s. Switching it to stable trackÚrefreshÚstable)r]   r_   Ú
subprocessÚPopenÚPIPEÚcommunicateÚreÚsearchÚ	MULTILINErR   rS   r   Úduplicate_packagesÚsplitÚlenÚ
startswith)r   Ú	snap_listrT   rU   rY   rG   rH   Úsnap_objectÚ	snap_inforK   Ú
re_channelÚconnsÚconnÚ	conn_colsÚplugÚslotÚ	plug_snapr   r   r   Úget_snap_transitionsµ   s~   þþ€þþ

ÿÿþþþ€€z#InstallBackend.get_snap_transitionsc                 C   sz   |\}}}|s	d S d}d}	|  ¡ D ]}
||
 ¡ 7 }|	|
 ¡ 7 }	q|	| }|| ||  }|| ¡ kr;t |j|¡ d S d S )Nr   )Ú	get_tasksÚget_progress_totalÚget_progress_doneÚget_fractionr   Úidle_addÚset_fraction)r   ÚclientÚchangerd   Ú	user_dataÚindexÚcountÚprogress_barÚ
task_totalÚ	task_doneÚtaskÚtask_fractionÚ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¡ zmt ¡ }| ¡  d}t|ƒ}	| ¡ D ]X\}
}|d }|d	kru|t d
|
 ƒƒ |j|
|d ˆ j||	|fd� n0|dkrŽ|t d|
 ƒƒ |j|
ˆ j||	|fd� n|t d|
 ƒƒ |j|
|d ˆ j||	|fd� |d7 }qQW n) tjyÔ } zt d| ¡ t ˆ jjdt dƒt dƒ¡ W Y d }~d S d }~ww t ˆ jj¡ d S )Nc                    s   t  ˆ jj| ¡ d S r   )r   r�   Úlabel_detailsÚ	set_label)Ústatusr=   r   r   Úupdate_status  s   z2InstallBackend.update_snaps.<locals>.update_statusc                 S   s   |   ¡  dS )NT)Úpulse)r–   r   r   r   Úupdate_progress  s   z4InstallBackend.update_snaps.<locals>.update_progresszUpdating snapsr   éd   rk   rs   zRefreshing %s snaprl   )Úprogress_callback_datarm   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.)rd   Úprogressbar_slotÚget_childrenÚ
isinstancer   ÚProgressBarr   Útimeout_addrŠ   Úsource_remover�   r   ÚClientÚconnect_syncr~   r_   Úrefresh_syncrœ   Úremove_syncÚinstall_syncÚErrorrR   rS   r�   r   Ústart_errorÚstart_available)r   r    r¢   r–   Úprogress_timerÚprogress_barsr€   r‘   r”   r•   rY   r�   rk   r\   r   r=   r   Úupdate_snaps  sp   
ÿ

ÿþ
ÿÿÿþ
íþ€ú	zInstallBackend.update_snapsFc                 C   sú   || j kr|r| j| _|  ¡  d S || jkrL|r-tj d¡r-t| dƒr-t| j	d� ¡  d S |r6| j
 ¡  d S |rB| j
 |||¡ d S t d| j
j¡ d S |rX| j
 d||¡ d S |rrtj d¡rrt| dƒrr|  ¡ | j
_| j
 ¡  d S | }| j
 |¡ d S )Nz/usr/bin/snapÚpane_update_progress)Útargetr   T)r   r'   r   r9   r   ÚpathÚexistsÚhasattrr	   rµ   r   r²   r±   r   r©   Úexitrf   r|   )r   r   r?   r@   rA   rB   rC   Úis_cancelled_updater   r   r   rD   L  s0   

ÿ
ÿÿzInstallBackend._action_doneN)F)Ú__name__Ú
__module__Ú__qualname__ÚACTION_UPDATEr   r'   r   r9   r-   r&   r,   r]   rf   rŠ   rœ   rµ   rD   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¡r"dt jvr"zt| i |¤ŽW S  ty!   t d¡ Y nw t j d¡rBdt jvrBzt| i |¤ŽW S  tyA   Y t	dƒ‚w t	dƒ‚)z,Select and return a package manager backend.rÁ   rÂ   zusing aptdaemon failedrÄ   rÅ   zENo working backend found, please try installing aptdaemon or synaptic)
r   r¸   r¹   r   rÃ   Ú	NameErrorrR   Ú	exceptionrÆ   rQ   )ÚargsÚkwargsr   r   r   Úget_backend„  s    
ÿ
ýrË   )$Ú__doc__Ú
__future__r   ÚgiÚrequire_versionÚgi.repositoryr   r   r   Úaptr   rM   rR   r   ry   ru   r   rd   Ú	threadingr	   ÚUpdateManager.Core.MyCacher
   ÚUpdateManager.Core.utilsr   r   ÚUpdateManager.Dialogsr   r   r¸   r¹   r   rÃ   ÚImportErrorrÈ   rÆ   rË   r   r   r   r   Ú<module>   sF     Z
ÿ
ÿ