o
    åvŽf  ã                   @   s<   d Z ddlZddlZdZdd„ Zdd„ Zdd	„ Zd
d„ ZdS )z:Python sys.excepthook hook to generate apport crash dumps.é    Nz/etc/default/apportc                  C   sd   ddl } z#ttƒ�}| ¡ }W d  ƒ n1 sw   Y  |  d|| j¡du W S  ty1   Y dS w )z4Return whether Apport should generate crash reports.r   Nz^\s*enabled\s*=\s*0\s*$T)ÚreÚopenÚCONFIGÚreadÚsearchÚMÚIOError)r   ÚfÚconf© r   ú4/usr/lib/python3/dist-packages/apport_python_hook.pyÚenabled   s   

ÿþr   c                 C   sx  �z.| t fv rW trt | ||¡ dS dS z	ddl}|j W n ty4   Y W tr2t | ||¡ dS dS w tƒ sFW trDt | ||¡ dS dS z
ddlm} | W n ty_   ddl	m} Y nw ddl
}ddl}ddlm}m} ztj tj t ¡ tjd ¡¡}	W n/ tttfy±   zt dt ¡  ¡}	W n ty®   Y Y W tr¬t | ||¡ dS dS w Y nw t |	tj¡r¿tj |	¡sÍW trËt | ||¡ dS dS ||	ƒsßW trÝt | ||¡ dS dS ddl}
|
j  ¡ }t!|dƒ�r| "¡ }|dk�rW t�rt | ||¡ dS dS |dk�rt#||ƒ n||d	< | tk�r'|j$du�r't%|j$ƒ|d	< |ƒ }|j&| |||d
� | '¡  (¡ |d< |j)ddgd� | *¡  |	|d< d|v �r\t%t+t ,|	¡j-ƒƒ|d< z	dtj |d< W n
 t�yo   Y nw | .¡ �r„W t�r‚t | ||¡ dS dS | /dd|	¡}t 0¡ }dtj1 2dd¡||f }d}tj 3|¡�rð|
j4 5|¡�rát6|dƒ�}||ƒd }W d  ƒ n	1 �sÂw   Y  |dk�rÛW t�rÙt | ||¡ dS dS t 7|¡ nW t�rît | ||¡ dS dS |�rùt%|ƒ|d< t 8t 6|tj9tj:B tj;B d¡d¡�}| <|¡ W d  ƒ n	1 �sw   Y  W t�r.t | ||¡ dS dS t�r;t | ||¡ w w )z1Catch an uncaught exception and make a traceback.Nr   )ÚStringIO)Úlikely_packagedÚget_recent_crashesz/proc/%i/exeÚget_dbus_namez"org.freedesktop.DBus.Error.NoReplyz)org.freedesktop.DBus.Error.ServiceUnknownÚ_PythonExceptionQualifier)ÚfileÚ	TracebackÚ
PYTHONPATHÚ
PYTHONHOME)ÚextraenvÚExecutablePathÚExecutableTimestampz%rÚ
PythonArgsú/Ú_z%s/%s.%i.crashÚAPPORT_REPORT_DIRz
/var/crashÚrbé   ÚCrashCounteri   Úwb)=ÚKeyboardInterruptÚsysÚ__excepthook__Úapt_pkgÚDATEÚImportErrorr   Ú	cStringIOr   Úior   Ú	tracebackÚapport.fileutilsr   r   ÚosÚpathÚrealpathÚjoinÚgetcwdÚargvÚ	TypeErrorÚAttributeErrorÚ
IndexErrorÚreadlinkÚgetpidÚOSErrorÚaccessÚX_OKÚisfileÚapport.reportÚreportÚReportÚhasattrr   Údbus_service_unknown_analysisÚerrnoÚstrÚprint_exceptionÚgetvalueÚstripÚadd_proc_infoÚadd_user_infoÚintÚstatÚst_mtimeÚcheck_ignoredÚsubÚgetuidÚenvironÚgetÚexistsÚ	fileutilsÚseen_reportr   ÚunlinkÚfdopenÚO_WRONLYÚO_CREATÚO_EXCLÚwrite)Úexc_typeÚexc_objÚexc_tbr%   r   r   r*   r   r   ÚbinaryÚapportÚprÚnameÚtb_fileÚmangled_programÚuserÚpr_filenameÚcrash_counterr	   r   r   r   Úapport_excepthook"   sô   
nÿ–
eÿšaÿ¡ÿ$Nÿ±ÿý	IÿºEÿ½

9ÿ
È
ÿ
ÿâÿÿÿ
ÿòÿ÷
ÿÿþ€
ÿÿrd   c              
   C   sœ  ddl m } dd l}dd l}zddlm}m}m} |||f W n ty2   ddlm}m}m} Y nw | d|  	¡ ¡}|sLt
jrLt
j d|  	¡  ¡ d S | d¡}	g }
|dƒD ]M}|d d�}|j|d	d
� z%| dd¡|	kr‰| dd¡}|jdd|g|jd�dk}|
 |||f¡ W qW ||fy¤   t
jr¢t
j d||  	¡ f ¡ Y qWw |
s¯d|	 |d< d S d|d< |
D ]\}}}|d  d|||rÅdndf 7  < qµd S )Nr   )Úglob)ÚConfigParserÚNoSectionErrorÚNoOptionErrorz/name\s+(\S+)\s+was not provided by any .servicez/Error: cannot parse D-BUS name from exception: r   z%/usr/share/dbus-1/*services/*.service)ÚinterpolationzUTF-8)ÚencodingzD-BUS ServiceÚNameÚExecÚpidofz-sx)Ústdoutz"Invalid D-BUS .service file %s: %szno service file providing ÚDbusErrorAnalysiszprovided byz %s (%s is %srunning)Ú znot )re   Ú
subprocessr   Úconfigparserrf   rg   rh   r'   r   Úget_dbus_messager#   ÚstderrrW   Úgroupr   rN   ÚcallÚPIPEÚappend)rY   r<   re   rq   r   rf   rg   rh   ÚmÚ	dbus_nameÚservicesr	   ÚcpÚexeÚrunningÚservicer   r   r   r?   ¤   sV   þÿÿ

€ÿü
ÿÿr?   c                   C   s
   t t_dS )zInstall the python apport hook.N)rd   r#   Ú
excepthookr   r   r   r   ÚinstallÒ   s   
r�   )Ú__doc__r,   r#   r   r   rd   r?   r�   r   r   r   r   Ú<module>   s     .