Ë
    x[h´  ã                   ó�   — d 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 ddl	m
Z
  ej                  e«      Zdefd„Z G d„ d	«      Zy)
z#A module for common socket helpers.é    N)Úsuppress)Úperformance)ÚDEFAULT_RUN_DIRÚmessagec                 óø  — t         j                  j                  dd«      }|sy|d   dk(  r|j                  ddd«       n|d   dk7  rt	        d	«      ‚t        j
                  t
        j                  t
        j                  t
        j                  z  «      5 }t        j                  d
t        | «      «       |j                  |«       |j                  | j                  d«      «       ddd«       y# 1 sw Y   yxY w)z[Send a sd_notify message.

    :param message: sd-notify message (must be valid ascii)
    ÚNOTIFY_SOCKETÚ Nr   ú@ú é   ú/zUnsupported socket typezSending sd_notify(%s)Úascii)ÚosÚenvironÚgetÚreplaceÚOSErrorÚsocketÚAF_UNIXÚ
SOCK_DGRAMÚSOCK_CLOEXECÚLOGÚinfoÚstrÚconnectÚsendallÚencode)r   Úsocket_pathÚsocks      ú2/usr/lib/python3/dist-packages/cloudinit/socket.pyÚ	sd_notifyr!      sÈ   € ô
 —*‘*—.‘. °"Ó5€Káàà	�Q‰˜3Ò	à×Ñ˜C  qÕ)ð 
�Q‰˜3Ò	ÜÐ/Ó0Ð0ä	�‰Ü�‰œ×)Ñ)¬F×,?Ñ,?Ñ?ó
ð .à	Ü�‰Ð(¬#¨g«,Ô7Ø�‰�[Ô!Ø�‰�W—^‘^ GÓ,Ô-÷.÷ .ñ .ús   ÂAC0Ã0C9c                   ó4   — e Zd ZdZdefd„Zdefd„Zd„ Zd„ Zy)	Ú
SocketSyncz<A two way synchronization protocol over Unix domain sockets.Únamesc           	      ó0  — d| _         d| _        d| _        d| _        d| _        |D �ci c]F  }|t        j
                  t
        j                  t
        j                  t
        j                  z  «      “ŒH c}| _	        t        j                  t        › d�dd¬«       | j                  j                  «       D ]O  \  }}t        › d|› d	�}t        t        «      5  t        j                   |«       d
d
d
«       |j#                  |«       ŒQ y
c c}w # 1 sw Y   Œ"xY w)an  Initialize a synchronization context.

        1) Ensure that the socket directory exists.
        2) Bind a socket for each stage.

        Binding the sockets on initialization allows receipt of stage
        "start" notifications prior to the cloud-init stage being ready to
        start.

        :param names: stage names, used as a unique identifiers
        r	   r   Fz/shareiÀ  T)ÚmodeÚexist_okú/share/z.sockN)ÚstageÚremoteÚfirst_exceptionÚsystemd_exit_codeÚexperienced_any_errorr   r   r   r   Úsocketsr   Úmakedirsr   Úitemsr   ÚFileNotFoundErrorÚremoveÚbind)Úselfr$   Únamer   r   s        r    Ú__init__zSocketSync.__init__-   sú   € ð ˆŒ
ØˆŒØ!ˆÔØ!"ˆÔØ%*ˆÔ"ð
 ö	
ð ð ”&—-‘-Ü—‘¤× 1Ñ 1´F×4GÑ4GÑ Góñ ò
ˆŒô 	�‰”Ð' vÐ.°UÀTÕJàŸ,™,×,Ñ,Ó.ò 	#‰JˆD�$Ü,Ð-¨W°T°F¸%Ð@ˆKÜÔ+Ó,ñ 'Ü—	‘	˜+Ô&÷'à�I‰I�kÕ"ñ		#ùò
÷'ð 'ús   ¨ADÃDÄD	r)   c                 óL   — || j                   vrt        d|› �«      ‚|| _        | S )aŽ  Set the stage before entering context.

        This enables the context manager to be initialized separately from
        each stage synchronization.

        :param stage: the name of a stage to synchronize

        Example:
            sync = SocketSync("stage 1", "stage 2"):
            with sync("stage 1"):
                pass
            with sync("stage 2"):
                pass
        zInvalid stage name: )r.   Ú
ValueErrorr)   )r4   r)   s     r    Ú__call__zSocketSync.__call__M   s/   € ð ˜Ÿ™Ñ$ÜÐ3°E°7Ð;Ó<Ð<ØˆŒ
Øˆó    c                 óæ  — t        j                  t        j                  j	                  «       «      rt
        j                  d«       yd| _        t        d| j                  › d�«       | j                  | j                     }t        j                  d| j                  › �«      5  |j                  d«      \  }| _        ddd«       dk7  r+| j                  ddd«       t!        d	t#        |«      › d
�«      ‚t$        › d| j                  › d�t#        | j                  «      k7  r+| j                  ddd«       t!        d| j                  › �«      ‚t        d| j                  › d�«       | S # 1 sw Y   Œ«xY w)z‡Wait until a message has been received on this stage's socket.

        Once the message has been received, enter the context.
        z:Stdin is a tty, so skipping stage synchronization protocolNr   zDSTATUS=Waiting on external services to complete before starting the z stage.zWaiting to start stage é   s   startzReceived invalid message: [ú]r(   z-return.sockz Unexpected path to unix socket: zSTATUS=Running (z stage))r   ÚisattyÚsysÚstdinÚfilenor   r   r,   r!   r)   r.   r   ÚTimedÚrecvfromr*   Ú__exit__r8   r   r   )r4   r   Úchunks      r    Ú	__enter__zSocketSync.__enter__a   sO  € ô
 �9‰9”S—Y‘Y×%Ñ%Ó'Ô(Ü�H‰HØLôð Ø!"ˆÔÜð,Ø,0¯J©J¨<°wð@ô	
ð �|‰|˜DŸJ™JÑ'ˆÜ×ÑÐ!8¸¿¹¸ÐEÓFñ 	2Ø!%§¡¨qÓ!1ÑˆE�4”;÷	2ð �uÒà�M‰M˜$  dÔ+ÜÐ:¼3¸u»:¸,ÀaÐHÓIÐIÜÐ  ¨¯
©
 |°<Ð@ÄCØ�K‰KóE
ò 
ð
 �M‰M˜$  dÔ+ÜÐ?ÀÇÁ¸}ÐMÓNÐNäÐ$ T§Z¡Z L°Ð8Ô9Øˆ÷!	2ð 	2ús   Â#E'Å'E0c                 ó  — d| j                   › �}|r`d| _        d| _        t        |«      › d|j                  › �}d}| j
                  s|| _        t        j                  |«       t        d|› �«       | j                  xs t        | j                  «      | _        | j                  | j                      }|j                  | j                  «       |j                  d|› d| j                  › d	�j                  «       «       |j                  «        y)
z.Notify the socket that this stage is complete.z,Completed socket interaction for boot stage r   Tz in zkfatal error, run "systemctl status cloud-init-main.service" and "cloud-init status --long" for more detailszSTATUS=zecho 'z'; exit ú;)r)   r,   r-   ÚreprÚtb_framer+   r   Úfatalr!   Úboolr.   r   r*   r   r   Úclose)r4   Úexc_typeÚexc_valÚexc_tbr   Ústatusr   s          r    rD   zSocketSync.__exit__ˆ   sÿ   € à@ÀÇÁÀÐMˆÙà%&ˆDÔ"Ø)-ˆDÔ&Ü˜W›� d¨6¯?©?Ð*;Ð<ˆFðBð ð ×'Ò'Ø'-�Ô$Ü�I‰I�fÔÜ˜ ˜xÐ(Ô)à%)×%?Ñ%?ò &
Ä4Ø×"Ñ"óD
ˆÔ"ð �|‰|˜DŸJ™JÑ'ˆØ�‰�T—[‘[Ô!ð
 	�‰Ø�W�I˜X d×&<Ñ&<Ð%=¸QÐ?×FÑFÓHô	
ð 	�
‰
Œð r:   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r6   r9   rF   rD   © r:   r    r#   r#   *   s)   „ ÙFð#˜só #ð@˜có ò(%óN#r:   r#   )rU   Úloggingr   r   r?   Ú
contextlibr   Ú	cloudinitr   Úcloudinit.settingsr   Ú	getLoggerrR   r   r   r!   r#   rV   r:   r    ú<module>r\      sG   ðá )Û Û 	Û Û 
Ý å !Ý .à€g×Ñ˜Ó!€ð.�só .÷6Aò Ar:   