
0Vt                 @   sX   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   sk   d d l  }  yB t t   } | j   } Wd QRX|  j d | |  j  d k SWn t k
 rf d SYn Xd 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   fZconf r
   4/usr/lib/python3/dist-packages/apport_python_hook.pyenabled   s     r   c          7   C   s  z|  t  f k r d St   s# d Sy d d l m } | Wn" t k
 r_ d d l m } Yn Xd d l } d d l } d d l m	 } m
 } y2 t j j t j j t j   t j d   } WnQ t t t f k
 ry t j d t j    } Wn t k
 rd SYn XYn Xt j | t j  s=t j j |  rAd S| |  sQd Sd d l }	 |	 j j   }
 t | d  r| j   } | d k rd S| d k rt  | |
  n
 | |
 d	 <|  t k r| j! d k	 rt" | j!  |
 d	 <|   } | j# |  | | d
 | | j$   j%   |
 d <|
 j& d d d g  |
 j'   | |
 d <d |
 k r{t" t( t j) |  j*   |
 d <y d t j |
 d <Wn t k
 rYn X|
 j+   rd S| j, d d |  } t j-   } d t j. j/ d d  | | f } d } t j j0 |  ro|	 j1 j2 |  rkt3 | d   } | |  d } Wd QRX| d k r[d St j4 |  n d S| rt" |  |
 d <t j5 t j3 | t j6 t j7 Bt j8 Bd  d   } |
 j9 |  Wd QRXWd t rt j: |  | |  Xd 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.ServiceUnknownZ_PythonExceptionQualifierfileZ	TracebackZextraenv
PYTHONPATHZ
PYTHONHOMEZExecutablePathZExecutableTimestampz%rZ
PythonArgs/_z%s/%s.%i.crashZAPPORT_REPORT_DIRz
/var/crashZrb   ZCrashCounteri  wb);KeyboardInterruptr   Z	cStringIOr   ImportErrorior   	tracebackZapport.fileutilsr   r   ospathrealpathjoingetcwdsysargv	TypeErrorAttributeError
IndexErrorreadlinkgetpidOSErroraccessX_OKisfileZapport.reportreportZReporthasattrr   dbus_service_unknown_analysiserrnostrZprint_exceptiongetvaluestripZadd_proc_infoZadd_user_infointstatst_mtimeZcheck_ignoredsubgetuidenvirongetexistsZ	fileutilsZseen_reportr   unlinkfdopenO_WRONLYO_CREATO_EXCLwrite__excepthook__)exc_typeexc_objZexc_tbr   r   r   r   r   ZbinaryZapportZprnameZtb_fileZmangled_programuserZpr_filenameZcrash_counterr	   r
   r
   r   apport_excepthook"   s    	2)
	

"&rE   c             C   s1  d d l  m  } d d  l } d d  l } y- d d l m } m } m } | | | f Wn. t k
 r d d l m } m } m } Yn X| j d |  j	    } | s t
 j r t
 j j d |  j	    d  S| j d  }	 g  }
 x | d  D] } | d d   } | j | d	 d
 yk | j d d  |	 k r| j d d  } | j d d | g d | j d k } |
 j | | | f  Wq | | f k
 rt
 j rt
 j j d | |  j	   f  w Yq Xq W|
 sd |	 | d <nK d | d <x> |
 D]6 \ } } } | d d | | | rd n d f 7<qWd  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/*.serviceZinterpolationencodingzUTF-8zD-BUS ServiceZNameZExecZpidofz-sxstdoutz"Invalid D-BUS .service file %s: %szno service file providing ZDbusErrorAnalysiszprovided byz %s (%s is %srunning) znot )rF   
subprocessr   ZconfigparserrG   rH   rI   r   r   Zget_dbus_messager    stderrr?   groupr   r8   ZcallPIPEappend)rB   r+   rF   rM   r   rG   rH   rI   mZ	dbus_nameZservicesr	   cpZexeZrunningZservicer
   r
   r   r-      sF    !		'	
r-   c               C   s   t  t _ d S)zInstall the python apport hook.N)rE   r    
excepthookr
   r
   r
   r   install   s    rU   )__doc__r   r    r   r   rE   r-   rU   r
   r
   r
   r   <module>   s   y.