+
    ˜qgjœ.  ã                   óª  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ] P                  ! ]
4      t^t^t^t^t^tRt^t^<tRtRt]P,                  ! ]4      t]P,                  ! ]4      t]],           t^t^t^t^t^ t^t^t ^t!^t"^t#^t$]! R. RO4      t%]! RR	R
.4      t&]! R. RO4      t' ! R R](4      t)R t*R t+RR lt,R t-R t.R t/R t0R t1R t2R# )é    N)Ú
namedtuple)Úutiliÿÿ  ÚIHHIIÚBHiIIÚRTAAttrÚInterfaceOperstateÚifnameÚ	operstateÚNetlinkHeaderc                   ó   € ] tR t^5tRtRtR# )ÚNetlinkCreateSocketErrorz5Raised if netlink socket fails during create or bind.© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    ÚC/usr/lib/python3/dist-packages/cloudinit/sources/helpers/netlink.pyr   r   5   s   † Ý?r   r   c                 ó�  €  \         P                   ! \         P                  \         P                  \         P                  4      p V P	                  \
        P                  ! 4       \        34       V P                  ^ 4       \        P                  R4       T #   \         P                   d   pRT,          p\        T4      ThRp?ii ; i)a]  Creates netlink socket and bind on netlink group to catch interface
down/up events. The socket will bound only on RTMGRP_LINK (which only
includes RTM_NEWLINK/RTM_DELLINK/RTM_GETLINK events). The socket is set to
non-blocking mode since we're only receiving messages.

:returns: netlink socket in non-blocking mode
:raises: NetlinkCreateSocketError
z*Exception during netlink socket create: %sNzCreated netlink socket)ÚsocketÚ
AF_NETLINKÚSOCK_RAWÚNETLINK_ROUTEÚbindÚosÚgetpidÚRTMGRP_LINKÚsetblockingÚerrorr   ÚLOGÚdebug)Únetlink_socketÚeÚmsgs      r   Úcreate_bound_netlink_socketr'   9   s—   € ð3ÜŸšÜ×ÑœvŸ™´×0DÑ0Dó
ˆð 	×ÑœRŸYšY›[¬+Ð6Ô7Ø×"Ñ" 1Ô%ô ‡I�IÐ&Ô'ØÐøô	 �<‰<ô 3Ø:¸QÕ>ˆÜ& sÓ+°Ð2ûð3ús   ‚A=B ÂCÂ+C Ã Cc                óà   € V f   Q R4       h\        V 4      \        8¼  g   Q R4       h\        P                  ! \        V R\
         4      w  rr4p\        P                  RV4       \        WW4V4      # )aì  Gets netlink message type and length

:param: data read from netlink socket
:returns: netlink message type
:raises: AssertionError if data is None or data is not >= NLMSGHDR_SIZE
struct nlmsghdr {
           __u32 nlmsg_len;    /* Length of message including header */
           __u16 nlmsg_type;   /* Type of message content */
           __u16 nlmsg_flags;  /* Additional flags */
           __u32 nlmsg_seq;    /* Sequence number */
           __u32 nlmsg_pid;    /* Sender port ID */
};
Núdata is nonez+data is smaller than netlink message headerzGot netlink msg of type %d)	ÚlenÚNLMSGHDR_SIZEÚstructÚunpackÚNLMSGHDR_FMTÚMSG_TYPE_OFFSETr"   r#   r   )ÚdataÚmsg_lenÚmsg_typeÚflagsÚseqÚpids   &     r   Úget_netlink_msg_headerr6   O   ss   € ð ÒÐ+˜^Ó+ÐäˆD‹	”]Ô"ð5à4ó5Ø"ä)/¯ªÜ�dÐ+œOÐ,ó*Ñ&€G�u 3ô ‡I�IÐ*¨HÔ5Ü˜¨E¸Ó<Ð<r   c                óî   € V f   Q R4       h\         P                   ! V .. . V4      w  p pW9  d   R# \        P                  R4       V P                  \        4      pVf   \        P                  R4       V# )a¥  Select and read from the netlink socket if ready.

:param: netlink_socket: specify which socket object to read from
:param: timeout: specify a timeout value (integer) to wait while reading,
        if none, it will block indefinitely until socket ready for read
:returns: string of data read (max length = <MAX_SIZE>) from socket,
          if no data read, returns None
:raises: AssertionError if netlink_socket is None
Núnetlink socket is noneznetlink socket ready for readz,Reading from Netlink socket returned no data)Úselectr"   r#   ÚrecvÚMAX_SIZEr!   )r$   ÚtimeoutÚread_setÚ_r0   s   &&   r   Úread_netlink_socketr?   h   sr   € ð Ò%Ð?Ð'?Ó?Ð%Ü—]’] NÐ#3°R¸¸WÓE�N€Hˆa�ð Ô%ÙÜ‡I�IÐ-Ô.Ø×ÑœxÓ(€DØ‚|Ü�	‰	Ð@ÔAØ€Kr   c                ó†  € V f   Q R4       h\        V\        4      '       g   Q R4       hV\        8¼  g   Q R4       h^ ;r#Rp \        P                  ! RWR7      ^ ,          p\        P                  ! RW^,           R7      ^ ,          pY\        ,           Y,            p\        Y#T4      #   \        P
                   d     R# i ; i)a  Unpack a single rta attribute.

:param: data: string of data read from netlink socket
:param: offset: starting offset of RTA Attribute
:return: RTAAttr object with length, type and data. On error, return None.
:raises: AssertionError if data is None or offset is not integer.
Nr)   zoffset is not integerz'rta offset is less than expected lengthÚH)Úoffset)Ú
isinstanceÚintÚRTATTR_START_OFFSETr,   Úunpack_fromr!   ÚRTA_DATA_START_OFFSETr   )r0   rB   ÚlengthÚrta_typeÚ	attr_datas   &&   r   Úunpack_rta_attrrK      sÄ   € ð ÒÐ+˜^Ó+ÐÜ�fœc×"Ò"Ð;Ð$;Ó;Ð"àÔ%Ô%ð1à0ó1Ø%àÐ€FØ€IðÜ×#Ò# C¨Ô=¸aÕ@ˆÜ×%Ò% c¨4À½
ÔCÀAÕFˆð
 Ô3Õ3°fµoÐF€IÜ�6 YÓ/Ð/øô �<‰<ô Úðús   ÁAB' Â'C Â?C c                ó¢  € V f   Q R4       h\        V 4      \        8”  g   Q R4       hR;r\        pV\        V 4      8:  dã   \        W4      pV'       d   VP                  ^ 8X  d   M½\        VP                  \        ,          ,
          \        ,          pW4P                  V,           ,          pVP
                  \        8X  d   \        VP                  4      pK§  VP
                  \        8X  g   K¾  \        P                  ! VP                  R4      pVP                  R4      pKò  V'       d   Vf   R# \        P                  RW4       \        W4      # )a�  Reads Interface name and operational state from RTA Data.

:param: data: string of data read from netlink socket
:returns: InterfaceOperstate object containing if_name and oper_state.
          None if data does not contain valid IFLA_OPERSTATE and
          IFLA_IFNAME messages.
:raises: AssertionError if data is None or length of data is
         smaller than RTATTR_START_OFFSET.
Nr)   z2length of data is smaller than RTATTR_START_OFFSETzutf-8Ú z!rta attrs: ifname %s operstate %d)r*   rE   rK   rH   ÚPAD_ALIGNMENTrI   ÚIFLA_OPERSTATEÚordr0   ÚIFLA_IFNAMEr   Údecode_binaryÚstripr"   r#   r   )r0   r	   r
   rB   ÚattrÚpadlenÚinterface_names   &      r   Úread_rta_oper_staterW   ™   s  € ð ÒÐ+˜^Ó+ÐäˆD‹	Ô'Ô'ð<à;ó<Ø'àÐ€FÜ €FØ
”C˜“IÔ
Ü˜tÓ,ˆß�t—{‘{ aÔ'Øô ˜TŸ[™[¬=Õ8Õ9Üõˆð 	—+‘+ Õ&Õ&ˆà�=‰=œNÔ*Ü˜DŸI™I›ŠIØ�]‰]œkÖ)Ü!×/Ò/°·	±	¸7ÓCˆNØ#×)Ñ)¨$Ó/ŠFß�YÒ&ÙÜ‡I�IÐ1°6ÔEÜ˜fÓ0Ð0r   c                ó‚   aa€ \         P                  R4       RoVV3R lp\        V R\        .\        \
        .V4       S# )zÚBlock until a single nic is attached.

:param: netlink_socket: netlink_socket to receive events
:param: existing_nics: List of existing nics so that we can skip them.
:raises: AssertionError if netlink_socket is none.
z!Preparing to wait for nic attach.Nc                 ó   <€ V S9   d   R # V oR# )TFr   )ÚinameÚcarrierÚprevCarrierÚexisting_nicsr	   s   &&&€€r   Úshould_continue_cbÚ5wait_for_nic_attach_event.<locals>.should_continue_cbÈ   s   ø€ Ø�MÔ!ÙàˆÙr   )r"   r#   Úread_netlink_messagesÚRTM_NEWLINKÚOPER_UPÚ	OPER_DOWN)r$   r]   r^   r	   s   &f @r   Úwait_for_nic_attach_eventrd   ¾   sC   ù€ ô ‡I�IÐ1Ô2Ø€Föô ØØÜ	ˆÜ	”)ÐØôð €Mr   c                ót   a€ \         P                  R4       RoV3R lp\        V R\        .\        .V4       S# )zƒBlock until a single nic is detached and its operational state is down.

:param: netlink_socket: netlink_socket to receive events.
z!Preparing to wait for nic detach.Nc                 ó   <€ V oR # )Fr   )rZ   r[   r\   r	   s   &&&€r   r^   Ú5wait_for_nic_detach_event.<locals>.should_continue_cbã   s   ø€ àˆÙr   )r"   r#   r`   ÚRTM_DELLINKrc   )r$   r^   r	   s   & @r   Úwait_for_nic_detach_eventri   Û   s=   ø€ ô
 ‡I�IÐ1Ô2Ø€Fõô
 Ø˜œ{˜m¬i¨[Ð:Lôð €Mr   c                óÞ   a€ V f   Q R4       hSf   Q R4       h\        S4      ^ 8”  g   Q R4       hV3R lp\        P                  R4       \        V S\        \
        .\        \        .V4       R# )aŸ  Block until media disconnect and connect has happened on an interface.
Listens on netlink socket to receive netlink events and when the carrier
changes from 0 to 1, it considers event has happened and
return from this function

:param: netlink_socket: netlink_socket to receive events
:param: ifname: Interface name to lookout for netlink events
:raises: AssertionError if netlink_socket is None or ifname is None.
Nr8   zinterface name is nonezinterface name cannot be emptyc                 ó|   <€ V\         8H  ;'       d
    V\        8H  pV'       d   \        P                  R S4       R# R# )zMedia switch happened on %s.FT)rc   rb   r"   r#   )rZ   r[   r\   ÚisVnetSwitchr	   s   &&& €r   r^   Ú=wait_for_media_disconnect_connect.<locals>.should_continue_cbü   s2   ø€ à#¤yÑ0×JÐJ°wÄ'Ñ7IˆßÜ�I‰IÐ4°fÔ=ÙÙr   z1Wait for media disconnect and reconnect to happen)r*   r"   r#   r`   ra   rh   rb   rc   )r$   r	   r^   s   &f r   Ú!wait_for_media_disconnect_connectrn   î   st   ø€ ð Ò%Ð?Ð'?Ó?Ð%ØÒÐ7Ð7Ó7ÐÜˆv‹;˜Œ?Ð<Ð<Ó<ˆ?õô ‡I�IÐAÔBÜØØÜ	”kÐ"Ü	”)ÐØör   c                ó  € V f   \        R4      h\        4       p\        p\        p \        V \        4      pVf   K  \
        P                  R\        V4      4       WX,          p\
        P                  R\        V4      4       ^ p	\        V4      p
Wš8  Edn   WYR p\        V4      \        8  d   \
        P                  R4       EM>\        V4      p\        V4      VP                  8  d   \
        P                  R4       EMVP                  \        ,           ^,
          \        ^,
          ( ,          pW�,           p	\
        P                  RV	4       VP                  V9  d   KÔ  \        V4      pVf   \
        P                  RV4       Kû  Ve6   VP                  V8w  d%   \
        P                  R	VP                  V4       EK4  VP                  V9  d   EKH  TpVP                  pV! VP                  Wg4      '       d   EKr  R# WYR pEKå  )
a”  Reads from the netlink socket until the condition specified by
the continuation callback is met.

:param: netlink_socket: netlink_socket to receive events.
:param: ifname_filter: if not None, will only listen for this interface.
:param: rtm_types: Type of netlink events to listen for.
:param: operstates: Operational states to listen.
:param: should_continue_callback: Specifies when to stop listening.
NzNetlink socket is nonezread %d bytes from socketzLength of data after concat %dz#Data is smaller than netlink headerz*Partial data. Smaller than netlink messagez"offset to next netlink message: %dz!Failed to read rta attributes: %sz6Ignored netlink event on interface %s. Waiting for %s.)ÚRuntimeErrorÚbytesrb   r?   ÚSELECT_TIMEOUTr"   r#   r*   r+   r6   rH   rN   ÚtyperW   r	   r
   )r$   Úifname_filterÚ	rtm_typesÚ
operstatesÚshould_continue_callbackr0   r[   r\   Ú	recv_datarB   ÚdatalenÚnl_msgÚnlheaderrU   Úinterface_states   &&&&&          r   r`   r`     s¹  € ð  ÒÜÐ3Ó4Ð4Ü‹7€DÜ€GÜ€KØ
Ü'¨¼ÓGˆ	ØÒÙÜ�	‰	Ð-¬s°9«~Ô>ØÕˆÜ�	‰	Ð2´C¸³IÔ>ØˆÜ�d“)ˆØÕØ˜'�]ˆFÜ�6‹{œ]Ô*Ü—	‘	Ð?Ô@ÙÜ-¨fÓ5ˆHÜ�6‹{˜XŸ_™_Ô,Ü—	‘	ÐFÔGÙØ—o‘o¬Õ5¸Õ9Ü Õ!ð>õ ˆFð •_ˆFÜ�I‰IÐ:¸FÔCà�}‰} IÔ-ÙÜ1°&Ó9ˆOØÒ&Ü—	‘	Ð=¸ÔOÙàÒ)Ø#×*Ñ*¨mÔ;ä—	‘	ØLØ#×*Ñ*Ø!ôò
 Ø×(Ñ(°
Ô:ÚØ!ˆKØ%×/Ñ/ˆGÙ+Ø×&Ñ&¨÷õ ñ Ø�Gˆ}‹r   )rH   rI   r0   )rH   rs   r3   r4   r5   )N)3Úloggingr   r9   r   r,   Úcollectionsr   Ú	cloudinitr   Ú	getLoggerr   r"   r   ra   rh   ÚRTM_GETLINKÚRTM_SETLINKr;   r/   rr   r.   ÚIFINFOMSG_FMTÚcalcsizer+   ÚIFINFOMSG_SIZErE   rG   rN   rQ   rO   ÚOPER_UNKNOWNÚOPER_NOTPRESENTrc   ÚOPER_LOWERLAYERDOWNÚOPER_TESTINGÚOPER_DORMANTrb   r   r   r   rp   r   r'   r6   r?   rK   rW   rd   ri   rn   r`   r   r   r   Ú<module>r‹      s0  ðó
 Û 	Û Û Û Ý "å à×Ò˜Ó!€ð €Ø€Ø€Ø€Ø€Ø€Ø€Ø€à€Ø€Ø—’ Ó-€Ø—’ Ó/€Ø# nÕ4Ð ØÐ Ø€à€Ø€ð €Ø€Ø€	ØÐ Ø€Ø€Ø
€á
�YÒ >Ó
?€ÙÐ 4°xÀÐ6MÓNÐ ÙØÒ>ó€ô
@˜|ô @òò,=ô2ò.0ò4"1òJò:ò&ô@Er   