U
    8d                     @   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   sV   ddl } z2tt}| }W 5 Q R X | d|| jdkW S  tk
rP   Y dS X dS )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   s  zh| tfkrW XdS zddl}|j W n tk
rF   Y W *dS X t sXW dS zddlm} | W n  tk
r   ddl	m} Y nX ddl
}ddl}ddlm}m} z$tjtjt t jd }	W nT tttfk
r&   ztdt  }	W n  tk
r    Y Y W PdS X Y nX t|	tjrFtj|	sPW  dS ||	sdW dS ddl}
|
j  }t!|dr|" }|dkrW dS |dkrt#|| n||d	< | tkr|j$dk	rt%|j$|d	< | }|j&| |||d
 |' ( |d< |j)ddgd |*  |	|d< d|krJt%t+t,|	j-|d< zdt j |d< W n tk
rr   Y nX |. rW dS |/dd|	}t0 }dtj12dd||f }d}tj3|r|
j45|rt6|d}||d }W 5 Q R X |dkrW hdS t7| nW TdS |r.t%||d< t8t6|tj9tj:B tj;B dd}|<| W 5 Q R X W 5 t rt | || X dS )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)=sys__excepthook__KeyboardInterrupt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    



$








  

 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k
rf   ddlm}m}m} Y nX |d| 	 }|st
jrt
jd| 	   d S |d}	g }
|dD ]}|d d}|j|d	d
 zL|dd|	kr|dd}|jdd|g|jddk}|
|||f W q ||fk
rV   t
jrNt
jd|| 	 f  Y qY qX q|
snd|	 |d< n>d|d< |
D ]0\}}}|d  d|||rdndf 7  < qzd 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?      sT    

 
  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    .