
    \e6_                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm Z	  G d de
      Z G d d      Z G d d	e      Z G d
 de      Z G d de      Zd Zd Z G d d      Zddddg fdZy)    N)ElementTree)gettextc                       e Zd Zy)NoDistroTemplateExceptionN)__name__
__module____qualname__     4/usr/lib/python3/dist-packages/DistUpgrade/distro.pyr   r   %   s    r   r   c                   V    e Zd Zg fdZd ZddZd Zd ZddZd Z	d	 Z
d
 Zd Zd Zy)Distributionc                 f    || _         || _        || _        || _        || _        d| _        d| _        y)z0Container for distribution specific informationsdebzdeb-srcN)idcodenamedescriptionreleaseis_likebinary_typesource_type)selfr   r   r   r   r   s         r   __init__zDistribution.__init__*   s8      & $r   c                 	   || _         d| _        g | _        g | _        g | _        g | _        g | _        g | _        g | _        g | _	        d| _
        g | _        d| _        d| _        d| _        g | _        | j                   j                   j"                  D ]@  }| j%                  |j&                        s|j(                  | j*                  k(  s9|| _         n | j                  %t-        d| j*                  d| j.                        g }g }g }g }| j                   j1                         D ]#  }|j2                  sB| j%                  |j4                        r&|j6                  r|j6                  j8                  r| j%                  |j6                  j&                        r|j:                  j=                  d      rD|j>                  s8| j
                  jA                  |       |jC                  |jD                         n}|j:                  j=                  d      r)|j>                  r| j
                  jA                  |       n9|jF                  | jH                  k(  r^|j>                  sR| j                  jA                  |       |jC                  |jD                         |jA                  |j:                         n|jF                  | jH                  k(  r(|j>                  r| j                  jA                  |       n|jF                  | jJ                  k(  r(|j>                  s| j                  jA                  |       n@|jF                  | jJ                  k(  r'|j>                  r| j                  jA                  |       |j2                  ra|j6                  | j                  jL                  v s|j>                  s6|jF                  | jH                  k(  r| j                  jA                  |       |j>                  s6|jF                  | jJ                  k(  r| j                  jA                  |       	| j                  jA                  |       & tO        |      | _        tO        |      | _        |jC                  |       |jC                  |       tO        |      | _        tO        |      | _	        | jQ                          y)zf
        Find the corresponding template, main and child sources
        for the distribution
        NF z2Error: could not find a distribution template for /cdrom:))sourceslistsource_templatechild_sourcesmain_sourcesdisabled_sourcescdrom_sourcesdownload_compsenabled_compscdrom_comps
used_mediaget_source_codesource_code_sourcesdefault_servermain_servernearest_serverused_serversmatcher	templatesis_codenamenamedistributionr   r   r   exploded_listinvaliddisttemplateofficialuri
startswithdisabledappendextendcompstyper   r   childrensetget_mirrors)r   r   r6   mediar=   r&   r%   sources           r   get_sourceszDistribution.get_sources6   s    '# " $#%  !  ((00:: 	H.83H3HDGG3S (0$	 '+77DMM+  &&446 	9FNN$$V[[1OOOO,,$$V__%9%9: ::((26??&&--f5&&v||4ZZ**84&&--f5[[D$4$44V__%%,,V4LL.LL,[[D$4$44))008[[D$4$44V__,,33F;[[D$4$44))008>>foo9M9M9V9V&V6;;$:J:J+J&&--f5V[[D<L<L-L,,33F;))008?	9@ "%j{+U#[) /e*r   Nc                 ~   | j                   j                  | _        | j                  D ]/  }|j	                  d      r| j
                  j                  |       1 t        | j                        dk(  r| j                  | _	        n| j                  d   j                  | _	        i | _        d}t        j                  j                  |      rt        |      }t!        |dd      |j"                  |_        |j%                  d      }|D ]S  }	 |j&                  d   }	 |j&                  d
   }t+        j,                  d|      | j                  |j/                         <   U d| _        d| _        t        j4                  dd      }	|	j7                  d      }
|	j7                  d      }|dk(  rt        |	      }|	|
dz   | j/                         }|r
||z  | _        || j                  v r| j                  |   | _        || _        yy# t(        $ r |j&                  d	   }Y w xY w# t(        $ r |j&                  d   }Y w xY w)zR
        Provide a set of mirrors where you can get the distribution from
        r   r   z%/usr/share/xml/iso-codes/iso_3166.xml)fileiterNiso_3166_entrycommon_namer1   alpha_2_codealpha_3_codeiso_3166LANGen_UK)default_.   )r   base_urir+   r'   r9   r-   r;   lenr!   r*   r8   	countriesospathexistsr   getattrgetiteratorrG   attribKeyErrorr   dgettextlowercountrycountry_codegetenvfindr,   )r   mirror_templatemediumfnameetitelmdescrcodelocaleazra   s                r   rA   zDistribution.get_mirrors   s   
  //88 oo 	1F$$X.!!((0	1
 t  !Q&"&"2"2D"&"3"3A"6":":D 777>>% %(B r64(0..)*B 	S/JJ}5E6::n5D 07/?/?
E/Rtzz|,	S  673KKKK7FAa!ea(..0"1L"@D4>>)>>,7DL ,D *+   /JJv.E/   6::n5D6s$   HH HH H<;H<c                     d}|j                  d      }|j                  d      }|dk7  r|dk7  r||t        d      z   | }|| j                  v rt        d      | j                  |   z  S d|j	                  d      z  S )zoTry to get a human readable name for the main mirror of a country
        Customize for different distributionsNz://z.archive.ubuntu.comrR   Server for %s%s/ )rc   rU   rV   rP   rstripr   serverr`   ilis        r   _get_mirror_namezDistribution._get_mirror_name   s     KK[[./7rRxQU^b1Gdnn$_%w(???&-----r   c                 `   d }g }t        | j                        dk  s8t        | j                        dk(  r || j                  d   | j                        rl|j                  t	        d      | j                  dg       | j
                  r7|j                  | j                  | j
                        | j
                  dg       |S t        | j                        dk(  r || j                  d   | j                        s|j                  t	        d      | j                  dg       | j                  d   }| j
                  rJ ||| j
                        s7|j                  | j                  | j
                        | j
                  dg       |r#|j                  | j                  |      |dg       |S t        | j                        dkD  r|j                  t	        d      | j                  dg       | j
                  r7|j                  | j                  | j
                        | j
                  dg       |j                  t	        d      ddg       | j                  D ]S  }| j                  |      |dg} ||| j
                        s ||| j                        r>||vsC|j                  |       U |S )	z+Return a list of used and suggested serversc                 j    t        j                  | j                  d      |j                  d            S )zgHelper function that handles comaprision of mirror urls
            that could contain trailing slashesrr   )rematchstriprs   )mir1mir2s     r   compare_mirrorsz5Distribution.get_server_list.<locals>.compare_mirrors   s'     88DJJt,dkk$.?@@r   rS   r   zMain serverTFzCustom serversN)rU   r-   r+   r;   rP   r,   rx   )r   r   mirrorsru   mirror_entrys        r   get_server_listzDistribution.get_server_list   s   	A t  !A%!!"a' 1 1! 4d6F6FGNNAm,d.>.>EF""--d.A.AB++d W ""#q(a $"2"22
 NNAm,d.>.>FG&&q)F ""&vt/B/BCNN 11$2E2EF //!  5 5f =vtLM2 / ""#a' NNAm,d.>.>FG""--d.A.AB++ NNA./t<=++ 1 $ 5 5f =vuM"64+>+>??D,,D !0NN<01 r   c                 B   || j                   }|| j                  }|t        | j                        }|| j                  }d}d}t        | j                        xs t        | j                        D ]  }|j                  } n | j                  j                  |||||||      }| j                  rn|| j                  k(  r^| j                  j                  | j                  |||||j                  || j                  j                  j                  |      dz          yyy)z3
        Add distribution specific sources
        N)parentrF   rS   )rF   r   pos)r*   r   listr%   r   reversedr    r!   rF   r   addr(   r   index)	r   r>   r8   r5   r=   commentr   rF   
new_sources	            r   
add_sourcezDistribution.add_source  s*    ;%%C<==D=++,E<##Dt112Qht?P?P6Q 	F;;D	 %%))#tUGF * 


 DD,<,<$<    __!$$))//
;a? ! 	 %=r   c                 2   t        |g      }| j                  D ]d  }|j                  j                  D ]I  }|j                  |k(  s|j
                  s |j
                  |vs/|j                  |j
                         K f |D ]  }| j                  |        y)z
        Enable a component in all main, child and source code sources
        (excluding cdrom based sources)

        comp:         the component that should be enabled
        N)r   r!   r6   
componentsr1   parent_componentr;   _enable_component)r   compr=   rC   cs        r   enable_componentzDistribution.enable_component<  s     dV'' 	9F__// 966T>a&8&8))6Q%7%789	9
  	&A""1%	&r   c                    fd}g }|j                  | j                         |j                  | j                         i }i }|D ]p  }|j                  | j                  k(  s|j
                  |vrt               ||j
                  <   |j                  D ]   }||j
                     j                  |       " r | j                  D ]p  }|j                  | j                  k(  s|j
                  |vrt               ||j
                  <   |j                  D ]   }||j
                     j                  |       " r t        | j                        dk  r| j                  dz  g       n*|D ]  } |||        | j                  D ]  } |||        | j                  rUt        | j                        dk  r"| j                  | j                  dz  g       y | j                  D ]  } |||        y y )Nc                     | j                   |vry|| j                      v ry| j                  gz   | _        || j                      j                         y)z
            Check if we already added the component to the repository, since
            a repository could be splitted into different apt lines. If not
            add the component
            N)r5   r=   r   )rC   comps_per_distr   s     r   add_component_only_oncez?Distribution._enable_component.<locals>.add_component_only_onceN  sS     {{.0 ~fkk22!<<4&0FL6;;'++D1r   rS   rq   )r=   )r>   r=   )r<   r!   r    r>   r   r5   r@   r=   r   r)   r   rU   r   r(   )	r   r   r   sourcesr   comps_per_sdistsr   rC   s	    `       r   r   zDistribution._enable_componentM  s   	2$ t(()t))*  	2Avv)))66/-0UN166* 2A"166*..q12		2 )) 	3Avv)))660.1eOAFF+ 3A#AFF+//23		3 t  !A%OO4$;-O0 " @'?@ 22 A'@A 4++,q0T%5%5dTk]K #66 EF+FODE  r   c                    g }|j                  | j                         |j                  | j                         |j                  | j                         || j                  v rg }|j                  | j                         |D ]i  }||j
                  v s|j
                  }|j                  |       ||_        t        |j
                        dk  sO| j                  j                  |       k y)zx
        Disable a component in all main, child and source code sources
        (excluding cdrom based sources)
        rS   N)	r<   r!   r    r)   r&   r=   removerU   r   )r   r   r   rC   r=   s        r   disable_componentzDistribution.disable_component  s    
 t(()t))*t//04###GNN4,,- 	4Fv||#T"$v||$q($$++F3	4r   c                 <     fd}g }g }| _          j                  D ]  } ||||         j                  D ]F  }|j                  j                  $|j                  j                  |j
                  k7  s= ||||       H  j                  D ]  } ||||        y)zHChange the server of all distro specific sources to
        a given hostc                 \   || _         | j                  D ]a  }| j                   | j                  |g|v r| j                  j                  |       :|j	                  | j                   | j                  |g       c t        | j                        dk  rj                  j                  |        y y )NrS   )r8   r=   r5   r   r;   rU   r   )rC   r8   seenr   r   s       r   change_server_of_sourcez;Distribution.change_server.<locals>.change_server_of_source  s    FJ AJJT2d:LL''-KKV[[$ ?@	A
 6<< 1$  ''/ %r   N)r*   r!   r    r6   rT   r8   r)   )r   r8   r   seen_binaryseen_sourcerC   s   `     r   change_serverzDistribution.change_server  s    		0 !'' 	>F#FC=	>(( 	BF ((0??++vzz9'[A	B .. 	>F#FC=	>r   c                 $    || j                   k(  ryy)z/Compare a given name with the release codename.TF)r   r   r1   s     r   r0   zDistribution.is_codename  s    4== r   N)NNNNr   )r   r   r	   r   rD   rA   rx   r   r   r   r   r   r   r0   r
   r   r   r   r   )   sD    CE 
%Tl6-p.CJ#J&";Ez4(><r   r   c                   "    e Zd ZdZd Zd Zd Zy)DebianDistributionz)Class to support specific Debian featuresc                 @    || j                   k(  s| j                  dv ryy)z}Compare a given name with the release codename and check if
        if it can be used as a synonym for a development releases)testingunstableTF)r   r   r   s     r   r0   zDebianDistribution.is_codename  s"     4== DLL4K$Kr   c                 Z   d}|j                  d      }|j                  d      }|dk7  r|dk7  r||t        d      z   | }|| j                  v rKt        d      t	        j
                  d| j                  |   j                               j                         z  S d|j                  d      z  S )	zYTry to get a human readable name for the main mirror of a country
        Debian specificNz://ftp.z.debian.orgrR   rp   rL   rq   rr   )rc   rU   rV   rP   r   r^   rs   rt   s        r   rx   z#DebianDistribution._get_mirror_name  s     KK	"[['7rRxQY/"5Gdnn$ /"""w 7 > > @&( &-----r   c                 2    t         j                  | d       y )Nz http://ftp.%s.debian.org/debian/rd   r   rA   r   s    r   rA   zDebianDistribution.get_mirrors  s      "D 	! 	
r   N)r   r   r	   __doc__r0   rx   rA   r
   r   r   r   r     s    3.&
r   r   c                       e Zd ZdZd Zy)UbuntuDistributionz)Class to support specific Ubuntu featuresc                 2    t         j                  | d       y )Nz$http://%s.archive.ubuntu.com/ubuntu/r   r   r   s    r   rA   zUbuntuDistribution.get_mirrors  s      "H 	! 	
r   Nr   r   r	   r   rA   r
   r   r   r   r     s
    3
r   r   c                       e Zd ZdZd Zy)UbuntuRTMDistributionz-Class to support specific Ubuntu RTM featuresc                 :    | j                   j                  | _        y r   )r   rT   r+   r   s    r   rA   z!UbuntuRTMDistribution.get_mirrors  s    //88r   Nr   r
   r   r   r   r     s
    79r   r   c                  h   ddl } ddlm}m} ddddd}	  |d	d
g|      j	                         d   }|j                  d      }|j                  d |j                  d      D               |S # t        $ r<}|j                   | j                  k7  rt        j                  d|z         Y d}~|S d}~ww xY w)z-Call lsb_release --idrc and return a mapping.r   N)PIPEPopensidDebianzDebian GNU/Linux unstable (sid)r   )CodenameDistributor IDDescriptionReleaselsb_releasez-idrc)stdoutzutf-8c              3   H   K   | ]  }d |v s|j                  d         yw)z:	N)split).0lines     r   	<genexpr>z_lsb_release.<locals>.<genexpr>  s      UDuPT}djj'Us   	""
z#lsb_release failed, using defaults:)errno
subprocessr   r   communicatedecodeupdater   OSErrorENOENTloggingwarning)r   r   r   resultoutexcs         r   _lsb_releaser     s    & "8	FI]G,T:FFHKjj!UCIIdOUU M  I99$OOACGHMIs   AA, ,	B151B,,B1c                  j   ddl } ddlm}m}m} 	  |ddg||d      j                         d   }|j                         D ]*  }|j                  d      s|j                  d	d
      d
   c S  	 y# t        $ r;}|j                   | j                  k7  rt        j                  d|z         Y d}~yd}~ww xY w)z=Get the current channel from system-image-cli -i if possible.r   N)DEVNULLr   r   zsystem-image-cliz-iT)r   stderruniversal_newlinesz	channel: z: rS   z+system-image-cli failed, using defaults: %s)r   r   r   r   r   r   
splitlinesr9   r   r   r   r   r   )r   r   r   r   r   r   r   s          r   _system_image_channelr     s    //Q&#	

 +- NN$ 	.D{+zz$*1--	.   Q99$OOICOPQs$   AA. A. +A. .	B271B--B2c                   4    e Zd ZdZdZddZd Zd Zd Zd Z	y)	
_OSReleasez/etc/os-releasec                     i | _         d| _        t        j                  | _        t
        j                  j                  | j                        sy | j                          d| _        |r| j                          y y )NFT)
r   validr   OS_RELEASE_FILErF   rW   rX   isfileparseinject_lsb_compat)r   
lsb_compats     r   r   z_OSRelease.__init__'  sX    
..	ww~~dii(


""$ r   c                    | j                   d   | j                   d<   | j                   d   | j                   d<   | j                   j                  d      | j                   d<   | j                   d   s(| j                   j                  d      | j                   d<   | j                   j                  d      | j                   d	<   y )
NIDr   PRETTY_NAMEr   VERSION_CODENAMEr   UBUNTU_CODENAME
VERSION_IDr   )r   getr   s    r   r   z_OSRelease.inject_lsb_compat5  s    (,D(9$%%)[[%?M""&++//2D"EJ{{:&&*kkoo6G&HDKK
#!%!>Ir   c                     t        | j                        }|D ]4  }|j                         }|s | j                  |j	                  dd        6 |j                          y )N=rS   )openrF   r}   parse_entryr   close)r   fr   s      r   r   z_OSRelease.parse?  sU    O 	2D::<DDdjja01		2
 	
	r   c                     | j                  |      }|dk(  r!t        |t              r|j                  d      }|| j                  |<   y )NID_LIKE )parse_value
isinstancestrr   r   )r   keyvalues      r   r   z_OSRelease.parse_entryH  sA      ')
5# 6 KK$E Cr   c                 V    t        j                  |      }t        |      dk(  r|d   S |S )NrS   r   )shlexr   rU   )r   r   valuess      r   r   z_OSRelease.parse_valueP  s+    U#v;!!9r   N)T)
r   r   r	   DEFAULT_OS_RELEASE_FILEr   r   r   r   r   r   r
   r   r   r   r   #  s&    /'O%?!r   r   c                 2   | r|r|r|s| s|s|s|rt        j                  dt        d       t               }g }t	               }|j
                  r|j                  }t	               }|d   } |d   }|d   }|d   }|j                  dg       }| d	k(  r>t               }|2d
|v r.d} |j                  dd      d   j                  dd      d   }|}|}| d	k(  rt        | ||||      S | dk(  rt        | ||||      S | dk(  rt        | ||||      S t        | ||||      S )z
    Check the currently used distribution and return the corresponding
    distriubtion class that supports distro specific features.

    If no paramter are given the distro will be auto detected via
    a call to lsb-release
    z#Provided only a subset of arguments   )
stacklevelr   r   r   r   r   Ubuntuzubuntu-rtm/z
Ubuntu-RTMr   rS   -r   r   )warningswarnDeprecationWarningr   r   r   r   r   r   rsplitr   r   r   r   r   )	r   r   r   r   r   
os_release	os_result
lsb_resultchannels	            r   
get_distror  W  sJ    8[GMM57IVW  \
	!^
"))I "^
()j) /Y'--	2.>+-G"}'?!">>#q1!4::3B1E&"	X~!"hWgNN	\$R;QQ	x!"hWgNNB+wHHr   )r   r   rW   r{   r   r  xml.etree.ElementTreer   apt_pkgrP   	Exceptionr   r   r   r   r   r   r   r   r  r
   r   r   <module>r     s   4   	 	   -  		 	X Xv!
 !
H
 
9. 9,*1 1h 4r 1Ir   