ó
    x[h´  ã                   ó’   • S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
  \R                  " \5      rS\4S jr " S S	5      rg)
z#A module for common socket helpers.é    N)Úsuppress)Úperformance)ÚDEFAULT_RUN_DIRÚmessagec                 ó  • [         R                  R                  SS5      nU(       d  gUS   S:X  a  UR                  SSS5        OUS   S:w  a  [	        S	5      e[
        R
                  " [
        R                  [
        R                  [
        R                  -  5       n[        R                  S
[        U 5      5        UR                  U5        UR                  U R                  S5      5        SSS5        g! , (       d  f       g= f)zSSend 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C8Ã8
Dc                   ó@   • \ rS rSrSrS\4S jrS\4S jrS rS r	S	r
g
)Ú
SocketSyncé*   z<A two way synchronization protocol over Unix domain sockets.Únamesc           	      óB  • SU l         SU l        SU l        SU l        SU l        U Vs0 s HH  nU[
        R
                  " [
        R                  [
        R                  [
        R                  -  5      _MJ     snU l	        [        R                  " [         S3SSS9  U R                  R                  5        HP  u  p#[         SU S	3n[        [        5         [        R                   " U5        S
S
S
5        UR#                  U5        MR     g
s  snf ! , (       d  f       N)= f)a6  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__Ú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   • XR                   ;  a  [        SU 35      eXl        U $ )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*   )r5   r*   s     r    Ú__call__ÚSocketSync.__call__M   s+   € ð Ÿ™Ó$ÜÐ3°E°7Ð;Ó<Ð<ØŒ
Øˆó    c                 ó   • [         R                  " [        R                  R	                  5       5      (       a  [
        R                  S5        gSU l        [        SU R                   S35        U R                  U R                     n[        R                  " SU R                   35         UR                  S5      u  o l        SSS5        SW:w  a+  U R                  SSS5        [!        S	[#        U5       S
35      e[$         SU R                   S3[#        U R                  5      :w  a+  U R                  SSS5        [!        SU R                   35      e[        SU R                   S35        U $ ! , (       d  f       N²= f)zwWait 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__r:   r   r   )r5   r   Úchunks      r    Ú	__enter__ÚSocketSync.__enter__a   sK  € ô
 �9Š9”S—Y‘Y×%Ñ%Ó'×(Ñ(Ü�H‰HØLôð Ø!"ˆÔÜð,Ø,0¯J©J¨<°wð@ô	
ð �|‰|˜DŸJ™JÑ'ˆÜ×ÒÐ!8¸¿¹¸ÐEÕFØ!%§¡¨qÓ!1ÑˆE”;÷ Gð �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Øˆ÷! GÕFús   Â*E/Å/
E=c                 ó:  • SU R                    3nU(       ad  SU l        SU l        [        U5       SUR                   3nSnU R
                  (       d  XPl        [        R                  U5        [        SU 35        U R                  =(       d    [        U R                  5      U l        U R                  U R                      nUR                  U R                  5        UR                  SU SU R                   S	3R                  5       5        UR                  5         g)
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)r5   Úexc_typeÚexc_valÚexc_tbr   Ústatusr   s          r    rG   Ú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=   )r.   r,   r+   r/   r*   r-   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r7   r;   rI   rG   Ú__static_attributes__© r=   r    r#   r#   *   s)   † ÙFð#˜sô #ð@˜cô ò(%õN#r=   r#   )r[   Úloggingr   r   rB   Ú
contextlibr   Ú	cloudinitr   Úcloudinit.settingsr   Ú	getLoggerrW   r   r   r!   r#   r]   r=   r    Ú<module>rc      sE   ðá )Û Û 	Û Û 
Ý å !Ý .à×Ò˜Ó!€ð.�sô .÷6Aò Ar=   