3
^C                 @   s  d dl mZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlm	Z	 e d dl
Z
e
jdd	e 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Zd dlZd dlmZ edd ddlmZ ddlmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$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l.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5 dZ6G dd dej7Z8G dd dej9j:Z;dS )    )absolute_importprint_function)Gtk)GdkGdkX11)Gio)GLib)GObjectNignorezAccessed deprecated property)gettext)DBusGMainLoopT)Zset_as_default   )UnitySupport)
DistUpgradeDialogErrorDialogHWEUpgradeDialogNeedRestartDialogNoUpdatesDialogNoUpgradeForYouDialogPartialUpgradeDialogStoppedUpdatesDialogUnsupportedDialogUpdateErrorDialog)MetaRelease)UpdatesAvailable)AlertWatcher)MyCache)NetworkManagerHelper)
UpdateList)get_archget_dist)InstallBackendget_backendz/var/run/reboot-requiredc               @   s   e Zd ZdZdd Zd3ddZdd Zd	d
 Zdd Zdd Z	d4ddZ
dd Zdd Zdd Zdd Zd5ddZd6ddZd7dd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 ZdS )8UpdateManagerz This class is the main window and work flow controller. The main
        window will show panes, and it will morph between them. c                s  t jj  | _| _t  _d  _d  _d  _	d  _
d  _t  _ jtd  jd  jt jj  j }|jd fdd _ jd j  j   jr jjr jd  j   j   jd  jjd  jd	 j _ t! jo jj" jo
 jj# _
d S )
NzSoftware Updaterzsystem-software-updateZchangedc                s    j  S )N)resize_to_standard_width)ctx)self =/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py<lambda>e   s    z(UpdateManager.__init__.<locals>.<lambda>zdelete-eventFTzfocus-in-event)$r   Window__init__datadiroptionsr   unity
controllercacheupdate_listmeta_releasehwe_replacement_packagesr   archZ	set_title_Zset_icon_nameZset_positionZWindowPositionZCENTERget_style_contextconnectstyle_changed	_on_close_setup_dbusZno_focus_on_mapZset_focus_on_mapZiconifyZstickset_urgency_hintset_urgencyon_initial_focus_ininitial_focus_idr   Zdevel_releaseZuse_proposed)r&   r,   r-   r%   r'   )r&   r(   r+   O   s:    


zUpdateManager.__init__r   c                s4    j d dkr0dkr0tj fdd d S )NTr   c                  s    j S )N)Zresizer'   )r&   stored_heightstored_widthr'   r(   r)      s    z4UpdateManager.begin_user_resizable.<locals>.<lambda>)set_resizabler   idle_add)r&   r@   r?   r'   )r&   r?   r@   r(   begin_user_resizable|   s    
z"UpdateManager.begin_user_resizablec             C   s   | j d d S )NF)rA   )r&   r'   r'   r(   end_user_resizable   s    z UpdateManager.end_user_resizablec             C   s|   | j  rd S d}| j j }|dkr(d}| j }tj|| j |jdtj	j
}|d | | }| j|d tj|| j d S )N!   r   `   z	font-sizeH   r   )Zget_resizableZ
get_screenZget_resolutionr6   r	   Zsignal_handler_blockr8   Zget_propertyr   Z
StateFlagsZNORMALZset_size_requestZsignal_handler_unblock)r&   Znum_emZdpir%   sizewidthr'   r'   r(   r$      s    z&UpdateManager.resize_to_standard_widthc             C   s.   | j   | jd | jjd | j| j dS )z6callback run on initial focus-in (if started unmapped)F)Zunstickr;   r.   r<   Z
disconnectr>   )r&   widgetZeventr'   r'   r(   r=      s
    
z!UpdateManager.on_initial_focus_inc             C   s   | j d k	r,| j j  t| j tjr,| j j  || _ | j  | j  |d krNd S t|tjrv| j| |j	  | j
  n|j	  | j  d S )N)r/   stop
isinstancer   ZWidgetZdestroy_look_readyrD   addstartZshow_allZhide)r&   paner'   r'   r(   _start_pane   s    




zUpdateManager._start_paneNc             C   s   | j  S )N)close)r&   rK   datar'   r'   r(   r9      s    zUpdateManager._on_closec             C   s0   | j  sdS | jr$| jj }|r$|S | j  d S )NT)Zget_sensitiver/   rS   exit)r&   Zcontroller_closer'   r'   r(   rS      s    
zUpdateManager.closec             C   s   | j d tjd dS )z& exit the application, save the state Nr   )rR   sysrU   )r&   r'   r'   r(   rU      s    
zUpdateManager.exitc             C   s   yt j  W n tk
r    Y nX dddg}dtjkrN|dd| j j  g7 }| j  zZytj	|}W n t
k
rz   Y n4X x0|j d krxtj rtj  qW tjd q~W W d | j  X d S )Nz /usr/bin/software-properties-gtkz
--open-tab2ZWAYLAND_DISPLAYz
--toplevelz%sg?)apt_pkgZpkgsystem_unlockSystemErrorosenviron
get_windowZget_xid
_look_busy
subprocessPopenOSErrorZpollr   events_pendingmain_iterationtimeZsleepstart_available)r&   cmdpr'   r'   r(   show_settings   s$    

zUpdateManager.show_settingsc             C   s.   | j jr| j  d S t| tj}| j| d S )N)r-   Z	no_updaterd   r"   r!   ZACTION_UPDATErR   )r&   Zupdate_backendr'   r'   r(   start_update   s
    zUpdateManager.start_updateFc             C   sV   t | tj}|rHx6| jD ],}y| j| j  W q tk
rB   Y qX qW | j| d S )N)r"   r!   ZACTION_INSTALLr3   r0   Zmark_installrY   rR   )r&   Zhwe_upgradeZinstall_backendpkgnamer'   r'   r(   start_install   s    
zUpdateManager.start_installc             C   sH   | j   | j  | jd krd S | j| jjtjjt||}| j	| d S )N)
r]   refresh_cacher0   _make_available_paneinstall_countrZ   pathexistsREBOOT_REQUIRED_FILErR   )r&   cancelled_updateerror_occurredrQ   r'   r'   r(   rd      s    


zUpdateManager.start_availablec             C   s   | j   |dkrT|rt| S | j }|r,|S |r8t| S | jrFt| S t| |dS nHd }d }|rjtd}n$|rtd}td}n| jrt| S t| |||S d S )Nr   )rr   u0   Some software couldn’t be checked for updates.z"You stopped the check for updates.z4Updated software is available from a previous check.)	_check_hwe_support_statusr   _check_meta_releaser   r3   r   r   r5   r   )r&   rm   Zneed_rebootrq   rr   Zdist_upgradeheaderdescr'   r'   r(   rl      s,    

z"UpdateManager._make_available_panec             C   s.   |r| j t| || n| j t| || d S )N)rR   r   r   )r&   Zupdate_and_retryru   rv   r'   r'   r(   start_error  s    zUpdateManager.start_errorc             C   s4   | j d | j d k	r0| j jtjjtjj d S )NF)set_sensitiver\   
set_cursorr   ZCursornewZ
CursorTypeZWATCH)r&   r'   r'   r(   r]     s    
zUpdateManager._look_busyc             C   s:   | j d | j d k	r6| j jd  | j jtjj d S )NT)rx   r\   ry   Zset_functionsr   Z
WMFunctionZALL)r&   r'   r'   r(   rN   #  s    
zUpdateManager._look_readyc             C   s   | j d krd S | j jr*tj| j tj  | j j}| s>|jrBd S | j j	rVt
| | j S tjjd}| j jr| jjs||jdr| jdkrt| | j | jS t| | j S d S )Nzcom.ubuntu.update-managerzcheck-dist-upgradesZi386)r2   downloadingr   rB   _meta_release_wait_idler   mainZupgradable_toZupgrade_brokenZno_longer_supportedr   r   ZSettingsrz   Znew_distr-   Zcheck_dist_upgradesZget_booleanr4   r   r   )r&   nextZsettingsr'   r'   r(   rt   )  s&    


z!UpdateManager._check_meta_releasec             C   s&   | j jstj  n| j jdtj dS )NZdone_downloadingF)r2   r{   r   Z	main_quitr7   )r&   r'   r'   r(   r|   G  s    
z%UpdateManager._meta_release_wait_idlec             C   sJ   t j }t }|j|}|s d S d}tjj|s4d S |dg}| j| d S )Nz/usr/bin/hwe-support-statusz--show-replacements)distro_infoZUbuntuDistroInfor    Zis_ltsrZ   rn   ro   _parse_hwe_support_status)r&   ZdiZcodenameZltsZHWEre   r'   r'   r(   rs   Q  s    
z'UpdateManager._check_hwe_support_statusc             C   s   yt j| W n~ t jk
r } z`|jdkr||jj j }g | _x:|D ]2}|jd}|| j	krF| j	| j
 rF| jj| qFW W Y d d }~X nX d S )N
   zutf-8)r^   Zcheck_outputZCalledProcessError
returncodeoutputstripsplitr3   decoder0   Zis_installedappend)r&   re   eZpackagesri   r'   r'   r(   r   ]  s    



z'UpdateManager._parse_hwe_support_statusc          '   C   sr  yt j  W n tk
r    Y nX y0| jd kr:td | _n| jjd  | jj  W n tk
r   | jt	|  t
d}t
d}| jd|| d S  tk
r } z*t
d}t
dt| }| jd|| d S d }~X nX dd }|  t| | _y| jj| j|d W nJ tk
rP } z,t
d	}t
d
t| }| jd|| W Y d d }~X nX | jjdkrn| jt	|  d S )NzSoftware index is brokenzIt is impossible to install or remove any software. Please use the package manager "Synaptic" or run "sudo apt-get install -f" in a terminal to fix this issue at first.Fz,Could not initialize the package informationzAn unresolvable problem occurred while initializing the package information.

Please report this bug against the 'update-manager' package and include the following error message:
c               S   s   xt j rt j  qW d S )N)r   ra   rb   r'   r'   r'   r(   iterate  s    
z,UpdateManager.refresh_cache.<locals>.iterate)Zeventloop_callbackzCould not calculate the upgradezAn unresolvable problem occurred while calculating the upgrade.

Please report this bug against the 'update-manager' package and include the following error message:
Tr   )rX   Zpkgsystem_lockrY   r0   r   openZ_initDepCacheAssertionErrorrR   r   r5   rw   strr   r1   updateZdistUpgradeWouldDelete)r&   ru   rv   r   r   r'   r'   r(   rk   o  sB    



 zUpdateManager.refresh_cachec             C   s   yt j }W n( tk
r4 } ztd dS d}~X nX y.|jdd}t j|d}|j  tjd W n0 t j	k
r   t j
jd|}t| || _Y nX dS )z; this sets up a dbus listener if none is installed already z warning: could not initiate dbusNzorg.freedesktop.UpdateManagerz$/org/freedesktop/UpdateManagerObjectz"org.freedesktop.UpdateManagerIFacer   )dbusZ
SessionBus	ExceptionprintZ
get_objectZ	InterfacebringToFrontrV   rU   ZDBusExceptionserviceZBusNameUpdateManagerDbusControllerZdbusController)r&   Zbusr   Z	proxy_objZifacebus_namer'   r'   r(   r:     s     zUpdateManager._setup_dbus)r   r   )N)F)FF)FFF)__name__
__module____qualname____doc__r+   rC   rD   r$   r=   rR   r9   rS   rU   rg   rh   rj   rd   rl   rw   r]   rN   rt   r|   rs   r   rk   r:   r'   r'   r'   r(   r#   K   s2   -





 

9r#   c               @   sJ   e Zd ZdZdddZejjddd Zejjddd	 Z	d
d Z
dS )r   z4 this is a helper to provide the UpdateManagerIFace $/org/freedesktop/UpdateManagerObjectc             C   s:   t jjj| || || _t | _| jjd| j d| _	d S )Nznetwork-alertF)
r   r   Objectr+   parentr   Zalert_watcherr7   _on_network_alert	connected)r&   r   r   Zobject_pathr'   r'   r(   r+     s
    z$UpdateManagerDbusController.__init__z"org.freedesktop.UpdateManagerIFacec             C   s   | j j  dS )NT)r   Zpresent)r&   r'   r'   r(   r     s    
z(UpdateManagerDbusController.bringToFrontc             C   s4   y| j j  dS  tk
r. } zdS d }~X nX d S )NTF)r   rj   r   )r&   r   r'   r'   r(   upgrade  s
    
z#UpdateManagerDbusController.upgradec             C   s   |t jkrd| _nd| _d S )NTF)r   ZNM_STATE_CONNECTED_LISTr   )r&   Zwatcherstater'   r'   r(   r     s    
z-UpdateManagerDbusController._on_network_alertN)r   )r   r   r   r   r+   r   r   methodr   r   r   r'   r'   r'   r(   r     s
   
r   )<Z
__future__r   r   Zgi.repositoryr   r   r   r   r   r	   warningsfilterwarningsDeprecationWarningrX   r   rZ   r^   rV   rc   r   r5   r   Zdbus.serviceZdbus.mainloop.glibr   r   ZDialogsr   r   r   r   r   r   r   r   r   r   ZMetaReleaseGObjectr   r   ZCore.AlertWatcherr   ZCore.MyCacher   Z	Core.roamr   ZCore.UpdateListr   Z
Core.utilsr   r    Zbackendr!   r"   rp   r*   r#   r   r   r   r'   r'   r'   r(   <module>   sF   
0
  w