o 4fe@sdZddlmZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZmZmZmZddlmZddlmZGdddeZGd d d eZGd d d eZd dZedkreedSdS)z;Classes for working with locally available Debian packages.)print_functionN)DictIterableListOptionalSetTupleUnioncast)gettext)BytesIOc@seZdZdZdS)NoDebArchiveExceptionz9Exception which is raised if a file is no Debian archive.N)__name__ __module__ __qualname____doc__rr-/usr/lib/python3/dist-packages/apt/debfile.pyr #sr c@sReZdZdZed\ZZZZdZ dEddZ ddZ d d Z d d Z ed dZeddZ dFddZddZddZddZddZeddZeddZed d!Zed"d#Zd$d%Zd&d'Zd(d)ZdGd+d,ZdFd-d.Zd/d0Zd1d2Z ed3d4Z!ed5d6Z"e#d7d8Z$e#d9d:Z%dHd;d<Z&d=d>Z'd?d@Z(dAdBZ)dIdCdDZ*dS)J DebPackagezA Debian Package (.deb file).rNcCsd|durt}||_ttjd|_d|_d|_i|_ g|_ d|_ d|_ d|_ |r0||dSdS)NF)aptCache_cacher apt_instDebFile_debfilepkgnamefilename _sections _need_pkgs_check_was_run_failure_string _multiarchopenselfrcacherrr__init__3szDebPackage.__init__cCsh|dd|g|_t|_d|_||_t|j|_|jj d}t ||_ |j d|_d|_dS)z open given debfile z open '%s'rcontrolPackageFN)_dbgr set_installed_conflictsr"rrrrr* extractdataapt_pkg TagSectionrrr!)r&rr*rrrr$Cs   zDebPackage.opencCs |j|SNrr&keyrrr __getitem__Q zDebPackage.__getitem__cCs ||jvSr2r3r4rrr __contains__Ur7zDebPackage.__contains__csDgz|jjfddWSty!td|jgYSw)z$return the list of files in the deb.c |jSr2appendnameitemdatafilesrr_ z%DebPackage.filelist..z(List of files for '%s' could not be read)rr?go SystemError_rr&rr@rfilelistYs  zDebPackage.filelistcsHgz|jjfddWtSty#td|jgYSw)z, return the list of files in control.tar.gz cr9r2r:r=r*rrrBlrCz-DebPackage.control_filelist..z0List of control files for '%s' could not be read)rr*rDrErFrsortedrGrrIrcontrol_filelistes   zDebPackage.control_filelistFcCsd|vr|S|js |S|j|r|S||jvr0|j|jdur0ttjj|j|jjdkr0|Sd||jf}||jvr>|S|j|}|jdurJ|S|jj }|j |j @rV|S|r`|j |j @s`|S|S)N:all%s:%s) r#ris_virtual_package candidater rpackageVersion architecture_cand multi_archMULTI_ARCH_FOREIGNMULTI_ARCH_SAME)r&rin_conflict_checkingmultiarch_pkgname multiarch_pkgcandrrr_maybe_append_multiarch_suffixss8        z)DebPackage._maybe_append_multiarch_suffixc Cs|dd||D]k}|d}|d}|d}||}||jvrA|j|r@|dd||j|D] }|jr?dSq6q |j|j}|durVt|j ||rVdS|su|jj|dd D]}|jrt|dd |j |fdSq`q d S) 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 depTN)include_nonvirtualz'found installed '%s' that provides '%s'F) r,r\rrOget_providing_packages is_installed installedr0 check_depversionr<) r&or_groupdepdepnameveroperpkginstppkgrrr_is_or_group_satisfiedsF     z!DebPackage._is_or_group_satisfiedc Cs|D]S}|\}}}||}||jvr,|j|sq|j|}t|dkr'q|dj}|j|}|jj|j}|s|jj t||d|j sBq'|j d usIJ|j j }|j jD]?} | jD]9} | j|jkrt|| j| js|d d |j|jtd |j| j| j| jd 7_|jjdSqVqQd|jvr|jdD]~} | D]y} | jj|jkr| jj|krt|| j| jr|d d|j|jtd|j| jj| j| jd7_|jjdS| jj|vr|j|jkr|d d||jtdd||j | jj|jd7_|jjdSqqq'|jjdS)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 ArchitecturecSsg|]}|ddqS)rr).0xrrr sz=DebPackage.check_breaks_existing_packages..rgY@Nr]zwould break (depends) %sz]Breaks existing package '%(pkgname)s' dependency %(depname)s (%(deprelation)s %(depversion)s))rrg 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)!floatrormaxintrr enumerate op_progressupdaterarbrr current_ver dependenciesor_dependenciesr<rr0rcrelationrdr,r"rFdone depends_list target_pkgrS comp_type target_verjoinr) r&sizestepsdebverdebarchrirjrhdep_orrfconflicts_ver_listc_orrrrcheck_breaks_existing_packagess                  &z)DebPackage.check_breaks_existing_packagesTcCs|dd|jd}|jd}d||g}|jd}|dd|||jvrp|j|}|r:|jd ur:|jj}n|sF|jd urF|jj}n|jS|d urpt ||}|dd ||d krb|j S|d kri|j S|d krp|j S|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+rrLrRr^z debver: %sNz"CompareVersion(debver,instver): %sr) r,rrrrbrdrP VERSION_NONEr0version_compare VERSION_SAME VERSION_NEWERVERSION_OUTDATED)r& use_installedrrSrrjcachevercmprrrrs.         z&DebPackage.compare_to_version_in_cachecCs>|ddd|_d|jvr|ddtd|_dS|jd}|d krV|tjd krV|tvrG||_ d |j |j f|_ |dd |n|dd td||_dS|sm| |j krm|j |j jrmtd|_dSd|_|svdS|s|dS||jsdS|sdS|j jjdkrtd|_|j dSdS)z$Check if the package is installable.r)checkTrr^zERROR: no architecture fieldz$No Architecture field in the packageFrMzAPT::ArchitecturerNzFound 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!rrFr"r0configfindget_architecturesr#rrrrrbrr_satisfy_dependsrrp broken_countclear)r&allow_downgradearchrrrrsL          zDebPackage.checkcCs|t|dS)z-Satisfy the dependencies in the given string.F)rr0r)r& dependsstrrrrsatisfy_depends_strEszDebPackage.satisfy_depends_strc Csz t|jj}|Wn tyYnw|D]}||s&||s&dSq|jD]$}z |j|jddWq*t yNt d||_ |j YdSwdS)zSatisfy the dependencies.F) from_userzCannot install '%s'T) r0 ActionGrouprrpAttributeErrorrmrvr mark_installrErFr"r)r&r _actiongrouprerjrrrrJs(      zDebPackage._satisfy_dependscCs&|dd|j|jstd|jS)zReturn missing dependencies.r^zInstalling: %s-property only available after check() was run)r,r r!rrGrrr missing_depsbs zDebPackage.missing_depscCsg}g}g}|js td|jD]4}|js|jr;|jdusJ||jd}|jjD]}||j O}q+|s;||j|j rD||jq|||fS)zGet the changes required to satisfy the dependencies. Returns: a tuple with (install, remove, unauthenticated) rNF) r!rrrwmarked_upgraderPr;r<originstrusted marked_delete)r&installremoveunauthenticatedrj authenticatedoriginrrrrequired_changesls(        zDebPackage.required_changescCs>d}t|D]\}}|ddkr|d7}|dt|7}q|S)NrPr z%2.2x )rord)in_datahexrcrrrto_hexs  zDebPackage.to_hexcCszd}t|tr#|D]}t|dkst|dkr|d7}q ||7}q |S|D]}|dks/|dkr4|d7}q%|t|7}q%|S)Nr  ) isinstancestrrchr)rsrbrrr to_strishs    zDebPackage.to_strishc Cs|dr |dd}||}|dr.|r.t|}tj|d}tdd}||7}z| dWSt yJtd}|| |7}|YSw)Nz./r]z.gz)fileobjzAutomatically decompressed: zutf-8z,Automatically converted to printable ascii: ) startswithr/endswithr gzipGzipFilerFencodereaddecode Exceptionr) r&partr<auto_decompressauto_hexr?iogznew_datarrr _get_contents       zDebPackage._get_contentcC(z ||jj|WStyYdSwz6 return the content of a specific control.tar.gz file r)rrr* LookupErrorr&r<rrrcontrol_content  zDebPackage.control_contentcCrr)rrr?rrrrr data_contentrzDebPackage.data_contentcCs ||jkrt|tjddSdS)z%Write debugging output to sys.stderr.)fileN)debugprintsysstderr)r&levelmsgrrrr,s zDebPackage._dbgcCs|jdur td|durttjddd|jSz|Wn ty,|Ynw| |j}z| W|StyH| Y|Sw)zInstall the package.NzNo filename specifieddpkgz-i) rr0ErrorosspawnlpP_WAIT start_updater startUpdaterun finish_update finishUpdate)r&install_progressrrrrrs"        zDebPackage.installNNF)T)TTr2)+rrrrrangerrrrrr(r$r6r8propertyrHrKr\rmrvrzr}rrrrrxrrrrrrrr staticmethodrrrrrr,rrrrrr'sd    %/.!      Y $?     rc@sPeZdZdZdddZeddZeddZed d Zd d Z dddZ dS) DscSrcPackagez#A locally available source package.NcCsXt|d|||_g|_g|_t|_d|_g|_i|_ |jdur*| |jdSdS)Nr) rr(r_depends _conflictsr-r.rbinariesrr$r%rrrr(s zDscSrcPackage.__init__cC|jSz&Return the dependencies of the package)rrGrrrrzDscSrcPackage.dependscCrr)rrGrrrrrzDscSrcPackage.conflictscCs|jddddS)z6Return the list of files associated with this dsc fileFilesr]Nr))rsplitrGrrrrHszDscSrcPackage.filelistc Cs.ddg}ddg}t|}t|}t|}zb|D]X}|D]}||vr%q|jt||q|D]}||vr:q3|jt||q3d|vrO|d|_ d|vr`dd|d d D|_ | D] }||vrq|||j |<qdqW~|n~|wtd |j d |j f} | |j d <d |_dS)zOpen the package.z Build-DependszBuild-Depends-IndepzBuild-ConflictszBuild-Conflicts-IndepSourceBinarycSsg|]}|qSr)strip)rrrrrrsz&DscSrcPackage.open..rzBInstall Build-Dependencies for source package '%s' that builds %s r DescriptionFN)r0open_maybe_clear_signed_filerfdopenTagFilerrparse_src_dependsrrrrkeysrcloserFrr!) r&r depends_tagsconflicts_tagsfdfobjtagfilesectagrrrrr$sL           zDscSrcPackage.openFcCsN|s|jD]}|j|jjrttd|j|qd|_| |j S)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.rrr essentialrrF mark_deleter!rr)r&rrrrrr*s   zDscSrcPackage.checkrr) rrrrr(rrrrHr$rrrrrrs    $rc Csddlm}ddlm}|}d}td|||f||}td||D] }td|jq)tt j d|}td |j | sOtd t|j td |jt|jt|jtd ||}t|t|d }d} t|t| ddS)z Test functionr)r)InstallProgressz www-browserz%s virtual: %szProviders for %s :z %sr^zDeb: %szcan't be satifiedzmissing deps: %szInstalling ...)r'z:libc6 (>= 2.3.2), libaio (>= 0.3.96) | libaio1 (>= 0.3.96)FN) apt.cacherapt.progress.baser2rrOr`r<rrargvrrr"rrrHrrrr0r) rr2r'vprtrjdretrdsrrr_test<s.         r:__main__)r __future__rrrr0rrrtypingrrrrrrr r r rFrr IOErrorr objectrrr:rrrrrs. (  AY'