
    xf                         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  G d de          ZdS )    N)PIPEPopen   )get_arch)gettextc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd%dZd%dZ d  Z!d! Z"d" Z#d# Z$d$S )&DistUpgradeQuirksa  
    This class collects the various quirks handlers that can
    be hooked into to fix/work around issues that the individual
    releases have.

    The following handlers are supported:
    - PreCacheOpen: run *before* the apt cache is opened the first time
                    to set options that affect the cache
    - PostInitialUpdate: run *before* the sources.list is rewritten but
                         after an initial apt-get update
    - PreDistUpgradeCache: run *right before* the dist-upgrade is
                           calculated in the cache
    - PostDistUpgradeCache: run *after* the dist-upgrade was calculated
                            in the cache
    - StartUpgrade: before the first package gets installed (but the
                    download is finished)
    - PostUpgrade: run *after* the upgrade is finished successfully and
                   packages got installed
    - PostCleanup: run *after* the cleanup (orphaned etc) is finished
    c                 R   || _         |j        | _        || _        t          ddgt          d                                          d                                         | _        t                      | _	        d| _
        d | _        d| _        d | _        d | _        d | _        d| _        d S )Nunamez-rT)stdoutuniversal_newlinesr   F)
controller_viewconfigr   r   communicatestripr   r   archextra_snap_space_poke_snapstore_reachable
_snap_list_from_version_to_version_did_change_font)selfr   r   s      P/home/let_prod/public_html/lightetech2/upgrader/DistUpgrade/DistUpgradeQuirks.py__init__zDistUpgradeQuirks.__init__=   s    $%
GT?4.24 4 44?KMM!EEJUWW 	
JJ	 !
$)!! %    c                     | j         j        rt          j        d           dS t          j        d           |                                  dS )z3 run before the apt cache is opened the first time )not running quirks in partialUpgrade modeNzrunning Quirks.PreCacheOpen)r   _partialUpgradelogginginfodebug_add_apport_ignore_listr   s    r   PreCacheOpenzDistUpgradeQuirks.PreCacheOpenM   sP     ?* 	LDEEEF3444$$&&&&&r   c                 X   | j         j        rt          j        d           dS t          j        d           |                                  |                                  | j         j        }|                     |           | 	                                 d|vrt          j        d           dS |d         j
        rRt          j                            d          st          j                            d          r|                                  | j        r|                                  dS dS )z2 run after the apt cache is opened the first time r    Nz running Quirks.PostInitialUpdatesnapd'package required for Quirk not in cachez/run/snapd.socketz/run/snapd-snap.socket)r   r!   r"   r#   r$   _get_from_and_to_version_test_and_fail_on_tpm_fdecache_test_and_warn_if_ros_installed#_maybe_prevent_flatpak_auto_removalis_installedospathexists_checkStoreConnectivityr   _calculateSnapSizeRequirementsr   r-   s     r   PostInitialUpdatez#DistUpgradeQuirks.PostInitialUpdateX   s-    ?* 	LDEEEF8999%%'''&&(((%,,U33300222%MCDDDF>& 	+ 344	+ 899	+ ((*** $ 	2//11111	2 	2r   c                    | j         j        rt          j        d           d S t          j        d           | j         j        }d|vrt          j        d           d S |d         j        r| j        r|                                  d|v r!|d         j        r| 	                                 d|v r#|d         j        r| 
                                 d S d S d S )Nr    zrunning Quirks.PostUpgrader)   r*   zubuntu-desktop-raspizubuntu-server-raspi)r   r!   r"   r#   r$   r-   r0   r   _replaceDebsAndSnaps_replace_fkms_overlay_add_kms_overlayr6   s     r   PostUpgradezDistUpgradeQuirks.PostUpgradev   s    ?* 	LDEEEF2333%%MCDDDF>& 	(	(%%'''!U**+,9 -**,,, E))*+8 (%%''''' *)( (r   c                     | j         j        rt          j        d           d S 	 t          j        d           |                                  d S )Nr    zrunning Quirks.PostCleanup)r   r!   r"   r#   r$   _remove_apport_ignore_listr&   s    r   PostCleanupzDistUpgradeQuirks.PostCleanup   sQ    ?* 	LDEEEF2333'')))))r   c                 T   | j         j        rt          j        d           d S t          j        d           | j         j        }|                                  |                                  |                                  | 	                                 | 
                    |           d S )Nr    zrunning Quirks.StartUpgrade)r   r!   r"   r#   r$   r-   _removeOldApportCrashes_killUpdateNotifier_pokeScreensaver_set_generic_font_disable_kdump_tools_on_installr6   s     r   StartUpgradezDistUpgradeQuirks.StartUpgrade   s    ?* 	LDEEEF3444%$$&&&  """   ,,U33333r   c                     | j         j        rt          j        d           dS t          j        d           |                                  dS )z/ run right before calculating the dist-upgrade r    Nz"running Quirks.PreDistUpgradeCache)r   r!   r"   r#   r$   _maybe_remove_gpg_wks_serverr&   s    r   PreDistUpgradeCachez%DistUpgradeQuirks.PreDistUpgradeCache   sP     ?* 	LDEEEF:;;;))+++++r   c                     | j         j        rt          j        d           dS t          j        d           |                                  dS )z( run after calculating the dist-upgrade r    Nz#running Quirks.PostDistUpgradeCache)r   r!   r"   r#   r$   _install_linux_metapackager&   s    r   PostDistUpgradeCachez&DistUpgradeQuirks.PostDistUpgradeCache   sP     ?* 	LDEEEF;<<<'')))))r   c                     t          j                    }	 |                    d j        j        z                                            d          _        |                    d j        j        z                                            d          _        d S # t          $ r t           fd|                    d          D              j        j                                                  d          _        t           fd|                    d          D              j        j                                                  d          _        Y d S w xY w)Nz%sr   c              3   P   K   | ] }|j         j        j        k    |j        V  !d S N)seriesr   fromDistversion.0rr   s     r   	<genexpr>z=DistUpgradeQuirks._get_from_and_to_version.<locals>.<genexpr>   sB       : :qH 888 8888: :r   objectc              3   P   K   | ] }|j         j        j        k    |j        V  !d S rO   )rP   r   toDistrR   rS   s     r   rV   z=DistUpgradeQuirks._get_from_and_to_version.<locals>.<genexpr>   sB       8 8qH 666 66668 8r   )distro_infoUbuntuDistroInforR   r   rQ   splitr   rY   r   AttributeErrornextget_all)r   dis   ` r   r+   z*DistUpgradeQuirks._get_from_and_to_version   sd   )++	3

4$/"::;;AACCAF  

4$/"8899??AA!D   	3 	3 	3!%: : : :BJJx$8$8 : : :("* "* +0%''!"5D  $8 8 8 8BJJx$8$8 8 8 8& (  ( ). 3D	3s   A>B B6EEc                    t                      }dD ],}|                    t          j        d|z                       -d}|D ]7}|r n2|D ].}|                    |j                  r|j        s|j        rd} n/8|rR| j        	                    t          d          t          d                    }|s| j                                         dS dS dS )z
        Test and warn if ROS is installed. A given ROS release only
        supports specific Ubuntu releases, and can cause the upgrade
        to fail in an overly-cryptic manner.
        )catkinzrosboost-cfgroscleanzros-environmentzros-workspacezros-[^\-]+-%sFTz-The Robot Operating System (ROS) is installeda	  It appears that ROS is currently installed. Each ROS release is very strict about the versions of Ubuntu it supports, and Ubuntu upgrades can fail if that guidance isn't followed. Before continuing, please either uninstall ROS, or ensure the ROS release you have installed supports the version of Ubuntu to which you're upgrading.

For ROS 1 releases, refer to REP 3:
https://www.ros.org/reps/rep-0003.html

For ROS 2 releases, refer to REP 2000:
https://www.ros.org/reps/rep-2000.html

Are you sure you want to continue?N)setaddrecompilematchnamer0   marked_installr   askYesNoQuestion_r   abort)r   r-   ros_package_patternspackage_nameros_is_installedpkgpatternress           r   r.   z1DistUpgradeQuirks._test_and_warn_if_ros_installed   s7     #uu! 	= 	=L !$$
+l:;;= = = = ! 	 	C /  ==** ' 03+= 0+/(E
  	(*--ABB 7 8 89 9C  (%%'''''!	( 	(( (r   c                    d}d| j         j        vrdS | j         j        d         j        sdS t          j                            d          sdS dD ]T}t          j        d|gt          j                  }|j	        
                    d                                          rd} nUt          j        d	                    |rd
nd                     |sdS | j         j        d                             d           dD ]v}|| j         j        vr| j         j        |         j        s)t          j        d                    |                     | j         j        |                             d           w| j         j                            | j                                        | j                            | j         j                             dS )z
        If flatpak is installed, and there are either active remotes, or
        flatpak apps installed, prevent flatpak's auto-removal on upgrade.
        FflatpakNz/usr/bin/flatpak)remoteslist)r   utf-8Tz-flatpak will{}be marked as manually installed z NOT )auto)zplasma-discover-backend-flatpakzgnome-software-plugin-flatpakz'{} will be marked as manually installed)r   r-   r0   r1   r2   r3   
subprocessrunr   r   decoder   r"   r$   format	mark_autocommitr   getAcquireProgressgetInstallProgress)r   prevent_auto_removalsubcmdrU   rq   s        r   r/   z5DistUpgradeQuirks._maybe_prevent_flatpak_auto_removal   s   
  %DO111F$Y/< 	Fw~~011 	F) 	 	F'0%?  A xw''--// '+$ 	Ev%9FccwGG	I 	I 	I $ 	Fi(222>>>5 
	= 
	=C$////?(-: MC!6#;;( ( (O!#&00e0<<<<$$J))++J))$/*?@@	
 	
 	
 	
 	
r   c                 l   ddg}d}	 t          j        t           j                            |          d           t	          |d          5 }|D ]}|                    | d           	 d d d            d S # 1 swxY w Y   d S # t          $ r%}t          j        d| d	|            Y d }~d S d }~ww xY w)
Nz/usr/libexec/tracker-extract-3z!/usr/sbin/update-apt-xapian-index2/etc/apport/blacklist.d/upgrade-quirks-ignore-listTexist_okw
zFailed to create : )	r1   makedirsr2   dirnameopenwrite	Exceptionr"   r$   )r   ignore_listr2   fbines         r   r%   z)DistUpgradeQuirks._add_apport_ignore_list1  s1   ,/

 D	;K--====dC (A& ( (CGGsJJJ''''(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (  	; 	; 	;M9d99a99:::::::::	;s<   AB A7*B 7A;;B >A;?B 
B3B..B3c                     d}	 t          j        |           d S # t          $ r%}t          j        d| d|            Y d }~d S d }~ww xY w)Nr   zFailed to remove r   )r1   remover   r"   r$   )r   r2   r   s      r   r>   z,DistUpgradeQuirks._remove_apport_ignore_listB  so    C	;IdOOOOO 	; 	; 	;M9d99a99:::::::::	;s    
A	AA	c                     t           j                            d          r,t          j        d           t          j        g d           dS dS )zkill update-notifierz/usr/bin/killallzkilling update-notifier)killall-qzupdate-notifierN)r1   r2   r3   r"   r$   r{   callr&   s    r   rB   z%DistUpgradeQuirks._killUpdateNotifierJ  sV     7>>,-- 	BM3444O@@@AAAAA	B 	Br   c                    t           j                            d          rt           j                            d          rt          j        d           d}|dz  }|dz  }	 t          j        |d          | _	        t          j        | j                   d S # t          t          f$ r t          j        d	           Y d S w xY wd S d S )
Nz/usr/bin/xdg-screensaverDISPLAYz$setup poke timer for the screensaverzwhile true;z3 do /usr/bin/xdg-screensaver reset >/dev/null 2>&1;z sleep 30; doneTshellz failed to setup screensaver poke)r1   r2   r3   environgetr"   r$   r{   r   r   atexitregister_stopPokeScreensaverOSError
ValueError	exception)r   cmds     r   rC   z"DistUpgradeQuirks._pokeScreensaverQ  s    GNN566 
	F
y))
	FM@AAACHHC$$CF'-c>>>
 9:::::Z( F F F!"DEEEEEEF
	F 
	F 
	F 
	Fs    4B %B?>B?c                     d}| j         _	 | j                                          | j                                         }n$# t          $ r t	          j        d           Y nw xY wd | _         |S )NFzfailed to stop screensaver poke)r   	terminatewaitr   r"   r   )r   rs   s     r   r   z&DistUpgradeQuirks._stopPokeScreensaver^  s    :!E
$$&&&joo'' E E E!"CDDDDDEDJ
s   2> AAc           	         	 dD ]K}t          j         d|z            D ]1}t          j        d|d|d           t          j        |           2LdS # t
          $ r"}t          j        d|z             Y d}~dS d}~ww xY w)z: remove old apport crash files and whoopsie control files )z.crashz.uploadz	.uploadedz/var/crash/*%szremoving old z file ''z+error during unlink of old crash files (%s)N)globr"   r$   r1   unlinkr   warning)r   extr   r   s       r   rA   z)DistUpgradeQuirks._removeOldApportCrashesi  s    	O9 ! !#3c#9:: ! !AMMaaa"HIIIIaLLLL!! !  	O 	O 	OOIAMNNNNNNNNN	Os   AA 
A>A99A>c                    d}t           j                                        }d|d<   t          g dt          t          |d                                          }t          j        d|d         t          j                  r	d| _	        d	S t          j        d
|d         t          j                  rt          j        d           d}| j        j        }d|v rH|d         j        r;|d         j        j                            d          st          j        d           d}|rSt%          d          }t%          d          }| j                            ||           | j                                         n| j                            t%          d          t%          d                    }nd|d         v rJt          j        d           | j                            t%          d          t%          d                    }n5d|d         v rd}t          j        d           nt          j        d           |s| j                                         d	S d	S )z: check for connectivity to the snap store to install snapsFzC.UTF-8LANG)snapr$   connectivityT)r   stderrenvr   z	^ \* PASSr   Nz^ \*.*unreachablezNo snap store connectivitylxdz1:zlxd is installedz#Connection to the Snap Store faileda  You have the package lxd installed but your system is unable to reach the Snap Store. lxd is now provided via a snap and the release upgrade will fail if snapd is not functional. Please make sure you're connected to the Internet and update any firewall or proxy settings as needed so that you can reach api.snapcraft.io. If you are an enterprise with a firewall setup you may want to configure a Snap Store proxy.zConnection to Snap Store failedzYour system does not have a connection to the Snap Store. For the best upgrade experience make sure that your system can connect to api.snapcraft.io.
Do you still want to continue with the upgrade?zerror: unknown commandr   z snap debug command not availablezOutdated snapd packagezYour system does not have the latest version of snapd. Please update the version of snapd on your system to improve the upgrade experience.
Do you still want to continue with the upgrade?zerror: access deniedzNot running as root!z-Unhandled error connecting to the snap store.)r1   r   copyr   r   r   rf   search	MULTILINEr   r"   errorr   r-   r0   	candidaterR   
startswithrl   r   rm   rk   )r   rs   snap_env	connectedold_lxd_deb_installedr-   summarymsgs           r   r4   z)DistUpgradeQuirks._checkStoreConnectivitys  sg   :??$$$;;;D!%8-13 3 33>;== 	 9\9Q<>> 4	K(,D%FY+Yq\2<HH 0	KM6777$)!O)E~~<, 1e.6AA$GG1M"4555,0)$ ABB 	. 
 
 
  #...%%''''j11788 H I I  &155M<===*--*++ D E E CC $y|33CM01111MIJJJ 	$O!!#####	$ 	$r   c           	         dd l }dd l}ddlm} |                                  | j                            t          d                     | j        	                                D ]a\  }}|d         dk    rdd|d         |d	         d
}g |gd}|j
                            dt          |                    |          d                    }|                    dd           |                    dd           |                    d| j                   	 |j
                            |                                          }	|                    |	          }
t'          |
d         d         d         d         d                   }n0# t(          |t*          f$ r t-          j        d|z             Y Mw xY w| xj        |z  c_        cd S )Nr   )URLErrorz"Calculating snap size requirementscommandinstallzupgrade-size-checkdownloadsnap-idchannel)zinstance-keyactionr   r   )contextactionsz)https://api.snapcraft.io/v2/snaps/refreshrx   encoding)urldatazSnap-Device-Series16zContent-typezapplication/jsonzSnap-Device-Architectureresultsr   sizezFailed fetching size of snap %s)jsonurllib.requesturllib.errorr   _prepare_snap_replacement_datar   updateStatusrl   r   itemsrequestRequestbytesdumps
add_headerr   urlopenreadloadsintKeyErrorr   r"   r$   r   )r   r   urllibr   r   snap_objectr   r   reqresponser#   r   s               r   r5   z0DistUpgradeQuirks._calculateSnapSizeRequirements  s   ))))))
 	++--- 	
"F G GHHH!%!6!6!8!8 	* 	*D+9%22 4$&y1&y1	 F "8 D .((?4::d++g>>> ) @ @C NN/666NN>+=>>>NN5tyAAA!>11#66;;==zz(++4	?1-f5jA&IJJh
3   ?$FGGG !!T)!!!5	* 	*s   A.F)F10F1c                    | j                             t          d                     | j                                        D ]\  }}|d         }|dk    r:|d         }| j                             t          d|z                       d|d||g}nm|dk    r0| j                             t          d	|z                       d||g}n7| j                             t          d
|z                       d|d|d         |g}	 | j                                          t          j        |t          j        d          }| j                                          n0# t          j	        $ r t          j        |d|d           Y <w xY w|j        dk    rt          j        |d|d           |dk    r-|d         r%| j        j                            |d                    dS )z? install a snap and mark its corresponding package for removal zProcessing snap replacementsr   switchr   zswitching channel for snap %sr   z	--channelr   zremoving snap %szinstalling snap %sT)r   checkz	 of snap z failedr   z
 succeededr   debN)r   r   rl   r   r   processEventsr{   r|   r   CalledProcessErrorr"   r$   
returncoder   forced_obsoletesappend)r   r   r   r   r   	popenargsprocs          r   r9   z&DistUpgradeQuirks._replaceDebsAndSnaps  s   
"@ A ABBB "&!6!6!8!8 	L 	LD+!),G(""%i0
''5<==   $Wk7DI		H$$
''*<t*C(D(DEEE#Wd3		
''*>*E(F(FGGG#W(+i*@$H		
((***!~%?      
((****0   FGGG !##777DDDIJJJ)##E(:#077E8JKKK;	L 	Ls   =AE)E>=E>c                    t          j        d          }|                    |          }|                    |          }|r\|rZ|                    d          d|                    d          }|                    d          d|                    d          }t	          j        d|d|           t          j                            ||          dk    S )z# copied from ubuntu-drivers common z(.+)-([0-9]+)-(.+)r   -   z
Comparing z with r   )	rf   rg   rh   groupr"   r$   aptapt_pkgversion_compare)r   term1term2rr   match1match2s         r   _is_greater_thanz"DistUpgradeQuirks._is_greater_than  s     *122u%%u%% 	0f 	0%||A%||A0E%||A%||A0E 	uu=>>>{**5%881<<r   c           	      j   |rdpd}t          j        d          }t          j        d          }d}d}|D ]}d|j        v rd|j        vr|j        s|j        r|                    |j                  }	|	r|j        j        d         }
|	                    d          d	|	                    d
          }| 	                    ||          rj|}|                    |
          }d|
v r4|r2d|d	|	                    d          d	|                    d          }d|d	|	                    d          }|S )zb Get the linux headers or linux metapackage
            copied from ubuntu-drivers-common
        z-headers zlinux-image-(.+)-([0-9]+)-(.+)z
linux-(.+)zlinux-imageextraSourcer   r   r   z-lts-linux   )
rf   rg   ri   r0   rj   rh   r   recordr   r   )r   r-   headerssuffixrr   source_patternmetapackagerR   rq   rh   sourcecurrent_versionmatch_sources                r   _get_linux_metapackagez(DistUpgradeQuirks._get_linux_metapackage  s{    'Z-2*=>>L11 #	; #	;C))gSX.E.E% /F),); /Fch//  ; ]1(;F16Q16Q'AO ,,_-46 6 ;"1'5';';F'C'C"f,,,, ,266+0;;q>>>>+7+=+=a+@+@+@+BKK ,266+0;;q>>>+;K r   c                     | j         j        }|                     |d          }||vrt          j        d|z             dS ||         j        s1t          j        d|z             d}|                    ||           dS dS )zo Ensure the linux metapackage is installed for the newest_kernel
            installed. (LP: #1509305)
        Fz$linux metapackage (%s) not availableNz installing linux metapackage: %sz8linux metapackage may have been accidentally uninstalled)r   r-   r  r"   r#   r0   mark_install)r   r-   linux_metapackagereasons       r   rK   z,DistUpgradeQuirks._install_linux_metapackage?  s     % 77uEE E))L?*+ , , ,F&'4 	:L;*+ , , ,OF0&99999		: 	:r   c                     | j         j        sft          j        j                            d          sDd}|dz  }t          j        |           t          j        j                            dd           dS dS dS )z] ensure that on a desktop install recommends are installed
            (LP: #759262)
        zApt::Install-Recommendsz%Apt::Install-Recommends was disabled,z! enabling it just for the upgrade1N)	r   
serverModer   r   r   find_br"   r   rd   )r   r   s     r   +ensure_recommends_are_installed_on_desktopsz=DistUpgradeQuirks.ensure_recommends_are_installed_on_desktopsR  s     ) 	G;%,,-FGG G=::$$$"&&'@#FFFFF	G 	GG Gr   c                     |                     dd          }t          |t                    s|g}|D ]/}|| j        j        vr|r| j        j        |         j        du r- dS dS )z Helper function that checks if the given deb2snap entry
            has at least one metapkg which is installed on the system.
        metapkgNFT)r   
isinstancerw   r   r-   r0   )r   deb2snap_entrymetapkg_listr  s       r   _is_deb2snap_metapkg_installedz0DistUpgradeQuirks._is_deb2snap_metapkg_installed]  s     &)))T::,-- 	*(>L# 	 	Gdo333 O)'2?5HH44ur   c           	      
   ddl }i | _        d| j        z  }d| j        z  }i }i }	 t          j                            t          j                            t                              }t          |dz   d          }|
                    |          }|                                 |d         D ]}	|d         |	         }
|                     |
          s&|
                    dd          }|
                    d|          }|
                    d	|          }|
                    d
d          }||||f||	<   |d         D ]Y}	|d         |	         }|                    dd          }|                     |          s<|                    d|          }||f||	<   Zn.# t          $ r!}t          j        d|z             Y d}~nd}~ww xY wd}t#          j        ddgdt"          j                                                  }|rDd |d                             d          dd         D             }|D ]}	|	|v s|	|v rd||df||	<   | j                            t1          d                     |                                D ]z\  }	}|\  }}}}i }t#          j        dd|	gdt"          j                                                  }| j                                         t7          j        d|d         t6          j                  r`t          j        d|	z             t7          j        d|z  |d         t6          j                  st          j        d|	z             |sd|d<   n| j        j         }|r.||vs||         j!        st          j        d|d |	d!            t7          j        d"|d                   }|st          j        d#|	z             Vd$|d<   ||d<   |d         |d%<   ||d&<   || j        |	<   ||                                D ]\  }	\  }}i }t#          j        dd|	gdt"          j                                                  }| j                                         t7          j        d|d         t6          j                  rpt          j        d|	z             t7          j        d|z  |d         t6          j                  st          j        d|	z             d'|d<   t#          j        dd(|	gdt"          j                                                  }| j                                         |d                             d          D ]}|                                }tE          |          d)k    r*|d         }|d*         }|#                    |	d+z             rL|                    d+          d         }|d,k    r+||vr't          j        d-|	d.|d/           d|d<   d0|d&<    n|| j        |	<   | j        S )1z Helper function fetching all required info for the deb-to-snap
            migration: version strings for upgrade (from and to) and the list
            of snaps (with actions).
        r   Nzstable/ubuntu-%sz/deb2snap.jsonrU   seededr   from_channel
to_channelforce_switchFunseededz%error reading deb2snap.json file (%s)r   r   rw   T)r   r   c                 B    g | ]}|                                 d          S r   )r\   rT   lines     r   
<listcomp>zDDistUpgradeQuirks._prepare_snap_replacement_data.<locals>.<listcomp>  s:     K K K#'  $zz||A K K Kr   r   r   zChecking for installed snapsr#   z^installed: zSnap %s is installedz^tracking:.*%sz+Snap %s is not tracking the release channelr   r   zDeb package z) is not installed. Skipping snap package z installationzsnap-id:\s*(\w*)z'Could not parse snap-id for the %s snapr   r   r   r   connections   r   :r   zSnap z is being used by z. Switching it to stable trackstable)$r   r   r   r   r1   r2   r   abspath__file__r   loadcloser  r   r   r"   r   r{   r   r   r   r\   r   r   rl   r   r   rf   r   r   r$   r   r-   r0   lenr   )r   r   r  r   seeded_snapsunseeded_snapscurrent_pathd2s_filed2sr   seedr   	from_chanto_chanr!  unseedr   	snap_listsnaps_installedpropsr   	snap_infor-   rh   connsconn	conn_colsplugslot	plug_snaps                                 r   r   z0DistUpgradeQuirks._prepare_snap_replacement_datap  s   
 	)D,>>'$*::
	I7??27??8+D+DEELL+;;SAAH))H%%CNNH M M8}T*::4@@ hhud++ HH^\BB	((<<<#xx>>&)9g|%LT""J 8 8Z.jj--::6BB "JJ~|DD	(+Y'7t$$8  	I 	I 	IOCaGHHHHHHHH	I 	$ff%58<,6O= = ==H[]] 	  	K K+4Q<+=+=d+C+CAbD+IK K KO (  <''4>+A+A lJ*L&& 	
"@ A ABBB'--// '	0 '	0KD%<A9S,
LK"(&&$)?<@0:A A AAL  J$$&&&y)A,EE 24t;<<<y!2\!A!*1r|= = !M"O$(#) * * * ( ! !)1I&& - S--U3Z5L-MMDGCC#O P P P	"5y|DD M"K$(#) * * *)2I&%(E").qI&%/K	"$/DOD!!)7)=)=)?)? *	4 *	4%D%3K"(&&$)?<@0:A A AAL  J$$&&&y)A,EE #44t;<<<y!2\!A!*1r|= = M"O$(#) * * *)1I& #(&-)F<@0:A A AAL  
((***!!HNN400 " "D $

I9~~** $Q<D$Q<Dtcz22 	"$(JJsOOA$6	$++$N::#MM-1TT999+> ? ? ? 6>K	25=K	2!E(3%s   E/F 
G F;;G c                    	 |dz   }t          |dd          5 }|                    |           d d d            n# 1 swxY w Y   n/# t          $ r"}t          j        d|||           Y d }~d S d }~ww xY w	 t          |dd          5 }|                    |           d d d            d S # 1 swxY w Y   d S # t          $ r"}t          j        d|||           Y d }~d S d }~ww xY w)Nz.distUpgrader   rx   r   z0unable to write boot config backup to %s: %s; %sz-unable to write new boot config to %s: %s; %s)r   r   IOErrorr"   r   )r   
old_config
new_configboot_config_filenamefailure_actionboot_backup_filenamer   excs           r   _replace_pi_boot_configz)DistUpgradeQuirks._replace_pi_boot_config  s   	#7.#H *C'BBB $a
###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 	 	 	ML.^E E EFFFFF		E*C'BBB $a
###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 	E 	E 	EMI.^E E E E E E E E E	Esp   A ;A ?A ?A 
A3A..A37B9 	B,B9 ,B00B9 3B04B9 9
C%C  C%/boot/firmwarec                    d}	 t           j                            |d          }t          |dd          5 }|                                }d d d            n# 1 swxY w Y   n'# t
          $ r t          j        d||           Y d S w xY wd                    d |                    d	
          D                       }||k    rt          j	        d|           d S | 
                    ||||           d S )NzfYou may need to replace the vc4-fkms-v3d overlay with vc4-kms-v3d in config.txt on your boot partition
config.txtrU   rx   r   +failed to open boot configuration in %s; %sr   c              3      K   | ]i}|                     d           rd|z   |                    d d          z   n3|                     d          s|                                dk    rd|z   n|V  jdS )zdtoverlay=vc4-fkms-v3dz0# changed by do-release-upgrade (LP: #1923673)
#dtoverlay=vc4-kms-v3dzgpu_mem=z	start_x=1z1# disabled by do-release-upgrade (LP: #1923673)
#N)r   replacerstripr%  s     r   rV   z:DistUpgradeQuirks._replace_fkms_overlay.<locals>.<genexpr>  s       
 
  788	?$FLL13JKKL L z**.2kkmm{.J.J A4GG
 
 
 
 
 
r   T)keependsz3no fkms overlay or camera firmware line found in %sr1   r2   joinr   r   FileNotFoundErrorr"   r   
splitlinesr   rM  )r   boot_dirrJ  rI  r   boot_configrH  s          r   r:   z'DistUpgradeQuirks._replace_fkms_overlay  s   ? 		#%7<<,#G#G *C'BBB 'affhh' ' ' ' ' ' ' ' ' ' ' ' ' ' '  	 	 	MG.@ @ @FF	
 WW 
 
 $...==
 
 
 
 

  $$O $%9; ; ;F$$%9>	K 	K 	K 	K 	Ks4   2A# AA# AA# AA# # BBc                 0  	
 d}g d		 t           j                            |d          }t          |dd          5 }|                                }d d d            n# 1 swxY w Y   n'# t
          $ r t          j        d||           Y d S w xY wd 
	
fd	}d
 |                                D             } ||          }d                    d |D                       }||k    rt          j	        d|           d S | 
                    ||||           d S )NzbYou may need to add dtoverlay=vc4-kms-v3d to an [all] section in config.txt on your boot partition)z,# added by do-release-upgrade (LP: #2065051)rS  zdisable_fw_kms_setup=1r   z[pi3+]dtoverlay=vc4-kms-v3d,cma-128r   z[pi02]r^  r   [all]rP  rU   rx   r   rQ  c                 8   d}d}t          |           D ]\  }}|                                }|rd|}|                    d          r|c S |                    d          r|                    d          r|dk    }g|                    d          rd}|dk    }|S )	NTr   rS  []r_  zinclude F)	enumeraterU  r   endswith)linesin_alllastindexr&  s        r   find_insertion_pointz@DistUpgradeQuirks._add_kms_overlay.<locals>.find_insertion_pointN  s     FD(// - -t{{}} - D'>?? '#-- '$--2D2D '!%44 ' "'!W_FFKr   c                      |           }	 | |                              d          r| S n# t          $ r Y nw xY w| ||<   | S )NrS  )r   
IndexError)re  insert_pointadded_linesri  s     r   add_kms_overlayz;DistUpgradeQuirks._add_kms_overlay.<locals>.add_kms_overlayf  st    //66L&112IJJ ! L!    0;E,|+,Ls   , 
99c                 6    g | ]}|                                 S  )rU  r%  s     r   r'  z6DistUpgradeQuirks._add_kms_overlay.<locals>.<listcomp>q  s     DDD4DDDr   r   c              3       K   | ]	}|d z   V  
dS )r   Nrp  r%  s     r   rV   z5DistUpgradeQuirks._add_kms_overlay.<locals>.<genexpr>s  s&      ;;TTD[;;;;;;r   z)no addition of KMS overlay required in %srW  )r   r[  rJ  rI  r   r\  rn  re  rH  rm  ri  s            @@r   r;   z"DistUpgradeQuirks._add_kms_overlay4  s   3 	
 
 
	#%7<<,#G#G *C'BBB 'affhh' ' ' ' ' ' ' ' ' ' ' ' ' ' '  	 	 	MG.@ @ @FF	
	 	 	0		 		 		 		 		 		 ED;+A+A+C+CDDD&&WW;;U;;;;;
$$OG02 2 2F$$%9>	K 	K 	K 	K 	Ks4   2A) AA) A!!A) $A!%A) ) BBc                 	   d}| j         rdS t          j        dd          dv rdS ddh                    t          j                  st          j        d           dS 	 t          t          j        dt          j        d                              }t          j	        |          }n%# t          $ r t          j        d	           Y dS w xY wd
}t          j        dd                              d          }d|v sd|v rd}nd|v rd}t          t          g d          t          |          z            }t          j        ddd|j         ddddddd| dgt          j        d          }|j                            d                               d!          \  }}	}
|pd"}	 t          |
           n# t          $ r d#}
Y nw xY wt          j        d$| d!|
 d%| d!|
 d&	           t          j        ddd|j         ddddddd'| dd(| d!|
 d(g          }|j        d)k    rt          j        d*| d!|
            dS d+| _         t          j                            |j        d,          }t          j        t          j                            |          d+-           t7          j        |                              d./           t          j        ||j        |j                    |rd0}t          j        t          j                            |          d+-           d1}tC          |d2          5 }|"                    d3| d4| d5| d!|
 d6| d7           ddd           n# 1 swxY w Y   dS d8}t          j        t          j                            |          d+-           tC          |d2          5 }|"                    d9| d:| d!|
 d;           ddd           n# 1 swxY w Y   t          j        d<dd|j         dd=g           t          j        d<dd|j         dd>t          j        #                    |          g          }|j        d)k    r7t          j        d?t          j        #                    |           d@           dS dS )Az Due to changes to the Ubuntu font we enable a generic font
            (in practice DejaVu or Noto) during the upgrade.
            See https://launchpad.net/bugs/2034986
        SansNXDG_SESSION_TYPEr   )r   ttySUDO_UID
PKEXEC_UIDzFCannot determine how root privileges were gained, will not change fontz3Cannot determine non-root UID, will not change fontzorg.gnome.desktop.interfaceXDG_CURRENT_DESKTOPr+  MATEUKUIzorg.mate.interface
X-Cinnamonzorg.cinnamon.desktop.interface)BudgieLXQtry  rz  r{  XFCEzsystemd-runz--userz-Mz@.hostz--waitz--piper   z--z/usr/bin/gsettingsr   z	font-namerx   )r   r   z'
ry   Ubuntu11zSetting generic font z& during the upgrade. Original font is .rd   "r   zFailed to change font to Tz!.config/upgrade-need-font-restorer   i  )modez//etc/xdg/autostart/upgrade-restore-font.desktopz'$HOME/.config/upgrade-need-font-restorer   z[Desktop Entry]
Name=Restore font after upgrade
Comment=Auto-generated by ubuntu-release-upgrader
Type=Application
Exec=sh -c 'if [ -e "z" ]; then gsettings set z font-name "z	";rm -f "z"; fi'
NoDisplay=true
z2/usr/lib/systemd/user/upgrade-restore-font.servicez# Auto-generated by ubuntu-release-upgrader
[Unit]
Description=Restore font after upgrade
After=graphical-session.target dconf.service
ConditionPathExists=%h/.config/upgrade-need-font-restore

[Service]
Type=oneshot
ExecStart=/usr/bin/gsettings set z font-name 'zm'
ExecStart=/usr/bin/rm -f %h/.config/upgrade-need-font-restore

[Install]
WantedBy=graphical-session.target
	systemctlzdaemon-reloadenablezFailed to enable z%. Font will not be restored on reboot)$r   r1   getenvintersectionr   r"   r$   r   pwdgetpwuidr   r\   boolrd   r{   r|   pw_namer   r   r   
rpartitionr   r2   rX  pw_dirr   r   pathlibPathtouchchownpw_uidpw_gidr   r   basename)r   	temp_fontuidpwuidschemadesktopsuse_autostartrU   fontrl   r   need_font_restore_fileautostart_fileflagr   	unit_files                   r   rD   z#DistUpgradeQuirks._set_generic_font|  sX   
 	  	F9',,;; FL)66rzBB 	M"   F	bi
BIl,C,CDDEECL%%EE 	 	 	ME   FF		 /92B77==cBB X8!3!3)FFX%%5F HHHII(mm
 

 NHdu},D,D,Dxt!5[+' ?
 
 
 (..00;;C@@q$x	IIII 	 	 	DDD	 	 Bi B B$ B B37B B:>B B B 	C 	C 	C N8Tem+C+C+Chd %F0Y00000	
   <1MHiHH$HHIIIF $ "$L="
 "
 	BGOO$:;;dKKKK+,,222>>>
'u|DDD 	NNK77$GGGG<Dnc** 
a' .2	' '
 ' '
 ,0' '
 37' ' #' ' '	 	 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 F I	
BGOOI..>>>>)S!! 	QGG6 6 6 )-6 6 046 6 6  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	& 	du}444
 	 	 	
 Ndu}444bg&&y11
  
 <1M @bg.>.>y.I.I @ @ @ A A A A A sI   AB& &CC F0 0F?>F?+&MM!$M!/ OO"Oc                    | j         j        j        }	 |d         j        sdS |d         j        }d |D             }n# t
          $ r Y dS w xY wt          |          s}t          j        d           | j         j        d         	                    d           t          j        | j         j                                      | j         j        d                    dS dS )z}
        Prevent postfix from being unnecessarily installed, and leading to a
        debconf prompt (LP: #2060578).
        zgpg-wks-serverNzmail-transport-agentc                 2    g | ]\  }}}|j         j        |S rp  )
parent_pkgcurrent_ver)rT   rl   vers      r   r'  zBDistUpgradeQuirks._maybe_remove_gpg_wks_server.<locals>.<listcomp>  s9       !1c>-  r   zENo mail-transport-agent installed, marking gpg-wks-server for removalF)auto_fix)r   r-   _cacher  provides_listr   anyr"   r#   mark_deleter   ProblemResolverprotect)r   r-   provides_mtainstalled_mtas       r   rH   z.DistUpgradeQuirks._maybe_remove_gpg_wks_server  s    %,	)*6  !78FL %1  MM  	 	 	FF	 =!! 		L5  
 O!"23???OOO 566>>%&67    		 		s   < < 
A
	A
c                 $   	 t          j        ddg          }d |                                D             }n# t          $ r Y dS w xY wd|v rd| j        j        v r| j        j        d         j        rt          j        d           t          j
                    }|                    | j        j                  pd}| j                            t          d	|           t          d
                     | j                                         dS dS dS dS )z
        LP: #2065229
        r   rw   c                 f    g | ].}|                                                                 d          /S r$  )r}   r\   )rT   ss     r   r'  z?DistUpgradeQuirks._test_and_fail_on_tpm_fde.<locals>.<listcomp>7  s1    KKKqQXXZZ%%''*KKKr   Nz	pc-kernelzubuntu-desktop-minimalzDetected TPM FDE systemznext releasez%Sorry, cannot upgrade this system to zUpgrades for desktop systems running TPM FDE are not currently supported. Please see https://launchpad.net/bugs/2065229 for more information.)r{   check_outputrZ  rY  r   r-   r0   r"   r$   rZ   r[   rR   rY   r   r   rl   rm   )r   r;  snapsr`   rR   s        r   r,   z+DistUpgradeQuirks._test_and_fail_on_tpm_fde1  sD   	"/0@AAIKKI4H4H4J4JKKKEE  	 	 	FF	
 5  $(===O!":;H > M3444-//Bjj!788JNGJEGEE  , 	   O!!#####+ ! ====s   47 
AAc                    d|vrdS |d         }|j         rt          j        d           dS |j        rPt          j        d           t	          j        dd          }|j        }|dk    rt          j        d	|            dS dS dS )
z0Disable kdump-tools if installed during upgrade.zkdump-toolsNz-kdump-tools already installed. Not disabling.z1installing kdump-tools due to upgrade. Disabling.zOecho "kdump-tools kdump-tools/use_kdump boolean false" | debconf-set-selectionsTr   r   z-kdump-tools debconf-set-selections returned: )r0   r"   r#   rj   r{   r|   r   r$   )r   r-   rq   r   ret_codes        r   rE   z1DistUpgradeQuirks._disable_kdump_tools_on_installT  s    %%FM" 	LHIIIF 	LLMMM>0   D H1}}1&.1 1    	 	 }r   N)rN  )%__name__
__module____qualname____doc__r   r'   r7   r<   r?   rF   rI   rL   r+   r.   r/   r%   r>   rB   rC   r   rA   r4   r5   r9   r   r  rK   r  r  r   rM  r:   r;   rD   rH   r,   rE   rp  r   r   r	   r	   '   sJ        *& & & ' ' '2 2 2<( ( (,* * *4 4 4 , , ,* * *3 3 3$-( -( -(^0
 0
 0
d; ; ;"; ; ;B B BF F F	 	 	O O O>$ >$ >$@&* &* &*P"L "L "LH= = = . . .`: : :&	G 	G 	G  &L L L\E E E"#K #K #K #KJFK FK FK FKPPA PA PAd! ! !F!$ !$ !$F    r   r	   )r   r   rZ   r   r"   r1   r  rf   r{   r  r   r   utilsr   DistUpgradeGettextr   rl   rW   r	   rp  r   r   <module>r     s   , 


        				 



 				      " " " " " " " "       , , , , , ,H H H H H H H H H Hr   