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rdejvrzddlmZ W n e y   e!d Y nw ejdrdejvrz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rg }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rt	
d|  d}
td|
 |d tjst	
d|  qKd|d	< tjdd|gdtjd }|d dD ]>}| }t|dkrq|d }|d }||d r|dd }|dkr||vrt	
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

