a
    %v"f(¶  ã                   @   sd  d dl Z d dlZd dlZd dlZzd dlZddlmZmZ W nD ey€ Z	 z,e 
¡ dkrZnee	ƒ e  d¡ W Y dZ	[	n
dZ	[	0 0 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 ddlmZ dZej ed¡Zej ed	¡Zd
ZdgZdddddœZ g d¢Z!e!D ] Z"e#de" $¡ e! %e"¡f ƒ q["ddl&m'Z' d dl(m)Z) dZ*g d¢Z+ddddddddddd œ
Z,e-d!d"„ e.e, /¡ ƒD ƒƒZ0e 1¡ Z2d#d$„ Z3g d%¢Z4d&d'„ Z5d€d(d)„Z6d*d+„ Z7dd-d.„Z8d/d0„ Z9d‚d1d2„Z:dƒd4d5„Z;d6d7„ Z<d8d9„ Z=d:d;„ Z>d„d=d>„Z?d…d@dA„Z@i ZAd†dBdC„ZBG dDdE„ dEeCƒZDdFdG„ ZEdHdI„ ZFdJdK„ ZGdLdM„ ZHd‡dNdO„ZIdPdQ„ ZJdˆdSdT„ZKd‰dUdV„ZLg dW¢ZMdXdY„ ZNdZd[„ ZOd\d]„ ZPd^d_„ ZQd<d<d`ddd<d<d<d<eRddd3dfdadb„ZSG dcdd„ ddejƒZTej Ude¡ZVdfeVfZWdgZXdhdi„ ZYdjdk„ ZZdldm„ Z[dndo„ Z\dpdq„ Z]drds„ Z^ej
fdtdu„Z_dvdw„ Z`dxdy„ Zadzd{„ Zbd|d}„ Zcd~d„ ZddS )Šé    Né   )ÚTempFileÚcleanup_temp_fileZWindows)Úopen_url)ÚMUAz/var/lib/dpkgZ	availableÚstatus)ZPackageZSourceZVersionZSeverityZFileZTagsZJustificationzFollowup-ForZOwnerZUserZUsertagsZ	ForwardedÚControlúX-Debbugs-Ccr   z4Offer simple prompts, bypassing technical questions.zˆOffer more extensive prompts, including asking about things that a moderately sophisticated user would be expected to know about Debian.zRLike standard, but assumes you know a bit more about Debian, including "incoming".z¥Bypass most handholding measures and preliminary triage routines.  This mode should not be used by people unfamiliar with Debian's policies and operating procedures.)ZnoviceZstandardZadvancedZexpertz
MODE_%s=%d)Údebbugs)ÚAVAILABLE_UISaf  Dear Maintainer,

*** Reporter, please consider answering these questions, where appropriate ***

   * What led up to the situation?
   * What exactly did you do (or not do) that was effective (or
     ineffective)?
   * What was the outcome of this action?
   * What outcome did you expect instead?

*** End of the template - remove these template lines ***)ú/z/usrz
/usr/sharez/varz
/usr/X11R6z/usr/manz/usr/docú/usr/binZoldoldoldoldoldstableZoldoldoldoldstableZoldoldoldstableZoldoldstableÚ	oldstableÚstableÚtestingznext-testingÚunstableÚexperimental)
ZwheezyZjessieZstretchZbusterZbullseyeZbookwormZtrixieZforkyZsidr   c                 C   s   g | ]\}}||f‘qS © r   )Ú.0ZcodenameZsuiter   r   ú1/usr/lib/python3/dist-packages/reportbug/utils.pyÚ
<listcomp>l   ó    r   c                 C   s°   t j | ¡} |  d¡}tdt|ƒd ƒD ]‚}d |d|… ¡}|tv rHq(t j |¡r(t  	|¡}t j |¡\}}t j 
t j ||¡¡}t jj|g||d …  Ž }t|ƒ  S q(| S )Nr   é   r   r   )ÚosÚpathÚabspathÚsplitÚrangeÚlenÚjoinÚfhs_directoriesÚislinkÚreadlinkÚnormpathÚrealpath)ÚfilenameÚbitsÚiZ	componentZresolvedÚdirÚfileÚnewpathr   r   r   r$   p   s    

r$   )ú	/usr/sbinr   z/sbinz/binz/usr/X11R6/binz
/usr/gamesc                 C   s‚   t j | ¡\}}|rt| ƒS t j dt j¡ d¡}tD ]}||vr6| |¡ q6|D ]*}t j 	||¡}t j 
|¡rRt|ƒ  S qRd S )NÚPATHú:)r   r   r   r$   ÚenvironÚgetÚdefpathÚpathdirsÚappendr   Úexists)r%   ÚdÚfr   Úfullnamer   r   r   Úsearch_path_for‡   s    r7   c                 C   s2   d}| t j d¡t j d¡|fD ]}|r  q.q |S )a   Determine which editor program to use.

        :parameters:
          `specified_editor`
            Specified editor for reportbug, to be used in preference
            to other settings.

        :return value:
            Command to invoke for selected editor program.

        z/usr/bin/sensible-editorZVISUALZEDITOR)r   r.   r/   )Zspecified_editorZdebian_default_editorÚeditorr   r   r   Úwhich_editor˜   s    

ýr9   c                 C   s   t  dd| ¡} | S )Nz
([*?\[\]])z\\\1)ÚreÚsub)r%   r   r   r   Úglob_escape¯   s    r<   Tc                 C   sD   t  | ¡}|r*tj d¡r*t d| ¡}nd}t d| ¡}||fS )Nz/usr/bin/dlocatez$COLUMNS=79 dlocate -S %s 2>/dev/nullFz'COLUMNS=79 dpkg --search %s 2>/dev/null)ÚshlexÚquoter   r   r3   Úpopen)Z
searchfileÚuse_dlocateÚargÚpiper   r   r   Úsearch_pipe´   s    
rC   c                 C   s6   d}t | tƒrd| v rd}tj| |tjdjjddS )NFú T)ÚshellÚstdoutÚbackslashreplace©Úerrors)Ú
isinstanceÚstrÚ
subprocessÚrunÚPIPErF   Údecode)ÚcmdZ	use_shellr   r   r   Úget_command_output¾   s    rQ   c                 C   sø   zt  ¡ }W n ty(   t  d¡ Y n0 t| ƒ}t||ƒ\}}i }|D ]d}| ¡ }d|v r^qH| dd¡\}}	|	 ¡ }	| d¡}
|
D ]&}||v r ||  |	¡ q„|	g||< q„qH| 	¡  |sÎ|rÎt
| dd\}}|sð|  d¡rð| d	d … } t
| ƒS | |fS )
Nr   zdiversion byú: r   ú, F)r@   )r   z/usr/libr+   é   )r   ÚgetcwdÚOSErrorÚchdirr<   rC   Ústripr   r2   ÚcloseÚquery_dpkg_forÚ
startswith)r%   r@   ÚxZsearchfilenamerB   Zdlocate_usedÚpackagesÚlineÚpackager   ÚpacklistÚ_r   r   r   rZ   Å   s2    
rZ   Fc                 C   s€   i }|   d¡r8t d¡}| | ¡}d|| d¡< | |fS | d dkr\t| ƒ\}}|r\||fS t| ƒ}|rt|st| dfS t|p|| ƒS )z)Find the package(s) containing this file.z/var/lib/dpkg/info/z/var/lib/dpkg/info/(.+)\.[^.]+Ú r   r   r   N)r[   r:   ÚcompileÚmatchÚgrouprZ   r7   )r%   Zpathonlyr]   Z	dpkg_infoÚmÚfnZpkglistZnewfilenamer   r   r   Úfind_package_forë   s    


rh   c              	   C   sÐ   d}zt |dd}W n ttfy,   Y d S 0 z’|D ]€}| ¡  d¡d }|sPq4z6| d¡\}}| ¡ | kr„| ¡ W   W | ¡  S W q4 ty²   td| ƒ Y  W | ¡  d S 0 q4W | ¡  n
| ¡  0 d S )Nz/etc/email-addressesrG   rH   ú#r   r-   zInvalid entry in %s)ÚopenÚFileNotFoundErrorÚIOErrorrX   r   rY   Ú
ValueErrorÚprint)Zusernamer%   Úfpr^   ÚnameÚaliasr   r   r   Úfind_rewritten  s,    ûþ
rr   c                 C   s†   d| vrdS |   d¡dkrdS |  d¡\}}| d¡s@| d¡rDdS d|vrPdS | d¡sd| d¡rhdS |dv rtdS | d¡r‚dS dS )zSimple check for email validityú@Fr   Ú.)Z	localhostzexample.comzexample.netzexample.org)z.examplez.invalidz
.localhostz.testz.example.comz.example.netz.example.orgT)Úcountr   r[   Úendswith)ÚaddrZ	localpartZ
domainpartr   r   r   Úcheck_email_addr  s     
rx   c                 C   s   t j | g¡d S )Nr   )ÚemailÚutilsZgetaddresses)rw   r   r   r   Úget_email_addr0  s    r{   rb   c                 C   s   t t| |ƒƒS ©N)r{   Úget_user_id)Ú	emailaddrÚrealnamer   r   r   Ú	get_email4  s    r€   úutf-8c              	   C   sP  t  ¡ }t |¡}t j d| ¡p6t j d¡p6t j d¡} | pNt|d ƒpN|d } d| vr¾z:tddƒ}| ¡  	¡ }W d   ƒ n1 s†0    Y  W n t
tfy°   t ¡ }Y n0 | d | } d| v sÎd	| v rÚt| ƒ\}} |s6t j d
¡pt j d¡pt j d¡}|s6|d  dd¡d }| d|d  ¡ ¡}|s@| S tj || f¡S )NZREPORTBUGEMAILZDEBEMAILZEMAILr   rs   z/etc/mailnameÚrú<ú(ZDEBFULLNAMEZDEBNAMEÚNAMErT   ú,r   ú&)r   ÚgetuidÚpwdÚgetpwuidr.   r/   rr   rj   ÚreadlinerX   rk   rl   ÚsocketZgetfqdnr{   r   ÚreplaceÚ
capitalizery   rz   Z
formataddr)r~   r   ÚcharsetZuidÚinfoZmfZ
domainnamer   r   r   r}   8  s6    

ÿ
ÿ.
ÿr}   c           -      C   sÜ  |s| t v rt |  S t d¡}t d¡}t d¡}t d¡}t d¡}t d¡}t d¡}t d¡}	t d	¡}
t d
¡}t d¡}t d¡}t d¡}t d¡}t d¡}d  } } } }}d  } } } } }}g }g }g }g }g } d}!d}"d}#zt ¡ }$W n ty    t d¡ Y n0 t | ¡}%|r@t	d|% ƒ}&n:zt	d|% ƒ 
¡ d }%W n tyl   Y n0 t	d|% ƒ}&|& 
tj¡D ]~}'|' ¡ }'|'sžq†|"rÂ|'d dkr¾| |'¡ nd}"|!rð|'d d… dkràd}!n|t d|'¡7 }| |'¡r|' 
dd¡\}(}q†|
 |'¡r0|' 
dd¡\}(}q†| |'¡rP|' 
dd¡\}(}q†| |'¡rp|' 
dd¡\}(}q†| |'¡r|' 
dd¡\}(}q†| |'¡r°|' 
dd¡\}(}q†| |'¡rÚ|sÚ|' 
dd¡\}(}d}"q†| |'¡r|' 
dd¡\}(})dd„ |) 
d¡D ƒ})| |)¡ nî| |'¡rR|' 
dd¡\}(})d d„ |) 
d¡D ƒ})| |)¡ n²| |'¡rŽ|' 
dd¡\}(})d!d„ |) 
d¡D ƒ})|  |)¡ nv| |'¡r d}!nd|	 |'¡r¾|' 
dd¡\}(}nF| |'¡rè|' 
dd¡\}(}| 
¡ d }n| |'¡r†|' 
dd¡\}(}q†d}*|r&| 
¡ d }#|#d"v}*d }+|r<t |¡}+nP|rˆ|tjv r~tj| d# }tj|  d$d%¡tj| d& f}+n| ¡ }nd}||t|ƒt|ƒt|ƒ||*|||+|||tj |¡|#t| ƒ|f},|sØ|,t | < |,S )'Nz	Version: z	Package: z
Priority: z(Pre-)?Depends: zRecommends: z
Suggests: z
Conffiles:zMaintainer: zStatus: zOrigin: zBugs: zDescription(?:-[a-zA-Z]+)?: rD   zSource: z	Section: Frb   r   z,LC_ALL=C.UTF-8 apt-cache show %s 2>/dev/nullz4dpkg-query -W -f='${binary:Package}
' %s 2>/dev/nullr   z'COLUMNS=79 dpkg --status %s 2>/dev/nullr   z /z (.+) ([0-9a-f]+).*$rR   r   Tc                 S   s    g | ]}d d„ |  d¡D ƒ‘qS )c                 S   s   g | ]}|  ¡ d  ‘qS ©r   ©r   ©r   Úyr   r   r   r   µ  r   ú1get_package_status.<locals>.<listcomp>.<listcomp>ú|r’   ©r   r\   r   r   r   r   µ  s   ÿz&get_package_status.<locals>.<listcomp>rS   c                 S   s    g | ]}d d„ |  d¡D ƒ‘qS )c                 S   s   g | ]}|  ¡ d  ‘qS r‘   r’   r“   r   r   r   r   »  r   r•   r–   r’   r—   r   r   r   r   »  s   ÿc                 S   s    g | ]}d d„ |  d¡D ƒ‘qS )c                 S   s   g | ]}|  ¡ d  ‘qS r‘   r’   r“   r   r   r   r   Á  r   r•   r–   r’   r—   r   r   r   r   Á  s   ÿ)úconfig-filesznot-installedrp   Útyper
   Zbtsroot)Ústatuscacher:   rc   r   rU   rV   rW   r=   r>   rQ   r   Ú
IndexErrorÚlinesepÚrstripr2   Úfindallrd   Úextendr
   Zparse_bts_urlÚSYSTEMSr/   rŽ   Útupler   )-r_   ZavailZ	versionreZ	packagereZ
priorityreZ	dependsreZrecsreZ
suggestsreZconffilesreZmaintreZstatusreZoriginreZbugsreZdescreZfullreZsrcreZ	sectionreÚ
pkgversionZpkgavailZ
maintainerr   ÚoriginZbugsZvendorZpriorityÚdescZsrc_nameZsectionÚ	conffilesZfulldescÚdependsZ
recommendsZsuggestsZconfmodeZdescmodeÚstater\   ZpackargÚoutputr^   ZcrudZthisdependsZ	installedZ
reportinfor   r   r   r   Úget_package_status^  sú    















ÿÿÿÿÿÿÿÿ
ür©   c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚAvailDBNc                 C   s"   || _ |r|| _n|r|j| _d S r|   )Úpopenobro   rF   )Úselfro   r«   r   r   r   Ú__init__ð  s
    zAvailDB.__init__c                 C   s   | S r|   r   )r¬   r   r   r   Ú__iter__÷  s    zAvailDB.__iter__c                 C   sN   d}| j r| j jrq>| j ¡ }|s$q>|dkr0|S |t|ƒ7 }q|rF|S t‚d S )Nrb   Ú
)r«   Ú
returncodero   r‹   rK   ÚStopIteration)r¬   Úchunkr^   r   r   r   Ú__next__ú  s    
zAvailDB.__next__c                 C   sB   | j r.| j jrq$| j d¡}|sq$q| j  ¡  | jr>| j ¡  d S )Ni   )r«   r°   ro   ÚreadÚwaitrY   )r¬   Zstuffr   r   r   Ú__del__  s    
zAvailDB.__del__)NN)Ú__name__Ú
__module__Ú__qualname__r­   r®   r³   r¶   r   r   r   r   rª   ï  s   
rª   c                  C   sR   z t tdd} | rt| dW S W n, tyL   tdttjd t d¡ Y n0 d S )NrG   rH   ©ro   zUnable to open©r)   r   )rj   ÚSTATUSDBrª   rl   rn   ÚsysÚstderrÚexitrº   r   r   r   Úget_dpkg_database  s    rÀ   c                  C   s   t jdt jd} t| dS )N)z	apt-cacheZ	dumpavail)rF   )r«   )rL   ÚPopenrN   rª   )Zsubpr   r   r   Úget_avail_database'  s    rÂ   c              
   C   s„   zt |  jd jW S  ty$   Y n0 z tj ¡ }| | ¡rD|jW S W n8 tjj	y~ } zt
d|› dƒ W Y d }~n
d }~0 0 d S )Nr   z Cannot look up source package: 'ú')Ú
_apt_cacheÚversionsZsource_nameÚKeyErrorÚaptZapt_pkgZSourceRecordsÚlookupr_   ÚErrorrn   )r_   Z
srcrecordsÚer   r   r   Úget_source_name-  s    

&rË   c              	   C   sÈ   g }g }i }t dt | ¡ ƒ}t d¡}| d¡D ]0}| |¡}|r2| d¡}t d|¡}	||	7 }q2|D ]R}
zt|
 j	d j
}W n ty–   Y qhY n0 |rh|
|vrh||
|fg7 }|||
< qh| ¡  |S )Nzapt-cache showsrc z^Binary: (.*)$r¯   r   z,\s*r   )rQ   r=   r>   r:   rc   r   rd   re   rÄ   rÅ   ZsummaryrÆ   Úsort)r_   r]   ZretlistÚfoundÚdataZbinrer^   rf   Úpacksr`   Úpr¤   r   r   r   Úget_source_package<  s*    





rÑ   c                    sR  | sg S t ƒ }d}i }g }g }| D ](\}}|||< t |¡}	| |	d ¡ q"dd |¡ d d| d d |¡ d | d	 g}t| ¡ ƒ}
i ‰ d
d„ |D ƒ}t dtj¡}t dtj¡}t dtj¡}t dtj¡}g }|D ]}|D ]}| 	|¡}|rè| 	|¡ 
d¡}| 	|¡ 
d¡}| ¡ }|d d |d d  }|d dvsè|d dkrXqè| 
d¡dkr|| 
d¡ ¡ d }nd }| 	|¡ 
d¡}| 	|¡ 
d¡}|||||f}| |¡ | |¡}|rÜ|D ]}dˆ |< qÌ|ˆ vrèdˆ |< qèqÞ|rú|S |
D ]N}‡ fdd„|D ƒ}t|ƒt|ƒkrþ|ˆ vrþ| d |¡ddd d f¡ qþ|S )!Nz&(?:[\S]+(?:\s+\(=[^()]+\))?(?:$|,\s+))z(?:\s+\(=[^()]+\))?z^(?P<hdr>Package):\s+(r–   z)$z^(?P<hdr>Provides):\s+z	*(?P<pkg>z)(?:$|,\s+)z*$c                 S   s   g | ]}t  |t j¡‘qS r   )r:   rc   Ú	MULTILINEr—   r   r   r   r   q  r   z$get_package_info.<locals>.<listcomp>z^Package: (?P<pkg>.*)$z^Status: (?P<stat>.*)$z^Version: (?P<vers>.*)$z*^Description(?:-[a-zA-Z]+)?: (?P<desc>.*)$ÚpkgÚstatr   r   Zihr   ÚnZhdrZProvidesÚversr¤   Tc                    s   g | ]}|ˆ vr|‘qS r   r   r—   ©rÍ   r   r   r   œ  r   z | Zpnz<none>z(no description available))rÀ   r:   Úescaper2   r   ÚlistÚvaluesrc   rÒ   Úsearchre   r   r/   r   )r]   Úskip_notfoundZpackinfoÚpkgnameZgroupforZ
searchpkgsZ
searchbitsre   r_   ZescpkgÚgroupsZ	searchobsZpackobZstatobZversobZdescobÚretrÐ   Úobrf   ÚpackrÔ   ZsinfoÚprovidesrÖ   r¤   r   ÚitemZnotfoundr   r×   r   Úget_package_infoW  sz    
ÿÿÿü





ÿ
rä   c                 C   s<   t | f| fgdd}g }|D ]}| |d |d f¡ q|S )NT)rÜ   r   é   )rä   r2   )r_   Zaretrß   rÓ   r   r   r   Úpackages_providing¥  s
    ræ   ú
depends onc                 C   sj  |sd| |f S g }|D ].}dd„ |D ƒ}|D ]}|  t|ƒ|f¡ q.qd| |f }i }t|ƒD ]:}|d }	|	|vr~|||	< q`|d r`||	 d s`|||	< q`t| ¡ ƒ}
|
 ¡  g }|
D ]2\}}}}}|rÚ|d| d 7 }|  |||f¡ q¸|}
td	d„ |
D ƒƒ}td
d„ |
D ƒƒ}t|d| ƒ}t|d| ƒ}|
D ]0\}}}dj|||||d}|| 	¡ d 7 }q4|S )Nz
%s %s no packages.
c                 S   s   g | ]}|  d ¡d ‘qS )r-   r   r’   )r   r4   r   r   r   r   µ  r   z'get_dependency_info.<locals>.<listcomp>z
Versions of packages %s %s:
r   rT   z [ú]c                 S   s   g | ]}t |d  ƒ‘qS r‘   ©r   r—   r   r   r   r   Ó  r   c                 S   s   g | ]}t |d  ƒ‘qS )r   ré   r—   r   r   r   r   Ô  r   éI   z4{0:3.3} {1:{widthp}.{widthp}}  {2:{widthv}.{widthv}})ÚwidthpÚwidthvr¯   )
r2   r¡   rä   rÙ   rÚ   rÌ   ÚmaxÚminÚformatr   )r_   r¦   ZrelZdependenciesZdepÚbitÚdepinforÏ   r   rÓ   ZdeplistZdeplist2rá   r   rÖ   r¤   râ   ZmaxpZmaxvrë   rì   r   r   r   Úget_dependency_info®  sD    


ÿrò   c                 C   sÚ   i }g }| D ]Ä\}}zt |dd}W n8 ty\ } z |||< W Y d }~qW Y d }~n
d }~0 0 tdt |¡ ƒ ¡ d }||kr‚q| |¡ d}	|D ]2}
|
sžq”|
dkr¬|s¬q”|
d dkr¾|s¾q”|	|
7 }	q”|	||< q||fS )NrG   rH   zmd5sum r   z	changed:
r¯   ri   )rj   rl   rQ   r=   r>   r   r2   )r¥   Ú
nocompressÚconfinfoZchangedr%   Zmd5sumro   ÚmsgZfilemd5Zthisinfor^   r   r   r   Úget_changed_config_filesä  s.    "


rö   )r   r   r   r   r   c                  C   sŽ  d }  } }}g }t dƒ}|rÊt dtj¡}i }| |¡D ]R}| dd¡\}	}
|
tv rnt|	ƒt |
¡ }}nt|	ƒt	tƒ }}d||||
f< q<|rÊt
| ¡ ƒ}| ¡  | ¡  dd„ |D ƒ}|d	 d } z<td
dd}| ¡  ¡ }W d   ƒ n1 sú0    Y  W n" ty(   tdtjd Y n0 |r@|d| d 7 }| rV|d|  d 7 }|r|d dd„ |D ƒ¡}|d| 7 }|rŠ||7 }|S )Nrb   zapt-cache policy 2>/dev/nullzE\s+(\d+)\s+.*$\s+release\s.*o=(Ubuntu|Debian|Debian Ports),a=([^,]+),r   rå   Tc                 S   s   g | ]}|d  |d f‘qS )r   r   r   r—   r   r   r   r     r   z+get_debian_release_info.<locals>.<listcomp>r   z/etc/debian_versionrG   rH   z"Unable to open /etc/debian_versionr»   zDebian Release: r¯   z  APT prefers rS   c                 S   s   g | ]}t |ƒ‘qS r   )rK   r—   r   r   r   r   ,  r   z  APT policy: %s
)rQ   r:   rc   rÒ   Úfinditerre   Ú	DISTORDERÚintÚindexr   rÙ   ÚkeysrÌ   Úreverserj   r‹   rX   rl   rn   r½   r¾   r   )ZdebversZdebinfoZverfileÚwarnZdistsr¨   ZmrerÍ   rd   ZpwordZdistnameZpriZdistZfobZ	policystrr   r   r   Úget_debian_release_info  sB    .rþ   c                   C   s   t dƒS )Nzlsb_release -a 2>/dev/null)rQ   r   r   r   r   Úlsb_release_info4  s    rÿ   c                  C   sN   t dƒ ¡ } | sJt ¡ }|d } t dd| ¡} t dd| ¡} t dd| ¡} | S )	zlGet the architecture of the current system.

    :returns:

        The architecture, e.g. ``"i386"``.

    z0COLUMNS=79 dpkg --print-architecture 2>/dev/nullrT   zi[456]86Zi386Zs390xZs390ZppcZpowerpc)rQ   rX   r   Úunamer:   r;   )ZarchZunr   r   r   Úget_arch8  s    r  c                  C   s   t dƒ} d |  ¡ ¡S )Nz9COLUMNS=79 dpkg --print-foreign-architectures 2>/dev/nullrS   )rQ   r   Ú
splitlines)Úoutr   r   r   Úget_multiarchJ  s    r  Zdebianc                 C   sZ   ddl m} | tjvo |o |j }|j| ||||||||||	|
|||||||d}t|ƒS )Nr   )Ú	bugreport)ÚversionÚseverityÚjustificationr%   ÚmodeÚsubjectÚtagsÚbodyÚpseudoheadersZfollowupr™   Úsystemrñ   Úsysinforô   ÚincfilesÚdebsumsoutputÚissource)rb   r  r
   ZdebotherZbuildd_formatrK   )r_   r¢   r  r  rñ   rô   Z	foundfiler  r  Zexinfor™   Úklassr
  r  r  r	  Úpseudosr  r  Zoptionsr  r  Zrepr   r   r   Úgenerate_blank_reportO  s    
úr  c                   @   s   e Zd Zdd„ ZdS )Úour_lexc                 C   sN   t j  | ¡}|d u st|ƒs |S |d |d krJ|d | jv rJ|dd… }|S )Nr   éÿÿÿÿr   )r=   Ú	get_tokenr   Zquotes)r¬   Útokenr   r   r   r  g  s    zour_lex.get_tokenN)r·   r¸   r¹   r  r   r   r   r   r  f  s   r  z~/.reportbugrcz/etc/reportbug.conf)'Úsendtor  ÚmuaÚmtary   r   ÚbtsÚverifyÚreplytoÚ
http_proxyÚsmtphostr8   Údebconfr  ÚsignÚnoccró   Ú	dontqueryÚnoconfÚmirrorsÚkeyidÚheadersÚ	interfaceÚtemplater	  Úcheck_availableÚ	query_srcÚ	printonlyÚofflineÚ	check_uidÚsmtptlsÚsmtpuserÚ
smtppasswdÚparanoidÚmbox_reader_cmdÚmax_attachment_sizeÚlistccmeÚoutfileÚ	draftpathc                   C   s   t j t¡ S r|   )r   r   r3   ÚUSERFILEr   r   r   r   Ú	first_run}  s    r;  c                  C   s  i } t D ]ø}tj |¡rztt|dddd}W n0 tyb } zW Y d }~qW Y d }~n
d }~0 0 |jd |_| ¡ }|r| 	¡ }|dv r˜|| d< n`|dkrÊ| ¡  	¡ }|t
tj ¡ ƒv rÆ|| d< n.|d	krð|  d
g ¡| ¡ g | d
< n|dv r
|dk| d< nî|dv r$|dk| d< nÔ|dv r>|dk| d< nº|dv rX|dk| d< n |dv rr|dk| d< n†|dv rˆd| |< np|dv r¦| ¡ }|| |< nR|dv rÀ|dk| d< n8|dkr| ¡  	¡ }|dv rê|| d< n&|d krþd!| d< n|d"krød#| d< nä|d$krV| ¡  	¡ }|d%kr8d&}|t
t ¡ ƒv rø|| d'< n¢|d(krŠ| ¡  	¡ }|t
t ¡ ƒv rø|| |< nn|d)krÀ| ¡  	¡ }|t
tj ¡ ƒv rø|| d)< n8|d*krè|  d+g ¡| ¡ g | d+< n|d,v r |d-k| d.< nø|d/kr| ¡  	¡ }nà|tv r0t| | d0< nÈ|d1v rH|d2k| d3< n°|d4v r`|d5k| d5< n˜|d6v rx|d7k| d7< n€|d8v r|d9k| d:< nh|d;v r¨|d<k| d<< nP|d=krÈ| ¡ }t|ƒ| d=< n0|d>krè| ¡  	¡ }|| d>< ntj d?| ¡ | ¡ }qxq| S )@NrG   rH   T)Úposixz-.@/:<>)ÚquietZ	maintonlyZsubmitr  r  Úheaderr)  )úno-ccZccr?  r$  )úno-compressÚcompressr@  ró   )zno-list-cc-meú
list-cc-merB  r7  )úno-query-btsz	query-btsrC  r%  )r˜   úno-config-filesrD  r&  )r.  r+  r/  )ry   r   r  r   r!  r8   r  r  r2  r3  r  r(  r5  r8  r9  )z
no-smtptlsr1  r1  r#  )ZpgpÚgpgZgnupgrE  Znonerb   ZuiZgtk2Zgtkr*  r	  r  Zmirrorr'  )zno-check-availableúcheck-availablerF  r,  Zreportbug_versionr  )úquery-sourcezno-query-sourcerG  r-  )r"  z
no-debconfr"  )r  z	no-verifyr  )ú	check-uidzno-check-uidrH  r0  )r4  zno-paranoidr4  r6  ZenvelopefromzUnrecognized token: %s
)ÚFILESr   r   r3   r  rj   rl   Z	wordcharsr  ÚlowerrÙ   r
   Z
SEVERITIESrû   r/   r   ÚMODESr    r   rù   r½   r¾   Úwrite)Úargsr%   Zlexrõ   r  rð   rA   Z	w_versionr   r   r   Úparse_config_files  sª    
"





























rN  c           
      C   s²   d  }}g }g }t | dd}|D ]„}| ¡ }| d¡}t|ƒdkrDq |d  ¡ |d  }}	|dkrh|	}q |dkrv|	}q |d	krŽ||	 d
¡7 }q |dkr ||	 d
¡7 }q ||||fS )NrG   rH   rR   r   r   r   z	submit-aszsend-tozreport-withrD   zpackage-status)rj   rX   r   r   rJ  )
r%   ZsubmitasZsubmittoZ
reportwithZsupplementalÚfhr^   Úpartsr>  rÎ   r   r   r   Úparse_bug_control_fileã  s&    
rQ  c                    s¬  g }g }g }t  dt j¡}d}d }	}
|D ] }| |¡}|r*| | ¡ ¡ q*dd„ ‰ ‡ fdd„tD ƒ}|D ]2}| |¡}|rjˆ | d¡ƒ}||vrj| |¡ qj|  t	j
¡D ]}|	r |sÀd	}	qª| |¡}|r|d
krìˆ | d¡ƒ|vs
|dkr| d¡d dkr| | ¡ ¡ d	}
n€|rZd}
| ¡ \}}|d dkrJˆ |ƒ}| ||f¡ nD|
s¸t|ƒr¸|d dkr¸|d }|d |d d | f|d< n qª| ¡ tkrª||d 7 }qª|dkr|D ].\}}|rê|d||f g7 }n
||g7 }qÈ|||fS i }g }|D ]\\}}|tv r6|d||f g7 }q|dkr`||v r`||  d| 7  < n|||< q|D ]&}||v rp|d||| f g7 }qp| |¡ |||fS )Nz^([^:]+):\s*(.*)$rb   Tc                 S   s   d  dd„ |  d¡D ƒ¡S )Nú-c                 S   s   g | ]}|  ¡ ‘qS r   )rŽ   r—   r   r   r   r     r   z/cleanup_msg.<locals>.normph.<locals>.<listcomp>)r   r   )Zaphr   r   r   Únormph
  s    zcleanup_msg.<locals>.normphc                    s   g | ]}ˆ |ƒ‘qS r   r   )r   Úph©rS  r   r   r     r   zcleanup_msg.<locals>.<listcomp>r   Fr
   Zgnatsr   ú>rD   r  r¯   z%s: %sr	   rS   )r:   rc   ÚIrd   r2   rÞ   ÚPSEUDOHEADERSre   r   r   rœ   r   rX   Ú
NEWBIELINEÚREPEATABLE_PSEUDOHEADERSrŸ   )Zdmessager)  r  ZbtstypeZ
newheadersZcollected_pseudoheadersZclean_pseudoheadersZheaderreÚmessageZparsingZ
lastpseudor>  ZmobZaccepted_pseudoheadersrT  r^   ÚkeyÚvalueZ
lastheaderZcontentZ	unique_phZrepeatable_phr   rU  r   Úcleanup_msgû  s‚    


ÿþþ




r^  c           	   	   C   sÆ   t |||ƒ}|du rdS tƒ \}}z’| ¡ D ]}| |d ¡ q,| ¡  | duršz| | } W n tyz   d| |f } Y n0 t | ¡}|sšW t |¡ dS t d| ¡ W t |¡ nt |¡ 0 dS )z›Runs the command specified by cmd passing the mbox file
    downloaded from url as a parameter. If cmd is None or fails, then
    fallback to mail program.Nr¯   z%s %szmail -f )	r   r   r  rL  rY   Ú	TypeErrorr   r  Úunlink)	rP   Zurlr   ZtimeoutZmboxÚfdÚfnamer^   Úerrorr   r   r   Úlaunch_mbox_reader`  s(    


ürd  c                  C   s8   t  ¡ } t  ¡ }| dkr d| S | dkr0d| S dS dS )zuReturn the package of the currently running kernel, needed to force
    assignment for 'kernel' package to a real oneZLinuxzlinux-image-zGNU/kFreeBSDzkfreebsd-image-N)Úplatformr  Úrelease)r  rf  r   r   r   Úget_running_kernel_pkgz  s    rg  c                 C   s  t ƒ \}}| ¡  |d| t |¡t |¡f ƒ}d}d}d}d }	 }
}g }t|dd}| ¡ D ]}|dkrrd}q`|dkr€d}q`|d	krŽd}q`|d
krœd}q`|dkrªd}q`|dkr¸d}q`|rÆ|	|7 }	q`|rÔ|
|7 }
q`|rè| | ¡ ¡ q`||7 }q`| ¡  t|ƒ ||	|
||fS )z†Execute and parse the output of the package bugscript, in particular
    identifying the headers and pseudo-headers blocks, if presentzLC_ALL=C %s %s %sFrb   rG   rH   z-- BEGIN HEADERS --
Tz-- END HEADERS --
z-- BEGIN PSEUDOHEADERS --
z-- END PSEUDOHEADERS --
z-- BEGIN ATTACHMENTS --
z-- END ATTACHMENTS --
)	r   rY   r=   r>   rj   Ú	readlinesr2   rX   r   )ZhandlerZ	bugscriptZrunnerrO  r%   ZrcZ	isheadersZispseudoheadersZisattachmentsr)  r  ÚtextZattachmentsro   r^   r   r   r   Úexec_and_parse_bugscript‰  sD    
ÿ


rj  c                 C   s   t  d¡}| | ¡rdS dS )z«Check the package name against Debian Policy:
    https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Source

    Returns True if the package name is valid.z^[a-z0-9][a-z0-9+-\.]+$TF)r:   rc   rd   )rÓ   Zpkg_rer   r   r   Úcheck_package_nameµ  s    
rk  c                  C   sÀ   d} t j d¡rd} n¦tjddds*d} n’t j d¡r<d	} n€t j d
¡r d} zDtddƒ&}| d| ¡  ¡ › 7 } W d  ƒ n1 s„0    Y  W q¼   Y q¼0 nt j d¡r¼t j 	d¡s¼d} | S )z1Determines the init system on the current machinezunable to detectz/run/systemd/systemz!systemd (via /run/systemd/system)z+. /lib/lsb/init-functions ; init_is_upstartT)rE   zupstart (via init_is_upstart())z/run/runit.stopitzrunit (via /run/runit.stopit)z/run/openrczOpenRC (via /run/openrc)z/proc/1/commr‚   z	, PID 1: Nz
/sbin/initzsysvinit (via /sbin/init))
r   r   ÚisdirrL   ÚcallÚisfilerj   r´   rX   r!   )ZinitZpfr   r   r   Úget_init_systemÀ  s"    8ro  c                  C   sê   d} t j d¡r&t ddg¡dkr&d} t j d¡ræt dg¡dkræ| du rPd} n| d7 } t d	g¡ d
¡}| d|dd…  7 } tddƒN}| ¡ }|D ]0}| 	d¡r–| d| 
d¡d dd…  7 }  qÈq–W d  ƒ n1 sÜ0    Y  | S )z©Determines the linux security module enabled on the current machine

    Returns None if there is no LSM enabled on the machine or if the state
    cannot be determined.Nz/usr/bin/aa-enabledz--quietr   zAppArmor: enabledz/usr/sbin/selinuxenabledzSELinux: enabled - z; SELinux: enabled - z/usr/sbin/getenforceÚasciizMode: %s - r  z/etc/selinux/configr‚   zSELINUXTYPE=zPolicy name: %sú=r   )r   r   r3   rL   rm  Zcheck_outputrO   rj   rh  r[   r   )ZlsminfoZenforce_statusr5   Úlinesr^   r   r   r   Úget_lsm_info×  s$    ÿ
$rs  c                  C   sT   g d¢} g }t j d¡rPttdƒ ¡ ƒ}t| ƒD ]\}}|d| @ r0| |¡ q0|S )z!Determines the kernel taint flags)ZTAINT_PROPRIETARY_MODULEZTAINT_FORCED_MODULEZTAINT_CPU_OUT_OF_SPECZTAINT_FORCED_RMMODZTAINT_MACHINE_CHECKZTAINT_BAD_PAGEZ
TAINT_USERZ	TAINT_DIEZTAINT_OVERRIDDEN_ACPI_TABLEZ
TAINT_WARNZ
TAINT_CRAPZTAINT_FIRMWARE_WORKAROUNDZTAINT_OOT_MODULEZTAINT_UNSIGNED_MODULEZTAINT_SOFTLOCKUPZTAINT_LIVEPATCHZ	TAINT_AUXZTAINT_RANDSTRUCTz/proc/sys/kernel/taintedr   )r   r   r3   rù   rj   r´   Ú	enumerater2   )ZTAINT_FLAGSÚflagsZtaintedr'   Úflagr   r   r   Úget_kernel_taint_flagsô  s    rw  c                 C   s.  t  d¡}| |¡}|sdS z,t|  }ddd„ |j| jD ƒv rFW dS W n   Y n0 d}d | ¡d	 | ¡fD ]}tj 	|¡rn q„qnz˜t
 |d
¡v}| ¡ }||vr¨t‚| ¡ D ]H}| ¡ dkrØ| d¡sÔ| d¡sØ qúd| ¡ v r° W d  ƒ W dS q°W d  ƒ n1 s0    Y  W n   Y n0 dS )a  Determine whether a given package is a security update.

    Detection of security update versions works most reliably if the
    package version under investigation is the currently installed
    version.  If this is not the case, the probability of false
    negatives increases.

    Parameters
    ----------
    pkgname : str
        package name
    pkgversion : str
        package version

    Returns
    -------
    bool
        True if there is evidence that this version is a security
        update, otherwise False
    z(\+|~)deb(\d+)u(\d+)FzDebian-Securityc                 S   s   g | ]
}|j ‘qS r   )Zlabel)r   Úor   r   r   r   E  r   z&is_security_update.<locals>.<listcomp>TNz%/usr/share/doc/{}/changelog.Debian.gzz/usr/share/doc/{}/changelog.gzZrtrb   z -- rD   zCVE-20)r:   rc   rÛ   rÄ   rÅ   Zoriginsrï   r   r   r3   Úgziprj   r‹   rÆ   rh  r   r[   Úupper)rÝ   r¢   ZregexZ
secversionrÐ   Zclr5   Zlnr   r   r   Úis_security_update  s>    

	
ÿ
ÿ :r{  )N)T)T)F)rb   rb   )rb   rb   r   )F)F)rç   )F)er½   r   r:   re  r‰   Z	tempfilesr   r   ÚImportErrorrÊ   r  rn   r¿   r=   ry   Zemail.policyrŒ   rL   rÇ   ry  ZurllibZurlutilsr   Zmailerr   ZDPKGLIBr   r   ZAVAILDBr¼   rX  rZ  rK  ZMODELISTr	  Úexecrz  rú   rb   r
   Zreportbug.uir   rY  r    ZCODENAME2SUITEÚdictrÙ   ÚitemsZSUITE2CODENAMEZCacherÄ   r$   r1   r7   r9   r<   rC   rQ   rZ   rh   rr   rx   r{   r€   r}   rš   r©   Úobjectrª   rÀ   rÂ   rË   rÑ   rä   ræ   rò   rö   rø   rþ   rÿ   r  r  ZMODE_EXPERTr  r  Ú
expanduserr:  rI  ZCONFIG_ARGSr;  rN  rQ  r^  rd  rg  rj  rk  ro  rs  rw  r{  r   r   r   r   Ú<module>   sÒ    ú	÷




&


#
 .

N	
6
 -û


be,'