
    QKfC                        d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ d dlmZmZ d dlmZmZ ddlmZmZmZmZmZ  G d d	e      Z G d
 de      Z G d de      Z e!dk(  r
 e dd      Z"yy)    N)BadStatusLine)quote)Requesturlopen)	HTTPErrorURLError   )get_langget_distget_dist_versionget_ubuntu_flavorget_ubuntu_flavor_namec                       e Zd Zy)MetaReleaseParseErrorN)__name__
__module____qualname__     9/usr/lib/python3/dist-packages/DistUpgrade/MetaRelease.pyr   r   2   s    r   r   c                       e Zd Zd Zy)Distc                     || _         || _        || _        || _        d | _        d | _        d | _        d | _        d | _        y N)	nameversiondate	supportedreleaseNotesURIreleaseNotesHtmlUriupgradeToolupgradeToolSigupgrade_broken)selfr   r   r   r   s        r   __init__zDist.__init__7   sF    		"##' ""r   N)r   r   r   r%   r   r   r   r   r   6   s    
#r   r   c                       e Zd ZdZdej
                  v ZdZdZ	 	 	 	 	 	 ddZ	d Z
d Zd	 Zd
 Zd Zed        Zd Zd Zy)MetaReleaseCorezT
    A MetaReleaseCore object abstracts the list of released
    distributions.
    DEBUG_UPDATE_MANAGERz$/etc/update-manager/release-upgradesz /etc/update-manager/meta-releaseNc           	      |   |rd| _         | j                  d|d|       || _        || _        t	        j
                         | _        d | _        d | _        |t        j                         }t        |      | _        t        |      | _        t               | _        t#               | _        d | _        d | _        d}|dz   | _        |dz   | _        d| _        d	| _        t3        j4                         }t6        j8                  j;                  | j<                        r	 |j?                  | j<                         |jI                  d      rod}
dD ]h  }|jK                  |
|      s| j                  | j<                  d|jM                  |
|      d       tO        | |
d||jM                  |
|             j t3        j4                         }t6        j8                  j;                  | jP                        r	 |j?                  | jP                         |jK                  dd      r|jM                  dd      jS                         }|dk(  s|dk(  r"d| _        | j                  jU                          y |dk(  rZd| _        tW        jX                         }|j[                  | j                         r| j,                  | _        n| j                  d       nd| _        |r| j,                  | _        |r | xj*                  | j.                  z  c_        n!|r| xj*                  | j0                  z  c_        | j                  d| j*                  z         d | _.        | j_                         s| j                  d       y t	        j`                  | jb                        je                          y # t2        j@                  $ r9}	tB        jD                  jG                  d
| j<                  d|	       Y d }	~	y d }	~	ww xY w# t2        j@                  $ r9}	tB        jD                  jG                  d
| jP                  d|	       Y d }	~	y d }	~	ww xY w)NTz MetaRelease.__init__() useDevel=z useProposed=)cachezhttps://changelogs.ubuntu.com/zmeta-releasezmeta-release-ltsz-developmentz	-proposedzERROR: failed to read 'z':
METARELEASE)URIURI_LTSURI_UNSTABLE_POSTFIXURI_PROPOSED_POSTFIXz:  _DEFAULTPromptnevernoltsz Prompt=lts for non-LTS, ignoringnormalzmetarelease-uri: %sz_buildMetaReleaseFile failed)target)3DEBUG_debugforceDownloaduseDevelopmentRelease	threadingEvent
downloadedupgradable_tonew_distaptCacher   flavorr   flavor_namer   current_dist_namer   current_dist_versionno_longer_supportedpromptMETARELEASE_URIMETARELEASE_URI_LTS METARELEASE_URI_UNSTABLE_POSTFIX METARELEASE_URI_PROPOSED_POSTFIXconfigparserConfigParserospathexistsCONF_METARELEASEreadErrorsysstderrwritehas_section
has_optiongetsetattrCONFlowersetdistro_infoUbuntuDistroInfois_ltsmetarelease_information_buildMetaReleaseFileThreaddownloadstart)r$   r<   useProposeddebugforceLTSr;   r*   base_uriparsereseckrI   dis                 r   r%   zMetaReleaseCore.__init__P   s    DJ$k3	

 +%:"#//+!=IIKE'e41>!)$4$6!#'  4'.8#+.@#@ 0>-0;- **,77>>$//0D112 !!-0# NA ((a0#44fjja6HJ  a&8&**S!:LMN **,77>>$))$DII&   H5Ix8>>@W$$")DK OO'')u_"'DK %557Byy!7!78/3/G/G,$FG"*DK#'#;#;D    D$I$II   D$I$II )D,@,@@A'+$))+KK67.446K  %% 

  ,,a1 8  %% 

  9=AF 	s0   N  5O/  O,3/O''O,/P;/P66P;c                    t         j                  j                  dt         j                  j                  | j                              | _        	 t        | j
                  d      j                          	 t         j                  j'                  | j
                        dk(  rt        j(                  | j
                         y
# t        $ r t        j                  dt         j                  j                  d            }t         j                  j                  |      d   }t         j                  j                  |      sP	 t        j                  |       n9# t        $ r-}t        j                   j#                  d|z         Y d }~Y yd }~ww xY wt         j                  j                  |      sQ	 t        j$                  |d       n9# t        $ r-}t        j                   j#                  d|z         Y d }~Y yd }~ww xY wt         j                  j                  |d	      }t         j                  j                  |      sP	 t        j$                  |       n9# t        $ r-}t        j                   j#                  d|z         Y d }~Y yd }~ww xY wt         j                  j                  |t         j                  j                  | j                              | _        Y iw xY w# t*        $ r Y y
w xY w)Nz/var/lib/update-manager/aXDG_CACHE_HOMEz~/.cacher   zmkdir() failed: '%s'Fi  zupdate-manager-coreT)rP   rQ   joinbasenamerJ   METARELEASE_FILEopencloseIOErrorgetenv
expandusersplitrR   makedirsOSErrorrV   rW   rX   mkdirgetsizeunlink	Exception)r$   	cache_dircache_parent_dirrm   rQ   s        r   rd   z%MetaReleaseCore._buildMetaReleaseFile   s    "&(8(89M9M(N!

	&&,224@	wwt445:		$//0 I  			 "''"4"4Z"@I  "ww}}Y7:77>>"23!KK 01 !JJ$$%;a%?@ ! 77>>),!HHY. !JJ$$%;a%?@ ! 77<<	+@AD77>>$'!HHTN !JJ$$%;a%?@ ! %'GGLLbgg&&t';';<%D!7	D  		s   $B? 3AK ?A>K>EK	F
"F?KF

"K-GK	G:"G5/K5G::AK=IK	J	"J>KJ		AKK	K+*K+c                     || _         y)zWvirtual function that is called when the distro is no longer
        supported
        N)rH   r$   dists     r   dist_no_longer_supportedz(MetaReleaseCore.dist_no_longer_supported   s     $( r   c                     || _         y)zWvirtual function that is called when a new distro release
        is available
        N)rA   r   s     r   new_dist_availablez"MetaReleaseCore.new_dist_available   s     r   c                    | j                  d       | j                  }| j                  d|z         d }g }t        j                  | j                        }	 |j                         rdD ]  }||j                  vst        d|z         |j                  d   }| j                  d|z         |j                  d   }t        t        j                  j                  |            }d|d	<   t        j                  t        |            }	t        |j                  d
         }
|j                  d   }t!        |||	|
      }d|j                  v r8|j                  d   |_        t%               }|r|xj"                  d|z  z  c_        d|j                  v r<|j                  d   |_        | j)                  |      }|r|xj&                  |z  c_        d|j                  v r|j                  d   |_        d|j                  v r|j                  d   |_        d|j                  v r|j                  d   |_        |j1                  |       ||k(  r|}|j                         r| j                  j7                          d | _        || j                  d       yd}|D ]L  }|j8                  |j8                  kD  s|j:                  s| j<                  s6|}| j                  d|z          n |dk7  r$|j:                  s|| _        | jA                  |       |dk7  r|| _        | jC                  |       y# t        j2                  $ r t        d| j4                  z        w xY w)NzMetaRelease.parse()zcurrent dist name: '%s')r   Version	SupportedDatezRequired key '%s' missingr   zfound distro name: '%s'r   r      r   r   ReleaseNotesz?lang=%sReleaseNotesHtmlUpgradeToolUpgradeToolSignatureUpgradeBrokenzUnable to parse %sz,current dist not found in meta-release file
F znew dist: %sT)"r:   rF   apt_pkgTagFilerc   stepsectionr   listemailutils	parsedatetimemktimetupleintr   r   r
   r    #_get_release_notes_uri_query_stringr!   r"   r#   appendrU   rJ   rx   r   r   r<   r@   r   r   )r$   rF   current_distdists	index_tagrequired_keyr   rawdate
parseddater   r   r   r   langqueryr@   s                   r   parsezMetaReleaseCore.parse   sM   )* 22-0AAB OOD$@$@A	+	.."$L L#9+<+<<37,F 
 !((05<=#++F3!%++"7"7"@A
 !
1{{5#45	 1 1+ >?	#++I6D'4;!Y%6%66+4+<+<^+LD(#:D,,
T0AA,%):)::/8/@/@*0D, !DDTJE00E90 I$5$55'0'8'8'GD$)Y->->>*3*;*;.+D' #i&7&77*3*;*;O*LD'T",,#'LM .."X 	$$**,'+$
 KKGH  
	Dyy<,,,
 ~~d.H.H $N]:;
	 B|'='=!.D)),7B!.D##M2 O }} 	'$t';';; 	s   $L+ ;GL+ +,Mc                 N   | j                  d       d}t        | j                        }|j                  dd       |j                  dd       t	        j
                  | j                  t        j                        r*	 t	        j                  | j                        j                  }|dkD  rD| j                  s8|j                  dt        j                  t        j                  |                   	 t        |d	      }t        j                   j#                  | j                        rNt	        j
                  | j                  t        j                        s 	 t	        j$                  | j                         	 t)        | j                  d      }|j+                         D ]"  }|j-                  |j/                  d             $ |j1                          |j3                  dd       || _        |j9                          | j4                  d| j                  d       	 | jG                          | jP                  rG| jP                  jR                  r1t	        jN                  | j                         n| j                  d       | jT                  jW                          y # t        $ r Y w xY w# t        $ r'}t'        d
| j                  d|d       Y d }~\d }~ww xY w# t6        $ r Y w xY w# t:        $ r}|j<                  dk(  rct        j                   j#                  | j                        r:| j                  d| j                  z         t)        | j                  d      | _        n| j                  d|z         Y d }~d }~wt>        t@        tB        jD                  f$ r7}| j                  d|z         t'        d| j                  z         Y d }~d }~ww xY w# tH        $ rE tK        jL                  d| j                  z         t	        jN                  | j                         Y w xY w)NzMetaRelease.download()r   zCache-ControlzNo-CachePragmazno-cachezIf-Modified-Since   )timeoutzCan't unlink 'z' ()zw+zUTF-8i0  zreading file '%s'rz%result of meta-release download: '%s'zIFailed to connect to %s. Check your Internet connection or proxy settingsz!have self.metarelease_informationzparse failed for '%s'zNO self.metarelease_information),r:   r   rJ   
add_headerrP   accessrv   W_OKstatst_mtimer~   r;   r   asctimegmtimer   rQ   rR   r   printrw   	readlinesrX   decodeflushseekrc   ry   rx   r   coder   r   socketr   r   r   logging	exceptionremoverA   r#   r?   r_   )r$   lastmodifiedrequrirm   flines          r   rf   zMetaReleaseCore.downloadZ  s)   ,-d**+
3x,99T**BGG4!wwt'<'<=FF !D$6$6NN#T\\$++l2K%L(	#r*C ww~~d334RYY%%rww>IId334..5MMO 2DGGDKK012	q!/0, IIK" ''3KK;<1

 }}!=!=		$//0KK9:C  "  484I4I1M     	Ivv}0E0E!F/$2G2GGH/3D4I4I3/O,CaGH-8 	KK?!CD$&*&:&:; 	  1!!+d.C.CC 		$//01s   <)J /A$K& J$ 4A4K (K& O 	J! J!$	K-K	K& KK& 	K# K& "K##K& &	O/BM;;!O,OOA
P$#P$c                 8    | j                   j                          S r   )r?   is_set)r$   s    r   downloadingzMetaReleaseCore.downloading  s    ??))+++r   c                     d}t               }|r|d|z  z  }|d| j                  z  z  }|d|j                  z  z  }t        |d      S )N?zlang=%s&zos=%s&zver=%sz/?)r
   rD   r   r   )r$   r   qr   s       r   r   z3MetaReleaseCore._get_release_notes_uri_query_string  sR    zd""A	X##	X$$Q~r   c                 b    | j                   r#t        j                  j                  |dz          y y )N
)r9   rV   rW   rX   )r$   msgs     r   r:   zMetaReleaseCore._debug  s$    ::JJS4Z( r   )FFFFFN)r   r   r   __doc__rP   environr9   r]   rS   r%   rd   r   r   r   rf   propertyr   r   r:   r   r   r   r'   r'   D   s{    
 #bjj0E 2D9 $p7f-^(XxKZ , ,)r   r'   __main__F)#rB   r   r`   rN   http.clientr   r   email.utilsr   rP   r   rV   r   r=   urllib.parser   urllib.requestr   r   urllib.errorr   r   r   r
   r   r   r   r   r   r   objectr   r'   r   metar   r   r   <module>r      s   .     %   	  
    + , 	I 	#6 #v)f v)r z5%(D r   