o a<@sddlmZmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z e jdkr:dZndZeejddd eZd d Zd d ZdZGdddeZdS))print_functionabsolute_importN)SqliteDatabase3gettextugettextzcommand-not-foundT)fallbackcsvdfddttdD}dd|D}dd|D}fdd|D}fdd|D}t||||S) zw return a set with spelling1 distance alternative spellings based on http://norvig.com/spell-correct.html z&abcdefghijklmnopqrstuvwxyz-_0123456789cs$g|]}d||dfqSN).0i)wordr A/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py #$z!similar_words..cSs$g|]\}}|r||ddqSrNr r abr r rr$rcSs<g|]\}}t|dkr||d|d|ddqS)rrNlenrr r rr%s<cs2g|]\}}D]}|r|||ddqqSrr r rrcalphabetr rr&s2cs&g|]\}}D]}|||qqSr r rrr rr's&)rangerset)r sdeletes transposesreplacesinsertsr )rr r similar_wordssr$cCsDzt}tdd|vptdd|vWSty!YdSw)NsudoradminF)posix getgroupsgrpgetgrnamKeyError)groupsr r r user_can_sudo+s r-z&/var/lib/command-not-found/commands.dbc@seZdZdZdZdZdZejZ d*ddZ d+d d Z d d Z d dZ ddZddZddZd,ddZddZddZddZddZd d!Zd"d#Zd$d%Zd-d'd(Zd)S).CommandNotFoundz programs.d)z /snap/binz/binz/usr/binz/usr/local/binz/sbinz /usr/sbinz/usr/local/sbinz /usr/gamesz /usr/bin/snap/usr/share/command-not-foundcCsN||_tjtrtttjrtt|_ nt dt |_ t |_dS)NzCannot find database)_getSourcesList sources_listospathexistsdbpathaccessR_OKrdbFileNotFoundErrorr-r'geteuideuid)selfdata_dirr r r__init__Ks  zCommandNotFound.__init__c Csdg}|t|kr|jks|S|St|D]}||}|D]\}}}|||||fq q|S)z try to correct the spelling )rmax_lenr$ get_packagesappend) r=r min_lenpossible_alternativeswpackagespackagevercompr r rspelling_suggestionsUs  z$CommandNotFound.spelling_suggestionscCs |j|Sr )r9lookupr=commandr r rrB`s zCommandNotFound.get_packagesc Cslg}g}tj|jstd|jggfSz%ttj}tj |jddd|g|dd}Wdn1s6wYWntj yZ}ztd|ggfWYd}~Sd}~wwtd|zt |}Wnt j y}ztd |ggfWYd}~Sd}~ww|D]'}|d |kr||d |d |d fq||d |d |d fq||fS) Nz %s not existsz advise-snapz --format=jsonz --commandT)stderruniversal_newlinesz.calling snap advice-snap returned an error: %szgot %s from snap advise-snapzcannot decoding json: %sCommandSnapVersion)r3r4r5snap_cmdloggingdebugopendevnull subprocess check_outputCalledProcessErrorjsonloadsJSONDecodeErrorrCget) r=rN exact_resultmispell_resultrXoutputesnapssnapr r r get_snapscsD    zCommandNotFound.get_snapscCsjz)ttjtdddf}dd|DWdWS1s"wYWdSty4gYSw)NHOMEz/rootz.command-not-found.blacklistcSs g|] }|dkr|qS))strip)r liner r rrs z0CommandNotFound.getBlacklist..)rWr3sepjoingetenvIOError)r= blacklistr r r getBlacklists ( zCommandNotFound.getBlacklistc Cszzddl}ddlm}|Wn ttfygYSwtg}|ddD]}|js:|js:|j D]}| |q2q'|S)Nr) SourcesListF) withMatcher) apt_pkgaptsources.sourceslistrqinit SystemError ImportErrorrdisabledinvalidcompsadd)r=rsrqr2source componentr r rr1s     zCommandNotFound._getSourcesListcCsdtjvrdS|r[td}tjdkrt|}dd}n||}tjjr/t|t r/| tjj}| tdkr]|j dkr?d}nd }d ||f}t d |tjd tj|d ddSdSdS)N COMMAND_NOT_FOUND_INSTALL_PROMPTz Do you want to install it? (N/y)rcSs|Sr r )xr r rsz0CommandNotFound.install_prompt..yrrhsudo z%sapt install %sz%sfileF)shell)r3environ_sysversioninputstdinencoding isinstancestrdecodelowerr<printstdoutrYcallsplit)r= package_namepromptanswer raw_inputcommand_prefixinstall_commandr r rinstall_prompts&      zCommandNotFound.install_promptc CsVt|t||kr ttd|t|f|jd|jdSt|t|dkrtttd||jd|D]\}}}|rCd|}nd}ttd|||f|jdq7|D]\}}} }|rcd|}nd}ttd |||f|jdqVt|dkrttd |jdn t|dkr|jrttd d |jdn ttd d |jd|jdS)z3 print spelling suggestions for packages and snaps z6Command '%s' not found, but there are %s similar ones.rNr%Command '%s' not found, did you mean:z (%s)rhz command '%s' from snap %s%s command '%s' from deb %s%s3See 'snap info ' for additional versions.zTry: %s zsudo apt installz apt install)rrr output_fdflushr-) r=r mispell_packages mispell_snapsmax_altrNrerIrHrJr r rprint_spelling_suggestionss.     z*CommandNotFound.print_spelling_suggestionscCsttdd|i|jddS)Nz;Command '%(command)s' not found, but can be installed with:rNr)rrrrMr r r_print_exact_headers  z#CommandNotFound._print_exact_headercCs|||d}|jdkrtd|d|jdn |jr)td|d|jdntd|d|jdttd|jdS)Nrzsnap install %srzsudo snap install %sPlease ask your administrator.)rr<rrr-rr)r=rNrGrdrer r radvice_single_snap_packages   z*CommandNotFound.advice_single_snap_packagecCs|||jdkr!td|dd|jd||ddnE|jr;td|dd|jd||ddn+td|dd|jdttd|dd|jvrfttd|dd|jd|jdS)Nrzapt install %srzsudo apt install %srrz1You will have to enable the component called '%s') rr<rrrr-rr2r)r=rNrGrdr r radvice_single_deb_packages   z)CommandNotFound.advice_single_deb_packagecCs|jdkr |jr dSdS)Nrrrh)r<r-)r=r r rr%szCommandNotFound.sudocCs||tdd||D}t|D]W\}}d}|dr5|dkr/t|dkr/d|d}nd|d}|d|jvrNtd |||d|f|jd qtd |||d|fd td |dd |jd q|j dkr}|j s}ttd|jd |j dS)NcSg|]}t|dqSrrr rr r rrz.rhrr # version %s, or # version %srz%sapt install %-*s%srz (z-You will have to enable component called '%s')z.Ask your administrator to install one of them.) rmax enumeraterr2rr%rrr<r-r)r=rNrGrdpadr rHrIr r radvice_multi_deb_packages  $<z(CommandNotFound.advice_multi_deb_packagecCs||tdd||D}t|D]2\}}d}|dr5|dkr/t|dkr/d|d}nd|d}td|||d|f|jd qttd |jd |jdS) NcSrrrrr r rrrz>CommandNotFound.advice_multi_snap_packages..rhrrrr%ssnap install %-*s%srr) rrrrrr%rrr)r=rNrGrdrr rerIr r radvice_multi_snap_packagess  $z*CommandNotFound.advice_multi_snap_packagesc Cs||tdd||D}t|D],\}}d}|dr/|dkr)d|d}nd|d}td|||d|f|jd q|D]}d}|d rQd|d }td |||d|f|jd qCt|d kryttd |dd|jd n ttd |jd |jdS)NcSrrrrr r rrrz?CommandNotFound.advice_multi_mixed_packages..rhrrrrrrrz%sapt install %-*s%sz+See 'snap info %s' for additional versions.r) rrrrr%rrrr) r=rNrGrdrr rerIrHr r radvice_multi_mixed_packagess$  $ $  z+CommandNotFound.advice_multi_mixed_packagesFc sPddt|jkr dSdr#tjr tjg}ng}n fdd|jD}|r|st|dkrNtt dtj |d d |j d n tt d d i|j d |D]}tdtj ||j d q]t t |t tddd}t|d krtt dd ||j d dd |vrtt d|j d dStjdstjdsdS|vrdSdkrtt d|j d tt dd|j d tt dd|j d dS|}|\}}td||ft|d kr t|d kr |} t| d kst|d kr|| |nmt|d kr6t|dkr6|||nWt|d krLt|d krL|||nAt|dkrbt|d krb|||n+t|dkrxt|d krx|||nt|d krt|d kr|||t|d kpt|d kpt|d kpt| d kS)z7 give advice where to find the given command to stderr cSs.tjtj||otjtj|| S)z? helper that returns if a command is found in the given prefix )r3r4r5rlisdir)prefixrNr r r _in_prefix'sz*CommandNotFound.advise.._in_prefixF/csg|] }|r|qSr r )r rrrNr rr5sz*CommandNotFound.advise..rz1Command '%(command)s' is available in '%(place)s'r)rNplacerz:Command '%(command)s' is available in the following placesrNz * %sPATHrh:z_The command could not be located because '%s' is not included in the PATH environment variable.sbinzfThis is most likely caused by the lack of administrative privileges associated with your user account.z /usr/bin/aptz/usr/bin/aptitudepythonrr)python3rrh)rzpython-is-python3rhTzgot debs: %s snaps: %s)rrA startswithr3r4r5dirnameprefixesrrrlrlistrrmrrprBrfrUrVrKrrrrrr) r=rNignore_installedrrmissingrGrdrrr rradvise%sl   ,"        zCommandNotFound.adviseN)r0)r@)r)F)__name__ __module__ __qualname__ programs_dirrArrTrrOrr?rKrBrfrpr1rrrrrr%rrrrr r r rr.8s,      r.) __future__rrrr)r\rUr3os.pathr'rrYCommandNotFound.db.dbrr_gettext_methodgetattr translationrr$r-r6objectr.r r r rs&