3 f89@sddlmZddlmZddlZddlZddlZddlZddlmZm Z ddl m Z ddl Z ddl Z ddZGdd d e jjZe jjGd d d e jjZdS) )absolute_import)unicode_literalsN)_logger) OptionParsercCs(tjjtj}tjjtjj|||S)N)dnfZi18nZucdosgetcwdpathrealpathjoin)Z intermediatetargetcwdr/usr/lib/python3.6/reposync.py_pkgdir#srcs(eZdZfddZfddZZS)RPMPayloadLocationcs$tt|j||tjj||_dS)N)superr__init__rr dirname package_dir)selfpkgprogressZ pkg_location) __class__rrr)szRPMPayloadLocation.__init__cs*tt|j}tjj|j|j|d<|S)Ndest)rr_target_paramsrutil ensure_dirr)rtp)rrrr-s z!RPMPayloadLocation._target_params)__name__ __module__ __qualname__rr __classcell__rr)rrr(s rcseZdZdZedZfddZeddZddZ d d Z d d Z d dZ ddZ ddZddZddZddZddZddZddZZS) RepoSyncCommandreposyncz&download all packages from remote repocstt|j|dS)N)rr$r)rcli)rrrr9szRepoSyncCommand.__init__c Cs|jdddgtjdtdd|jddd td d |jd dd td d |jdddd tdd |jdddd tdd |jdtdd|jdddd tdd |jddd tdd |jdddtdd |jd!dd td"d |jd#dd td$d |jd%d&dd td'd dS)(Nz-az--archarchesz[arch]z$download only packages for this ARCH)rdefaultactionmetavarhelpz--deleteF store_truez5delete local packages no longer present in repository)r(r)r+z--download-metadatazdownload all the metadata.z-gz --gpgcheckzBRemove packages that fail GPG signature checking after downloadingz-mz--downloadcompsz&also download and uncompress comps.xmlz--metadata-pathzXwhere to store downloaded repository metadata. Defaults to the value of --download-path.)r+z-nz --newest-onlyz&download only newest packages per-repoz --norepopathz,Don't add the reponame to the download path.z-pz--download-pathz./z&where to store downloaded repositories)r(r+z --remote-timezCtry to set local timestamps of local files by the one on the serverz--sourcezdownload only source packagesz-uz--urlsz:Just list urls of what would be downloaded, don't download) add_argumentrZ_SplitCallbackr)parserrrr set_argparser<s2                      zRepoSyncCommand.set_argparserc Cs|jj}d|_d|_|jj}|jjr||jj xJ|jjD]>}y ||}Wn$t k rnt jj d|YnX|j q:W|jjr|jtt|jdkr|jjrt jj tdx |jD]}|jjd|_qWdS)NTzUnknown repo: '%s'.z1Can't use --norepopath with multiple repositoriesF)r&demandsZavailable_reposZsack_activationbasereposoptsrepoalldisableKeyErrorrZCliErrorenablesourceZenable_source_reposlenlist iter_enabled norepopathr_repoZexpireZdeltarpm)rr1r3Zrepoidr5rrr configure\s(     zRepoSyncCommand.configurecsd|jj_d}x|jjjD]}|jjr8|jjd|jj r|jj rxP|jj D]6\}}|j |}|rtt |qTtd|}tj|qTWn |j ||jjr|jj rt|jj fdddD}|rxB|D]}|j |}|rt |PqWtd}tj|n |j||j|} |jj r8|j| n|j| |jjrxt| D]l} |j| } tj| fd d | | _|jj| \} } | d krRtjtd jtjj | | tj!| d }qRW|jj"r|j#|| qW|st$j%j&tddS)NTz%Failed to get mirror for metadata: %scsg|]}|kr|qSrr).0md_type)mdlrr sz'RepoSyncCommand.run..groupgroup_gz group_gz_zckz(Failed to get mirror for the group file.cSs|S)Nr)s local_pathrrrsz%RepoSyncCommand.run..rzRemoving {}: {}FzGPG signature check failed.)rErFrG)'r2ZconfZ keepcacher3r=r4Z remote_timer?ZsetPreserveRemoteTimedownload_metadataZurlsZgetMetadataLocationsremote_locationprintrrwarningZ downloadcompsdictgetcomps get_pkglist print_urlsdownload_packagesZgpgcheckpkg_download_pathtypes MethodTypeZlocalPkgZpackage_signature_checkformatrr basenameunlinkdeletedelete_old_local_packagesr exceptionsError)rZ gpgcheck_okr5rBZ md_locationurlmsgZgroup_locationsZgroup_locationpkglistrrIresulterrorr)rCrrunws^                        zRepoSyncCommand.runcCs$t|jjp|jj|jjs|jndS)N)rr4ZdestdirZ download_pathr>id)rr5rrr repo_targetszRepoSyncCommand.repo_targetcCs&|jjrt|jj|jS|j|SdS)N)r4Z metadata_pathrrerf)rr5rrrmetadata_targetszRepoSyncCommand.metadata_targetcCsT|j|j}tjjtjj||j}|jtjj|dsPtj j t dj |||S)Nrdz6Download target '{}' is outside of download path '{}'.) rfr5rr r r location startswithrr\r]rrW)rrrfrTrrrrTs  z!RepoSyncCommand.pkg_download_pathc stfdd|D}xtjj|D]\}}}x||D]t}tjj||}|jdr8tjj|r8||kr8ytj|t j t d|Wq8t k rt j t d|Yq8Xq8Wq(WdS)Nc3s|]}j|VqdS)N)rT)rAr)rrr sz.z.rpmz [DELETED] %szfailed to delete file %s)setrwalkrfr r endswithisfilerYrinforOSErrorrb) rr5r`Zdownloaded_filesdirpathZdirnames filenamesfilenamer r)rrr[s  z)RepoSyncCommand.delete_old_local_packagescCsZ|jj}|rV|j|}tjj|tjj|d}tj j j ||dt j td|jdS)Nz comps.xml)rz!comps.xml for repository %s saved)r?Z getCompsFnrgrrrrr r ZyumZmiscZ decompressrrorre)rr5Zcomps_fnZ dest_pathrrrrrPs   zRepoSyncCommand.getcompscCs|j|}|jj|dS)NT)rgr?ZdownloadMetadata)rr5rfrrrrKs  z!RepoSyncCommand.download_metadatacCstjjs|jS|j|jjj}t}i}i}xp|D]h}|j}|j ||j |j ij |j gj |x.|D]&}|j |ij |j gj |j qvWq8W|j|j|ddj} t} x|jD]\} } t} | jt| jdddt}x0| jD]$}x|D]}|j |jqWqWx:|j|djD]&}dj|}| jt||| q>Wx0| D](}x | |D]}| j |jq|WqnWqW| j|j| d} | S)a\ return union of these queries: - the latest NEVRAs from non-modular packages - all packages from stream version with the latest package NEVRA (this should not be needed but the latest package NEVRAs might be part of an older module version) - all packages from the latest stream version )Z nevra_strict)Zpkg__neqT)reverserz3{0.name}-{0.epoch}:{0.version}-{0.release}.{0.arch})rr2Z WITH_MODULESZlatestZapplyZ_moduleContainerZgetModulePackagesrkZ getArtifactsupdate setdefaultZ getNameStreamZ getVersionNumappendfilteritemsaddsortedkeysvaluesrWmaxunion)rqueryZmodule_packagesZ all_artifactsZ module_dictZartifact_versionZmodule_packageZ artifactsZartifactZ latest_queryZlatest_stream_artifactsZ namestreamZ version_dictZversionsZstream_artifactsmodulesmoduleZ latest_pkgZnevraversionrrr _get_latestsB         zRepoSyncCommand._get_latestcCsd|jjjtjdjj|jd}|jj r2|j |}|jj rH|jddn|jj r`|j|jj d|S)N)flags)Zreponamesrc)Zarch) r2sackrhawkeyIGNORE_MODULAR_EXCLUDESZ availableZfiltermrer4Z newest_onlyrr:r')rr5rrrrrQs  zRepoSyncCommand.get_pkglistcsjj}|jjdkr tjjtjj|jj t j dj d}fdd|D}|j ||dddS)N)rrcsg|]}t|j|qSr)rrT)rAr)rrrrrD0sz5RepoSyncCommand.download_packages..F)r2outputrrcallbackZNullDownloadProgressdrpmZ DeltaInforrrrZ installedZ_download_remote_payloads)rr`r2rZpayloadsr)rrrrS)s  z!RepoSyncCommand.download_packagescCs@x:|D]2}|j}|r t|qtd|j}tj|qWdS)Nz$Failed to get mirror for package: %s)rLrMrnamerrN)rr`rr^r_rrrrR4s   zRepoSyncCommand.print_urls)r%)r r!r"aliasesrZsummaryr staticmethodr/r@rcrfrgrTr[rPrKrrQrSrRr#rr)rrr$4s   :  9  r$)Z __future__rrrrZshutilrUZdnfpluginscorerrZdnf.cli.option_parserrrZdnf.clirr5Z RPMPayloadrZpluginZregister_commandr&ZCommandr$rrrrs