HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-10-0-8-47 6.8.0-1021-aws #23~22.04.1-Ubuntu SMP Tue Dec 10 16:31:58 UTC 2024 aarch64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.22
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/cloudinit/sources/helpers/__pycache__/netlink.cpython-310.pyc
o

�Ad/�@sVddlZddlZddlZddlZddlmZddlmZddlm	Z	e�
e�ZdZ
dZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZe�e�Ze�e�ZeeZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)edgd��Z*edddg�Z+edgd��Z,Gdd�de-�Z.dd�Z/dd �Z0d/d!d"�Z1d#d$�Z2d%d&�Z3d'd(�Z4d)d*�Z5d+d,�Z6d-d.�Z7dS)0�N)�
namedtuple)�log)�util�������i��� �<�IHHII�BHiII����RTAAttr)�length�rta_type�data�InterfaceOperstate�ifname�	operstate�
NetlinkHeader)r�type�flags�seq�pidc@seZdZdZdS)�NetlinkCreateSocketErrorz5Raised if netlink socket fails during create or bind.N)�__name__�
__module__�__qualname__�__doc__�r$r$�C/usr/lib/python3/dist-packages/cloudinit/sources/helpers/netlink.pyr9src
Cspzt�tjtjtj�}|�t��tf�|�d�Wntj	y0}z	d|}t
|�|�d}~wwt�d�|S)auCreates 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
    rz*Exception during netlink socket create: %sNzCreated netlink socket)
�socket�
AF_NETLINK�SOCK_RAW�
NETLINK_ROUTE�bind�os�getpid�RTMGRP_LINK�setblocking�errorr�LOG�debug)�netlink_socket�e�msgr$r$r%�create_bound_netlink_socket=s	�
��
r5cCs^|dusJd��t|�tksJd��t�t|dt��\}}}}}t�d|�t|||||�S)aGets 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 headerzGot netlink msg of type %d)	�len�
NLMSGHDR_SIZE�struct�unpack�NLMSGHDR_FMT�MSG_TYPE_OFFSETr0r1r)r�msg_len�msg_typerrrr$r$r%�get_netlink_msg_headerSs
���r?cCs^|dusJd��t�|ggg|�\}}}||vrdSt�d�|�t�}|dur-t�d�|S)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 noneznetlink socket ready for readz,Reading from Netlink socket returned no data)�selectr0r1�recv�MAX_SIZEr/)r2�timeout�read_set�_rr$r$r%�read_netlink_socketls



rGcCs�|dusJd��t|�tksJd��|tksJd��d}}d}ztjd||d�d}tjd||dd�d}WntjyCYdSw||t||�}t|||�S)	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.
    Nr6zoffset is not integerz'rta offset is less than expected lengthr�H)�offsetr)r�int�RTATTR_START_OFFSETr9�unpack_fromr/�RTA_DATA_START_OFFSETr)rrIrr�	attr_datar$r$r%�unpack_rta_attr�s ���rOcCs�|dusJd��t|�tksJd��d}}t}|t|�kr]t||�}|r*|jdkr+n2t|jtt}||j|7}|jtkrFt|j�}n|jt	krWt
�|jd�}|�d�}|t|�ks|rc|duredSt
�d||�t||�S)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.
    Nr6z2length of data is smaller than RTATTR_START_OFFSETrzutf-8�z!rta attrs: ifname %s operstate %d)r7rKrOr�
PAD_ALIGNMENTr�IFLA_OPERSTATE�ordr�IFLA_IFNAMEr�
decode_binary�stripr0r1r)rrrrI�attr�padlen�interface_namer$r$r%�read_rta_oper_state�s2

��
�


�
rZcs6t�d�d���fdd�}t|dtgttg|��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.Ncs|�vrdS|�dS)NTFr$��iname�carrier�prevCarrier��
existing_nicsrr$r%�should_continue_cb�sz5wait_for_nic_attach_event.<locals>.should_continue_cb)r0r1�read_netlink_messages�RTM_NEWLINK�OPER_UP�	OPER_DOWN)r2r`rar$r_r%�wait_for_nic_attach_event�s
	�rfcs2t�d�d��fdd�}t|dtgtg|��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.Ncs|�dS)NFr$r[�rr$r%ra�sz5wait_for_nic_detach_event.<locals>.should_continue_cb)r0r1rb�RTM_DELLINKre)r2rar$rgr%�wait_for_nic_detach_event�s
�ricsf|dusJd���dusJd��t��dksJd���fdd�}t�d�t|�ttgttg|�dS)	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.
    Nr@zinterface name is nonerzinterface name cannot be emptycs(|tko|tk}|rt�d��dSdS)NzMedia switch happened on %s.FT)rerdr0r1)r\r]r^�isVnetSwitchrgr$r%ras
z=wait_for_media_disconnect_connect.<locals>.should_continue_cbz1Wait for media disconnect and reconnect to happen)r7r0r1rbrcrhrdre)r2rrar$rgr%�!wait_for_media_disconnect_connect�s

�rkcCsn|durtd��t�}t}t}	t|t�}|durqt�dt|��||7}t�dt|��d}	t|�}
|	|
kr�||	d�}t|�tkrJt�d�nft	|�}t|�|j
kr[t�d�nU|j
td	td	@}
|	|
}	t�d
|	�|j|vrwq4t
|�}|dur�t�d|�q4|dur�|j|kr�t�d|j|�q4|j|vr�q4|}|j}||j||�s�dS|	|
ks8||	d�}q)
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.
    NzNetlink socket is noneTzread %d bytes from socketzLength of data after concat %drz#Data is smaller than netlink headerz*Partial data. Smaller than netlink messagerz"offset to next netlink message: %dz!Failed to read rta attributes: %sz6Ignored netlink event on interface %s. Waiting for %s.)�RuntimeError�bytesrdrG�SELECT_TIMEOUTr0r1r7r8r?rrQrrZrr)r2�
ifname_filter�	rtm_types�
operstates�should_continue_callbackrr]r^�	recv_datarI�datalen�nl_msg�nlheaderrX�interface_stater$r$r%rbsn


�
���
��'�rb)N)8r+rAr&r9�collectionsr�	cloudinitr�loggingr�	getLoggerr r0r-�
NLMSG_NOOP�NLMSG_ERROR�
NLMSG_DONErcrh�RTM_GETLINK�RTM_SETLINKrC�RTA_DATA_OFFSETr<rnr;�
IFINFOMSG_FMT�calcsizer8�IFINFOMSG_SIZErKrMrQrTrR�OPER_UNKNOWN�OPER_NOTPRESENTre�OPER_LOWERLAYERDOWN�OPER_TESTING�OPER_DORMANTrdrrrrlrr5r?rGrOrZrfrirkrbr$r$r$r%�<module>sf


�
%