a ,i:@sddlmZddlmZddlZddlZddlZddlZddlmZm Z ddl m Z ddl Z ddl Z ddZGdd d e jjZe jjGd d d e jjZdS) )absolute_import)unicode_literalsN)_logger) OptionParsercCs(tjt}tjtj|||SN)dnfZi18nZucdosgetcwdpathrealpathjoin)Z intermediatetargetcwdr8/usr/lib/python3.9/site-packages/dnf-plugins/reposync.py_pkgdir#srcs(eZdZfddZfddZZS)RPMPayloadLocationcs$tt|||tj||_dSr)superr__init__r r dirname package_dir)selfpkgprogressZ pkg_location __class__rrr)szRPMPayloadLocation.__init__cs*tt|}tj|j|j|d<|S)Ndest)rr_target_paramsrutil ensure_dirr)rtprrrr-s z!RPMPayloadLocation._target_params)__name__ __module__ __qualname__rr __classcell__rrrrr(s rcseZdZdZedZfddZeddZddZ d d Z d d Z d dZ ddZ ddZddZddZddZddZddZddZZS)RepoSyncCommand)Zreposyncz&download all packages from remote repocstt||dSr)rr&r)rclirrrr9szRepoSyncCommand.__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<sJ           zRepoSyncCommand.set_argparserc Cs|jj}d|_d|_|jj}|jjrv| |jjD]<}z ||}Wn"t yjt j d|Yn0| q8|jjr|tt|dkr|jjrt j td|D]}|jd|_qdS)NTzUnknown repo: '%s'.z1Can't use --norepopath with multiple repositoriesF)r'demandsZavailable_reposZsack_activationbasereposoptsrepoalldisableKeyErrorrZCliErrorenablesourceZenable_source_reposlenlist iter_enabled norepopathr_repoZexpireZdeltarpm)rr2r4Zrepoidr6rrr configure\s*       zRepoSyncCommand.configurec sd|jj_d}|jjD]}|jjr4|jd|jj r|jj r|j D]6\}}| |}|rnt |qNtd|}t|qNn | ||jjr|jj rt|j fdddD}|r|D] }| |}|rt |qqtd}t|n ||||} |jj r0|| n|| |jjr| D]l} || } t| fdd| | _|j| \} } | d krHttd tj | | t!| d }qH|jj"r|#|| q|st$j%&td dS) NTz%Failed to get mirror for metadata: %scsg|]}|vr|qSrr).0md_typeZmdlrr sz'RepoSyncCommand.run..)groupZgroup_gzZ group_gz_zckz(Failed to get mirror for the group file.cSs|Srr)s local_pathrrrz%RepoSyncCommand.run..rzRemoving {}: {}FzGPG signature check failed.)'r3ZconfZ keepcacher4r>r5Z remote_timer@ZsetPreserveRemoteTimedownload_metadataZurlsZgetMetadataLocationsremote_locationprintrrwarningZ downloadcompsdictgetcomps get_pkglist print_urlsdownload_packagesZgpgcheckpkg_download_pathtypes MethodTypeZlocalPkgZpackage_signature_checkformatr r basenameunlinkdeletedelete_old_local_packagesr exceptionsError)rZ gpgcheck_okr6rCZ md_locationurlmsgZgroup_locationsZgroup_locationpkglistrrHresulterrorrrDrrunwsd                       zRepoSyncCommand.runcCs$t|jjp|jj|jjs|jndSN)rr5Zdestdir download_pathr?idrr6rrr repo_targetszRepoSyncCommand.repo_targetcCs2|jjr$t|jj|jjs|jndS||SdSrd)r5Z metadata_pathrr?rgrirhrrrmetadata_targetszRepoSyncCommand.metadata_targetcCsT||j}tjtj||j}|tj|dsPtj t d |||S)Nrez6Download target '{}' is outside of download path '{}'.) rir6r r r r location startswithrr\r]rrW)rrrirTrrrrTs z!RepoSyncCommand.pkg_download_pathc stfdd|D}t|D]\}}}|D]r}tj||}|dr4tj|r4||vr4zt|t t d|Wq4t yt t d|Yq40q4q&dS)Nc3s|]}|VqdSr)rTrBrrrr rJz.z.rpmz [DELETED] %szfailed to delete file %s)setr walkrir r endswithisfilerYrinforOSErrorrb) rr6r`Zdownloaded_filesdirpathdirnames filenamesfilenamer rrnrr[s  z)RepoSyncCommand.delete_old_local_packagescCsZ|j}|rV||}tj|tj|d}tj j j ||dt td|jdS)Nz comps.xml)rz!comps.xml for repository %s saved)r@Z getCompsFnrjrrr r r r ZyumZmisc decompressrrtrrg)rr6Zcomps_fnZ dest_pathrrrrrPs   zRepoSyncCommand.getcompscCs||}|j|dS)NT)rjr@ZdownloadMetadata)rr6rirrrrKs  z!RepoSyncCommand.download_metadatacCstjjs|S||jj}t}i}i}|D]d}|}| || | i | g ||D]&}| |i | g | qrq6|j|j|dd} t} |D]\} } t} | t| dddt}| D]}|D]}| |qq|j|dD]&}d|}| t||| q(| D]$}| |D]}| |q`qTq| |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})rr3Z WITH_MODULESZlatestZapplyZ_moduleContainerZgetModulePackagesrpZ getArtifactsupdate setdefaultZ getNameStreamZ getVersionNumappendfilteritemsaddsortedkeysvaluesrWmaxunion)rqueryZmodule_packagesZ all_artifactsZ module_dictZartifact_versionZmodule_packageZ artifactsZartifactZ latest_queryZlatest_stream_artifactsZ namestreamZ version_dictZversionsZstream_artifactsmodulesmoduleZ latest_pkgZnevraversionrrr _get_latestsP        zRepoSyncCommand._get_latestcCs|jjjtjdj|jd}|jj r2| |}|jj rH|jddn|jj r`|j|jj dg}t }|D]*}||}||vrn||||qn|S)Nflags)Zreponamesrc)Zarch)r3sackrhawkeyIGNORE_MODULAR_EXCLUDESZ availableZfiltermrgr5Z newest_onlyrr;r(rprTr~r)rr6rr`Z seen_pathsrrfrrrrQs"    zRepoSyncCommand.get_pkglistcsjj}|jjdur tjtj|jj t j d d}fdd|D}| ||dddS)Nrrcsg|]}t||qSr)rrTrmrrrrrE8sz5RepoSyncCommand.download_packages..F)r3outputrrcallbackZNullDownloadProgressdrpmZ DeltaInforrrrZ installedZ_download_remote_payloads)rr`r3rZpayloadsrrrrS1s  z!RepoSyncCommand.download_packagescCs<|D]2}|}|rt|qtd|j}t|qdS)Nz$Failed to get mirror for package: %s)rLrMrnamerrN)rr`rr^r_rrrrR<s  zRepoSyncCommand.print_urls)r"r#r$aliasesrZsummaryr staticmethodr0rArcrirjrTr[rPrKrrQrSrRr%rrrrr&4s"  :  9 r&)Z __future__rrrr shutilrUZdnfpluginscorerrZdnf.cli.option_parserrrZdnf.clirr6Z RPMPayloadrZpluginZregister_commandr'ZCommandr&rrrrs