U
    XXbµÓ  ã                   @   s’  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Zd dl	Z	d dl
Z
d dlmZmZ ddlmZ ddlmZ ddlmZ G dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZdd„ Zeƒ \ZZG dd„ deƒZG dd„ deƒZG dd„ de jƒZe dkrŽd dl!Z!ddl"m#Z# ddl$m$Z$ e%dƒ ee#dƒe$ƒ dƒZ&e%e& '¡ ƒ e! (¡  e& )¡  e& *¡  e&j+ e& ,dg¡ e%e& -¡ ƒ e& .¡  dS )é    N)ÚPopenÚPIPEé   )Úgettext)Úngettext)Úinside_chrootc                   @   s   e Zd ZdS )ÚCacheExceptionN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú>/usr/lib/python3/dist-packages/DistUpgrade/DistUpgradeCache.pyr   (   s   r   c                   @   s   e Zd ZdS )ÚCacheExceptionLockingFailedNr	   r   r   r   r   r   ,   s   r   c                   @   s   e Zd ZdS )ÚCacheExceptionDpkgInterruptedNr	   r   r   r   r   r   0   s   r   c                  C   sà   d} d}t  ¡ d }t d| ¡D ]`}|d| krD|t j |¡7 }q"| d¡dks"| d¡dks"| d¡dkrrq"q"| t j |¡7 } q"| dkršt d¡ d	} |dkr°t d
¡ d}| d7 } d}|d |krÐ|d }||7 }| |fS )zjestimate the amount of space used by the kernel and initramfs in /boot,
    including a safety margin
    r   é   z
/boot/*%s*z/boot/initrd.img-%sz
initrd.imgz.bakz.dpkg-z>estimate_kernel_initrd_size_in_boot() returned '0' for kernel?i   z>estimate_kernel_initrd_size_in_boot() returned '0' for initrd?i  @i   gš™™™™™©?)ÚosÚunameÚglobÚpathÚgetsizeÚfindÚloggingÚwarning)ZkernelZinitrdZkverÚfZinitrd_bufferr   r   r   Ú#estimate_kernel_initrd_size_in_boot4   s6    ÿÿÿr   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚFreeSpaceRequiredzÁ FreeSpaceRequired object:

    This exposes:
    - the total size required (size_total)
    - the dir that requires the space (dir)
    - the additional space that is needed (size_needed)
    c                 C   s   || _ || _|| _d S ©N)Ú
size_totalÚdirÚsize_needed)Úselfr   r   r    r   r   r   Ú__init__`   s    zFreeSpaceRequired.__init__c                 C   s   d| j | j| jf S )Nz@FreeSpaceRequired Object: Dir: %s size_total: %s size_needed: %s)r   r   r    ©r!   r   r   r   Ú__str__d   s    zFreeSpaceRequired.__str__N)r
   r   r   Ú__doc__r"   r$   r   r   r   r   r   X   s   r   c                   @   s   e Zd ZdZdd„ ZdS )ÚNotEnoughFreeSpaceErrorzI
    Exception if there is not enough free space for this operation

    c                 C   s
   || _ d S r   )Úfree_space_required_list)r!   r'   r   r   r   r"   m   s    z NotEnoughFreeSpaceError.__init__N©r
   r   r   r%   r"   r   r   r   r   r&   h   s   r&   c                   @   sø  e Zd ZdZdZdsdd„Zdd„ Zed	d
„ ƒZdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd „ Zdtd!d"„Zd#d$„ Zdud%d&„Zdvd'd(„Zdwd)d*„Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zdxd:d;„Z dyd<d=„Z!dzd>d?„Z"d{d@dA„Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,edTdU„ ƒZ-dVdW„ Z.dXdY„ Z/edZd[„ ƒZ0d\d]„ Z1d^d_„ Z2d`da„ Z3dbdc„ Z4eddde„ ƒZ5dfdg„ Z6dhdi„ Z7djdk„ Z8dldm„ Z9dndo„ Z:d|dqdr„Z;dS )}ÚMyCacher   é   NTc              
   C   s0  g | _ g | _|| _|| _d| _d| _|| _| j dd¡| _d| _	|ržzt
 ¡  |  ¡  d| _W n> tk
rœ } z dt|ƒkr„t|ƒ‚t|ƒ‚W 5 d }~X Y nX tj | |¡ | dd¡| _| j | d¡| _tdd	gtdd
 ¡ d  ¡ | _|  ¡  | dd¡dkrdtj krt
j !dd¡ t
j !dd¡ d S )NFÚDistroÚMetaPkgséÿÿÿÿTzdpkg --configure -aZRemovalBlacklistFiler   z-r)ÚstdoutZuniversal_newlinesr   ZSourcesZFromZhardyZRELEASE_UPGRADE_NO_RECOMMENDSzAPT::Install-RecommendsÚtruez"APT::AutoRemove::SuggestsImportantZfalse)"Ú
to_installÚ	to_removeÚviewÚquirksÚlockÚpartialUpgradeÚconfigÚgetlistÚmetapkgsÚ
_listsLockÚapt_pkgÚpkgsystem_lockÚlock_lists_dirÚSystemErrorÚstrr   r   ÚaptÚCacher"   ZgetListFromFileÚremoval_blacklistZ_get_linux_metapackageÚlinux_metapackager   r   ÚcommunicateÚstripr   Ú_initAptLogÚgetr   ÚenvironÚset)r!   r6   r2   r3   Zprogressr4   Úer   r   r   r"   v   s@    

ÿÿ
ÿzMyCache.__init__c                 C   s2   | D ](}|j rq|jjtjkr|jddd qdS )z! honor the dselect install state F)Ú	auto_instÚauto_fixN)Úis_installedÚ_pkgZselected_stater:   ZSELSTATE_INSTALLÚmark_install©r!   Úpkgr   r   r   Ú_apply_dselect_upgrade   s
    zMyCache._apply_dselect_upgradec                 C   sJ   t ƒ }| D ]:}|jr|jjs
|jj| jks8|jj| jkr
| |j¡ q
|S )zB return the packages not downloadable packages in reqreinst state )	rH   Ú	candidateÚdownloadablerM   Z
inst_stateÚ	ReInstReqÚHoldReInstReqÚaddÚname)r!   Ú	reqreinstrP   r   r   r   Úreq_reinstall_pkgs¦   s    þýzMyCache.req_reinstall_pkgsc                 C   s€   | j }t|ƒdkr|tddt|ƒƒ}tddt|ƒƒd |¡ }| ||¡r||  ¡  ddd	gt|ƒ }| ¡  |¡ |  	¡  d
S dS )z/ check for reqreinst state and offer to fix it r   zRemove package in bad statezRemove packages in bad statez¡The package '%s' is in an inconsistent state and needs to be reinstalled, but no archive can be found for it. Do you want to remove this package now to continue?z§The packages '%s' are in an inconsistent state and need to be reinstalled, but no archives can be found for them. Do you want to remove these packages now to continue?ú, z/usr/bin/dpkgz--removez--force-remove-reinstreqTF)
rY   Úlenr   ÚjoinZaskYesNoQuestionÚrelease_lockÚlistZgetTerminalÚcallÚget_lock)r!   r2   rX   ÚheaderZsummaryÚcmdr   r   r   Úfix_req_reinst²   s&    þö
özMyCache.fix_req_reinstc                 C   s¾   | j  ddd¡}tj |¡s&t |¡ tj  d|¡ tj  dd¡ t tj 	|d¡tj
tjB tjB d¡| _tj ¡ }d	| }t | j| d
¡¡ tj  dd¡ tj  dd¡ tj  dd¡ dS )z init logging, create log fileZFilesZLogDirz/var/log/dist-upgradezDir::LogzDir::Log::Terminalzapt-term.logzapt.logi¤  zLog time: %s
zutf-8zDebug::pkgProblemResolverr/   zDebug::pkgDepCache::MarkerzDebug::pkgDepCache::AutoInstallN)r6   ÚgetWithDefaultr   r   ÚexistsÚmakedirsr:   rH   Úopenr\   ÚO_RDWRÚO_CREATÚO_APPENDÚlogfdÚdatetimeÚnowÚwriteÚencode)r!   Zlogdirrm   ra   r   r   r   rE   Í   s"    
ÿ
 ÿ
zMyCache._initAptLogc                 C   sZ   t | dƒr"t | j¡ t | j¡ t d¡| _t d¡| _t | jd¡ t | jd¡ d S )NÚ
old_stdoutr   r   )Úhasattrr   Úcloserp   Ú
old_stderrÚdupÚdup2rk   r#   r   r   r   Ú_startAptResolverLogß   s    
zMyCache._startAptResolverLogc                 C   s4   t  d¡ t  d¡ t  | jd¡ t  | jd¡ d S )Nr   r   )r   Úfsyncru   rp   rs   r#   r   r   r   Ú_stopAptResolverLogç   s    

zMyCache._stopAptResolverLogc                    s   ‡ fdd„}|S )z3 decorator to ensure that the apt output is logged c                     s&   | d   ¡  ˆ | |Ž}| d  ¡  |S ©Nr   )rv   rx   )ÚargsÚkwargsÚres©r   r   r   Úwrapperñ   s    
z(MyCache.withResolverLog.<locals>.wrapperr   )r   r~   r   r}   r   ÚwithResolverLogï   s    zMyCache.withResolverLogc                 C   s,   t  | j¡}t  ¡ }| || j| j¡ |jS )z< get the size of the packages that are required to download )r:   ZPackageManagerÚ	_depcacheZAcquireZget_archivesÚ_listÚ_recordsZfetch_needed)r!   ZpmZfetcherr   r   r   Úrequired_downloadù   s    zMyCache.required_downloadc                 C   s   | j jS )z9 get the size of the additional required space on the fs )r€   Zusr_sizer#   r   r   r   Úadditional_required_space   s    z!MyCache.additional_required_spacec                 C   s&   z
| j jW S  tk
r    Y dS X dS )z< get the extra size needed to install the snap replacements r   N)r3   Zextra_snap_spaceÚAttributeErrorr#   r   r   r   Ú#additional_required_space_for_snaps  s    
z+MyCache.additional_required_space_for_snapsc                 C   s   | j jdkS )z is the cache broken r   )r€   Zbroken_countr#   r   r   r   Ú	is_broken  s    zMyCache.is_brokenc                 C   s:   t j d¡d }t  |¡| _| jdk r6d| }t|ƒ‚d S )NzDir::State::Listsr4   r   zCan not lock '%s' )r:   r6   Úfind_dirr`   r9   r   )r!   rW   rI   r   r   r   r<     s
    
zMyCache.lock_lists_dirc                 C   s    | j dkrt | j ¡ d| _ d S )Nr   r-   )r9   r   rr   r#   r   r   r   Úunlock_lists_dir  s    
zMyCache.unlock_lists_dirc                 C   sH   |   ¡  tj | |¡}|  ¡  |r4|jr4ttdƒƒ‚|dkrDtdƒ‚dS )zf
        our own update implementation is required because we keep the lists
        dir lock
        zThe server may be overloadedFzAapt.cache.update() returned False, but did not raise exception?!?N)r‰   r?   r@   Úupdater<   Zrelease_file_download_errorÚIOErrorÚ_)r!   Ú	fprogressr|   r   r   r   rŠ   "  s    
zMyCache.updatec                 C   s,   t  d¡ | jr|  ¡  tj | ||¡ d S )Nzcache.commit())r   Úinfor4   r]   r?   r@   Úcommit)r!   r   Z	iprogressr   r   r   r   1  s    
zMyCache.commitc              
   C   sN   | j rJzt ¡  d| _ W n0 tk
rH } zt d| ¡ W 5 d }~X Y nX d S )NFzfailed to SystemUnLock() (%s) )r4   r:   Zpkgsystem_unlockr=   r   Údebug©r!   ZpkgSystemOnlyrI   r   r   r   r]   7  s    
zMyCache.release_lockc              
   C   sN   | j sJzt ¡  d| _ W n0 tk
rH } zt d| ¡ W 5 d }~X Y nX d S )NTzfailed to SystemLock() (%s) )r4   r:   r;   r=   r   r   r‘   r   r   r   r`   ?  s    
zMyCache.get_lockc                 C   sB   |r| j  |j¡}n|jj}|dkr<t d|j|f ¡ dS |jS )z* check if the given pkg can be downloaded Nz1no version information for '%s' (useCandidate=%s)F)r€   Úget_candidate_verrM   Zcurrent_verr   r   rW   rS   )r!   rP   ZuseCandidateÚverr   r   r   rS   G  s    zMyCache.downloadablec                 C   s   |j o| j |j¡S )z$ check if the pkg is auto-removable )rL   r€   Ú
is_garbagerM   rO   r   r   r   Úpkg_auto_removableR  s    ÿzMyCache.pkg_auto_removablec                 C   s
   | j  ¡ S )z^ try to fix broken dependencies on the system, may throw
            SystemError when it can't)r€   Ú
fix_brokenr#   r   r   r   r–   W  s    zMyCache.fix_brokenc                 C   sL   g | _ g | _|  ¡ D ]2}|js$|jr2| j  |j¡ |jr| j |j¡ qdS )z* create a snapshot of the current changes N)r0   r1   Úget_changesÚmarked_installÚmarked_upgradeÚappendrW   Úmarked_deleterO   r   r   r   Úcreate_snapshot\  s    zMyCache.create_snapshotc                 C   s   | j  ¡  d S r   )r€   Zinitr#   r   r   r   Úclearf  s    zMyCache.clearc                 C   sZ   t  | j¡}| |  ¡  | jD ]}| | }| ¡  q| jD ]}| | }|jddd q:dS )z restore a snapshot F)rK   rJ   N)r:   ÚActionGroupr€   r   r1   Úmark_deleter0   rN   )r!   ÚactiongrouprW   rP   r   r   r   Úrestore_snapshoti  s    


zMyCache.restore_snapshotc                 C   s’   | j  dd¡}|D ]p}|| kr<| | jr<t d| ¡  dS d}| j  |d¡D ]}||| kod| | jM }qN|rt d| ¡  dS qt d¡ dS )	ac  
        This checks if we run on a desktop or a server install.

        A server install has more freedoms, for a desktop install
        we force a desktop meta package to be install on the upgrade.

        We look for a installed desktop meta pkg and for key
        dependencies, if none of those are installed we assume
        server mode
        r+   r,   z@need_server_mode(): run in 'desktop' mode, (because of pkg '%s')FTÚKeyDependencieszIneed_server_mode(): run in 'desktop' mode, (because of key deps for '%s')z[need_server_mode(): can not find a desktop meta package or key deps, running in server mode)r6   r7   rL   r   r   )r!   r8   ÚkeyÚ
deps_foundrP   r   r   r   Úneed_server_modew  s    
zMyCache.need_server_modec                 C   sL   | j rHzt d¡ |  ¡  W n* tk
rF   | tdƒtdƒ¡ Y dS X dS )zY check if the cache is ok and if the required metapkgs
            are installed
        z$Have broken pkgs, trying to fix themzBroken packagesz’Your system contains broken packages that couldn't be fixed with this software. Please fix them first using synaptic or apt-get before proceeding.FT)r‡   r   r   r–   r=   ÚerrorrŒ   )r!   r2   r   r   r   Úsanity_check•  s    

ÿzMyCache.sanity_checkÚ c                 K   sT   t  d||f ¡ || krP| | jf |Ž | | jsP| | jsPt  d| ¡ dS dS )NzInstalling '%s' (%s)z Installing/upgrading '%s' failedFT)r   r   rN   r˜   r™   r¦   ©r!   rP   ÚreasonÚflagsr   r   r   rN   §  s    zMyCache.mark_installc                 C   sP   t  d||f ¡ || krL| | jrL| |  ¡  | | jsLt  d| ¡ dS dS )NzUpgrading '%s' (%s)zUpgrading '%s' failedFT)r   r   rL   Úmark_upgrader™   r¦   ©r!   rP   rª   r   r   r   r¬   ±  s    
zMyCache.mark_upgradec                 K   s.   t  d||f ¡ || kr*| | jf |Ž d S )NzRemoving '%s' (%s))r   r   rŸ   r©   r   r   r   Úmark_removeº  s    zMyCache.mark_removec                 C   s2   t  d||f ¡ || kr.| j | | jd¡ d S )NzPurging '%s' (%s)T)r   r   r€   rŸ   rM   r­   r   r   r   Ú
mark_purge¿  s    zMyCache.mark_purgec                 C   s,   || kr(| | j r(| | jr(|  ||¡ d S r   )rL   r›   rN   )r!   Úpkgnamerª   r   r   r   Ú_keep_installedÄ  s    ÿþzMyCache._keep_installedc              	   C   sh  | j  dd¡D ]}|  |d¡ q| jD ]D}|| kr&| | jsF| | jr&| j  |d¡D ]}|  |d| ¡ qTq&| j  dd¡dkrdt d¡ | j  dd	¡D ]@}| D ]6}|j	r |j	j
r |jr |j	j|kr |  |jd
| ¡ q q˜| jD ]‚}|| krà| | js| | jrà| j  |d	¡D ]P}| D ]D}|j	r|j	j
r|jr|j	j|kr|  |jd||f ¡ qqqàdS )z[ run after the dist-upgrade to ensure that certain
            packages are kept installed r+   ZKeepInstalledPkgszDistro KeepInstalledPkgs rulez%s KeepInstalledPkgs ruleÚOptionsZwithNetworkÚTruez"Running KeepInstalledSection rulesÚKeepInstalledSectionz$Distro KeepInstalledSection rule: %sz %s KeepInstalledSection rule: %sN)r6   r7   r±   r8   rL   r˜   rF   r   r   rR   rS   r›   ÚsectionrW   )r!   r°   r£   rµ   rP   r   r   r   Úkeep_installed_ruleÊ  s<    
ÿ
ÿ
þ
ÿÿ
þzMyCache.keep_installed_rulec                 C   s   | j s| j d¡ dS )z. run before the upgrade was done in the cache ZPreDistUpgradeCacheN)r5   r3   Úrunr#   r   r   r   Úpre_upgrade_ruleí  s    zMyCache.pre_upgrade_rulec                 C   s¼   d| j fd| jfd| jfd| jffD ]€\}}| j dd| ¡D ]}||d| ƒ q>| jD ]J}|| krX| | jsx| | jrX| j |d| ¡D ]}||d||f ƒ qŠqXq$| j	s¸| j
 d	¡ d
S )z- run after the upgrade was done in the cache ZInstallZUpgradeZRemoveZPurger+   zPostUpgrade%szDistro PostUpgrade%s rulez%s PostUpgrade%s ruleZPostDistUpgradeCacheN)rN   r¬   r®   r¯   r6   r7   r8   rL   r˜   r5   r3   r·   )r!   ZruleÚactionrP   r£   r   r   r   Úpost_upgrade_ruleó  s    ý
ÿzMyCache.post_upgrade_rulec              
   C   sD  t  d¡ zddlm} W n: ttfk
rT } zt  d| ¡ W Y ¢dS d}~X Y nX z¶|dd}|jD ]&}|| krh| | jrh|  	|d	¡  q qht  
d
¡ W dS | ¡ }t  d| ¡ || krÒt  d| ¡ W dS | | js
| | js
| |  ¡  t  
d| ¡ W dS W n2 tk
r> } zt  d| ¡ W 5 d}~X Y nX dS )zR
        this checks for nvidia hardware and checks what driver is needed
        znvidiaUpdate()r   )ÚNvidiaDetectionz%NvidiaDetector can not be imported %sFNz./ubuntu-drivers-obsolete.pkgs)Zobsoletezold nvidia driverz1no old nvidia driver installed, installing no newznv.selectDriver() returned '%s'zno '%s' foundz,installing %s as suggested by NvidiaDetectorTz$NvidiaDetection returned a error: %s)r   r   ZNvidiaDetector.nvidiadetectorr»   ÚImportErrorÚSyntaxErrorr¦   ZoldPackagesrL   r®   rŽ   ZselectDriverr   r˜   r™   rN   Ú	Exception)r!   r»   rI   ZnvZ	oldDriverZdriverr   r   r   ÚcheckForNvidia  s4    




 zMyCache.checkForNvidiac                 C   s&   | D ]}|j  d¡r|jr dS qdS )Nzlinux-headers-TF)rW   Ú
startswithrL   rO   r   r   r   Ú_has_kernel_headers_installed/  s    ÿz%MyCache._has_kernel_headers_installedc              
   C   sŠ   t  d| j ¡ z| j d¡\}}}W n6 tk
r\ } zt  d| ¡ W Y ¢dS d}~X Y nX tdgtd ¡ d }d	|kr†t  d
¡ dS )zd check for the running kernel and try to ensure that we have
            an updated version
        zKernel uname: '%s' ú-z/Can't parse kernel uname: '%s' (self compiled?)FNÚdmesg)r.   r   s   WARNING: NR_CPUS limitzUP kernel on SMP system!?!T)	r   r   r   Úsplitr¾   r   r   r   rC   )r!   ÚversionZbuildZflavourrI   rÃ   r   r   r   ÚcheckForKernel6  s    
zMyCache.checkForKernelc                 C   sœ   d}| j  dd¡}| D ]€}|jj |j¡}|rJ|jdkrJt d|j	 ¡ q|j
r|j
jr|js|js|j	|krd|j	kr|j
j|kr|  |j	d| ¡ qd S )N)Zrequiredr+   ÚRemoveEssentialOkr   zPackage %s has no priority setú:z;priority in required set '%s' but not scheduled for install)r6   r7   Ú_pcacher€   r’   rM   Zpriorityr   r¦   rW   rR   rS   rL   r˜   rN   )r!   ÚneedÚremoveEssentialOkrP   r“   r   r   r   ÚcheckPriorityF  s&    ÿÿþü
ûzMyCache.checkPriorityc                 C   sT   d}|  ¡ r<|d dkr | ¡  | ¡  t d¡ |d7 }q|jdd | ¡  d S )Nr   é   g{®Gáz”?r   T)Zfinished)ÚlockedZpulseProgressÚprocessEventsÚtimeÚsleep)r!   r2   r4   Úir   r   r   Ú	updateGUI[  s    

zMyCache.updateGUIc              
   C   sn  t  ¡ }| ¡  t j| j| j|fd}| ¡  zˆz–|  	¡  |  
d¡ |  ¡  |  ¡  tƒ rht d¡ n|  ¡  |  ¡  |  ¡  |  |¡ |s˜|  |¡ |  ¡  | jrÆttdƒd dd„ | D ƒ¡ ƒ‚W nì tk
r´ } zÌtdƒ}| j d	d
¡dkr|tdƒ7 }n4| j d	d
¡dkr:| j d	d¡dkr:|tdƒ7 }|rN|tdƒ7 }n|tdƒ7 }|tdƒ7 }|  ¡  | tdƒ|¡ t|ƒ}t d|¡ |  ¡  W Y ¢W ¢dS d }~X Y nX W 5 | ¡  | ¡  X g }	g }
|  ¡ D ]Æ}|j rìqÜ|j!rl|
 "|j#¡ |j$j%D ]^}t& '|j(|j)j*¡dk r|j+D ]8\}}|j,j- .|¡}|r*|j/s*|	 "|j#¡  qq*qqÜ|j0j1}d}|D ]}||j2O }q||sÜ|	 "|j#¡ qÜz(| j 3dd¡}|rÊt d¡ W dS W n t4j5k
rä   Y nX t6|
ƒdkr|
 7¡  t dd |
¡ ¡ t6|	ƒdkrj|	 7¡  t dd |	¡ ¡ |  ¡  | tdƒtdƒd |	¡¡ |  ¡  dS dS ) N)Útargetrz   Tz5skipping kernel checks because we run inside a chrootz!Broken packages after upgrade: %srZ   c                 s   s    | ]}|j s|jr|jV  qd S r   )Zis_inst_brokenZis_now_brokenrW   )Ú.0Úpr   r   r   Ú	<genexpr>”  s       z&MyCache.distUpgrade.<locals>.<genexpr>zBAn unresolvable problem occurred while calculating the upgrade.

 r²   ZforeignPkgsr³   zÓThis was likely caused by:
 * Unofficial software packages not provided by Ubuntu
Please use the tool 'ppa-purge' from the ppa-purge 
package to remove software from a Launchpad PPA and 
try the upgrade again.

ÚFalseZ
devReleasez†This was caused by:
 * Upgrading to a pre-release version of Ubuntu
This is most likely a transient problem, 
please try again later.
z@This is most likely a transient problem, please try again later.z€If none of this applies, then please report this bug using the command 'ubuntu-bug ubuntu-release-upgrader-core' in a terminal. z©If you want to investigate this yourself the log files in '/var/log/dist-upgrade' will contain details about the upgrade. Specifically, look at 'main.log' and 'apt.log'.zCould not calculate the upgradezDist-upgrade failed: '%s'Fr   r+   ZAllowUnauthenticatedzAllowUnauthenticated set!z!Packages to downgrade found: '%s'ú z$Unauthenticated packages found: '%s'z"Error authenticating some packagesz®It was not possible to authenticate some packages. This may be a transient network problem. You may want to try again later. See below for a list of unauthenticated packages.Ú
)8Ú	threadingZLockÚacquireZThreadrÓ   r2   ÚstartÚreleaser\   r¸   ZupgraderÌ   r¶   r   r   r   rÆ   r¿   rº   Ú_keepBaseMetaPkgsInstalledÚ_installMetaPkgsÚ_verifyChangesr‡   r=   rŒ   r6   rF   rx   r¦   r>   rv   r—   r›   Zmarked_downgraderš   rW   rM   Úversion_listr:   Zversion_compareZver_strÚ	installedrÅ   Ú	file_listrÉ   r   Z
find_indexZ
is_trustedrR   ÚoriginsÚtrustedÚ
getbooleanÚconfigparserÚNoOptionErrorr[   Úsort)r!   r2   Z
serverModer5   r4   ÚtrI   ZdetailsZ	error_msgZ	untrustedZ	downgraderP   r“   ZverFileIterÚindexZ	indexfilerå   ræ   ÚoriginÚbr   r   r   ÚdistUpgradef  s¶    


$ÿ 
 ÿÿ

ÿÿ
ûzMyCache.distUpgradec                 C   s  t j d¡}| j dd¡}|  ¡ D ]‚}|jrX|  |j¡rXt 	d|j¡ t
tdƒ|j ƒ‚|jr"|jjdkr"|jj|dfkr"|j|kr"t 	d|j¡ t
td	ƒ|j ƒ‚q"| j dd
¡}|D ]Z}| d¡\}}|| kr¸| | jr¸| | jj|kr¸| | js| | jr¸t
tdƒ| ƒ‚q¸dS )zx this function tests if the current changes don't violate
            our constrains (blacklisted removals etc)
        zAPT::Architecturer+   rÇ   zHThe package '%s' is marked for removal but it's in the removal blacklistzJThe package '%s' is marked for removal but it is in the removal blacklist.TÚallzDThe package '%s' is marked for removal but it's an ESSENTIAL packagez1The essential package '%s' is marked for removal.ZBadVersionsrŒ   z*Trying to install blacklisted version '%s')r:   r6   r   r7   r—   r›   Ú_inRemovalBlacklistrW   r   r   r=   rŒ   rM   Z	essentialrã   ZarchitecturerÄ   rR   rÅ   r˜   r™   )r!   Z	main_archrË   rP   ZbadVersionsZbvr°   r“   r   r   r   rá   û  s6    
ÿþýÿþýzMyCache._verifyChangesc                 C   sn   |j j |j¡}|dkr(td|jƒ dS |jdkrHtd| j ¡  ƒ dS |j d¡\}}|j j 	||f¡ dS )a  
        helper to make sure that the pkg._records is pointing to the right
        location - needed because python-apt 0.7.9 dropped the python-apt
        version but we can not yet use the new version because on upgrade
        the old version is still installed
        NzNo candidate ver: FzNo file_list for: %s r   T)
rÉ   r€   r’   rM   ÚprintrW   rä   Úpopr‚   Úlookup)r!   rP   r“   r   rì   r   r   r   Ú_lookupPkgRecord  s    
zMyCache._lookupPkgRecordc           	      C   sð   i }t ƒ }| D ]†}|  |¡s.t d|j ¡ q|jjj d¡D ]T}| 	d¡r>|t
dƒd …  d¡D ].}| ¡ }||kr€t ƒ ||< ||  |j¡ qbq>q|D ]P}d}| j dd¡}||kr¼d}|| D ]}| | jsÄd} qÜqÄ|rš| |¡ qš|S )	Nz&no PkgRecord found for '%s', skipping rÚ   úTask:ú,Tr+   ZIgnoredTasksF)rH   rõ   r   r   rW   rÉ   r‚   ÚrecordrÄ   rÀ   r[   rD   rV   r6   r7   rL   )	r!   ÚtasksZinstalled_tasksrP   ÚlineÚtaskrã   Zignored_tasksr°   r   r   r   ÚinstalledTasks)  s2    



zMyCache.installedTasksc                 C   s®   t  d¡ | D ]š}|js|jr q|  |¡ t|jjdƒrB|jjjsTt  	d|j
 ¡ q|jjj d¡D ]B}| d¡rd|tdƒd …  d¡D ]}| ¡ }||krˆ| ¡  qˆqdqdS )Nzrunning installTasksrø   zcan not find Record for '%s'rÚ   rö   r÷   T)r   r   r˜   rL   rõ   rq   rÉ   r‚   rø   r   rW   rÄ   rÀ   r[   rD   rN   )r!   rù   rP   rú   rû   r   r   r   ÚinstallTasksE  s    


zMyCache.installTasksc                 C   s$   | j  dd¡D ]}|  |d¡ qd S )Nr+   ÚBaseMetaPkgsz%base meta package keep installed rule)r6   r7   r±   )r!   r2   rP   r   r   r   rß   V  s    z"MyCache._keepBaseMetaPkgsInstalledc                    sâ  ‡ ‡fdd„}ˆj  dd¡‰ ˆj  dd¡D ]}ˆ|  ¡  q*ˆ D ]t}z:|ˆkr|ˆ| jr|ˆ| jr|t d| ¡ ˆ|  ¡  W q@ tk
r² } zt 	d||f ¡ W 5 d }~X Y q@X q@|ƒ s t dˆ  ¡ ˆ D ]Î}d	}ˆj  |d
¡D ]}||ˆkoüˆ| jM }qæ|rÐt d| ¡ zˆ|  ¡  W nZ tt
fk
r~ } z6t d||f ¡ | tdƒ| tdƒ¡ W Y ¢ dS d }~X Y nX t d|ˆ| jf ¡  q qÐ|ƒ sÞd ˆ dd… ¡}| tdƒtdƒ|ˆ d f ¡ dS d	S )Nc                     sV   ˆ D ]L} | ˆkrˆ|  }|j r4|jr4t d|j ¡ |j r@|jrJˆ|  jr dS qdS )zy
            internal helper that checks if at least one meta-pkg is
            installed or marked install
            z(metapkg '%s' installed but marked_deleteTF)rL   r›   r   r   rW   r˜   )r£   rP   ©r8   r!   r   r   ÚmetaPkgInstalled\  s    ÿz2MyCache._installMetaPkgs.<locals>.metaPkgInstalledr+   r,   rþ   zMarking '%s' for upgradez Can't mark '%s' for upgrade (%s)z$none of the '%s' meta-pkgs installedTr¢   z!guessing '%s' as missing meta-pkgz$failed to mark '%s' for install (%s)zCan't install '%s'z‹It was impossible to install a required package. Please report this as a bug using 'ubuntu-bug ubuntu-release-upgrader-core' in a terminal.Fzmarked_install: '%s' -> '%s'rZ   r   r-   zCan't guess meta-packagez×Your system does not contain a %s or %s package and it was not possible to detect which version of Ubuntu you are running.
 Please install one of the packages above first using synaptic or apt-get before proceeding.)r6   r7   rN   rL   Zis_upgradabler   r   r¬   r=   r   ÚKeyErrorr¦   rŒ   r˜   r\   )r!   r2   r   rP   r£   rI   r¤   Z	meta_pkgsr   rÿ   r   rà   Z  sX    ÿþ&ÿÿ

ùÿ	zMyCache._installMetaPkgsc                 C   s8   | j D ],}t |¡ |¡rt d||f ¡  dS qdS )Nz blacklist expr '%s' matches '%s'TF)rA   ÚreÚcompileÚmatchr   r   )r!   r°   Úexprr   r   r   rñ   ¦  s
    
zMyCache._inRemovalBlacklistc           
   
   C   sÜ  |  | j¡rt d| ¡ dS || jkr:t d| ¡ dS |  |¡rVt d| ¡ dS | j dd¡D ]:}|| krd| | jrd| | jj	|krdt d| ¡  dS qd|| kr¬dS z| j 
dd	¡}W n tjk
rØ   d}Y nX t | j¡}| |  ¡  z–| | j|d
 | j ¡  ||krW dS |  ¡ D ]^}|j|ks^|j|ks^|  |j¡s^|j| jkr&t d||jf ¡ |  ¡   W dS q&W nN ttfk
rÖ }	 z*t d|t|	ƒ|	f ¡ |  ¡  W Y ¢dS d }	~	X Y nX dS )Nz skipping running kernel pkg '%s'Fz skipping kernel metapackage '%s'z#skipping '%s' (in removalBlacklist)r+   r´   z'skipping '%s' (in KeepInstalledSection)TZPurgeObsoletes)Úpurgez8package '%s' produces an unwanted removal '%s', skippingz3_tryMarkObsoleteForRemoval failed for '%s' (%s: %s))Úendswithr   r   r   rB   rñ   r6   r7   rã   rµ   rç   rè   ré   r:   rž   r€   rœ   rŸ   r2   rÏ   r—   rW   r¡   r=   r  r   Úrepr)
r!   r°   Zremove_candidatesZforced_obsoletesÚforeign_pkgsrµ   r  r    rP   rI   r   r   r   ÚtryMarkObsoleteForRemoval­  sZ    

ÿ


ÿ
þ
ýz!MyCache.tryMarkObsoleteForRemovalc                 C   s0   t ƒ }| D ] }|jr
|  |¡s
| |j¡ q
|S ©z1 get all package names that are not downloadable )rH   rL   ÚanyVersionDownloadablerV   rW   )r!   Zobsolete_pkgsrP   r   r   r   Ú_getObsoletesPkgsç  s    
zMyCache._getObsoletesPkgsc                 C   s   |j jD ]}|jr dS qdS )zA helper that checks if any of the version of pkg is downloadable TF)rM   râ   rS   )r!   rP   r“   r   r   r   r  ô  s    zMyCache.anyVersionDownloadablec                 C   s4   t ƒ }| D ]$}|jr
| j |j¡r
| |j¡ q
|S r  )rH   rL   r€   r”   rM   rV   rW   )r!   Zunused_dependenciesrP   r   r   r   Ú_getUnusedDependenciesû  s
    zMyCache._getUnusedDependenciesc              	   C   s¦   t ƒ }| j dd¡}tj |¡rVt|ƒ(}|D ]}| d¡s.| | 	¡ ¡ q.W 5 Q R X t ƒ }|D ]<}|| krnq`| | }|j
r`| j |j¡s`|jr’q`| |¡ q`t|ƒS )zƒ return list of installed and demoted packages

            If a demoted package is a automatic install it will be skipped
        r+   Z	Demotionsú#)rH   r6   rF   r   r   re   rg   rÀ   rV   rD   rL   r€   Zis_auto_installedrM   r›   r^   )r!   Z	demotionsZdemotions_fileZdemotions_frú   Zinstalled_demotionsZdemoted_pkgnamerP   r   r   r   Úget_installed_demoted_packages  s(    

ÿþz&MyCache.get_installed_demoted_packagesc                 C   s~   t ƒ }| D ]n}|jr
|  |¡r
|js&q
d}|jjD ]4}||jkrN|j|krNd}||jkr2|j|kr2d}q2|r
| |j¡ q
|S )zm get all packages that are installed from a foreign repo
            (and are actually downloadable)
        TF)	rH   rL   rS   rR   rå   Úarchiverí   rV   rW   )r!   Zallowed_originZfromDistZtoDistr	  rP   Zforeignrí   r   r   r   Ú_getForeignPkgs  s$    
ÿ
ÿzMyCache._getForeignPkgsFc                    sh  G dd„ dt ƒ}‡ fdd„}g ‰ i }i }tdƒx}|D ]l}z| ¡ \}}	}
}}}W n< tk
rŽ } zt d||f ¡ W Y ¢q6W 5 d}~X Y nX |	ˆ kr6ˆ  |	¡ q6W 5 Q R X ˆ jtdd	 t	j
 d
¡}d}t| dƒr| j
 ddd¡r| j
 dd¡}tj |¡st |¡ t d| ¡ dddd||ddfD ]ª}tj |¡}||ƒ}tj |¡rpt |¡}|j|j }nt d| ¡ d}||kr´t d||| f ¡ |||  ||< n&t d||f ¡ |||< ||ƒ||< q2~t d| ¡ d}| D ]B}t d|j¡rö|js|jröt d|jtf ¡ |d7 }qö|t |d t  }d}t| dƒr°| j
 ddd¡r°t d ¡ | j
 dd¡}| D ]"}|js |jrŒ||jj 7 }qŒd}|rø| D ]*}|j!r¾|jsÚ|j"r¾||j#j 7 }q¾t d!| ¡ || j$fd| j%fd| j&fd"d|fd#d$||fd|ff	D ]h\}}|dk rBq,tj |¡}t d%|||| || j'f ¡ ||  j'|8  _'||  j(|7  _(q,i }|D ]Ž}|| j'dk ržt	 )t*t+|| j'ƒd ƒ¡}t,|t-ƒrè| .t/ 0¡ ¡}t	 )|| j(¡}t,|t-ƒr| .t/ 0¡ ¡}t1|||ƒ|ƒ|||ƒ< qžt|ƒdkrdt 2d&d'd(„ |D ƒ ¡ t3t4| 5¡ ƒƒ‚dS ))zã
        this checks if we have enough free space on /var, /boot and /usr
        with the given cache

        Note: this can not be fully accurate if there are multiple
              mountpoints for /usr, /var, /boot
        c                   @   s   e Zd ZdZdd„ ZdS )z)MyCache.checkFreeSpace.<locals>.FreeSpacez@ helper class that represents the free space on each mounted fs c                 S   s   || _ d| _d S ry   )ÚfreerÊ   )r!   ZinitialFreer   r   r   r"   >  s    z2MyCache.checkFreeSpace.<locals>.FreeSpace.__init__Nr(   r   r   r   r   Ú	FreeSpace<  s   r  c                    s    ˆ D ]}|   |¡r|  S qdS )zŒ return 'id' of a directory so that directories on the
                same filesystem get the same id (simply the mount_point)
            ú/)rÀ   )ÚdZmount_point©Zmountedr   r   Ú
make_fs_idB  s    

z*MyCache.checkFreeSpace.<locals>.make_fs_idz/proc/mountsz-line '%s' in /proc/mounts not understood (%s)NT)r£   ÚreversezDir::Cache::archivesz/tmp/r6   ZAufsZEnabledFZRWDirzcache aufs_rw_dir: %sr  ú/usrz/varz/bootz/homezdirectory '%s' does not existsr   zDir %s mounted on %szFree space on %s: %szfs_free contains: '%s'z%^linux-(image|image-debug)-[0-9.]*-.*z,%s (new-install) added with %s to boot spacer   g        z*taking aufs overlay into space calculationz&additional space for the snapshots: %s)r  i   )z/tmpi  P )r  i    z dir '%s' needs '%s' of '%s' (%f)zNot enough free space: %sc                 S   s   g | ]}t |ƒ‘qS r   )r>   )rÕ   rÒ   r   r   r   Ú
<listcomp>Ï  s     z*MyCache.checkFreeSpace.<locals>.<listcomp>)6Úobjectrg   rÄ   Ú
ValueErrorr   r   rš   rê   r[   r:   r6   rˆ   rq   rd   rF   r   r   re   rf   ÚrealpathÚstatvfsÚf_bavailÚf_frsizer   r  r  rW   r˜   r™   ÚKERNEL_SIZEÚINITRD_SIZErR   Zinstalled_sizerL   r›   rã   rƒ   r„   r†   r  rÊ   Zsize_to_strÚfloatÚabsÚ
isinstanceÚbytesÚdecodeÚlocaleÚgetpreferredencodingr   r¦   r&   r^   Úvalues)r!   Zsnapshots_in_user  r  Zmnt_mapZfs_freeZmountsrú   ZwhatÚwhereZfsZoptionsÚarî   rI   Z
archivedirZaufs_rw_dirr  Zfs_idÚstr  Zkernel_countrP   Zspace_in_bootZrequired_for_aufsZrequired_for_snapshotsr   ÚsizeZrequired_listZfree_at_leastZfree_neededr   r  r   ÚcheckFreeSpace3  sÔ    	
ÿ



ÿÿ
ÿÿ
ÿÿõ
 ÿÿzMyCache.checkFreeSpace)NT)N)T)T)T)r¨   )r¨   )r¨   )r¨   )F)<r
   r   r   rT   rU   r"   rQ   ÚpropertyrY   rc   rE   rv   rx   r   rƒ   r„   r†   r‡   r<   r‰   rŠ   r   r]   r`   rS   r•   r–   rœ   r   r¡   r¥   r§   rN   r¬   r®   r¯   r±   r¶   r¸   rº   r¿   rÁ   rÆ   rÌ   rÓ   rï   rá   rõ   rü   rý   rß   rà   rñ   r
  r  r  r  r  r  r0  r   r   r   r   r)   q   s‚   
'	













	

#*
 
L
9r)   Ú__main__)ÚDistUpgradeConfig)ÚDistUpgradeViewZfooÚ.zubuntu-desktop)/r?   r:   r   r)  r   r  r   rÐ   rl   rÛ   rè   Ú
subprocessr   r   ZDistUpgradeGettextr   rŒ   r   Zutilsr   r¾   r   r   r   r   r"  r#  r  r   r&   r@   r)   r
   ÚsysZDistUpgradeConfigParserr3  r4  rò   Úcr0  Úexitr   rœ   rü   rý   r—   r¡   r   r   r   r   Ú<module>   sX   !
	        k
