3
Z?                 @   s   d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ e
jdkrtdZndZeejddd	eZd
d Zdd ZdZdZG dd deZdS )    )print_functionabsolute_importN)SqliteDatabase3gettextZugettextzcommand-not-foundT)Zfallbackc                sv   d fddt td D }dd |D }dd |D } fdd|D } fdd|D }t|| | | S )	zw
    return a set with spelling1 distance alternative spellings

    based on http://norvig.com/spell-correct.html
    z&abcdefghijklmnopqrstuvwxyz-_0123456789c                s$   g | ]} d |  |d  fqS )N ).0i)wordr   A/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py
<listcomp>#   s    z!similar_words.<locals>.<listcomp>   c             S   s$   g | ]\}}|r||d d  qS )r   Nr   )r   abr   r   r   r   $   s    c             S   s<   g | ]4\}}t |d kr||d   |d  |dd  qS )r   r      N)len)r   r   r   r   r   r   r   %   s    c                s2   g | ]*\}} D ]}|r|| |d d  qqS )r   Nr   )r   r   r   c)alphabetr   r   r   &   s    c                s&   g | ]\}} D ]}|| | qqS r   r   )r   r   r   r   )r   r   r   r   '   s    )ranger   set)r
   sZdeletesZ
transposesZreplacesZinsertsr   )r   r
   r   similar_words   s    r   c              C   sF   y,t j } tjdd | kp,tjdd | kS  tk
r@   dS X d S )Nsudor   ZadminF)posix	getgroupsgrpZgetgrnamKeyError)groupsr   r   r   user_can_sudo+   s    r   z&/var/lib/command-not-found/commands.dbz(/usr/share/command-not-found/commands.dbc               @   s   e Zd ZdZdZd1ZdZejZ	d2ddZ
d3ddZdd Zdd Zdd Zdd Zdd Zd4ddZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd5d.d/Zd0S )6CommandNotFoundz
programs.d   	/snap/bin/bin/usr/bin/usr/local/bin/sbin	/usr/sbin/usr/local/sbin
/usr/gamesz/usr/bin/snap/usr/share/command-not-foundc             C   sN   | j  | _tjjtr"tt| _ntjjtr8tt| _t	 | _	t
j | _d S )N)_getSourcesListsources_listospathexistsdbpathr   db	legacy_dbr   r   geteuideuid)selfZdata_dirr   r   r   __init__M   s    

zCommandNotFound.__init__   c       	      C   sl   g }|t |  ko| jkn  s&|S x@t|D ]4}| j|}x$|D ]\}}}|j||||f qDW q0W |S )z try to correct the spelling )r   max_lenr   get_packagesappend)	r4   r
   Zmin_lenZpossible_alternativeswpackagespackagevercompr   r   r   spelling_suggestionsW   s    
z$CommandNotFound.spelling_suggestionsc             C   s   | j j|S )N)r0   lookup)r4   commandr   r   r   r8   b   s    zCommandNotFound.get_packagesc       	   "   C   sP  g }g }t jj| js.tjd| j  g g fS y6tt j"}tj	| jddd|g|dd}W d Q R X W n4 tj
k
r } ztjd|  g g fS d }~X nX tjd|  ytj|}W n4 tjk
r } ztjd	|  g g fS d }~X nX xZ|D ]R}|d
 |kr$|j|d |d
 |jdf n|j|d
 |d |jdf  qW ||fS )Nz%s not existszadvise-snapz--format=jsonz	--commandT)stderrZuniversal_newlinesz.calling snap advice-snap returned an error: %szgot %s from snap advise-snapzcannot decoding json: %sZCommandZSnapZVersion)r,   r-   r.   snap_cmdloggingdebugopendevnull
subprocessZcheck_outputZCalledProcessErrorjsonloadsZJSONDecodeErrorr9   get)	r4   rA   Zexact_resultZmispell_resultrG   outputesnapssnapr   r   r   	get_snapse   s4    
 $zCommandNotFound.get_snapsc             C   sP   y6t tjjtjdddf}dd |D S Q R X W n tk
rJ   g S X d S )NHOMEz/rootz.command-not-found.blacklistc             S   s    g | ]}|j  d kr|j  qS ) )strip)r   liner   r   r   r      s    z0CommandNotFound.getBlacklist.<locals>.<listcomp>)rF   r,   sepjoingetenvIOError)r4   Z	blacklistr   r   r   getBlacklist   s
    zCommandNotFound.getBlacklistc             C   s   y dd l }ddlm} |j  W n ttfk
r8   g S X tg }x<|ddD ].}|j rN|j rNx|j	D ]}|j
| qjW qNW |S )Nr   )SourcesListF)ZwithMatcher)apt_pkgZaptsources.sourceslistrZ   ZinitSystemErrorImportErrorr   ZdisabledZinvalidcompsadd)r4   r[   rZ   r+   sourceZ	componentr   r   r   r*      s    zCommandNotFound._getSourcesListc             C   s   dt jkrd S |rtd}tjdkr6t|}dd }n(||}tjjr^t|t	r^|j
tjj}|j tdkr| jdkr~d}nd	}d
||f }td| tjd tj|j dd d S )NZ COMMAND_NOT_FOUND_INSTALL_PROMPTz Do you want to install it? (N/y)r   c             S   s   | S )Nr   )xr   r   r   <lambda>   s    z0CommandNotFound.install_prompt.<locals>.<lambda>yr   rR   zsudo z%sapt install %sz%s)fileF)shell)r,   environ_sysversioninputstdinencoding
isinstancestrdecodelowerr3   printstdoutrH   callsplit)r4   Zpackage_namepromptZanswerZ	raw_inputZcommand_prefixZinstall_commandr   r   r   install_prompt   s"    



zCommandNotFound.install_prompt   c       
      C   s  t |t | |kr\td| jd ttd|t |f | jd td| jd | jj  dS t |t | dkr,td| jd ttd| | jd td| jd x@|D ]8\}}}|rd| }nd}ttd|||f | jd qW xD|D ]<\}}}	}|rd| }nd}ttd	|||f | jd qW td| jd t |dkr\ttd
| jd nDt |dkr| jrttdd | jd nttdd | jd td| jd | jj  dS )z3 print spelling suggestions for packages and snaps rR   )rd   z6Command '%s' not found, but there are %s similar ones.Nr   z%Command '%s' not found, did you mean:z (%s)z  command '%s' from snap %s%sz  command '%s' from deb %s%sz3See 'snap info <snapname>' for additional versions.zTry: %s <deb name>zsudo apt installzapt install)r   rq   	output_fdrg   flushr   )
r4   r
   mispell_packagesmispell_snapsZmax_altrA   rO   r=   r<   r>   r   r   r   print_spelling_suggestions   s:    

 
 z*CommandNotFound.print_spelling_suggestionsc             C   s6   t | jd t tdd|i | jd t | jd d S )N)rd   z;Command '%(command)s' not found, but can be installed with:rA   )rq   rx   rg   )r4   rA   r   r   r   _print_exact_header   s    z#CommandNotFound._print_exact_headerc             C   s   | j | |d }| jdkr4td|d  | jd n@| jrRtd|d  | jd n"td|d  | jd ttd td| jd | jj  d S )Nr   zsnap install %s)rd   zsudo snap install %szPlease ask your administrator.rR   )r}   r3   rq   rx   r   rg   ry   )r4   rA   r;   rN   rO   r   r   r   advice_single_snap_package   s    

z*CommandNotFound.advice_single_snap_packagec             C   s   | j | | jdkrBtd|d d  | jd | j|d d  n| jrvtd|d d  | jd | j|d d  nVtd|d d  | jd ttd |d d | jkrttd|d d  | jd td| jd | jj  d S )	Nr   zapt install %s)rd   zsudo apt install %szPlease ask your administrator.r   z1You will have to enable the component called '%s'rR   )	r}   r3   rq   rx   rv   r   rg   r+   ry   )r4   rA   r;   rN   r   r   r   advice_single_deb_package   s    

z)CommandNotFound.advice_single_deb_packagec             C   s   | j dkr| jrdS dS )Nr   zsudo rR   )r3   r   )r4   r   r   r   r      s    zCommandNotFound.sudoc             C   s,  | j | tdd || D }xt|D ]\}}d}|d rl|dkr`t|dkr`d|d  }nd|d  }|d | jkrtd	| j ||d |f | jd
 q*td	| j ||d |f d td|d   d | jd
 q*W | j	dko| j
 rtd| jd
 ttd| jd
 td| jd
 | jj  d S )Nc             S   s   g | ]}t |d  qS )r   )r   )r   r   r   r   r   r      s    z<CommandNotFound.advice_multi_deb_package.<locals>.<listcomp>rR   r   r   z  # version %s, orz  # version %sr   z%sapt install %-*s%s)rd   z (z-You will have to enable component called '%s')z.Ask your administrator to install one of them.)r}   max	enumerater   r+   rq   r   rx   rg   r3   r   ry   )r4   rA   r;   rN   padr	   r<   r=   r   r   r   advice_multi_deb_package   s     
$>z(CommandNotFound.advice_multi_deb_packagec             C   s   | j | tdd || D }xpt|D ]d\}}d}|d rl|dkr`t|dkr`d|d  }nd|d  }td| j ||d |f | jd	 q*W td| jd	 ttd
| jd	 td| jd	 | jj  d S )Nc             S   s   g | ]}t |d  qS )r   )r   )r   r   r   r   r   r     s    z>CommandNotFound.advice_multi_snap_packages.<locals>.<listcomp>rR   r   r   z  # version %s, orz  # version %sz%ssnap install %-*s%s)rd   z3See 'snap info <snapname>' for additional versions.)	r}   r   r   r   rq   r   rx   rg   ry   )r4   rA   r;   rN   r   r	   rO   r=   r   r   r   advice_multi_snap_packages  s    
&z*CommandNotFound.advice_multi_snap_packagesc       	      C   s8  | j | tdd || D }xdt|D ]X\}}d}|d r`|dkrTd|d  }nd|d  }td| j ||d |f | jd	 q*W xF|D ]>}d}|d
 rd|d
  }td| j ||d |f | jd	 qW td| jd	 t|d
kr
ttd|d d  | jd	 nttd| jd	 td| jd	 | jj  d S )Nc             S   s   g | ]}t |d  qS )r   )r   )r   r   r   r   r   r   !  s    z?CommandNotFound.advice_multi_mixed_packages.<locals>.<listcomp>rR   r   r   z  # version %s, orz  # version %sz%ssnap install %-*s%s)rd   r   z%sapt  install %-*s%sz+See 'snap info %s' for additional versions.z3See 'snap info <snapname>' for additional versions.)	r}   r   r   rq   r   rx   r   rg   ry   )	r4   rA   r;   rN   r   r	   rO   r=   r<   r   r   r   advice_multi_mixed_packages  s(    
&
& z+CommandNotFound.advice_multi_mixed_packagesFc       
         s<  dd  t | jkrdS jdrFtjjr@tjjg}q\g }n fdd| jD }|od| rVt |dkrtt	dtjj
|d	 d
 | jd nDtt	ddi | jd x(|D ] }tdtjj
| | jd qW tt|ttjddjd }t |d	krRtt	ddj
| | jd ddj
|krRtt	d| jd dS tjjdpntjjdsvdS | j krdS | j}| j\}}tjd||f  t |d	krt |d	kr| j}	t |	d	kst |d	kr| j|	| nt |d	kr0t |dkr0| j|| nt |d	kr\t |d	kr\| j|| nt |dkrt |d	kr| j|| nVt |dkrt |d	kr| j|| n*t |d	krt |d	kr| j|| dkrtjjdrtd td t |d	kp:t |d	kp:t |d	kp:t |	d	kS )z7 give advice where to find the given command to stderr c             S   s.   t jjt jj| |o,t jjt jj| | S )z? helper that returns if a command is found in the given prefix )r,   r-   r.   rV   isdir)prefixrA   r   r   r   
_in_prefix9  s    z*CommandNotFound.advise.<locals>._in_prefixF/c                s   g | ]} |r|qS r   r   )r   r   )r   rA   r   r   r   G  s    z*CommandNotFound.advise.<locals>.<listcomp>r   z1Command '%(command)s' is available in '%(place)s'r   )rA   Zplace)rd   z:Command '%(command)s' is available in the following placesrA   z * %sPATHrR   :z_The command could not be located because '%s' is not included in the PATH environment variable.ZsbinzfThis is most likely caused by the lack of administrative privileges associated with your user account.z/usr/bin/aptz/usr/bin/aptitudezgot debs: %s snaps: %spythonz/usr/bin/python3z?You also have python3 installed, you can run 'python3' instead.)r   r7   
startswithr,   r-   r.   dirnameprefixesrq   rg   rV   rx   listr   rW   rt   rY   r8   rP   rD   rE   r?   r|   r~   r   r   r   r   )
r4   rA   Zignore_installedr   r   Zmissingr;   rN   r{   rz   r   )r   rA   r   advise7  s^    
,
 "

zCommandNotFound.adviseN)r!   r"   r#   r$   r%   r&   r'   r(   )r)   )r6   )rw   )F)__name__
__module____qualname__Zprograms_dirr7   r   rC   rh   rB   rx   r5   r?   r8   rP   rY   r*   rv   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   :   s8          



#r   )Z
__future__r   r   r   r   rI   rD   r,   os.pathr   rh   rH   ZCommandNotFound.db.dbr   ri   Z_gettext_methodgetattrZtranslationrg   r   r   r/   r1   objectr   r   r   r   r   <module>   s&   

