U
    Ӈg                     @   sN  U 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
mZmZmZmZ d dlmZ d dlmZ eeZdZeed< dZeed	< ejd
ejdejdiZeeeef  ed< G dd deZ e dej!Z"eed< e d ej#Z$eed< e"a%e& Z'eee
df ddddZ(dd Z)dd Z*dd Z+e j,dd Z-dS )    N)StringIO)CallableDictFinal
NamedTupleUnion)version)log_utilz#Cloud-init {} received {}, exiting
SIG_MESSAGE   BACK_FRAME_TRACE_DEPTHz/Cloud-init %(version)s received SIGINT, exitingz0Cloud-init %(version)s received SIGTERM, exitingz0Cloud-init %(version)s received SIGABRT, exitingSIGNALSc                   @   s   e Zd ZU eed< eed< dS )ExitBehavior	exit_code	log_levelN)__name__
__module____qualname__int__annotations__ r   r   :/usr/lib/python3/dist-packages/cloudinit/signal_handler.pyr       s   
r      SIGNAL_EXIT_BEHAVIOR_CRASHSIGNAL_EXIT_BEHAVIOR_QUIET)sigreturnc                 C   sz   t | r"t| tjsvtd|  nT| tjkr8td n>| dkrLtd n*| tjkrdtd|  nt	dt
| |  dS )z+inspect_handler() logs signal handler statez.Signal state [%s] - previously custom handler.z,Signal state [SIG_IGN] - previously ignored.Nz;Signal state [None] - previously not installed from Python.zISignal state [%s] - default way of handling signal was previously in use.zSignal state [%s(%s)] - unknown)callable
isinstancetypesBuiltinFunctionTypeLOGinfosignalSIG_IGNSIG_DFLZwarningtype)r   r   r   r   inspect_handler+   s    

r'   c                 C   sz   ||ks| sd S t | }d|d  }|d||jf  |d||jf  |d||jf  t| j|d || d S )N    z%sFilename: %s
z%sFunction: %s
z%sLine number: %s
r   )inspectZgetframeinfowritefilenameZfunctionlineno_pprint_framef_back)frameZdepthZ	max_depthcontentsZ
frame_infoprefixr   r   r   r.   B   s    
r.   c                 C   s^   t | tjr| jn| }ttt |}t	|dt
| tj| ttjd ttj d S )Nr   )logr   )r   r#   ZSignalsnamer   r
   formatvrZversion_stringr.   r   r	   Z	multi_loggetvaluer!   _SIGNAL_EXIT_BEHAVIORr   sysexitr   )signumr0   r4   r1   r   r   r   _handle_exitM   s      r<   c                  C   s2   d} t  D ]}tt|t q| tt 7 } | S )zattach cloud-init's handlersr   )r   keysr'   r#   r<   len)Zsigs_attachedr;   r   r   r   attach_handlersX   s
    r?   c                	   c   s"   t  tadV  taW 5 Q R X dS )a$  suspend_crash() allows signals to be received without exiting 1

    This allow signal handling without a crash where it is expected. The
    call stack is still printed if signal is received during this context, but
    the return code is 0 and no traceback is printed.

    Threadsafe.
    N)_SUSPEND_WRITE_LOCKr   r8   r   r   r   r   r   suspend_crasha   s    rA   ).
contextlibr*   Zloggingr#   r9   Z	threadingr   ior   typingr   r   r   r   r   Z	cloudinitr   r6   Zcloudinit.logr	   Z	getLoggerr   r!   r
   r   r   SIGINTSIGTERMSIGABRTr   r   strr   ZERRORr   INFOr   r8   RLockr@   r'   r.   r<   r?   contextmanagerrA   r   r   r   r   <module>   s@    
   	