U
    c>                     @   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 qX 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   }zt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
rd}||   | D ]}	|	j
r|	jr|	jsd} qq|  |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rt	
d|  d}
td|
 |d tjst	
d|  qd|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 zt }|  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 }qW 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
||| qtd| j
j nZ|r| j
d|| nD|rtjdrt| 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