3 šgt`…*ã@sÌddlmZddlmZddlmZmZmZddlZddlZddl Zddl Zddl Z ddl Z ddl Z ddlZddlZejjGdd„dejjƒƒZdd„Zejd ƒZejd ƒZejd ƒZejd ƒZd d„ZdS)é)Úabsolute_import)Úunicode_literals)Ú_ÚloggerÚP_Nc@sReZdZdgZedƒjejjd�Z e dd„ƒZ dd„Z dd „Z d d „Zd d „ZdS)ÚConfigManagerCommandzconfig-managerz4manage {prog} configuration options and repositories)ÚprogcCs¬|jdddtdƒd�|jdddtd ƒd �|jd gd d tdƒd�|jdddtdƒd �|jdddtdƒd �|jƒ}|jddddtdƒd�|jddddtdƒd�dS)NÚcrepoÚ*Úrepozrepo to modify)ÚnargsÚmetavarÚhelpz--saveFÚ store_truez/save the current options (useful with --setopt))ÚdefaultÚactionrz --add-repoÚappendZURLz8add (and enable) the repo from the specified file or url)rrr rz--dumpz,print current configuration values to stdoutz--dump-variableszprint variable values to stdoutz --set-enabledÚ set_enabledz"enable repos (automatically saves))rÚdestrrz--set-disabledÚ set_disabledz#disable repos (automatically saves))Ú add_argumentrZadd_mutually_exclusive_group)ÚparserZ enable_group©rú$/usr/lib/python3.6/config_manager.pyÚ set_argparser)s,      z"ConfigManagerCommand.set_argparserc CsØ|jj}d|_|jjgkp@|jjp@|jjp@|jjp@|jjp@|jj sp|jj j t dƒj djdddddd d d gƒƒƒ|jjgkrŠtjt d ƒƒ|jjsª|jj sª|jjsª|jjr°d|_d d„|jjDƒ}dd„|Dƒ|j_dS)NTz.one of the following arguments is required: {}ú z--savez --add-repoz--dumpz--dump-variablesz --set-enabledz--enablez--set-disabledz --disablez{Warning: --enablerepo/--disablerepo arguments have no meaningwith config manager. Use --set-enabled/--set-disabled instead.cSsg|]}|dkr|jdƒ‘qS)ú,)Úsplit)Ú.0Úxrrrú _sz2ConfigManagerCommand.configure..cSs"g|]}|D]}|dkr |‘q qS)Úr)rZsublistÚitemrrrr as)ÚcliÚdemandsZavailable_reposÚoptsÚadd_repoÚsaveÚdumpÚdump_variablesrrZ optparserÚerrorrÚformatÚjoinZrepos_edrZwarningZ root_userr )Úselfr$Z temp_listrrrÚ configureBs*  zConfigManagerCommand.configurecCs|jjr|jƒn|jƒdS)zExecute the util action here.N)r%r&Ú modify_repo)r-rrrÚrunds zConfigManagerCommand.runc sŒg‰tƒ‰‡‡‡‡fdd„}ˆjjrnxˆjjD]‰|ˆdƒq.WtˆjdƒršxLˆjjjƒD]‰|ˆdƒqZWn,tˆjdƒršxˆjjjƒD]‰|ˆdƒqˆWˆr¸tjjt dƒdj ˆƒƒ‚ˆj j }i}tˆjdƒràˆjj ràˆjj }ˆjj�rx*ˆj j jjƒD]\‰}td ˆ|fƒqúWˆjj �s0d ˆjjk�rˆˆjj�r\|�r\ˆj j jˆj j jd |j|ƒˆjj�rˆtˆj jjd ƒƒtˆj j jƒƒˆ�s’d Sˆjj�s¦ˆjj�r®dˆj_xØtˆƒD]Ì}i}ˆjj�rÔd |d <nˆjj�ræd|d <tˆjdƒ�r*x4ˆjjjƒD]$\}}tj|j|ƒ�r|j|ƒ�qWˆjj�rT|�rTˆj j j|j|j|j|ƒˆjj�r¸tˆj jjd|jƒƒt|jƒƒ�q¸Wd S)z< process --set-enabled, --set-disabled and --setopt options cs0ˆjjj|ƒ}|sˆjˆƒn|r,ˆj|ƒdS)N)ÚbaseZreposZ get_matchingÚaddÚextend)ÚkeyZadd_matching_reposZmatching)Úmatching_reposÚnameÚnot_matching_repos_idr-rrÚ match_reposqs  z5ConfigManagerCommand.modify_repo..match_reposTÚ repo_setoptsFzNo matching repo to modify: %s.z, Ú main_setoptsz%s = %sÚmainNÚ1ZenabledÚ0zrepo: )Úsetr%r Úhasattrr9ÚkeysÚdnfÚ exceptionsÚErrorrr,r1Úconfr:r)Z substitutionsÚitemsÚprintr'Zwrite_raw_configfileZconfig_file_pathr(ÚoutputZ fmtSectionrrÚsortedÚfnmatchÚidÚupdateZrepofile) r-r8ZsbcZmodifyÚvalr Z repo_modifyÚrepoidZsetoptsr)r5r6r7r-rr/ks`          z ConfigManagerCommand.modify_repoc CsN|jjj}d}�x|jjD�]}tjjj|ƒjdkrDdt j j |ƒ}t j tdƒ|ƒ|jdƒrèt j j|ƒ}t j j||ƒ}y6|jj|dd�}tj|j|ƒt j|dƒ|jƒWn6tk rä}z|d 7}t j|ƒwWYd d }~XnXqt|ƒ}d jtjj|ƒ}t j j|d |ƒ}d |||f} t|| ƒsqqW|�rJtjj t!dd|ƒƒ‚d S)z process --add-repo option rr!zfile://zAdding repo from: %sz.repozw+)Úmodei¤éNz$created by {} config-manager from {}z%s.repoz"[%s] name=%s baseurl=%s enabled=1 zConfiguration of repo failedzConfiguration of repos failed)"r1rDZ get_reposdirr%r&rAÚpycompZurlparseÚschemeÚosÚpathÚabspathrÚinforÚendswithÚbasenamer,ZurlopenÚshutilZcopy2r6ÚchmodÚcloseÚIOErrorr*Úsanitize_url_to_fsr+ÚutilÚ MAIN_PROGÚ save_to_filerBrCr) r-Z myrepodirZ errors_countÚurlZdestnameÚfÚerMZreponameÚcontentrrrr&­s8         zConfigManagerCommand.add_repoN)Ú__name__Ú __module__Ú __qualname__Úaliasesrr+rAr]r^ZsummaryÚ staticmethodrr.r0r/r&rrrrr"s  "BrcCspy4t|dƒ� }tjj||ƒtj|dƒWdQRXWn6ttfk rj}ztj t dƒ||ƒdSd}~XnXdS)Nzw+i¤z&Could not save repo to repofile %s: %sFT) ÚopenrArPZ write_to_filerRrYr[ÚOSErrorrr*r)ÚfilenamercÚfdrbrrrr_Ós  r_z^\w+:/*(\w+:|www\.)?z[?/:&#|~\*\[\]\(\)\'\\]+z^[,.]*z[,.]*$cCs*ybtj|ƒr`tjjr&|jdƒjdƒ}n:t|tƒrB|jdƒjdƒ}n |jdƒ}t|t ƒr`|jdƒ}Wnt t t t fk r~YnXtjd|ƒ}tjd|ƒ}tjd|ƒ}tjd|ƒ}t|ƒdk�r|dd…jdƒ}dt|d ƒ}tjƒ}|j||d…jdƒƒ|d|…d|jƒ}d }tj|d|ƒS) z©Return a filename suitable for the filesystem and for repo id Strips dangerous and common characters to create a filename we can use to store the cache in. Zidnazutf-8r!réúNé¹rOzE[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.:-]éÿÿÿÿ)Ú RE_SCHEMEÚmatchrArPZPY3ÚencodeÚdecodeÚ isinstanceÚstrZunicodeÚUnicodeDecodeErrorÚUnicodeEncodeErrorÚ UnicodeErrorÚ TypeErrorÚsubÚRE_SLASHÚRE_BEGINÚRE_FINALÚlenrÚhashlibZsha256rKZ hexdigestÚre)r`ÚpartsÚ lastindexZcsumZ allowed_regexrrrr\äs.        r\)Z __future__rrZdnfpluginscorerrrrAZdnf.cliZ dnf.pycompZdnf.utilrIrrRr€rXZpluginZregister_commandr#ZCommandrr_Úcompilerpr{r|r}r\rrrrÚs(   1