HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/utils/__pycache__/ssdp.cpython-310.pyc
o

�N�g�:�@s@dZddlZddlZddlZddlZddlZddlZddlZddl	Zzddl
mZWney9ddl
mZYnwejj��Zeed�sGdZz	ddlZde_Wneynz	ddlZde_WneykdZYnwYnwGdd�de�ZGd	d
�d
e�ZGdd�d�ZGd
d�de�ZGdd�de�ZGdd�de�ZdS)zq
Salt Service Discovery Protocol.
JSON-based service discovery protocol, used by minions to find running Master.
�N)�OrderedDict�dumpsFTc@�eZdZdS)�TimeOutExceptionN��__name__�
__module__�__qualname__�r
r
�C/opt/saltstack/salt/lib/python3.10/site-packages/salt/utils/ssdp.pyr7�rc@r)�TimeStampExceptionNrr
r
r
rr
;rr
c
@s^eZdZdZe�e�ZdZdZdZ	dZ
dZede	de
d	ed
eiiZe
dd��Ze
d
d��ZdS)�SSDPBasez*
    Salt Service Discovery Protocol.
    �	signature�answer�port�	listen_ip�timeoutZ__salt_master_servicei�z0.0.0.0�cCsttot�S)zW
        Return True if the USSDP dependencies are satisfied.
        :return:
        )�bool�asyncio�_jsonr
r
r
r�
_is_availableVszSSDPBase._is_availablecCstt�tjtj�}z,z
|�d�|��d}Wnty&t�t���}YnwW|��|SW|��|S|��w)zB
        Find out localhost outside IP.

        :return:
        )z
1.255.255.255�r)	�socket�AF_INET�
SOCK_DGRAM�connect�getsockname�	Exception�
gethostbyname�gethostname�close)ZsckZip_addrr
r
r�get_self_ip^s
���
�zSSDPBase.get_self_ipN)rrr	�__doc__�logging�	getLogger�log�	SIGNATURE�ANSWER�PORT�	LISTEN_IP�TIMEOUT�DEFAULTS�staticmethodrr#r
r
r
rr?s$
�
rc@s:eZdZdZdd�Zdd�Zdd�Zdd
d�Zdd
�ZdS)�SSDPFactoryz"
    Socket protocol factory.
    c	KsL|j|jfD]}t|||�||j|��qd|_d|_t�t�	��|_
dS)z4
        Initialize

        :param config:
        FN)r(r)�setattr�getr-�disable_hidden�	transportrr r!Zmy_ip��self�config�attrr
r
r�__init__us
zSSDPFactory.__init__cOs|S)zo
        Return instance on Factory call.
        :param args:
        :param kwargs:
        :return:
        r
)r5�args�kwargsr
r
r�__call__�szSSDPFactory.__call__cCs
||_dS)zL
        On connection.

        :param transport:
        :return:
        N)r3)r5r3r
r
r�connection_made�s
zSSDPFactory.connection_madeN�
c
Cs�d}dd�}|�}||krLz|jj||d�|j�d�WdStyE}z|j�d|�t�|�|d7}||�7}WYd}~nd}~ww||ks
dSdS)	a�
        On multi-master environments, running on the same machine,
        transport sending to the destination can be allowed only at once.
        Since every machine will immediately respond, high chance to
        get sending fired at the same time, which will result to a PermissionError
        at socket level. We are attempting to send it in a different time.

        :param data:
        :param addr:
        :return:
        rcSsdt�dd�S)Ng�?r=�)�random�randintr
r
r
r�slp_time�sz%SSDPFactory._sendto.<locals>.slp_time)�addrzSent successfullyNzPermission error: %sr)r3�sendtor'�debug�AttributeError�time�sleep)r5�datarBZattemptsZtriesrAZslp�exr
r
r�_sendto�s 
���zSSDPFactory._sendtocCs\tjj�|�}|�|j�r�z
t|t|j�d��}Wn$tt	fy>|j
jdg|�R�|jr;|�
d�|jd�|�YdSwtj�|�tj��tjdd�krj|jr^|�
d�|jd�|�|j
jdg|�R�dS|j
jd	|g|�R�|�
tjj�d
�|jtjjj|jtd���|�dS|jr�|�
tjj�d�|jd�|��|j
jd
g|�R�dS)zb
        On datagram receive.

        :param data:
        :param addr:
        :return:
        Nz0Received invalid timestamp in package from %s:%sz{}:E:{}zInvalid timestamp�)�secondszTimestamp is too oldz$Received outdated package from %s:%szReceived "%s" from %s:%sz{}:@:{}�Z_json_modulezInvalid packet signaturez!Received bad signature from %s:%s)�salt�utils�stringutils�
to_unicode�
startswithr�float�len�	TypeError�
ValueErrorr'rDr2rJ�format�datetime�
fromtimestamp�now�	timedelta�to_bytes�jsonrrr)r5rHrB�message�	timestampr
r
r�datagram_received�sV����

�����
��zSSDPFactory.datagram_received)Nr=)	rrr	r$r8r;r<rJr`r
r
r
rr/ps	
	r/c@sDeZdZdZedd��Zdd�Ze					ddd	��Zd
d�ZdS)
�SSDPDiscoveryServerz'
    Discovery service publisher.

    cC�t��S)zE
        Return availability of the Server.
        :return:
        �rrr
r
r
r�is_available��z SSDPDiscoveryServer.is_availablecKsBt�|�|_|j|jvri|j|j<|j|j�d|��i�dS)z5
        Initialize.

        :param config:
        ZmasterN)�copy�deepcopy�_configr)�updater#)r5r6r
r
rr8�szSSDPDiscoveryServer.__init__Nrc#sR��s�s|std��||fdff}njt�}d�fd�ffD]L\}	}
|
durjt|
t�r1t|
�dks5Jd��tj�|j|
|t	j
||d���V}|sLtd	��|D]\}}
}}
}||f}||vrcddg||<||||	<qNq��fd
d�|��D�}|s}td��g}|D]s\\}}\}}d}}z7t	j	|t	j
|d
�}t	j
t	jfD]
}|�t	j|d�q�|�d��r�|�|��r�tj�|�||��V|}Wn.ty�}z|dur�|��|�|�WYd}~q�d}~wty�|dur�|���wn|d�|�}tjj|d�}|�||||�}z	tj�|�VWn
t�y!|���wtj�||��)z�
        Create datagram connection.

        Based on code from Python 3.5 version, this method is used
        only in Python 2.7+ versions, since Trollius library did not
        ported UDP packets broadcast.
        zunexpected address family)NNrrN�z2-tuple is expected)�family�type�proto�flagsz!getaddrinfo() returned empty listcs8g|]\}}�r|ddus�r|ddus||f�qS)rNrr
)�.0�keyZ	addr_pair��
local_addr�remote_addrr
r�
<listcomp>*s���z@SSDPDiscoveryServer.create_datagram_endpoint.<locals>.<listcomp>zcan not get address information)rkrlrmF)�loop)rVr�
isinstance�tuplerTrZ
coroutinesZFrom�getaddrinforr�OSError�items�SO_REUSEADDR�SO_BROADCAST�
setsockopt�
SOL_SOCKET�setblocking�bindZsock_connectr"�appendrZfuturesZFutureZ_make_datagram_transportZReturn)ruZprotocol_factoryrrrsrkrmrnZaddr_pairs_infoZ
addr_infos�idxrB�infosZfam�_Zpro�addressrp�
exceptionsZ
local_addressZremote_address�sockZr_addr�opt�exc�protocol�waiterr3r
rqr�create_datagram_endpoint�s������	��


�����z,SSDPDiscoveryServer.create_datagram_endpointc	Cs�|j�|j|j|j�}|j�|j|j|j�}|j�d||�t��}t	|j|j
d�}tjr@|�t
j||||fd��\}}n|�|j|||fdd��\}}z|��W|j�d�|��|��dS|j�d�|��|��w)z.
        Run server.
        :return:
        z2Starting service discovery listener on udp://%s:%s)r)rrT)rrZallow_broadcastz$Stopping service discovery listener.N)rhr1r+r-r*r'�inforZget_event_loopr/r)�portedZrun_until_completerar�Zrun_foreverr")r5rrrur�r3r
r
r�runZs4�
�
�
��
�
zSSDPDiscoveryServer.run)NNrrr)	rrr	r$r.rdr8r�r�r
r
r
rra�s
�[rac@s<eZdZdZedd��Zdd�Zdd�Zdd	�Zd
d�Z	dS)
�SSDPDiscoveryClientz:
    Class to discover Salt Master via UDP broadcast.
    cCrb)zD
        Return availability of the Client
        :return:
        rcr
r
r
rrdrez SSDPDiscoveryClient.is_availablec	Ks�||_t�tjtj�|_|j�tjtjd�|j�|j�	|j
|j|j
��|j|j
|j
fD]}t|||j�	||j|��q.dS)z
        Initialize
        rN)rhrrr�_socketr}r~r|�
settimeoutr1r,r-r(r*r0r4r
r
rr8�s��zSSDPDiscoveryClient.__init__cCs4tjj�|j�t�����}|j�|d|jf�|S)zL
        Query the broadcast for defined services.
        :return:
        z<broadcast>)	rNrOrPr\rrFr�rCr)r5�queryr
r
r�_query�szSSDPDiscoveryClient._queryc
Csx	z|j�d�\}}|r||vrg||<||�|�nWdSWnty:}z|j�d|�WYd}~dSd}~wwq)zH
        Collect masters map from the network.
        :return:
        Tiz'Discovery master collection failure: %sN)r��recvfromr�rr'�error)r5�responserHrB�errr
r
r�_collect_masters_map�s����z(SSDPDiscoveryClient._collect_masters_mapcCsi}i}|j�d�|��|�|�|sd}|j�|�|S|��D]e\}}|D]^}tjj�|�}|�	|j
�r�|�|j
�d}|j�d|d|d|�d|vrl|�d�d}|j�
d||�d	|vrk|j�
d
|�q)||vrtg||<||�tjjj|�d�dtd��q)q#|S)
zY
        Gather the information of currently declared servers.

        :return:
        zLooking for a server discoveryzNo master has been discovered.���z/Service announcement at '%s:%s'. Response: '%s'rrz:E:z3Error response from the service publisher at %s: %sr_z(Publisher sent shifted timestamp from %sz:@:rM)r'r�r�r�rzrNrOrPrQrRr�splitrDr�r�r]�loadsr)r5r�Zmasters�msgrBZdescriptionsrHr�r
r
r�discover�sX
"����������zSSDPDiscoveryClient.discoverN)
rrr	r$r.rdr8r�r�r�r
r
r
rr�zs

r�)r$rfrXr%r?rrFZsalt.utils.jsonrNZsalt.utils.stringutilsZsalt.utils.odictr�ImportError�collectionsrOr]Zimport_jsonr�hasattrrr�Ztrolliusrrr
rr/rar�r
r
r
r�<module>sH�


���
1u