a 2h=Q@sNddlmZddlmZddlmZmZddlZddlZddl Zddl Zddl Zddl Zddl ZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z dZ!dZ"ej#ej$dZ%de&e%ej'fZ(d e(e"fd e(e!fd d Z)e*d Z+ddZ,ddZ-d-ddZ.ddZ/Gddde0Z1Gddde2Z3Gdddej4j5Z6Gddde0Z7Gdd d ej8j9Z:Gd!d"d"ej4j;ZGd'd(d(ej4j;Z?ej8j@jAZBej8j@jCZDej8j@jEZFGd)d*d*ej8jGZHGd+d,d,ejIjJZ@dS).)absolute_import)unicode_literals)ucd_NpackagesZ mirrorlistz-_.:z(?P[%s]+)\-[%s]{16}z>^%s\/.*((xml|yaml)(\.gz|\.xz|\.bz2|.zck)?|asc|cachecookie|%s)$z^%s\/%s\/.+rpm$z^.+(solv|solvx)$)metadatarZdbcachednfcCstjj|}|dkrdS|S)zAReturn index of an invalid character in the repo ID (if present).rN)libdnfrepoRepoZverifyId)Zrepo_idZ first_invalidr ,/usr/lib/python3.9/site-packages/dnf/repo.pyrepo_id_invalidIsrcGs8|D]}|||}|dur|Sqttd|dS)Nz"no matching payload factory for %s) ValueErrorr)pkgprogressZ factoriesfnploadr r r _pkg2payloadPs   rTc Csdd}|jddt||dD}t}ztjjtj||Wn.t yx}zt ||_ WYd}~n d}~00| |j |_|D]b}|}|dus|drq|} | j} | j} |dkr|j| q| jj|g|j| <q|S)NcSs t|d S)NZdelta)hasattr)payloadr r r _download_sort_keyZsz._download_payloads.._download_sort_keycSsg|] }|qSr )_librepo_target).0rr r r ^sz&_download_payloads..)key Not finishedzAlready downloaded)errclearsorted_DownloadErrorsr r PackageTargetZdownloadPackagesZVectorPPackageTarget RuntimeErrorstr_fatalwaitcopy _recoverableZgetErr startswithZ getCallbacks package_ploadr_skippedadd_repoZexpire_pkg_irrecoverable) payloadsZdrpmZ fail_fastrtargetserrseZtgtr callbacksrrr r r _download_payloadsXs2      r3cCsH|\}}|D]2}|j}||vr*||j7}q ||j7}||j7}q ||fSN)r download_size _full_size)Zsavingr.r0realZfullrrr r r _update_savingys   r8c@s>eZdZddZddZeddZejddZdd Zd S) r cCsi|_i|_d|_t|_dSr4)r-_val_recoverabler$setr*selfr r r __init__sz_DownloadErrors.__init__cCs"|jr |jS|jrd|jgiSiSN)r-r$r;r r r _irrecoverables  z_DownloadErrors._irrecoverablecCs|jSr4r9r;r r r r'sz_DownloadErrors._recoverablecCs ||_dSr4rA)r<Znew_dctr r r r'scCs|j|jvrdS|jSNr)rr*r5)r<rr r r _bandwidth_useds z_DownloadErrors._bandwidth_usedN) __name__ __module__ __qualname__r=r@propertyr'setterrCr r r r r s  r c@seZdZddZdS)_DetailedLibrepoErrorcCs,t||jd|_|jd|_||_dS)Nr) Exceptionr=argsZ librepo_codeZ librepo_msg source_url)r<Z librepo_errrMr r r r=s   z_DetailedLibrepoError.__init__N)rDrErFr=r r r r rIsrIc@seZdZddZdS)_NullKeyImportcCsdS)NTr r<idZuseridZ fingerprinturlZ timestampr r r _confirmsz_NullKeyImport._confirmN)rDrErFrRr r r r rNsrNc@s eZdZddZeddZdS)MetadatacCs ||_dSr4)r,r<r r r r r=szMetadata.__init__cCs |jSr4)r,freshr;r r r rUszMetadata.freshN)rDrErFr=rGrUr r r r rSsrScs4eZdZfddZddZddZddZZS) PackageTargetCallbackscstt|||_dSr4)superrVr=r))r<r) __class__r r r=szPackageTargetCallbacks.__init__cCs|jd||dSrB)r)_end_cb)r<statusmsgr r r endszPackageTargetCallbacks.endcCs|jd||dSrB)r) _progress_cbr<ZtotalToDownloadZ downloadedr r r rszPackageTargetCallbacks.progresscCs|jd||dSrB)r)_mirrorfail_cb)r<r\rQr r r mirrorFailuresz$PackageTargetCallbacks.mirrorFailure)rDrErFr=r]rra __classcell__r r rXr rVs rVcsHeZdZfddZddZddZddZed d Zd d Z Z S) PackagePayloadcs$tt||t||_||_dSr4)rWrcr=rVr2r)r<rrrXr r r=s zPackagePayload.__init__cCsRtjj}|durtjj}n$|dr(dS|tjjjkr>tjj }|j |||dS)z"End callback to librepo operation.Nr) rcallbackZ STATUS_FAILEDZ STATUS_OKr(r r PackageTargetCBZTransferStatus_ALREADYEXISTSZSTATUS_ALREADY_EXISTSrr])r<cbdataZ lr_statusr\r[r r r rZs  zPackagePayload._end_cbcCs|j|tjj|dSr4)rr]rrdZ STATUS_MIRROR)r<rfrrQr r r r`szPackagePayload._mirrorfail_cbcCsVz|j||Wn>tyPt\}}}t|||}td|Yn0dSr>) rrKsysexc_info tracebackformat_exceptionloggercriticaljoinr<rftotaldoneexc_type exc_value exc_tracebackZ except_listr r r r^s  zPackagePayload._progress_cbcCs|jSr4)r5r;r r r r6szPackagePayload._full_sizec Cs|j}|j}tj||d||j|j|jd}|| t j |j j |d|d|d|d|d|d|d d d |j S) NT)destresumerfZ progresscbZendcbZmirrorfailurecb relative_urlrt checksum_typechecksum expectedsizebase_urlrur)rpkgdirrutil ensure_dirr^rZr`update_target_paramsr r r!r,r2)r<rr{Z target_dctr r r rs$ zPackagePayload._librepo_target) rDrErFr=rZr`r^rGr6rrbr r rXr rcs   rcc@s(eZdZddZddZeddZdS) RPMPayloadcCstj|jjSr4)ospathbasenamerlocationr;r r r __str__szRPMPayload.__str__cCsT|j}|\}}tjj|}|tjjjkr>tt d||j |||j |j dS)Nzunsupported checksum type: %s)rvrwrxryrz) rZ returnIdSumr r r!Z checksumTypeZChecksumType_UNKNOWNrkwarningrr downloadsizebaseurl)r<rZctypeZcsumZ ctype_coder r r rs zRPMPayload._target_paramscCs|jjSzTotal size of the download.)rrr;r r r r5szRPMPayload.download_sizeN)rDrErFrrrGr5r r r r rsrcs@eZdZfddZddZddZddZed d ZZ S) RemoteRPMPayloadcstt|d|||_d|_||_|jjp.d|jjd}t | d dd}d|}t j|jj|d|_tj|jt j|j|d |_dS) NZ unused_objectrr?Zbasearchutf8z commandline-r/)rWrr=remote_location remote_sizeconfZ releasever substitutionsgethashlibZsha256encodeZ hexdigestrrrmZcachedirr{rr|r}rlstripZ local_path)r<rrrsZdigestZrepodirrXr r r=szRemoteRPMPayload.__init__cCstjtj|jSr4)rrrurllibparseunquoterr;r r r r*szRemoteRPMPayload.__str__cCs\||_z|j||Wn>tyVt\}}}t|||}td |Yn0dSr>) rrrKrgrhrirjrkrlrmrnr r r r^-s zRemoteRPMPayload._progress_cbc Cs*tj|jj|j|jddddddd|j S)NrT)r r r!r_configrr{r2r;r r r r6s    z RemoteRPMPayload._librepo_targetcCs|jSr)rr;r r r r5<szRemoteRPMPayload.download_size) rDrErFr=rr^rrGr5rbr r rXr rs   rcszeZdZfddZddZddZddZd d Zd d Ze d dZ e ddZ e j ddZ ddZ ddZZS) MDPayloadcs.tt||d|_d|_d|_t|_dS)Nr?rF)rWrr=_text_download_sizefastest_mirror_runningr:mirror_failuresr<rrXr r r=Ds zMDPayload.__init__cCstjjr|jS|jdSdS)Nzutf-8)rpycompZPY3rrr;r r r rKszMDPayload.__str__cCs|jSr4)rr;r r r __unicode__QszMDPayload.__unicode__cCs||_|j||dSr4)rr)r<rfrorpr r r r^TszMDPayload._progress_cbcCs\|tjjjkr"td|}d|_n*|tjjjkrH|jrH|rBd|nd}ndS|j|dS)Nz,determining the fastest mirror (%s hosts).. Tz error: %s zdone. ) r r RepoCBZFastestMirrorStage_DETECTIONrrZFastestMirrorStage_STATUSrmessage)r<rfstagedatar\r r r _fastestmirror_cbXs zMDPayload._fastestmirror_cbcCs&|j|d||f}t|dS)Nzerror: %s (%s).)rr+rkdebug)r<rfr\rQrr r r _mirror_failure_cbds  zMDPayload._mirror_failure_cbcCs|jSr4)rr;r r r r5iszMDPayload.download_sizecCs|jSr4) _progressr;r r r rmszMDPayload.progresscCs|durtj}||_dSr4)rrdNullDownloadProgressrrr r r rqs cCs||_|jdddS)NrJr)rrstart)r<textr r r rwszMDPayload.startcCsd|_|j|dddSrB)rrr]r;r r r r]{sz MDPayload.end)rDrErFr=rrr^rrrGr5rrHrr]rbr r rXr rBs     rcsLeZdZfddZddZddZddZd d Zd d Zd dZ Z S) RepoCallbackscs tt|||_|j|_dSr4)rWrr=r, _md_ploadrTrXr r r=szRepoCallbacks.__init__cCs|j|dSr4)rr)r<Zwhatr r r rszRepoCallbacks.startcCs|jdSr4)rr]r;r r r r]szRepoCallbacks.endcCs|jd||dSrB)rr^r_r r r rszRepoCallbacks.progresscCs|jd||dSr4)rr)r<rZptrr r r fastestMirrorszRepoCallbacks.fastestMirrorcCs|jd|||dSrB)rr)r<r\rQrr r r handleMirrorFailuresz!RepoCallbacks.handleMirrorFailurecCs|jj|||||Sr4)r, _key_importrRrOr r r repokeyImportszRepoCallbacks.repokeyImport) rDrErFr=rr]rrrrrbr r rXr rs rcseZdZeZd4fdd ZeddZeddZej ddZed d Z d d Z e j d d Z eddZ eddZ e j ddZ ddZddZfddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd5d2d3ZZS)6r Ncstt|j||d|jjtj|r.|nd|j|_t t j |_ t||_|jj|j|jd|_t|_d|_|j|r|jrtn|j|r|j|jt jj|_|dur|jnd|_dS)N)sectionparentr?T) rWr r=rthisZdisownr r r,rrrdrrrZ _callbacksZ setCallbacks_pkgdirrNrrZsetSyncStrategyZ cacheonlySYNC_ONLY_CACHE DEFAULT_SYNCZsetSubstitutionsrrZ SubstitutionsZ_substitutionsZcheck_config_file_ageZ_check_config_file_age)r<nameZ parent_confrXr r r=s$   z Repo.__init__cCs |jSr4)r,ZgetIdr;r r r rPszRepo.idcCs |jSr4)r,ZgetRepoFilePathr;r r r repofilesz Repo.repofilecCs|j|dSr4)r,ZsetRepoFilePath)r<valuer r r rscCs|jr|jS|Sr4)r,ZisLocalZgetLocalBaseurl cache_pkgdirr;r r r r{s  z Repo.pkgdircCs$|jdur|jStj|jtSr4)rrrrmr, getCachedir_PACKAGES_RELATIVE_DIRr;r r r rs zRepo.cache_pkgdircCs ||_dSr4)rr<valr r r r{scCstj|jdS)NZpubring)rrrmr,rr;r r r _pubring_dirszRepo._pubring_dircCs |jSr4)r,ZgetLoadMetadataOtherr;r r r load_metadata_otherszRepo.load_metadata_othercCs|j|dSr4)r,ZsetLoadMetadataOtherrr r r rscCs |j|jkSr4)rP)r<otherr r r __lt__sz Repo.__lt__cCsd|jj|jfS)Nz<%s %s>)rYrDrPr;r r r __repr__sz Repo.__repr__cstt|||dSr4)rWr __setattr__)r<rrrXr r rszRepo.__setattr__cCs|jdSr4)r,disabler;r r r rsz Repo.disablecCs|jdSr4)r,enabler;r r r rsz Repo.enablecCs|j|dS)a/Ask for additional repository metadata type to download. Given metadata_type is appended to the default metadata set when repository is downloaded. Parameters ---------- metadata_type: string Example: add_metadata_type_to_download("productid") N)r,ZaddMetadataTypeToDownloadr<Z metadata_typer r r add_metadata_type_to_downloads z"Repo.add_metadata_type_to_downloadcCs|j|dS)aIStop asking for this additional repository metadata type in download. Given metadata_type is no longer downloaded by default when this repository is downloaded. Parameters ---------- metadata_type: string Example: remove_metadata_type_from_download("productid") N)r,ZremoveMetadataTypeFromDownloadrr r r "remove_metadata_type_from_downloadsz'Repo.remove_metadata_type_from_downloadcCs |j|S)zReturn path to the file with downloaded repository metadata of given type. Parameters ---------- metadata_type: string )r,ZgetMetadataPathrr r r get_metadata_pathszRepo.get_metadata_pathcCs |j|S)zReturn content of the file with downloaded repository metadata of given type. Content of compressed metadata file is returned uncompressed. Parameters ---------- metadata_type: string )r,ZgetMetadataContentrr r r get_metadata_content"s zRepo.get_metadata_contentc Csd}zz|j}Wnrtjjtfy}zR|jjrbd|j}|jjD]}|d|7}qFt |t j t|WYd}~n d}~00Wt|j_n t|j_0t|j|_|S)aLoad the metadata for this repo. Depending on the configuration and the age and consistence of data available on the disk cache, either loads the metadata from the cache or downloads them from the mirror, baseurl or metalink. This method will by default not try to refresh already loaded data if called repeatedly. Returns True if this call to load() caused a fresh metadata download. Fz7Errors during downloading metadata for repository '%s':z - %sN)r,loadr errorErrorr"rrrPrkrr exceptionsZ RepoErrorr#r:rSr)r<retr1r\Zfailurer r r r.s   ( z Repo.loadcCsP|js|jd|jrL|jdkr&dS|j}|jrDtd|}d|fSdS)a)Get the number of seconds after which the cached metadata will expire. Returns a tuple, boolean whether there even is cached metadata and the number of seconds it will expire in. Negative number means the metadata has expired already, None that it never expires. F)TNrT)Fr)rr,Z loadCacheZmetadata_expireZ getExpiresInZ isExpiredmin)r<Z expirationr r r _metadata_expire_inKs     zRepo._metadata_expire_incCs ||_dSr4)r)r<Z key_importr r r _set_key_import^szRepo._set_key_importcCs ||j_dSr4)rrrr r r set_progress_baraszRepo.set_progress_barcCs |jS)zoReturns user defined http headers. Returns ------- headers : tuple of strings )r,ZgetHttpHeadersr;r r r get_http_headerseszRepo.get_http_headerscCs|j|dS)aSets http headers. Sets new http headers and rewrites existing ones. Parameters ---------- headers : tuple or list of strings Example: set_http_headers(["User-Agent: Agent007", "MyFieldName: MyFieldValue"]) N)r,ZsetHttpHeaders)r<Zheadersr r r set_http_headersos zRepo.set_http_headershttpftpfilehttpscs@fdd}sdS|j}|r,||S|jr<||jSdS)z :param location: relative location inside the repo :param schemes: list of allowed protocols. Default is ('http', 'ftp', 'file', 'https') :return: absolute url (string) or None cs^|D]T}r@tjj|d}|vrXtj|dSqtj|dSqdS)Nrr)rrurlparserrrmr)Zurl_listrQrrschemesr r schemes_filtersz,Repo.remote_location..schemes_filterN)r,Z getMirrorsr)r<rrrZmirrorsr rr r|s  zRepo.remote_location)NN)r)rDrErFSYNC_TRY_CACHErr=rGrPrrHr{rrrrrrrrrrrrrrrrrrrrbr r rXr r sF             r )T)KZ __future__rrZdnf.i18nrrZ dnf.callbackrZdnf.confZdnf.conf.substitutionsZ dnf.constZ dnf.cryptoZdnf.exceptionsZ dnf.loggingZ dnf.pycompZdnf.utilZ dnf.yum.miscZ libdnf.errorr Z libdnf.repo functoolsrZhawkeyZloggingoperatorrreshutilstringrgtimerirrZ_MIRRORLIST_FILENAME ascii_lettersdigitsZ _REPOID_CHARSescapeZ hexdigitsZ _CACHEDIR_REZ CACHE_FILESZ getLoggerrkrrr3r8objectr rKrIrdZ KeyImportrNrSr rerVZPayloadrcrrrr ZSyncStrategy_LAZYZ SYNC_LAZYZSyncStrategy_ONLY_CACHErZSyncStrategy_TRY_CACHErrrrZRepoConfr r r r st      !  8&?