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 rt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 }|rd}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 rt|||}||	 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rt|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
