\edZddlZddlZddlZddlmZddlmZddlm Z ddl Z ddl Z ddl m Z ddlZGddeZGd d ZGd d eZdd Zedk(reyy)z;Classes for working with locally available Debian packages.N)Iterable)BytesIO)cast)gettextceZdZdZy)NoDebArchiveExceptionz9Exception which is raised if a file is no Debian archive.N)__name__ __module__ __qualname____doc__-/usr/lib/python3/dist-packages/apt/debfile.pyrr#sCrrc eZdZdZed\ZZZZdZ d9de dzde jdzddfdZ de ddfd Zd e de fd Zd e defd Zedee fd Zedee fdZ d:de dede fdZdeee e e fdefdZdeee e e fdefdZde de de defdZdeee e e fdefdZedeeee e e ffdZedeeee e e ffdZedeeee e e ffdZedeeee e e ffdZde de de defdZ defdZ!defdZ"d;d ede#fd!Z$d:d"edefd#Z%d$e defd%Z&d&eeee e e fdefd'Z'edee fd(Z(edeee ee ee ffd)Z)e*d*e de fd+Z+e*d*e e,e#zde fd,Z- d DebPackagezA Debian Package (.deb file).rNfilenamecachereturnc|tj}||_ttj d|_d|_d|_i|_ g|_ d|_ d|_ d|_ |r|j|yy)NF)aptCache_cacherapt_instDebFile_debfilepkgnamer _sections _need_pkgs_check_was_run_failure_string _multiarchopenselfrrs r__init__zDebPackage.__init__0sv =IIKE X--t4  $( CE%'#!&*  IIh  rcr|jdd|zg|_t|_d|_||_t j|j |_|jjjd}tj||_ |jd|_d|_y)zopen given debfilez open '%s'rcontrolPackageFN)_dbgr set_installed_conflictsr"rrrrr* extractdataapt_pkg TagSectionrrr!)r&rr*s rr$zDebPackage.openAs ![8+,.1e!!   ((7 --''33I> ++G4~~i0 #rkeyc |j|SNrr&r2s r __getitem__zDebPackage.__getitem__Ns~~c""rc||jvSr4r5r6s r __contains__zDebPackage.__contains__Qsdnn$$rcg |jjjfdS#t$rt d|j zgcYSwxYw)z$return the list of files in the deb.c:j|jSr4appendname)itemdatafiless rz%DebPackage.filelist..YsU\\$))5Lrz(List of files for '%s' could not be read)rr@go SystemError_r)r&rAs @rfilelistzDebPackage.filelistTs[ S MM   ! !"L M  S@ADMMQR R Ss(/"AAcg |jjjfdt S#t$rt d|j zgcYSwxYw)z*return the list of files in control.tar.gzc:j|jSr4r<)r?r@r*s rrBz-DebPackage.control_filelist..cstyy8Qrz0List of control files for '%s' could not be read)rr*rCrDrErsorted)r&r*s @rcontrol_filelistzDebPackage.control_filelist^sa  MM ! ! $ $%Q R g  DE U  s(8"AArin_conflict_checkingcbd|vr|S|js|S|jj|r|S||jvrc|j|jJt t j j|j|jjdk(r|S|d|j}||jvr|S|j|}|j|S|jj}|j|jzr|S|r|j|jzs|S|S)N:all) r#ris_virtual_package candidaterrpackageVersion architecture_cand multi_archMULTI_ARCH_FOREIGNMULTI_ARCH_SAME)r&rrKmultiarch_pkgname multiarch_pkgcands r_maybe_append_multiarch_suffixz)DebPackage._maybe_append_multiarch_suffixks  '>NN [[ + +G 4N t{{ " G$..:S[[(($++g*>*H*HIVVN&iq(9: DKK /$ $ $56  " " *$ $&&,, ??T44 4N 4;O;O)ON  ror_groupc |jdd|z|D]&}|d}|d}|d}|j|}||jvr`|jj|rD|jdd|z|jj |D]}|j sy|j|j }|#tj|j||ry|r|jj |dD]4}|j s|jdd |jd |d y)y ) zReturn True if at least one dependency of the or-group is satisfied. This method gets an 'or_group' and analyzes if at least one dependency of this group is already satisfied. z_checkOrGroup(): %s rr)z+_is_or_group_satisfied(): %s is virtual depT)include_nonvirtualzfound installed 'z' that provides ''F) r,r[rrOget_providing_packages is_installed installedr0 check_depversionr>) r&r\depdepnameveroperpkginstppkgs r_is_or_group_satisfiedz!DebPackage._is_or_group_satisfiedsN !+x89& $C!fGa&Cq6D99'BGdkk);;11':IIH7R ${{AA'J(++#'(;;w'11DG$5$5dllD#$N KK>>? $D(( #yy'3 $ $;& $Nrc|D]}|\}}}|j|}||jvrU|jj|sE|jj|}t |dk7ro|dj }|j|}|jj j|j}|stj|j||s|jdd|z|jj|yd} |D]:}| |dz } rr| d|dd|dd z } ||t |dz k7s6| d z } <|xjt!d | zz c_y ) zTry to satisfy the or_group.r_rr^zNeed to get: %sTrz ( )|z"Dependency is not satisfiable: %s F)r[rrOrblenr> _depcacheget_candidate_ver_pkgr0rever_strr,r r=r"rE) r&r\rgrhrirj providersrkrZor_strs r_satisfy_or_groupzDebPackage._satisfy_or_groups C!$ GS$99'BGdkk){{55g> KK>>wG y>Q&#A,++++g&C;;((::388DD$$T\\4= IIa*W4 5 OO " "7 +; @ C c!f FtBs1vhaAxq11hs8}q011#    "G H6 QQrrirjc  |jdd|d|d|d|j|}|jr%|jJ|jj}n2|j r%|j J|j j}nytj|||r^|j|||sK|xjtd|jzz c_ |jdd|jzy y) z@Return True if a pkg conflicts with a real installed/marked pkg.r)z"_check_single_pkg_conflict() pkg='z' ver='z' oper='raFz)Conflicts with the installed package '%s'z!conflicts with installed pkg '%s'T) r,rrcrdrfmarked_installrPr0rereplaces_real_pkgr"rEr>)r&rrirjrkpkgvers r_check_single_pkg_conflictz%DebPackage._check_single_pkg_conflicts T # kk'"   ==, ,,]]**F   ==, ,,]]**F   VT3 /8N8N T39   @ACHHL   IIarrr.addbool)r&r\rgrhrirjrks r_check_conflicts_or_groupz$DebPackage._check_conflicts_or_groupsD !78DE 7C!fGa&Cq6D99d:G dkk);;11':#{{AA'JD !%BSXX%MN<<3883 IIa)EF$::388S$O 5599#((CD..wTB))--g65 76D--..rcpd} tj|j|dS#t$rgcYSwxYw)z/List of packages conflicting with this package. ConflictsFr0 parse_dependsrKeyErrorr6s r conflictszDebPackage.conflicts.s> (() (()s rr}zDebPackage.replaces_real_pkgUs !+G9AdV1SEBCkk'"!   ==, ,,]]**F   ==, ,,]]**FF H#+ c47?Ng&7&7c&JII03:<    rcTd}|jD]}|j|sd}|S)zCheck if there are conflicts with existing or selected packages. Check if the package conflicts with a existing or to be installed package. Return True if the pkg is OK. TF)rr)r&resr\s rcheck_conflictszDebPackage.check_conflictsss8  H--h7    rc dtt|j}tt |dz d}|j d}|j d}|j Dcgc] }|dd }}t|jD]{\}}||zdk(r4|jjjt||z dz|jsP|jJ|jj} |jjD]} | jD]} | j |j"k(st%j&|| j(| j*rI|j-dd|j z|xj.t1d |j | j | j(| j*d zz c_|jjj3y d | j4vs| j4d D]} | D]} | j6j |j"k(r| j6j8|k(rt%j&|| j:| j<r|j-dd |j z|xj.t1d|j | j6j | j:| j<dzz c_|jjj3y | j6j |vs$|j"|j k7s?|j-dd |z|xj.t1ddj?||j@| j6j |j dzz c_|jjj3y ~|jjj3ycc}w)z check if installing the package would break exsisting package on the system, e.g. system has: smc depends on smc-data (= 1.4) and user tries to installs smc-data 1.6 2r_rR ArchitecturergY@r^zwould break (depends) %sz]Breaks existing package '%(pkgname)s' dependency %(depname)s (%(deprelation)s %(depversion)s))rrh deprelation depversionFrzwould break (conflicts) %szZBreaks existing package '%(pkgname)s' conflict: %(targetpkg)s (%(comptype)s %(targetver)s))r targetpkgcomptype targetverz{Breaks existing package '%(pkgname)s' that conflict: '%(targetpkg)s'. But the '%(debfile)s' provides it via: '%(provides)s',)rdebfilerrT)!floatrsrmaxintrr enumerate op_progressupdatercrdrv current_ver dependenciesor_dependenciesr>rr0rerelationrfr,r"rEdone depends_list target_pkgrS comp_type target_verjoinr)r&sizestepsdebverdebarchxrirkridep_orrgconflicts_ver_listc_ors rcheck_breaks_existing_packagesz)DebPackage.check_breaks_existing_packagess{S%&Cr NA& *..0%)]]3AaDG33 ,N )FAs5yA~ ''..uQx$/FG##==, ,,((&&C--44 )!11)Cxx4<</&00s{{S IIa)Cchh)NO !00A!C5 ,/88+.88/2||.1kk ! 5 0!KK3388:#(') ).c...*-*:*:;*G-)& 2,) OO00DLL@ $ < < G&00 & !% !-ICHH-T U!% 4 4%C9" 03xx151E1E0415 %" 9" !" 4!% 7 7 < < >', OO00H< $  8 IIa)E)PQ 00A!15 -0HHX,>+/==-1__-A-A+.88 ! 5 0!KK3388:#(Y,)-)CN )^ $$&c4s#P- use_installedc|jdd|jd}|jd}dj||g}|jd}|jdd|z||jvr|j|}|r#|j|jj }n1|s#|j |j j }n |jS|^tj||}|jdd |z|d k(r |jS|d kr |jS|d kDr |jS|jS) a Compare the package to the version available in the cache. Checks if the package is already installed or availabe in the cache and if so in what version, returns one of (VERSION_NONE, VERSION_OUTDATED, VERSION_SAME, VERSION_NEWER). r)compare_to_version_in_cacher+rrMrRr_z debver: %sz"CompareVersion(debver,instver): %sr) r,rrrrdrfrP VERSION_NONEr0version_compare VERSION_SAME VERSION_NEWERVERSION_OUTDATED)r&rrrSrrkcachevercmps rrz&DebPackage.compare_to_version_in_caches2 !23..+~~n5 ((G\23 * !\F*+ dkk !++g&C!:==00"s}}'@==00(((#--h? !ACGH!8,,,1W---1W000   rallow_downgradec|jddd|_d|jvr#|jddtd|_y|jd}|d k7r|t j jd k7ry|t jvr=||_ |jd |j|_ |jdd |zn&|jdd td|z|_y|sQ|j|jk(r4|j|jjrtd|_yd|_|jsy|j!sy|j#|j$sy|jsy|jj&j(dkDr+td|_|jj+yy)z$Check if the package is installable.r)checkTrr_zERROR: no architecture fieldz$No Architecture field in the packageFrNzAPT::ArchitecturerMzFound multiarch arch: '%s'zERROR: Wrong architecture dude!zVWrong architecture '%s' -- Run dpkg --add-architecture to add it and update afterwardsz$A later version is already installedrrz1Failed to satisfy all dependencies (broken cache))r,r!rrEr"r0configfindget_architecturesr#rrrrrdrr_satisfy_dependsrrt broken_countclear)r&rarchs rrzDebPackage.checks !W"  / IIa7 8#$%K#LD ~~n- 5=TW^^%8%89L%MMw0022"&"&,,q0AB  !9D@A !>?7  $ 002d6K6KK{{4<<(22'()O'P$ "##%224$$T\\2##% ;; - - 1#$F$D  KK   r dependsstrcL|jtj|dS)z-Satisfy the dependencies in the given string.F)rr0r)r&rs rsatisfy_depends_strzDebPackage.satisfy_depends_strIs $$W%:%::u%MNNrrc tj|jj}||D]'}|j |r|j |r'y|jD]"} |j|jd$y#t$rYiwxYw#t$r1td|z|_ |jjYywxYw)zSatisfy the dependencies.F) from_userzCannot install '%s'T) r0 ActionGrouprrtAttributeErrorrnrzr mark_installrDrEr"r)r&r _actiongroupr\rks rrzDebPackage._satisfy_dependsMs "..t{{/D/DEL   !H..x8--h7  ! ?? C  C --->     '()>'?#'E$ !!# s#+B )B BB6CCc|jdd|jz|js td|jS)zReturn missing dependencies.r_zInstalling: %s-property only available after check() was run)r,r r!rr&s r missing_depszDebPackage.missing_depsds; !%78"" !PQ Qrcg}g}g}|js td|jD]}|js |jrr|j J|j |jd}|j jD]}||jz}|s|j |j|js|j |j|||fS)zGet the changes required to satisfy the dependencies. Returns: a tuple with (install, remove, unauthenticated) rF) r!rrr|marked_upgraderPr=r>originstrusted marked_delete)r&installremoveunauthenticatedrk authenticatedorigins rrequired_changeszDebPackage.required_changesls "" !PQ Q;; (C!!S%7%7}}000sxx(!& !mm334F!V^^3M4$#**3884   chh' (11rin_datacld}t|D]#\}}|dzdk(r|dz }|dt|zz }%|S)NrPr z%2.2x )rord)rhexrcs rto_hexzDebPackage.to_hexsMg& %DAq2v{t  8c!f$ $C % rcd}t|tr0|D])}t|dkst|dkDr|dz }%||z }+|S|D] }|dks|dkDr|dz }|t|z }"|S)Nr rp) isinstancestrrchr)rsrbs r to_strishzDebPackage.to_strishs  gs # q6B;#a&3,HAFA    r6QWHAQKA  rpartr>auto_decompressauto_hexc|jdr|dd}|j|}|jdrP|rNt|}t j |}t djd}||jz } |jdS#t$r$t d}||j|z }|cYSwxYw)Nz./r^z.gz)fileobjzAutomatically decompressed: zutf-8z,Automatically converted to printable ascii: ) startswithr/endswithrgzipGzipFilerEencodereaddecode Exceptionr) r&rr>rrr@iogznew_datas r _get_contentzDebPackage._get_contents ??4 8D% == OBr*B67>>wGD BGGI D ;;w' ' HIH t, ,HO s B*CCcn |j|jj|S#t$rYywxYwz4return the content of a specific control.tar.gz filer)r rr* LookupErrorr&r>s rcontrol_contentzDebPackage.control_contents6 $$T]]%:%:DA A   %( 44cn |j|jj|S#t$rYywxYwr )r rr@rrs r data_contentzDebPackage.data_contents6 $$T]]%7%7> >  rlevelmsgcZ||jkrt|tjyy)z%Write debugging output to sys.stderr.)fileN)debugprintsysstderr)r&rrs rr,zDebPackage._dbgs! DJJ  #CJJ ' rinstall_progressc|jtjd|1tjtj ddd|jS |j |j|j} |j|S#t$r|jYIwxYw#t$r|jY|SwxYw)zInstall the package.zNo filename specifieddpkgz-i) rr0ErrorosspawnlpP_WAIT start_updater startUpdaterun finish_update finishUpdate)r&rrs rrzDebPackage.installs == -- 78 8  #::biit}}M M / --/#&&t}}5C 0 ..0J" / ,,. / " 0 --/J 0s$BB3B0/B03CCNNF)T)TTr4)8r r r r rangerrrrrrrrr'r$r7rr9propertylistrFrJr[tuplernrzrrrrrrr}rrrrrrrrr staticmethodrrrrTarFiler rrr,progressbaseInstallProgressrr rrrr's3'EJ!HA\#\= EFJ d  25))d2B  " $S $T $#s#s#%%%$s) $s)  :?$!$!26$! $!L/tE#sC-4H/I/d/b*$uS#s]/C*D**X#Cst@/$uS#s]7K2L/QU/@4U3S=%9 :; d5c3#789  $tE#sC-$89:$tE#sC-$89:Ccd<  ^^@!!!!!!FCTCdCJOcOdOT%S# 2F-G(HT.d3i2%S 49d3i(G"H2223#.3,!%     0CC(#(C(D( LP # 1 1 A AD H rrceZdZdZ ddedzdej dzddfdZede e e eeeffdZ ede e e eeeffdZ ede efd Z d eddfd Zdd edefd Zy) DscSrcPackagez#A locally available source package.Nrrrctj|d|||_g|_g|_t |_d|_g|_i|_ |j|j|jyy)Nr) rr'r_depends _conflictsr-r.rbinariesrr$r%s rr'zDscSrcPackage.__init__si D$.$, :< <>.1e! #% )+ == $ IIdmm $ %rc|jSz&Return the dependencies of the package)r6rs rrzDscSrcPackage.dependss}}rc|jSr:)r7rs rrzDscSrcPackage.conflictssrcH|jdjdddS)z6Return the list of files associated with this dsc fileFilesr^Nr))rsplitrs rrFzDscSrcPackage.filelists'~~g&,,.qt!t44rrchddg}ddg}tj|}tj|}tj|} |D]}|D]8}||vr|j j tj||:|D]8}||vr|jj tj||:d|vr |d|_ d|vr5|djdD cgc]} | jc} |_ |jD]}||vs|||j|< ~|jt!d|jd j#|jfz} | |jd <d |_y cc} w#~|jwxYw) zOpen the package.z Build-DependszBuild-Depends-IndepzBuild-ConflictszBuild-Conflicts-IndepSourceBinaryrzBInstall Build-Dependencies for source package '%s' that builds %s rp DescriptionFN)r0open_maybe_clear_signed_filer fdopenTagFiler6rparse_src_dependsr7rr>stripr8keysrcloserErr!) r&r depends_tagsconflicts_tagsfdfobjtagfilesectagrrs rr$zDscSrcPackage.opens')>? +-DE  1 1$ 7yy}//$'  7'NC#~ MM(()B)B3s8)LMN*PC#~ OO**7+D+DSX+NOPs?#&x=DLs?8;H 8K8KC8P$Q1QWWY$QDM88:7Ccz.1#hs+7 7" JJL T \\388DMM2 3 4)*}%#%R  JJLs% B'F0FF'FFF1rc0|jse|jD]V}|j|jjrt t d|j|jXd|_|j|jS)zCheck if the package is installable. The second parameter is ignored and only exists for compatibility with parent type.z%An essential package would be removedT) rr.rrv essentialrrE mark_deleter!rr)r&rrs rrzDscSrcPackage.check%s ##%44 3;;w',,66#A&M$NOO G$002 3 #$$T\\22rr(r))r r r r rrrr'r+r,r-rrrFr$rrr rrr4r4s-FJ %d  %25))d2B %  %d5c3#7894U3S=%9 :;5$s)55 $ $ $D3T3d3rr4cddlm}ddlm}|}d}t |d|j ||j |}t d|z|D]}t d|jzttjd|}t d |jz|js t d t |jt d |jzt |jt |j t d |j#|}t |t%| }d} t |j't)j*| dy)z Test functionr)r)r2z www-browserz virtual: zProviders for %s :z %sr_zDeb: %szcan't be satifiedzmissing deps: %szInstalling ...)rz:libc6 (>= 2.3.2), libaio (>= 0.3.96) | libaio1 (>= 0.3.96)FN) apt.cacherapt.progress.baser2rrOrbr>rrargvrrr"rrrFrr4rr0r) rr2rvprxrkdretrdss r_testr\6s61 GE B RD 533B78 9:,,R0I  #$  echh  388A;&A )aii  779 !" a  q~~ -. !   !**  ))O% &C #J E"A EB !  W222u= >?r__main__)rN)r rr rcollections.abcrrrtypingrrr0rrErIOErrorrrr4r\r r rrrasn&B $ DGDx x vQ3JQ3h#@L z Gr