
    \Ne                        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e      Z G d	 d
e      Z G d de      Zd Z e       \  ZZ G d de      Z G d de      Z G d de j<                        Ze dk(  rd dl!Z!ddl"m#Z# ddl$m$Z$  e%d        e e#d       e$       d      Z& e%e&jO                                 e!jP                          e&jS                          e&jU                          e&jV                   e&jY                  dg        e%e&j[                                e&j]                          yy)    N)PopenPIPE   )gettext)ngettext)inside_chrootc                       e Zd Zy)CacheExceptionN__name__
__module____qualname__     >/usr/lib/python3/dist-packages/DistUpgrade/DistUpgradeCache.pyr
   r
   (       r   r
   c                       e Zd Zy)CacheExceptionLockingFailedNr   r   r   r   r   r   ,   r   r   r   c                       e Zd Zy)CacheExceptionDpkgInterruptedNr   r   r   r   r   r   0   r   r   r   c                  0   d} d}t        j                         d   }t        j                  d|z        D ]  }|d|z  k(  r#|t         j                  j	                  |      z  }.|j                  d      dk\  s(|j                  d      dk\  s|j                  d      dk\  rk| t         j                  j	                  |      z  }  | dk(  rt        j                  d       d	} |dk(  rt        j                  d
       d}| dz  } d}|dz  |kD  r|dz  }||z  }| |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)kernelinitrdkverfinitrd_buffers        r   #estimate_kernel_initrd_size_in_bootr&   4   s    FF88:a=DYY|d*+ 	)%,,bggooa((F ff\"a'166&>Q+>!Q&bggooa((F	) {L	N{L	N
kFM}}$
mF&=r   c                       e Zd ZdZd Zd Zy)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                 .    || _         || _        || _        y N)
size_totaldirsize_needed)selfr+   r,   r-   s       r   __init__zFreeSpaceRequired.__init__`   s    $&r   c                 T    d| j                   d| j                  d| j                  S )NzFreeSpaceRequired Object: Dir: z size_total: z size_needed: )r,   r+   r-   r.   s    r   __str__zFreeSpaceRequired.__str__d   s1    UYU]U]_c_n_npt  qA  qA  B  	Br   N)r   r   r   __doc__r/   r2   r   r   r   r(   r(   X   s    'Br   r(   c                       e Zd ZdZd Zy)NotEnoughFreeSpaceErrorzI
    Exception if there is not enough free space for this operation

    c                     || _         y r*   )free_space_required_list)r.   r7   s     r   r/   z NotEnoughFreeSpaceError.__init__m   s
    (@%r   Nr   r   r   r3   r/   r   r   r   r5   r5   h   s    Ar   r5   c                      e Zd ZdZdZd:dZd Zed        Zd Z	d Z
d	 Zd
 Zd Zed        Zed        Zed        Zed        Zd Zd Zd;dZd Zd<dZd<dZd<dZd Zd Zd Zd Zd Zd Zd Zd=dZ d=dZ!d=d Z"d=d!Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,ed+        Z-d, Z.d- Z/ed.        Z0d/ Z1d0 Z2d1 Z3d2 Z4ed3        Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d>d9Z;y)?MyCacher      Nc                    g | _         g | _        || _        || _        d| _        d| _        || _        | j                  j                  dd      | _        d| _	        |r,	 t        j                          | j                          d| _        t"        j$                  j'                  | |       |j)                  dd      | _        | j                  j-                  | d      | _        t1        dd	gt2        d
      j5                         d   j7                         | _        | j;                          |j=                  dd      dk(  r2dt>        j@                  vr t        j                  jC                  dd       t        j                  jC                  dd       y # t        $ r(}dt        |      v rt        |      t!        |      d }~ww xY w)NFDistroMetaPkgsTzdpkg --configure -aRemovalDenylistFiler   z-r)stdoutuniversal_newlinesr   SourcesFromhardyRELEASE_UPGRADE_NO_RECOMMENDSzAPT::Install-Recommendstruez"APT::AutoRemove::SuggestsImportant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/   getListFromFileremoval_denylist_get_linux_metapackagelinux_metapackager   r   communicatestripr   _initAptLoggetr   environset)r.   rO   rK   rL   progressrM   es          r   r/   zMyCache.__init__v   s|   		#++HjA5&&(##% 	 			4* & 6 6xAV W!%!C!CD%!PGT?4.244?KM!EEJUW 	
 JJy&)W4/2::=NN8&A 	?I+  5(CF27::1!44	5s   +F 	G#F<<Gc                     | D ]J  }|j                   r|j                  j                  t        j                  k(  s8|j                  dd       L y)z! honor the dselect install state F)	auto_instauto_fixN)is_installed_pkgselected_staterS   SELSTATE_INSTALLmark_installr.   pkgs     r   _apply_dselect_upgradezMyCache._apply_dselect_upgrade   sJ     	BCxx&&'*B*BB  55 A	Br   c                 2   t               }| D ]  }|j                  r|j                  j                  r&|j                  j                  | j
                  k(  s$|j                  j                  | j                  k(  sm|j                  |j                          |S )zB return the packages not downloadable packages in reqreinst state )	rc   	candidatedownloadablerj   
inst_state	ReInstReqHoldReInstReqaddname)r.   	reqreinstro   s      r   req_reinstall_pkgszMyCache.req_reinstall_pkgs   ss     E	 	(C]]#--*D*D$$6$$(:(::chh'	( r   c                 x   | j                   }t        |      dkD  rt        ddt        |            }t        ddt        |            dj                  |      z  }|j	                  ||      rP| j                          g dt        |      z   }|j                         j                  |       | j                          yy	)
z/ check for reqreinst state and offer to fix it r   zRemove package in bad statezRemove packages in bad statezThe 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?zThe 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)
rz   lenr   joinaskYesNoQuestionrelease_locklistgetTerminalcallget_lock)r.   rK   ry   headersummarycmds         r   fix_req_reinstzMyCache.fix_req_reinst   s    ++	y>A;<!)n.F   2
 +
  #9~
/ 2691E
FG $$VW5!!#ORVW`Raa  "'',r   c                 ^   | j                   j                  ddd      }t        j                  j	                  |      st        j
                  |       t        j                   j                  d|       t        j                   j                  dd       t        j                  t        j                  j                  |d      t        j                  t        j                  z  t        j                  z  d      | _        t        j                  j                         }d	|z  }t        j                   | j                  |j#                  d
             t        j                   j                  dd       t        j                   j                  dd       t        j                   j                  dd       y)z init logging, create log fileFilesLogDirz/var/log/dist-upgradezDir::LogzDir::Log::Terminalzapt-term.logzapt.logi  zLog time: %s
zutf-8zDebug::pkgProblemResolverrG   zDebug::pkgDepCache::MarkerzDebug::pkgDepCache::AutoInstallN)rO   getWithDefaultr   r   existsmakedirsrS   rc   openr~   O_RDWRO_CREATO_APPENDlogfddatetimenowwriteencode)r.   logdirr   r   s       r   r`   zMyCache._initAptLog   s   ++GX,CEww~~f%KK:v./@WWRWW\\&)<YY3bkkA5J
##%!C'
V]]734 	6?7@<fEr   c                    t        | d      r>t        j                  | j                         t        j                  | j                         t        j
                  d      | _        t        j
                  d      | _        t        j                  | j                  d       t        j                  | j                  d       y )N
old_stdoutr   r   )hasattrr   closer   
old_stderrdupdup2r   r1   s    r   _startAptResolverLogzMyCache._startAptResolverLog   sn    4&HHT__%HHT__%&&)&&)


A


Ar   c                     t        j                  d       t        j                  d       t        j                  | j                  d       t        j                  | j                  d       y )Nr   r   )r   fsyncr   r   r   r1   s    r   _stopAptResolverLogzMyCache._stopAptResolverLog   s<    


#
#r   c                       fd}|S )z3 decorator to ensure that the apt output is logged c                  d    | d   j                           | i |}| d   j                          |S Nr   )r   r   )argskwargsresr$   s      r   wrapperz(MyCache.withResolverLog.<locals>.wrapper   s7    G((*T$V$CG'')Jr   r   )r$   r   s   ` r   withResolverLogzMyCache.withResolverLog   s    	
 r   c                     t        j                  | j                        }t        j                         }|j	                  || j
                  | j                         |j                  S )z< get the size of the packages that are required to download )rS   PackageManager	_depcacheAcquireget_archives_list_recordsfetch_needed)r.   pmfetchers      r   required_downloadzMyCache.required_download   sH     ##DNN3//#
T]];###r   c                 .    | j                   j                  S )z9 get the size of the additional required space on the fs )r   usr_sizer1   s    r   additional_required_spacez!MyCache.additional_required_space   s     ~~&&&r   c                 N    	 | j                   j                  S # t        $ r Y yw xY w)z< get the extra size needed to install the snap replacements r   )rL   extra_snap_spaceAttributeErrorr1   s    r   #additional_required_space_for_snapsz+MyCache.additional_required_space_for_snaps  s+    
	 ;;/// 		s    	$$c                 4    | j                   j                  dkD  S )z is the cache broken r   )r   broken_countr1   s    r   	is_brokenzMyCache.is_broken  s     ~~**Q..r   c                     t         j                  j                  d      dz   }t        j                  |      | _        | j                  dk  rd|z  }t        |      y )NzDir::State::ListsrM   r   zCan not lock '%s' )rS   rO   find_dirr   rR   r   )r.   rx   re   s      r   rU   zMyCache.lock_lists_dir  sT    ~~&&':;fD!**40??Q$t+A-a00 r   c                 p    | j                   dkD  r't        j                  | j                          d| _         y y )Nr   r?   )rR   r   r   r1   s    r   unlock_lists_dirzMyCache.unlock_lists_dir  s*    ??QHHT__% DO r   c                     | j                          t        j                  j                  | |      }| j	                          |r |j
                  rt        t        d            |dk(  rt        d      y)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   rX   rY   updaterU   release_file_download_errorIOError_)r.   	fprogressr   s      r   r   zMyCache.update"  sh    
 	iitY/>> !:;<<%<]^^ r   c                     t        j                  d       | j                  r| j                          t        j
                  j                  | ||       y )Nzcache.commit())r   inforM   r   rX   rY   commit)r.   r   	iprogresss      r   r   zMyCache.commit1  s8    %&99		y)4r   c                     | j                   r	 t        j                          d| _         y y # t        $ r"}t	        j
                  d|z         Y d }~y d }~ww xY w)NFzfailed to SystemUnLock() (%s) )rM   rS   pkgsystem_unlockrV   r   debugr.   pkgSystemOnlyre   s      r   r   zMyCache.release_lock7  sP    99D((*!	   D>BCCD   + 	AAAc                     | j                   s	 t        j                          d| _         y y # t        $ r"}t	        j
                  d|z         Y d }~y d }~ww xY w)NTzfailed to SystemLock() (%s) )rM   rS   rT   rV   r   r   r   s      r   r   zMyCache.get_lock?  sP    yyB&&( 	   B<q@AABr   c                     |r&| j                   j                  |j                        }n|j                  j                  }|dk(  r't	        j
                  d|j                  d|d       y|j                  S )z* check if the given pkg can be downloaded Nzno version information for 'z' (useCandidate=)F)r   get_candidate_verrj   current_verr   r    rx   rs   )r.   ro   useCandidatevers       r   rs   zMyCache.downloadableG  s[    ..22388<C((&&C$;OOSVS[S[]ijkr   c                 h    |j                   xr% | j                  j                  |j                        S )z$ check if the pkg is auto-removable )ri   r   
is_garbagerj   rn   s     r   pkg_auto_removablezMyCache.pkg_auto_removableR  s+       4))#((3	5r   c                 6    | j                   j                         S )z^ try to fix broken dependencies on the system, may throw
            SystemError when it can't)r   
fix_brokenr1   s    r   r   zMyCache.fix_brokenW  s     ~~((**r   c                 (   g | _         g | _        | j                         D ]q  }|j                  s|j                  r%| j                   j                  |j                         |j                  sM| j                  j                  |j                         s y)z* create a snapshot of the current changes N)rI   rJ   get_changesmarked_installmarked_upgradeappendrx   marked_deletern   s     r   create_snapshotzMyCache.create_snapshot\  sn    ##% 	0C!!S%7%7&&sxx0  %%chh/		0r   c                 8    | j                   j                          y r*   )r   initr1   s    r   clearzMyCache.clearf  s    r   c                    t        j                  | j                        }| | j                          | j                  D ]  }| |   }|j                           | j                  D ]  }| |   }|j                  dd        y)z restore a snapshot F)rh   rg   N)rS   ActionGroupr   r   rJ   mark_deleterI   rm   )r.   actiongrouprx   ro   s       r   restore_snapshotzMyCache.restore_snapshoti  s{    ))$..9 	

NN 	Dt*COO	 OO 	>Dt*Ceu=	>r   c                 |   | j                   j                  dd      }|D ]  }|| v r)| |   j                  rt        j                  d|z          yd}| j                   j                  |d      D ]  }||| v xr | |   j                  z  } |snt        j                  d|z          y t        j                  d       y)	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)rO   rP   ri   r   r   )r.   rQ   key
deps_foundro   s        r   need_server_modezMyCache.need_server_modew  s     ;;&&x< 	Cd{tCy55`cffg J{{**30AB EcTkDd3i.D.DD
Eiloop	 	str   c                     | j                   r'	 t        j                  d       | j                          yy# t        $ r' |j                  t        d      t        d             Y yw xY w)zY check if the cache is ok and if the required metapkgs
            are installed
        z$Have broken pkgs, trying to fix themzBroken packageszYour 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   rV   errorr   )r.   rK   s     r   coherence_checkzMyCache.coherence_check  sf     >>
DE!   

1./!" $@ "AB s   %5 -A%$A%c                     t        j                  d|d|d       || v rL | |   j                  di | | |   j                  s(| |   j                  st        j
                  d|z         yy)NzInstalling '' (r   z Installing/upgrading '%s' failedFTr   )r   r   rm   r   r   r   r.   ro   reasonflagss       r   rm   zMyCache.mark_install  sb    V<=$;"DI""+U+I,,S	0H0H@3FGr   c                     t        j                  d|d|d       || v rJ| |   j                  r;| |   j                          | |   j                  st        j
                  d|z         yy)NzUpgrading 'r   r   zUpgrading '%s' failedFT)r   r   ri   mark_upgrader   r   r.   ro   r   s      r   r   zMyCache.mark_upgrade  s[    sF;<$;4911I""$9++5;<r   c                 p    t        j                  d|d|d       || v r | |   j                  di | y y )Nz
Removing 'r   r   r   )r   r   r   r   s       r   mark_removezMyCache.mark_remove  s6    c6:;$;!DI!!*E* r   c                     t        j                  d|d|d       || v r*| j                  j                  | |   j                  d       y y )Nz	Purging 'r   r   T)r   r   r   r   rj   r   s      r   
mark_purgezMyCache.mark_purge  s;    S&9:$;NN&&tCy~~t< r   c                 r    || v r3| |   j                   r#| |   j                  r| j                  ||       y y y y r*   )ri   r   rm   )r.   pkgnamer   s      r   _keep_installedzMyCache._keep_installed  sB    tOW**W++gv. , + r   c           	      b   | j                   j                  dd      D ]  }| j                  |d        | j                  D ]\  }|| v s| |   j                  s| |   j
                  s'| j                   j                  |d      D ]  }| j                  |d|z          ^ | j                   j                  dd      dk(  rqt        j                  d       | j                   j                  dd	      D ]s  }| D ]l  }|j                  s|j                  j                  s'|j                  s4|j                  j                  |k(  sN| j                  |j                  d
|z         n u | j                  D ]  }|| v s| |   j                  s| |   j
                  s'| j                   j                  |d	      D ]u  }| D ]n  }|j                  s|j                  j                  s'|j                  s4|j                  j                  |k(  sN| j                  |j                  |d|       p w  yy)z[ run after the dist-upgrade to ensure that certain
            packages are kept installed r=   KeepInstalledPkgszDistro KeepInstalledPkgs rulez%s KeepInstalledPkgs ruleOptionswithNetworkTruez"Running KeepInstalledSection rulesKeepInstalledSectionz$Distro KeepInstalledSection rule: %sz KeepInstalledSection rule: N)rO   rP   r  rQ   ri   r   ra   r   r   rr   rs   r   sectionrx   )r.   r  r   r  ro   s        r   keep_installed_rulezMyCache.keep_installed_rule  s    {{**85HI 	KG  *IJ	K == 	UCd{S	 6 6 $S	 8 8#{{2238KL UG((2MPS2STU	U ;;??9m4>MM>?;;..x9OP i iC#--*D*D--MM11W<,,SXX7]`g7gh	ii }} t$;DI$:$:$(I$<$<#';;#6#6s<R#S t#' tC ##--2L2L$'$5$5 # 5 5 @ $ 4 4SXXehjq?r s	ttt ?r   c                 T    | j                   s| j                  j                  d       yy)z. run before the upgrade was done in the cache PreDistUpgradeCacheN)rN   rL   runr1   s    r   pre_upgrade_rulezMyCache.pre_upgrade_rule  s#     ""KKOO12 #r   c           
          d| j                   fd| j                  fd| j                  fd| j                  ffD ]  \  }}| j                  j                  dd|z        D ]  } ||d|z          | j                  D ]Y  }|| v s| |   j                  s| |   j                  s'| j                  j                  |d|z        D ]  } |||d|d	        [  | j                  s| j                  j                  d
       yy)z- run after the upgrade was done in the cache InstallUpgradeRemovePurger=   zPostUpgrade%szDistro PostUpgrade%s rulez PostUpgradez rulePostDistUpgradeCacheN)rm   r   r  r  rO   rP   rQ   ri   r   rN   rL   r  )r.   ruleactionro   r   s        r   post_upgrade_rulezMyCache.post_upgrade_rule  s    )4+<+<= )4+<+<= ($*:*:; '9; 	KNT6
 {{**8_t5KL @s7$>?@}} K$;DI$:$:$(I$<$<#{{223$8NO KssD$IJKK	K ""KKOO23 #r   c                    t        j                  d       	 ddlm} 	  |d      }|j                  D ]*  }|| v s| |   j                  s| j                  |d	        n t        j                  d
       y|j                         }t        j                  d|z         || vrt        j                  d|z         y| |   j                  s;| |   j                  s,| |   j                          t        j                  d|z         yy# t        t
        f$ r"}t        j                  d|z         Y d}~yd}~ww xY w# t         $ r"}t        j                  d|z         Y d}~yd}~ww xY w)zR
        this checks for nvidia hardware and checks what driver is needed
        znvidiaUpdate()r   )NvidiaDetectionz%NvidiaDetector can not be imported %sNFz./ubuntu-drivers-obsolete.pkgs)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   NvidiaDetector.nvidiadetectorr  ImportErrorSyntaxErrorr   oldPackagesri   r  r   selectDriverr    r   r   rm   	Exception)r.   r  re   nv	oldDriverdrivers         r   checkForNvidiazMyCache.checkForNvidia  sP    	&'	E	F !*JKB  ^^ 	$i)E)E$$Y0CD
 PQ__&FMM;fDET>& 89L//4<3N3NV))+KfTU = [) 	 MMAAEF		8  	FMM@1DEE	FsG   D D: D: *D: 6AD: ;A	D: D7D22D7:	E%E  E%c                 f    | D ],  }|j                   j                  d      s|j                  s, y y)Nzlinux-headers-TF)rx   
startswithri   rn   s     r   _has_kernel_headers_installedz%MyCache._has_kernel_headers_installed/  s5     	C##$45  	 r   c                 \   t        j                  d| j                  z         	 | j                  j                  d      \  }}}t        dgt              j                         d   }d	|v rt        j                  d
       y# t        $ r"}t        j
                  d|z         Y d}~yd}~ww xY w)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?)NFdmesg)rA   r   s   WARNING: NR_CPUS limitzUP kernel on SMP system!?!T)	r   r   r   splitr$  r    r   r   r^   )r.   versionbuildflavourre   r.  s         r   checkForKernelzMyCache.checkForKernel6  s     	+djj89	(,

(8(8(=%WeW
 wi-99;A>$-MM67  	OOMPQQR	s   B   	B+	B&&B+c                 <   d}| j                   j                  dd      }| D ]  }|j                  j                  j	                  |j
                        }|r2|j                  dk(  r#t        j                  d|j                  z         f|j                  ss|j                  j                  s|j                  r|j                  r|j                  |vsd|j                  vs|j                  j                  |v s| j                  |j                  d|z          y )N)requiredr=   RemoveEssentialOkr   zPackage %s has no priority set:z;priority in required set '%s' but not scheduled for install)rO   rP   _pcacher   r   rj   priorityr   r   rx   rr   rs   ri   r   rm   )r.   needremoveEssentialOkro   r   s        r   checkPriorityzMyCache.checkPriorityF  s     KK//:MN 	rC++''99#((CCs||q(>IJ#--"<"<%%););HH 11388O&&$.!!#((,ilp,pq	rr   c                    d}|j                         rS|dz  dk(  r|j                          |j                          t        j                  d       |dz  }|j                         rS|j                  d       |j                          y )Nr      g{Gz?r   T)finished)lockedpulseProgressprocessEventstimesleep)r.   rK   rM   is       r   	updateGUIzMyCache.updateGUI[  sr    kkm2v{""$ JJtFA kkm 	D)r   c                 
   t        j                         }|j                          t        j                  | j                  | j
                  |f      }|j                          	 | j                          | j                  d       | j                          | j                          t               rt        j                  d       n| j                          | j                          | j!                          | j#                  |       |s| j%                  |       | j'                          | j(                  r-t+        t-        d      dj/                  d | D              z        	 |j=                          |j/                          g }	g }
| j?                         D ]=  }|j@                  r|jB                  r|
jE                  |jF                         |jH                  jJ                  D ]  }tM        jN                  |jP                  |jR                  jT                        dk  s;|jV                  D ]V  \  }}|jX                  jZ                  j]                  |      }|s.|j^                  r;|	jE                  |jF                            |j`                  jb                  }d}|D ]  }||jd                  z  } |r#|	jE                  |jF                         @ 	 | j0                  jg                  dd      }|rt        j                  d       y	 tm        |
      dkD  r7|
jo                          t        j6                  ddj/                  |
      z         tm        |	      dkD  r|	jo                          t        j6                  ddj/                  |	      z         | j5                          |j7                  t-        d      t-        d      dj/                  |	             | j;                          yy# t*        $ r8}t-        d      }| j0                  j3                  dd	      d
k(  r|t-        d      z  }nL| j0                  j3                  dd	      dk(  r-| j0                  j3                  dd      d
k(  r|t-        d      z  }|r|t-        d      z  }n|t-        d      z  }|t-        d      z  }| j5                          |j7                  t-        d      |       t9        |      }t        j6                  d|       | j;                          Y d }~|j=                          |j/                          yd }~ww xY w# |j=                          |j/                          w xY w# th        jj                  $ r Y `w xY w)N)targetr   Tz5skipping kernel checks because we run inside a chrootz!Broken packages after upgrade: %sr|   c              3   f   K   | ])  }|j                   s|j                  s|j                   + y wr*   )is_inst_brokenis_now_brokenrx   ).0ps     r   	<genexpr>z&MyCache.distUpgrade.<locals>.<genexpr>  s>       UR`amnm}m}  BC  BQ  BQUVU[U[  URs   11zBAn unresolvable problem occurred while calculating the upgrade.

 r	  foreignPkgsr  zThis 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.

False
devReleasezThis 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.zIf none of this applies, then please report this bug using the command 'ubuntu-bug ubuntu-release-upgrader-core' in a terminal. zIf 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=   AllowUnauthenticatedzAllowUnauthenticated set!z!Packages to downgrade found: '%s' z$Unauthenticated packages found: '%s'z"Error authenticating some packageszIt 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	threadingLockacquireThreadrF  rK   startr  upgrader<  r  r   r   r    r3  r(  r  _keepBaseMetaPkgsInstalled_installMetaPkgs_verifyChangesr   rV   r   r~   rO   ra   r   r   rW   r   releaser   r   marked_downgrader   rx   rj   version_listrS   version_comparever_str	installedr0  	file_listr8  r   
find_index
is_trustedrr   originstrusted
getbooleanconfigparserNoOptionErrorr}   sort)r.   rK   
serverModerN   rM   tre   details	error_msg	untrusted	downgradero   r   verFileIterindex	indexfilerg  rh  originbs                       r   distUpgradezMyCache.distUpgradef  s    ~~DNN$))T9KL		T	
 !!# LL   $$&  WX##% ! ""$ ++D1%%d+ !~~!!$G"H499  URei  UR  LR  #R  S  S Z LLNFFH 		##% 	+C  ##  *8800 &C..S]]%:%:<>?@47MM &0[%(+(9(9(D(D[(QI(1E1E ) 0 0 : %	&	& mm++GG! *6>>)*   *-	+0	&&x1GHA ;< 
 y>ANNMM=((9-. /y>ANNMM@((9-. / $$&JJq=> = > yy+- %%'G  '	  9 :G{{y-8FB1 " # # M:gE	<8FBA : ; ; 1 7 8 8 1 e f f1 O P P
 $$&JJq:;WEAIMM5yA %%' LLNFFHW'	T LLNFFHD )) 		s>   #C>O- 3U -
T/7DT*T2 *T//T2 2"UU.-U.c                    t         j                  j                  d      }| j                  j                  dd      }| j	                         D ]  }|j
                  r\| j                  |j                        rAt        j                  d|j                         t        t        d      |j                  z        |j
                  sx|j                  j                  dk(  s|j                  j                  |dfv s|j                  |vst        j                  d|j                         t        t        d	      |j                  z         | j                  j                  dd
      }|D ]}  }|j!                  d      \  }}|| v s| |   j"                  s,| |   j"                  j$                  |k(  sI| |   j&                  s| |   j(                  sht        t        d      |z         y)zy this function tests if the current changes don't violate
            our constraints (deny listed removals etc)
        zAPT::Architecturer=   r6  zHThe package '%s' is marked for removal but it's in the removal deny listzJThe package '%s' is marked for removal but it is in the removal deny list.TallzDThe package '%s' is marked for removal but it's an ESSENTIAL packagez1The essential package '%s' is marked for removal.BadVersionsr   z*Trying to install deny listed version '%s')rS   rO   r   rP   r   r   _inRemovalDenylistrx   r   r   rV   r   rj   	essentialrc  architecturer/  rr   r0  r   r   )r.   	main_archr;  ro   badVersionsbvr  r   s           r   r]  zMyCache._verifyChanges  s    NN''(;<	 KK//:MN##% 		eC  T%<%<SXX%Fhjmjrjrs!!$p"qtwt|t|"|}}  HH&&$.MM..9e2DD$55dfifnfno!!$W"X[^[c[c"cdd		e kk))(MB 	XBXXc]NWc4DM$;$;W''//36g--g--!!$P"QTV"VWW	X r   c                    |j                   j                  j                  |j                        }|t	        d|j
                         y|j                  't	        d| j                  j                         z         y|j                  j                  d      \  }}|j                   j                  j                  ||f       y)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
        zNo candidate ver: FzNo file_list for: %s r   T)
r8  r   r   rj   printrx   rd  popr   lookup)r.   ro   r   r$   rt  s        r   _lookupPkgRecordzMyCache._lookupPkgRecord  s     kk##55chh?;&1== )DIINN,<<===$$Q'5##QJ/r   c                    i }t               }| D ]  }| j                  |      s#t        j                  d|j                  z         7|j
                  j                  j                  j                  d      D ]u  }|j                  d      s|t        d      d  j                  d      D ]A  }|j                         }||vrt               ||<   ||   j                  |j                         C w  |D ]W  }d}| j                  j                  dd      }||v rd}||   D ]  }| |   j                  rd} n |sG|j                  |       Y |S )	Nz&no PkgRecord found for '%s', skipping rT  Task:,Tr=   IgnoredTasksF)rc   r  r   r   rx   r8  r   recordr/  r*  r}   r_   rw   rO   rP   ri   )	r.   tasksinstalled_tasksro   linetaskrc  ignored_tasksr  s	            r   installedTaskszMyCache.installedTasks)  sM   % 
	2C((-FQR,,3399$? 2??7+!%c'lm!4 ; ;C @ 2#zz|u,*-%E$Kd1	22	
	2  
	*DI KK//.IM}$!	 ; G}11 %I ##D)
	* r   c                 t   t        j                  d       | D ]  }|j                  s|j                  r| j	                  |       t        |j                  j                  d      r |j                  j                  j                  s#t        j                  d|j                  z         |j                  j                  j                  j                  d      D ][  }|j                  d      s|t        d      d  j                  d      D ]'  }|j                         }||v s|j                          ) ]   y)Nzrunning installTasksr  zcan not find Record for '%s'rT  r  r  T)r   r   r   ri   r  r   r8  r   r  r    rx   r/  r*  r}   r_   rm   )r.   r  ro   r  r  s        r   installTaskszMyCache.installTasksE  s    ,- 	/C!!S%5%5!!#&CKK00(;@T@T@[@[ > IJ,,3399$? /??7+!%c'lm!4 ; ;C @ /#zz|5=,,.//	/ r   c                 j    | j                   j                  dd      D ]  }| j                  |d        y )Nr=   BaseMetaPkgsz%base meta package keep installed rule)rO   rP   r  )r.   rK   ro   s      r   r[  z"MyCache._keepBaseMetaPkgsInstalledV  s5    ;;&&x@ 	OC  &MN	Or   c           	           fd} j                   j                  dd       j                   j                  dd      D ]  } |   j                           D ]P  }	 | v rI |   j                  r: |   j                  r+t        j                  d|z          |   j                          R  |       st        j                  d	z         D ]  }d
} j                   j                  |d      D ]  }|| v xr  |   j                  z  } |sAt        j                  d|z         	  |   j                          t        j                  d|d |   j                  d        n  |       sAdj                  dd       }|j                  t        d      t        d      |d   fz         yy
# t        $ r'}t        j                  d|d|d       Y d }~d }~ww xY w# t        t        f$ rN}t        j                  d|d|d       |j                  t        d      |z  t        d             Y d }~ yd }~ww xY w)Nc                      D ]o  } | v s|    }|j                   r.|j                  r"t        j                  d|j                  z         |j                   r|j                  r|    j
                  so y y)zy
            internal helper that checks if at least one meta-pkg is
            installed or marked install
            z(metapkg '%s' installed but marked_deleteTF)ri   r   r   r   rx   r   )r   ro   rQ   r.   s     r   metaPkgInstalledz2MyCache._installMetaPkgs.<locals>.metaPkgInstalled\  st    
   $$;s)C''C,=,=&PSVS[S[&[\))#2C2C933#$ r   r=   r>   r  zMarking '%s' for upgradezCan't mark 'z' for upgrade (r   z$none of the '%s' meta-pkgs installedTr   z!guessing '%s' as missing meta-pkgzfailed to mark 'z' for install (zCan't install '%s'zIt 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: 'z' -> ''r|   r   r?   zCan't guess meta-packagezYour 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.)rO   rP   rm   ri   is_upgradabler   r   r   rV   r    KeyErrorr   r   r   r~   )	r.   rK   r  ro   r   re   r   	meta_pkgsrQ   s	   `       @r   r\  zMyCache._installMetaPkgsZ  sA   	  ;;&&x< ;;&&x@ 	%CI""$	%
  
	OC	O4KI**I++MM"<s"BCI**,
	O  !MM@8KL !
;;..s4EF IC#+"H$s)2H2HHJIMM"E"KL%S	..0 MMCcIaIa"bc'*  !		(1R.1IJJq34 6 7 #HRL123 S  O c1 MNNO  (2 	%'*A'/ 0

1%9#:S#@#$ &3 $45  %	%s2   AF1)G$1	G!:GG!$I3AH<<Ic                     | j                   D ]D  }t        j                  |      j                  |      s(t	        j
                  d|d|d        y y)Nzdenylist expr 'z' matches 'r  TF)r[   recompilematchr   r   )r.   r  exprs      r   r|  zMyCache._inRemovalDenylist  sL    )) 	Dzz$%%g.#W. /		
 r   c           
         |j                  | j                        rt        j                  d|z         y|| j                  k(  rt        j                  d|z         y| j                  |      rt        j                  d|z         y| j                  j                  dd      D ]M  }|| v s| |   j                  s| |   j                  j                  |k(  s5t        j                  d|z          y || vry	 | j                  j                  dd	      }t        j                  | j                        }| | j!                          	 | |   j#                  |
       | j$                  j'                          ||v ry| j)                         D ]  }|j*                  |vsC|j*                  |v s5| j                  |j*                        s|j*                  | j                  k(  sTt        j                  d|d|j*                  d       | j-                           y 	 y# t        j                  $ r d}Y w xY w# t.        t0        f$ rB}	t        j2                  d|dt5        |	      d|	d       | j-                          Y d }	~	yd }	~	ww xY w)Nz skipping running kernel pkg '%s'Fz skipping kernel metapackage '%s'z"skipping '%s' (in removalDenylist)r=   r  z'skipping '%s' (in KeepInstalledSection)TPurgeObsoletes)purgez	package 'z ' produces an unwanted removal 'z', skippingz'_tryMarkObsoleteForRemoval failed for 'r   : r   )endswithr   r   r   r]   r|  rO   rP   rc  r  ri  rj  rk  rS   r   r   r   r   rK   rB  r   rx   r   rV   r  r    repr)
r.   r  remove_candidatesforced_obsoletesforeign_pkgsr  r  r   ro   re   s
             r   tryMarkObsoleteForRemovalz!MyCache.tryMarkObsoleteForRemoval  s7    DJJ'MM<wFGd,,,MM<wFG""7+MM>HI{{**85KL 	G4DM$;$;M++33w>G'QR		 $	KK**85EFE ))$..9 		M%%E%2II##%**'') !HH$55hh,.--chh7hh$"8"88MM`giliqiq"rs))+ ! ; )) 	E	2 X& 	OOU\^bcd^eghij!!#	s=   9H 3H6 ;A#H6 7H6 H6 H32H36J8JJc                     t               }| D ]<  }|j                  s| j                  |      r"|j                  |j                         > |S z1 get all package names that are not downloadable )rc   ri   anyVersionDownloadablerw   rx   )r.   obsolete_pkgsro   s      r   _getObsoletesPkgszMyCache._getObsoletesPkgs  sK     	0C
 2237!%%chh/	0 r   c                 V    |j                   j                  D ]  }|j                  s y y)zA helper that checks if any of the version of pkg is downloadable TF)rj   r`  rs   )r.   ro   r   s      r   r  zMyCache.anyVersionDownloadable  s,    88(( 	C	 r   c                     t               }| D ]P  }|j                  s| j                  j                  |j                        s6|j                  |j                         R |S r  )rc   ri   r   r   rj   rw   rx   )r.   unused_dependenciesro   s      r   _getUnusedDependencieszMyCache._getUnusedDependencies  sQ    !e 	2CDNN$=$=chh$G#''1	2 #"r   c                 (   t               }| j                  j                  dd      }t        j                  j                  |      rMt        |      5 }|D ]3  }|j                  d      r|j                  |j                                5 	 ddd       t               }|D ][  }|| vr| |   }|j                  r1| j                  j                  |j                        s|j                  rK|j                  |       ] t        |      S # 1 sw Y   ~xY w)z return list of installed and demoted packages

            If a demoted package is a automatic install it will be skipped
        r=   	Demotions#N)rc   rO   ra   r   r   r   r   r*  rw   r_   ri   r   is_auto_installedrj   r   r   )r.   	demotionsdemotions_filedemotions_fr  installed_demotionsdemoted_pkgnamero   s           r   get_installed_demoted_packagesz&MyCache.get_installed_demoted_packages  s    
 E	;?77>>.)n% 4' 4D??3/!djjl344 "e( 	)Od*'C$$00:!!##C(	) '((4 4s   D)!DDc                 v   t               }| D ]  }|j                  s| j                  |      s"|j                  s/d}|j                  j                  D ]B  }||j
                  v r|j                  |k(  rd}||j
                  v s1|j                  |k(  sAd}D |s|j                  |j                          |S )zm get all packages that are installed from a foreign repo
            (and are actually downloadable)
        TF)	rc   ri   rs   rr   rg  archiverv  rw   rx   )r.   allowed_originfromDisttoDistr  ro   foreignrv  s           r   _getForeignPkgszMyCache._getForeignPkgs  s     u 	/CD$5$5c$:}} !mm33 (F6>>1!==N:"'/!==N:"'(  $$SXX.!	/" r   c           
      .     G d dt               } fd}g  i }i }t        d      5 }|D ]0  }	 |j                         \  }}	}
}}}|	 vs  j                  |	       2 	 ddd        j                  t        d	
       t        j                  j                  d      }d}t        | d      rm| j                  j                  ddd      rP| j                  j                  dd      }t        j                   j#                  |      st        j$                  |       t	        j
                  d|z         dddd||ddfD ]  }t        j                   j'                  |      } ||      }t        j                   j#                  |      r/t        j(                  |      }|j*                  |j,                  z  }nt	        j.                  d|z         d}||v r*t	        j
                  d|d||          |||      ||<   t	        j
                  d|d|       |||<    ||      ||<    ~t	        j
                  d|z         d}| D ]j  }t1        j2                  d|j4                        s$|j6                  s|j8                  s=t	        j
                  |j4                  d t:        d!       |d"z  }l |t:        z  |d"z   t<        z  z   }d#}t        | d      r| j                  j                  ddd      rjt	        j
                  d$       | j                  j                  dd      }| D ]4  }|j8                  s|j6                  s||j>                  j@                  z  }6 d#}|r^| D ]A  }|jB                  s|j8                  s|jD                  s)||jF                  j@                  z  }C t	        j
                  d%|z         || jH                  fd| jJ                  fd| jL                  fd&d|fd'd(||fd|ff	D ]  \  }}|dk  rt        j                   j'                  |      }t	        j
                  d)||||   ||   jN                  fz         ||   xjN                  |z  c_'        ||   xjP                  |z  c_(         i }|D ]  }||   jN                  dk  st        jR                  tU        tW        ||   jN                        d"z               }tY        |tZ              r#|j]                  t_        j`                               }t        jR                  ||   jP                        }tY        |tZ              r#|j]                  t_        j`                               }tc        | ||      |      | ||      <    t        |      dkD  rQt	        jd                  d*|D cg c]  }tg        |       c}z         ti        tk        |jm                                     y	# t        $ r'}t	        j
                  d|d|d       Y d}~d}~ww xY w# 1 sw Y   xY wc c}w )+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                       e Zd ZdZd Zy))MyCache.checkFreeSpace.<locals>.FreeSpacez@ helper class that represents the free space on each mounted fs c                      || _         d| _        y r   )freer:  )r.   initialFrees     r   r/   z2MyCache.checkFreeSpace.<locals>.FreeSpace.__init__?  s    '		r   Nr8   r   r   r   	FreeSpacer  =  s
    Nr   r  c                 >    D ]  }| j                  |      s|c S  y)z return 'id' of a directory so that directories on the
                same filesystem get the same id (simply the mount_point)
            /)r*  )dmount_pointmounteds     r   
make_fs_idz*MyCache.checkFreeSpace.<locals>.make_fs_idC  s+      ' '<<,&&' r   z/proc/mountszline 'z"' in /proc/mounts not understood (r   NT)r   reversezDir::Cache::archivesz/tmp/rO   AufsEnabledFRWDirzcache aufs_rw_dir: %sr  /usrz/varz/bootz/homezdirectory '%s' does not existsr   zDir z mounted on zFree space on r  zfs_free contains: '%s'z%^linux-(image|image-debug)-[0-9.]*-.*z (new-install) added with z 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: %s)7objectr   r/  
ValueErrorr   r   r   rl  r}   rS   rO   r   r   r   ra   r   r   r   r   realpathstatvfsf_bavailf_frsizer    r  r  rx   r   r   KERNEL_SIZEINITRD_SIZErr   installed_sizeri   r   rc  r   r   r   r  r:  size_to_strfloatabs
isinstancebytesdecodelocalegetpreferredencodingr(   r   rW   r5   r   values)!r.   snapshots_in_user  r  mnt_mapfs_freemountsr  whatwherefsoptionsarw  re   
archivediraufs_rw_dirr  fs_idstr  kernel_countro   space_in_bootrequired_for_aufsrequired_for_snapshotsr,   sizerequired_listfree_at_leastfree_neededrE  r  s!                                   @r   checkFreeSpacezMyCache.checkFreeSpace4  s   	 		 .! 	*V *7;zz|4T5"gq! 'NN5)*	* 	d+^^,,-CD
D(#KK&&vy%@++//&':K77>>+.K(-;<vvw
KRYZ 	-A  #AqMEww~~a ZZ]{{R[[0 @1 DE '%.2 3$WU^4
 $( )!"&t_
#	-$ .89
  	&C xx?J %%););MMTWT\T\^i"jk A%L	& &3(1,;<  D(#KK&&vy%@MMFG++//&':K  F%%););%)E)EE%F
 "% K$$''3+<+<*cmm.J.JJ*K MMBE[[\ ()?)?@#T%C%CD#T%M%MN2$m41/(*;<#%;< 	&KS$ ax''""3'CMM<T7SV<Y`adYeYjYj?kklCL%CL%'	&,  	pCs|  1$ ' 3 3E#gcl>O>O:PQR:R4S TmU3$1$8$8335%7M%11'#,2C2CDk51"-"4"4335#7K
 2C;PZ[^P_an1ojo.	p  }!MM58WAQ8WWX)$}/C/C/E*FGGs " MMUY[\"]^		* 	*v 9Xs@   XWX
XX
	XW=7X=XXX)NTr*   )T) )F)<r   r   r   ru   rv   r/   rp   propertyrz   r   r`   r   r   r   r   r   r   r   rU   r   r   r   r   r   rs   r   r   r   r   r   r   r   rm   r   r  r  r  r  r  r  r(  r+  r3  r<  rF  rx  r]  r  r  r  r[  r\  r|  r  r  r  r  r  r  r  r   r   r   r:   r:   q   s   IM%JNB 	 	6F$$ $ $ ' '   / /
1!_5DB	 5
+
0><$+
=
/ tF34$'T r*	 R Rh8$  6"OJX 7 7r#)00^r   r:   __main__)DistUpgradeConfig)DistUpgradeViewfoo.zubuntu-desktop)/rX   rS   r   r  r   r  r   rC  r   rU  rj  
subprocessr   r   DistUpgradeGettextr   r   r   utilsr   r$  r
   r   r   r&   r  r  r  r(   r5   rY   r:   r   sysDistUpgradeConfigParserr  r  r  cr  exitr   r   r  r  r   r   r   r   r   <module>r     s8  ,     	 	      " , (  	Y 		. 		N 	 B ?@ [B B An Aacii aH# z:0	%L!#&(94@A 
!


CHHJGGINN$%&	!--/! r   