o
    x[h®  ã                   @   sP  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'deee
df ddf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   s†   t | ƒrt| tjƒst d| ¡ dS dS | tjkr t d¡ dS | du r+t d¡ dS | tjkr8t d| ¡ dS 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_DFLÚ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   )ÚinspectÚgetframeinfoÚwriteÚfilenameÚfunctionÚlinenoÚ_pprint_frameÚf_back)ÚframeÚdepthÚ	max_depthÚcontentsÚ
frame_infoÚprefixr   r   r   r1   B   s   
r1   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#   ÚSignalsÚnamer   r
   ÚformatÚvrÚversion_stringr1   r   r	   Ú	multi_logÚgetvaluer!   Ú_SIGNAL_EXIT_BEHAVIORr   ÚsysÚexitr   )Úsignumr3   r;   r6   r   r   r   Ú_handle_exitM   s   ÿrE   c                  C   s2   d} t  ¡ D ]
}tt |t¡ƒ q| tt ƒ7 } | S )zattach cloud-init's handlersr   )r   Úkeysr(   r#   rE   Úlen)Úsigs_attachedrD   r   r   r   Úattach_handlersX   s
   rI   c                   c   s:   � t � tadV  taW d  ƒ dS 1 sw   Y  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   rA   r   r   r   r   r   Úsuspend_crasha   s   €"ýrK   ).Ú
contextlibr+   Úloggingr#   rB   Ú	threadingr   Úior   Útypingr   r   r   r   r   Ú	cloudinitr   r=   Úcloudinit.logr	   Ú	getLoggerr   r!   r
   r   r   ÚSIGINTÚSIGTERMÚSIGABRTr   r   Ústrr   ÚERRORr   ÚINFOr   rA   ÚRLockrJ   r(   r1   rE   rI   ÚcontextmanagerrK   r   r   r   r   Ú<module>   s:   

ý	