o
    ïØ{fV`  ã                   @   sô   d dl mZ d dlZe dde¡ 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Zd dlZd dlZd dlmZ d dlmZ G dd	„ d	ƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZdS )é    )Úprint_functionNÚignorezAccessed deprecated property)Úgettext)ÚGio)Úutilsc                   @   s   e Zd Zddd„Zdd„ ZdS )Ú
UpdateItemTc                 C   s"   || _ || _|| _|| _|| _d S ©N)ÚiconÚnameÚpkgÚ	to_removeÚ	sensitive©Úselfr   r
   r	   r   r   © r   ú?/usr/lib/python3/dist-packages/UpdateManager/Core/UpdateList.pyÚ__init__/   s
   
zUpdateItem.__init__c                 C   s   | j s| jjp
| jjS | jjS r   )r   r   Úmarked_installÚmarked_upgradeÚmarked_delete©r   r   r   r   Úis_selected6   s   zUpdateItem.is_selectedN©T)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   .   s    
r   c                   @   sn   e Zd Zi Zddd„Zedd„ ƒZ		ddd	„Zd
d„ Zdd„ Z	dd„ Z
ddd„Zdd„ Zdd„ Zdd„ ZdS )ÚUpdateGroupTc                 C   sZ   t  | |||||¡ tƒ | _tƒ | _d | _|d ur+t |||||ƒ| _| j | j¡ d S d S r   )r   r   ÚsetÚ_itemsÚ_depsÚ	core_itemÚaddr   r   r   r   r   @   s   þzUpdateGroup.__init__c                 C   s    g }|  | j¡ t|dd„ d�S )Nc                 S   ó
   | j  ¡ S r   ©r
   Úlower©Úar   r   r   Ú<lambda>M   ó   
 z#UpdateGroup.items.<locals>.<lambda>©Úkey)Úextendr   Úsorted)r   Ú	all_itemsr   r   r   ÚitemsI   s   zUpdateGroup.itemsNFc                 C   sx   t  |¡}tj d¡}| j t|||||ƒ¡ |r6|j|v r8|j| j	vr:| j	s-|  
||¡ |  |||¡ d S d S d S d S ©NÚpackage)r   Úget_package_labelr   Ú
ThemedIconÚnewr   r!   r   r
   r   Ú
_init_depsÚ	_add_deps)r   r   ÚcacheÚeventloop_callbackr   r   r
   r	   r   r   r   r!   O   s   
úzUpdateGroup.addc                 C   s
   || j v S r   )r   ©r   Úitemr   r   r   Úcontains^   s   
zUpdateGroup.containsc                 C   s4   | j D ]}|jr|jj| jvr|  |j||¡ qd S r   )r   r   r
   r   r5   )r   r6   r7   r9   r   r   r   r4   a   s
   
€þzUpdateGroup._init_depsc           
      C   s(  |du s|j du s|j| jv r&| s|j  rdpd|j }t d| ¡ dS t| jƒd dkr6t|ƒr6|ƒ  | j |j¡ |j| jv r`| j|j D ]}|| jvr]||v r]|  	|| ||¡ qIdS |j }| 
dd¡}tj |¡D ]"}|j}	|	| jvr‘|	|v r‘| j |jg ¡ |	¡ |  	||	 ||¡ qodS )	z8Adds pkg and dependencies of pkg to the dependency list.Nz,Package was None or didn't have a candidate.z%s already in _deps.zUseless call to _add_deps. %séÈ   r   ÚDependsÚ
Recommends)Ú	candidater
   r   ÚloggingÚdebugÚlenÚcallabler!   Ú	_depcacher5   Úget_dependenciesÚ	itertoolsÚchainÚfrom_iterableÚ
setdefaultÚappend)
r   r   r6   r7   ÚreasonÚdepr>   ÚdependenciesÚdependency_pkgr
   r   r   r   r5   f   s4   ÿþ€þ€üzUpdateGroup._add_depsc                 C   s"   | j s|r|  ||¡ |j| j v S r   )r   r4   r
   )r   Ú	maybe_depr6   r7   r   r   r   Úis_dependency„   s   
zUpdateGroup.is_dependencyc                 C   s   | j D ]	}| ¡ r dS qdS )NTF)r.   r   r8   r   r   r   Úpackages_are_selectedŠ   s
   
ÿz!UpdateGroup.packages_are_selectedc                 C   s.   dd„ | j D ƒ}t|ƒdkot|ƒt| j ƒk S )Nc                 S   s   g | ]}|  ¡ r|‘qS r   )r   )Ú.0r9   r   r   r   Ú
<listcomp>‘   s    z9UpdateGroup.selection_is_inconsistent.<locals>.<listcomp>r   )r.   rA   )r   Úpkgs_installingr   r   r   Úselection_is_inconsistent�   s   ÿz%UpdateGroup.selection_is_inconsistentc                 C   s2   | j rdS d}| jD ]}|t|jjddƒ7 }q
|S )Nr   Úsize)r   r.   Úgetattrr   r>   )r   rU   r9   r   r   r   Úget_total_size•   s   
zUpdateGroup.get_total_sizer   )NNFT)NN)r   r   r   rC   r   Úpropertyr.   r!   r:   r4   r5   rO   rP   rT   rW   r   r   r   r   r   =   s    
	

ÿ
r   c                       ó   e Zd Zd‡ fdd„	Z‡  ZS )ÚUpdateApplicationGroupTc                    s,   |  ¡ }| ¡ }tt| ƒ |||||¡ d S r   )Úget_display_nameÚget_iconÚsuperrZ   r   )r   r   Úapplicationr   r   r
   r	   ©Ú	__class__r   r   r   Ÿ   s
   ÿzUpdateApplicationGroup.__init__r   ©r   r   r   r   Ú__classcell__r   r   r_   r   rZ   ž   ó    rZ   c                       rY   )ÚUpdatePackageGroupTc                    s2   t  |¡}tj d¡}tt| ƒ |||||¡ d S r/   )r   r1   r   r2   r3   r]   rd   r   )r   r   r   r   r
   r	   r_   r   r   r   §   s
   
ÿzUpdatePackageGroup.__init__r   ra   r   r   r_   r   rd   ¦   rc   rd   c                       rY   )ÚUpdateSystemGroupTc                    s<   t dƒtj|d� }tj d¡}tt| ƒ d ||||¡ d S )Nz%s base©r6   zdistributor-logo)	Ú_r   Úget_ubuntu_flavor_namer   r2   r3   r]   re   r   )r   r6   r   r   r
   r	   r_   r   r   r   ¯   s
   ÿzUpdateSystemGroup.__init__r   ra   r   r   r_   r   re   ®   rc   re   c                   @   ó   e Zd Zdd„ ZdS )ÚUpdateOriginc                 C   s   g | _ || _|| _d S r   )ÚpackagesÚ
importanceÚdescription)r   Údescrl   r   r   r   r   ¹   s   
zUpdateOrigin.__init__N©r   r   r   r   r   r   r   r   rj   ¸   ó    rj   c                   @   s€   e Zd ZdZdZdZdZdZdZdZ	d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g g fdd„ZdS )Ú
UpdateListz}
    class that contains the list of available updates in
    self.pkgs[origin] where origin is the user readable string
    zPhased-Update-Percentagez/etc/machine-idz/var/lib/dbus/machine-idz+/usr/share/app-install/desktop/%s:*.desktopz-Update-Manager::Always-Include-Phased-Updatesz,Update-Manager::Never-Include-Phased-UpdatesNc                 C   s<  |r|nt  ¡ | _d| _g | _g | _g | _g | _g | _g | _	g | _
d| _t ¡ | _g | _zt| jƒ�}| ¡ | _W d   ƒ n1 sBw   Y  W n# tyk   t| jƒ�}| ¡ | _W d   ƒ n1 sdw   Y  Y nw dtjv r|tjd r|tjd }nd}dd„ | d¡D ƒ| _dtjv r–tj d¡| _nd| _i | _d S )	Nr   ÚXDG_DATA_DIRSz/usr/local/share/:/usr/share/c                 S   s   g | ]	}t j |d ¡‘qS )Úapplications)ÚosÚpathÚjoin)rQ   Úbaser   r   r   rR   ð   s    ÿz'UpdateList.__init__.<locals>.<listcomp>ú:ÚXDG_CURRENT_DESKTOPÚ )r   Úget_distÚdistÚdistUpgradeWouldDeleteÚ
oem_groupsÚupdate_groupsÚsecurity_groupsÚkernel_autoremove_groupsÚduplicate_groupsÚubuntu_pro_groupsÚubuntu_pro_fake_groupsÚnum_updatesÚrandomÚRandomÚignored_phased_updatesÚopenÚUNIQ_MACHINE_ID_FILEÚreadÚmachine_uniq_idÚFileNotFoundErrorÚUNIQ_MACHINE_ID_FILE_FALLBACKrt   ÚenvironÚsplitÚapplication_dirsÚgetÚcurrent_desktopÚdesktop_cache)r   Úparentr|   ÚfÚ	data_dirsr   r   r   r   ×   sB   
ÿ€ÿ€ÿÿ

zUpdateList.__init__c                 C   s:   |  d¡sdS tj |¡}| jD ]
}| |¡r dS qdS )Nz.desktopFT)Úendswithrt   ru   Úabspathr‘   Ú
startswith)r   Ú	file_pathÚapp_dirr   r   r   Ú_file_is_applicationù   s   


ÿzUpdateList._file_is_applicationc                 C   sJ   d}t j | ¡ ¡}t j |¡d }| ¡ r#|d7 }||jkr#|d7 }|S )Nr   é   é   )rt   ru   ÚbasenameÚget_filenameÚsplitextÚshould_showr
   )r   r^   r   ÚscoreÚdesktop_fileÚapplication_idr   r   r   Ú_rate_application_for_package  s   
z(UpdateList._rate_application_for_packagec           	      C   sò   g }g }|j D ]}|  |¡r| |¡ q|j| jv r"|| j|j 7 }|D ]=}ztj |¡}| | j	¡ W n t
yO } zt d||f ¡ W Y d }~q$d }~ww |  ||¡}|dkra| ||f¡ q$|jdd„ dd� t|ƒdkrw|d d S d S )Nz"Error loading .desktop file %s: %sr   c                 S   s   | d S )Nr   r   )Úappr   r   r   r'   ,  s    z9UpdateList._get_application_for_package.<locals>.<lambda>T)r*   Úreverserž   )Úinstalled_filesr�   rI   r
   r”   r   ÚDesktopAppInfoÚnew_from_filenameÚset_desktop_envr“   Ú	Exceptionr?   Úwarningr§   ÚsortrA   )	r   r   Údesktop_filesÚrated_applicationsÚinstalled_filer¥   r^   Úer¤   r   r   r   Ú_get_application_for_package  s:   


€ÿÿ€ý€z'UpdateList._get_application_for_packagec              	   C   s¸   |s	t  d¡ d S t|ƒdkr| j|d  }n| jd }t |¡D ]8}z| d¡d  d¡d }W n tyA   t  d| ¡ Y q!w ||v rY| j	 
|g ¡ |¡ t  d	||f ¡ q!d S )
Nz;_populate_desktop_cache called with empty list of packages.rž   r   Ú*ú/éÿÿÿÿrx   z7Could not extract package name from '%s'. File ignored.zApp candidate for %s: %s)r?   r¯   rA   ÚAPP_INSTALL_PATTERNÚglobÚiglobr�   Ú
IndexErrorÚerrorr”   rH   rI   r@   )r   Ú	pkg_namesÚpatternr¥   r   r   r   r   Ú_populate_desktop_cache2  s,   

ÿúÿ€óz"UpdateList._populate_desktop_cachec                 C   s„   | j sdS |jj}|jjD ]2}|rtj |j|j¡dkrq|jD ]\}}|j	d| j  kr>|j
dkr>|jj |¡}|r>  dS q qdS )a©   This will test if the pkg is a security update.
            This includes if there is a newer version in -updates, but also
            an older update available in -security.  For example, if
            installed pkg A v1.0 is available in both -updates (as v1.2) and
            -security (v1.1). we want to display it as a security update.

            :return: True if the update comes from the security pocket
        Fr   z%s-securityÚUbuntuT)r|   Ú_pkgÚcurrent_verÚversion_listÚaptÚapt_pkgÚversion_compareÚver_strÚ	file_listÚarchiveÚoriginÚ_pcacheÚ_listÚ
find_index)r   r   Úinst_verÚverÚverFileIterÚindexÚ	indexfiler   r   r   Ú_is_security_updateP  s(   	
ÿÿ
€ûzUpdateList._is_security_updatec                 C   sª   t jj | jd¡rdS | j|jjv rSt jj | jd¡r"t	 
d¡ dS | j d|jj|jj| jf ¡ |jj| j }| j dd¡}|t|ƒkrSt	 
d|j||f ¡ dS dS )z« This will test if the pkg is a phased update and if
            it needs to get installed or ignored.

            :return: True if the updates should be ignored
        Fz,holding back phased update per configurationTz%s-%s-%sr   éd   z'holding back phased update %s (%s < %s))rÅ   rÆ   ÚconfigÚfind_bÚALWAYS_INCLUDE_PHASED_UPDATESÚPHASED_UPDATES_KEYr>   ÚrecordÚNEVER_INCLUDE_PHASED_UPDATESr?   Úinfor†   ÚseedÚsource_nameÚversionrŒ   ÚrandintÚintr
   )r   r   Ú	thresholdÚ
percentager   r   r   Ú_is_ignored_phased_updatek  s,   ÿÿ
þÿz$UpdateList._is_ignored_phased_updateFTc                 C   sÜ  |sg S g }g }g }|D ]}	|   |	¡}
|
d ur$t|	|
||ƒ}| |¡ q| |	¡ qt|ƒD ]2}	g }|D ]}| |	||¡rJ| |¡ t|ƒdkrJ nq4t|ƒdkr`|d  |	|||¡ | |	¡ q.d }|rÓd}t 	dd 
dd„ |D ƒ¡ d ¡}td d d ||ƒ}tj|d	�}|d
dg}|D ]}	| |	j¡r›| |	j¡ q�|D ]}	|	|v r­|s­| ||	 ¡ qž|D ]"}	| |	||¡rÉ|d u rÃt|||ƒ}| |	¡ q°| t|	||ƒ¡ q°|jdd„ d� |jdd„ d� |rê| |¡ || S )Nrž   r   )zlinux$zlinux-.*-buildinfo.*zlinux-.*-dev.*zlinux-.*-generic.*zlinux-.*-headers.*zlinux-.*-hwe.*zlinux-.*-gcp.*zlinux-.*-kernel.*zlinux-.*-lowlatency.*zlinux-.*-modules.*zlinux-.*-raspi.*zlinux-.*-tools.*zlinux-.*-virtual.*zlinux-base.*zlinux-crashdump.*zlinux-doc.*ú(ú|c                 S   s   g | ]}d | ‘qS )ú^r   )rQ   Únr   r   r   rR   ¼  s    z+UpdateList._make_groups.<locals>.<listcomp>ú)rf   zubuntu-standardzubuntu-minimalc                 S   r"   r   r#   r%   r   r   r   r'   Ø  r(   z)UpdateList._make_groups.<locals>.<lambda>r)   c                 S   r"   r   r#   r%   r   r   r   r'   Ù  r(   )rµ   rZ   rI   ÚlistrO   rA   r!   ÚremoveÚreÚcompilerv   r   r   Úget_ubuntu_flavor_packageÚmatchr
   re   rd   r°   )r   r6   Úpkgsr7   r   r   Úungrouped_pkgsÚ
app_groupsÚ
pkg_groupsr   r¨   Ú	app_groupÚ
dep_groupsÚgroupÚsystem_groupÚlinux_namesÚlinux_regexpÚubuntu_base_groupÚflavor_packageÚubuntu_base_pkgsr   r   r   Ú_make_groupsŠ  s„   
ÿ
€
€
ÿÿ
ÿþ€€ÿÿÿ
zUpdateList._make_groupsc                    sŠ  g | _ | ¡ | _g }g }g }g }g }	g }
G dd„ dƒ‰ G ‡ fdd„dƒ}g }g }|D ]\}}}}|r8| |¡ q*| ||||ƒ¡ q*|D ]‹}|jsL|jr›t|jdd ƒd u r\td|j	ƒ qD|  
|¡}|so|  |¡ro| j |¡ qDt |j	d¡r{| |¡ |j	|v }|rˆ| |¡ n|r�| |¡ n| |¡ | jd | _|jr¬|js¬|js¬| j  |j	¡ qD|jrÅ|jrÅ|j |j	¡rÅ|j |j	¡sÅ|	 |¡ |j	|v rÏ|
 |¡ qD|	D ]}| ¡  qÒ|
D ]}| ¡  qÛ| jD ]}| ¡  qå|só|só|�rd	d
„ || | |	 |
 D ƒ}|  |¡ |  |||¡| _|  |||¡| _|  |||¡| _|  ||	|d¡| _|  ||
|d¡| _| j|||dd�| _|  |||¡| _d S )Nc                   @   ri   )z8UpdateList.update.<locals>.FakeUbuntuProPackageCandidatec                 S   s.   || _ || _|| _|| _|| _d| _i | _d S ©NF)rÞ   Úsummaryrm   rß   rU   ÚdownloadablerÚ   )r   rÞ   rß   rU   r   r   r   r   î  s   
zAUpdateList.update.<locals>.FakeUbuntuProPackageCandidate.__init__Nro   r   r   r   r   ÚFakeUbuntuProPackageCandidateí  rp   r  c                       s(   e Zd Z‡ fdd„Zdd„ Zdd„ ZdS )z/UpdateList.update.<locals>.FakeUbuntuProPackagec                    s0   || _ ˆ |||ƒ| _d| _d| _d| _g | _d S rþ   )r
   r>   r   r   r   rª   )r   Úpackage_namerß   rU   ©r  r   r   r   ø  s   ÿ
z8UpdateList.update.<locals>.FakeUbuntuProPackage.__init__c                 S   ó   d S r   r   r   r   r   r   Úmark_install  ó   z<UpdateList.update.<locals>.FakeUbuntuProPackage.mark_installc                 S   r  r   r   r   r   r   r   Úmark_delete  r  z;UpdateList.update.<locals>.FakeUbuntuProPackage.mark_deleteN)r   r   r   r   r  r  r   r  r   r   ÚFakeUbuntuProPackage÷  s    	r  Úoriginsz1WARNING: upgradable but no candidate.origins?!?: z
oem-*-metarž   c                 S   s   g | ]}|j ‘qS r   )r
   )rQ   Úpr   r   r   rR   J  s    z%UpdateList.update.<locals>.<listcomp>TF)r   )Ú	held_backÚsaveDistUpgrader}   rI   Úis_upgradabler   rV   r>   Úprintr
   rÔ   rä   rˆ   Úfnmatchr…   r   Úis_auto_removableÚversioned_kernel_pkgs_regexprï   Úrunning_kernel_pkgs_regexpr  Ú	mark_keeprÀ   rý   r~   r   r€   r�   r‚   r„   rƒ   )r   r6   r7   Úduplicate_packagesÚua_security_packagesÚoem_pkgsÚpro_pkgsÚsecurity_pkgsÚupgrade_pkgsÚkernel_autoremove_pkgsÚduplicate_pkgsr  Úfake_ua_packagesÚua_packages_namesr  rß   rU   r   r   Úis_security_updateÚcomes_from_pror¾   r   r  r   Úupdateß  sÌ   

ûÿÿ




ÿÿþÿý


€



ÿþýüÿ
ÿÿÿÿÿÿ
ÿzUpdateList.updater   )FT)r   r   r   Ú__doc__rÙ   rŠ   rŽ   r¹   rØ   rÛ   r   r�   r§   rµ   rÀ   rÔ   rä   rý   r   r   r   r   r   rq   ¿   s.    ÿÿ
"
ÿUÿrq   )Ú
__future__r   ÚwarningsÚfilterwarningsÚDeprecationWarningr   rg   rÅ   r  r?   rE   rt   r†   rº   rì   Úgi.repositoryr   ÚUpdateManager.Corer   r   r   rZ   rd   re   rj   rq   r   r   r   r   Ú<module>   s.   ÿa
