
V Tx                 @   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   sj   d d l  }  yA t t   } | j   } Wd QX|  j d | |  j  d k SWn t k
 re 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          5   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| j   d k rt  | |
  qn  |   } | j! |  | | d	 | | j"   j#   |
 d
 <|
 j$ d d d g  |
 j%   | |
 d <d |
 k rIt& t' t j( |  j)   |
 d <n  y d t j |
 d <Wn t k
 rrYn X|
 j*   rd S| j+ d d |  } t j,   } d t j- j. d d  | | f } d } t j j/ |  r?|	 j0 j1 |  r8t2 | d   } | |  d } Wd QX| d k r(d St j3 |  q?d Sn  | rXt& |  |
 d <n  t j4 t j2 | t j5 t j6 Bt j7 Bd  d   } |
 j8 |  Wd QXWd t rt j9 |  | |  n  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.ServiceUnknownfileZ	TracebackZextraenv
PYTHONPATHZ
PYTHONHOMEZExecutablePathZExecutableTimestampz%rZ
PythonArgs/_z%s/%s.%i.crashZAPPORT_REPORT_DIRz
/var/crash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_analysisZprint_exceptiongetvaluestripZadd_proc_infoZadd_user_infostrintstatst_mtimeZcheck_ignoredZ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prZtb_fileZmangled_programuserZpr_filenameZcrash_counterr	   r
   r
   r   apport_excepthook"   s    	2)	

%&rC   c             C   s:  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  Sn  | j d  }	 g  }
 x | d  D] } | d d   } | j | d	 d
 yn | j d d  |	 k r| j d d  } | j d d | g d | j d k } |
 j | | | f  n  Wq | | f k
 rt
 j rt
 j j d | |  j	   f  n  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 )rD   
subprocessr   ZconfigparserrE   rF   rG   r   r   Zget_dbus_messager!   stderrr>   groupr   r7   ZcallPIPEappend)rA   r,   rD   rK   r   rE   rF   rG   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)rC   r!   
excepthookr
   r
   r
   r   install   s    rS   )__doc__r   r!   r   r   rC   r.   rS   r
   r
   r
   r   <module>   s   r.