HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/lib/python3/dist-packages/cloudinit/sources/helpers/__pycache__/netlink.cpython-38.pyc
U

Ӈg�.�@sJddlZddlZddlZddlZddlZddlmZddlmZe�	e
�ZdZdZ
dZdZdZd	ZdZd
ZdZdZe�e�Ze�e�ZeeZd
Zd
ZdZdZdZdZdZ dZ!d
Z"dZ#dZ$eddddg�Z%edddg�Z&eddddddg�Z'Gdd�de(�Z)d d!�Z*d"d#�Z+d2d$d%�Z,d&d'�Z-d(d)�Z.d*d+�Z/d,d-�Z0d.d/�Z1d0d1�Z2dS)3�N)�
namedtuple)�util�����i���<ZIHHIIZBHiII������RTAAttr�length�rta_type�data�InterfaceOperstate�ifname�	operstate�
NetlinkHeader�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.pyr5src
Cszz4t�tjtjtj�}|�t��tf�|�d�Wn6tj	k
rj}zd|}t
|�|�W5d}~XYnXt�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)
�socketZ
AF_NETLINKZSOCK_RAWZ
NETLINK_ROUTEZbind�os�getpid�RTMGRP_LINKZsetblocking�errorr�LOG�debug)�netlink_socket�e�msgr r r!�create_bound_netlink_socket9s	�
r,cCs^|dk	std��t|�tks$td��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)
�AssertionError�len�
NLMSGHDR_SIZE�structZunpack�NLMSGHDR_FMT�MSG_TYPE_OFFSETr'r(r)rZmsg_lenZmsg_typerrrr r r!�get_netlink_msg_headerOs
��
�r4cCs^|dk	std��t�|ggg|�\}}}||kr4dSt�d�|�t�}|dkrZt�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)r.�selectr'r(Zrecv�MAX_SIZEr&)r)ZtimeoutZread_set�_rr r r!�read_netlink_sockeths



r9cCs�|dk	std��t|t�s"td��|tks2td��d}}d}z0tjd||d�d}tjd||dd�d}Wntjk
r�YdSX||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.
    Nr-zoffset is not integerz'rta offset is less than expected lengthr�H)�offsetr)	r.�
isinstance�int�RTATTR_START_OFFSETr1Zunpack_fromr&�RTA_DATA_START_OFFSETr)rr;rrZ	attr_datar r r!�unpack_rta_attrs��r@cCs�|dk	std��t|�tks$td��d}}t}|t|�kr�t||�}|r�|jdkrVq�t|jtt}||j|7}|jtkr�t|j	�}q0|jt
kr0t�|j	d�}|�
d�}q0|r�|dkr�dSt�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.
    Nr-z2length of data is smaller than RTATTR_START_OFFSETrzutf-8�z!rta attrs: ifname %s operstate %d)r.r/r>r@r�
PAD_ALIGNMENTr�IFLA_OPERSTATE�ordr�IFLA_IFNAMErZ
decode_binary�stripr'r(r)rrrr;�attr�padlenZinterface_namer r r!�read_rta_oper_state�s0

��
�

rIcs6t�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|�krdS|�dS)NTFr ��iname�carrier�prevCarrier��
existing_nicsrr r!�should_continue_cb�sz5wait_for_nic_attach_event.<locals>.should_continue_cb)r'r(�read_netlink_messages�RTM_NEWLINK�OPER_UP�	OPER_DOWN)r)rOrPr rNr!�wait_for_nic_attach_event�s
	�rUcs2t�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 rJ�rr r!rP�sz5wait_for_nic_detach_event.<locals>.should_continue_cb)r'r(rQ�RTM_DELLINKrT)r)rPr rVr!�wait_for_nic_detach_event�s
�rXcsf|dk	std���dk	s td��t��dks4td���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.
    Nr5zinterface name is nonerzinterface name cannot be emptycs(|tko|tk}|r$t�d��dSdS)NzMedia switch happened on %s.FT)rTrSr'r()rKrLrMZisVnetSwitchrVr r!rP�s
z=wait_for_media_disconnect_connect.<locals>.should_continue_cbz1Wait for media disconnect and reconnect to happen)	r.r/r'r(rQrRrWrSrT)r)rrPr rVr!�!wait_for_media_disconnect_connect�s

�rYcCsx|dkrtd��t�}t}t}t|t�}|dkr2qt�dt|��||7}t�dt|��d}	t|�}
|	|
k�rf||	d�}t|�tkr�t�d��qft	|�}t|�|j
kr�t�d��qf|j
tdtd@}
|	|
}	t�d	|	�|j|kr�qft
|�}|dk�rt�d
|�qf|dk	�r:|j|k�r:t�d|j|�qf|j|k�rHqf|}|j}||j||�sfdSqf||	d�}qdS)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 nonezread %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�bytesrSr9�SELECT_TIMEOUTr'r(r/r0r4rrBrrIrr)r)Z
ifname_filterZ	rtm_typesZ
operstatesZshould_continue_callbackrrLrMZ	recv_datar;ZdatalenZnl_msgZnlheaderrHZinterface_stater r r!rQsl



�

����rQ)N)3Zloggingr#r6r"r1�collectionsrZ	cloudinitrZ	getLoggerrr'r%rRrWZRTM_GETLINKZRTM_SETLINKr7r3r\r2Z
IFINFOMSG_FMTZcalcsizer0ZIFINFOMSG_SIZEr>r?rBrErCZOPER_UNKNOWNZOPER_NOTPRESENTrTZOPER_LOWERLAYERDOWNZOPER_TESTINGZOPER_DORMANTrSrrrrZrr,r4r9r@rIrUrXrYrQr r r r!�<module>s^


�
%