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__/network.cpython-310.pyc
o

�N�gE%�@sPdZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlm
Z
mZddlmZmZddlZddlZddlZddlZddlZddlmZddlmZmZddlmZddlm Z zddl!Zd	Z"Wne#yd
Z"Ynwe�$e%�Z&zddl'Z'ddl(Z'e'j)�*e'j+�,d��Z-e-j.Z/Wn
e#e0e1e2fy�YnwGdd
�d
�Z3e3�Z4e4j5Z6dd�Z7dd�Z8dd�Z9dd�Z:dd�Z;e	j<dfdd�Z=dd�Z>dd�Z?dd�Z@d d!�ZAd"d#�ZBd$d%�ZCd&d'�ZDd(d)�ZEd*d+�ZFd,d-�ZGed!�d�d.d/��ZHd0d1�ZId2d3�ZJd4d5�ZKd6d7�ZLd8d9�ZMd:d;�ZNd<d=�ZOd>d?�ZPd�d@dA�ZQd�dBdC�ZRed#�d�dDdE��ZSed%�d�dFdG��ZTd�dHdI�ZUedJ�d�dKdJ��ZVedL�d�dMdL��ZWedN�d�dOdN��ZXd�dPdQ�ZYedR�d�dSdR��ZZdTdU�Z[edV�d�dWdV��Z\dXdY�Z]edZ�d�d[dZ��Z^d�d]d^�Z_d_d`�Z`dadb�Zadcdd�Zbdedf�Zcdgdh�Zddidj�Zedkdl�Zfdmdn�Zgdodp�Zhdqdr�Zidsdt�Zjdudv�Zkdwdx�Zldydz�Zmd{d|�Znd}d~�Zod�dd��Zpd�d��Zqd�d��Zrd�d��Zsd�d��Ztd�d��Zud�d��Zvd�d�d��Zwd�d�d��Zxd�d��Zyd�d�d��Zzd�d�d��Z{d�d�d��Z|	�d�d�d��Z}d�d�d��Z~d�d�d��Z		
	
		�d�d�d��Z�	d�d�d��Z�	d�d�d��Z�d�d�d��Z�d�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�dÄZ�edăd�d�dĄ�Z�edǃd�dDŽ�Z�d�dʄZ�ed˃d�d�d˄�Z�d�d΄Z�d�dЄZ�edуd�dф�Z�edӃd�dӄ�Z�d�d�dքZ�dS)�z:
Define some generic socket functions for network modules
�N)�Mapping�Sequence)�
ascii_letters�digits)�	ipaddress)�SaltClientError�SaltSystemExit)�jinja_filter)�VersionTF�cc@s*eZdZdZd	dd�Zdd�Zdd�ZdS)
�
Interfaces��
interfacesNcCs|duri}||_dS�Nr
)�selfr�r�F/opt/saltstack/salt/lib/python3.10/site-packages/salt/utils/network.py�__init__5s
zInterfaces.__init__cOs|jst�|_|jSrr
)r�args�kwargsrrr�__call__:szInterfaces.__call__cCs
i|_dSrr
�rrrr�clear?s
zInterfaces.clearr)�__name__�
__module__�__qualname__�	__slots__rrrrrrrr2s

rcs,ttd�d��fdd�|dd�D��S)zS
    Sanitize host string.
    https://tools.ietf.org/html/rfc1123#section-2.1
    z.-_�csg|]}|�vr|�qSrr)�.0r�ZRFC952_charactersrr�
<listcomp>Msz!sanitize_host.<locals>.<listcomp>r�)rr�join)�hostrrr�
sanitize_hostGs r$cCsJdt|�kr
dksdSdSt�tjtj�}|�t|�t|�f�}|S)z!
    Return status of a port
    �i��F)�int�socket�AF_INET�SOCK_STREAM�
connect_exr$)r#�port�sock�outrrr�
isportopenPs�r.cCs�g}z6t�|dtjtj�D]!\}}}}}|tjkr|\}}n|tjkr)|\}}}	}
|�|�q
|s6d}W|SW|StyDd}Y|Sw)zR
    Returns a list of IP addresses of a given hostname or None if not found.
    rN)r'�getaddrinfo�	AF_UNSPECr)r(�AF_INET6�append�	Exception)r#�ips�family�socktype�proto�	canonnameZsockaddr�ipr+Z	flow_info�scope_idrrr�host_to_ips^s&�


���r;c	Cs�Gdd�dt�}t��}|��tjj�t�tjj�	|�����t
����|�}|sdz$t�|�
�p1ddtjtjtjtj�D]}t|�dkrK|�|d�q<Wntjyct�d|�
�p]dtj�Ynwdd	d
djt�d�d
�fD]T}zItjj�|��8}|D]-}tjj�|�}|���d�d����}|r�|ddd�dvs�t|�dkr�|�|�q~Wd�n1s�wYWqqty�Yqqw|�dd�t�D��S)zM
    Get list of possible host names and convention names.

    :return:
    cs@eZdZdZgd�Z�fdd�Zdd�Zdd�Zd	d
�Z�Z	S)z)_generate_minion_id.<locals>.DistinctListz�
        List, which allows one to append only distinct objects.
        Needs to work on Python 2.6, because of collections.OrderedDict only since 2.7 version.
        Override 'filter()' for custom filtering.
        )	zlocalhost.*zip6-.*z127[.]\dz
0\.0\.0\.0z::1.*zipv6-.*zfe00::.*zfe02::.*z1.0.0.*.ip6.arpacs&|r||vr|�|�st��|�|Sr)�filter�superr2)rZp_object��	__class__rrr2�sz0_generate_minion_id.<locals>.DistinctList.appendcSs|D]}|�|�q|Sr)r2)r�iterable�objrrr�extend�sz0_generate_minion_id.<locals>.DistinctList.extendcSs"|jD]}t�||�rdSqdS)z,Returns True if element needs to be filteredTN)�localhost_matchers�re�match)r�elementZrgxrrrr<�s

��z0_generate_minion_id.<locals>.DistinctList.filtercSs|r|dpdS)Nrrrrrr�first��z/_generate_minion_id.<locals>.DistinctList.first)
rrr�__doc__rCr2rBr<rG�
__classcell__rrr>r�DistinctList~srK�	localhostN�z-Cannot resolve address %s info via socket: %szlocalhost (N/A)z
/etc/hostnamez
/etc/nodenamez
/etc/hostsz {win}\system32\drivers\etc\hostsZWINDIR)�win�#r�)z127.z::1r%cSsg|]
}t�|�js|�qSr)r�
ip_address�is_loopback�r�addrrrrr ��z'_generate_minion_id.<locals>.<listcomp>) �listr'�gethostnamer2�salt�utils�stringutils�
to_unicode�getfqdn�to_bytes�platform�noder/rGr(�SOCK_RAW�
IPPROTO_IP�AI_CANONNAME�len�gaierror�log�warning�format�os�getenv�files�fopen�strip�splitrB�OSError�ip_addrs)rK�hostname�hostsZa_nfoZf_nameZf_hdl�lineZhstrrr�_generate_minion_idssn&��
�

���

��� 
������rscCs8ztjj�t����}Wntyd}Ynw|pdS)zY
    Return only first element of the hostname from all possible list.

    :return:
    NrL)rXrYrZr[rsrG�	TypeError)�retrrr�generate_minion_id�s�rvcCs8t�|�j}|dkrtj}n|dkrtj}t�|||�S)zE
    Return a socket object for the addr
    IP-version agnostic
    rP�)rrQ�versionr'r(r1)rT�typer7rxr5rrr�
get_socket�srzcCs|t��g}z&t�t��dtjtjtjtj�}|D]}t|�dkr)|dr)|dg}qWn
tj	y5Ynw|r<|dp=dS)z.
    Returns the fully qualified hostname
    rrPrMN)
r'r\r/rWr0r)�SOL_TCPrbrcrd)�l�addrinfo�inforrr�get_fqhostname�s&
�
���rc
CsPzt�|�\}}}W|Sty'}zt�d||�d}WYd}~|Sd}~ww)z,
    Returns the hostname of a given IP
    z,salt.utils.network.ip_to_host(%r) failed: %sN)r'�
gethostbyaddrr3re�debug)r9rpZ	aliaslistZ
ipaddrlist�excrrr�
ip_to_hosts���r�cCsDztt�|dddd��tksJ�d}W|Stjy!d}Y|Sw)z
    Returns a bool telling if the entity name is a reachable host (IPv4/IPv6/FQDN/etc).
    :param hostname:
    :return:
    rTF)ryr'r/rVrd)Zentity_namerurrr�is_reachable_hosts��r�cC�t|�pt|�S)�R
    Returns a bool telling if the passed IP is a valid IPv4 or IPv6 address.
    )�is_ipv4�is_ipv6��ip_addrrrr�is_ip,�r�cC�(z	t�|�jdkWStyYdSw)zS
    Returns a bool telling if the value passed to it was a valid IPv4 address
    rPF�rrQrx�
ValueErrorr�rrrr�3�
�r�cCr�)zS
    Returns a bool telling if the value passed to it was a valid IPv6 address
    rwFr�r�rrrr�=r�r�cCs$zt�|�jWStyYdSw)zP
    Returns a bool telling if the value passed to it is a loopback address
    F)rrQrRr�r�rrrrRGs
�rRcCr�)zO
    Returns a bool telling if the passed string is an IPv4 or IPv6 subnet
    )�is_ipv4_subnet�is_ipv6_subnet��cidrrrr�	is_subnetQr�r�cC�.zd|vott�|��WStyYdSw)zG
    Returns a bool telling if the passed string is an IPv4 subnet
    �/F)�boolr�IPv4Networkr3r�rrrr�X�
�r�cCr�)zG
    Returns a bool telling if the passed string is an IPv6 subnet
    r�F)r�r�IPv6Networkr3r�rrrr�br�r�cCst||d�pt||d�S)r���options)�is_ipv4_filter�is_ipv6_filter)r�r�rrr�is_ip_filterls�r�cCs|jSr��
is_private��ip_objrxrrr�_ip_options_globalvsr�cC�|jSr)�is_multicastr�rrr�_ip_options_multicastz�r�cCr�r)rRr�rrr�_ip_options_loopback~r�r�cCr�r)�
is_link_localr�rrr�_ip_options_link_local�r�r�cCr�rr�r�rrr�_ip_options_private�r�r�cCr�r)�is_reservedr�rrr�_ip_options_reserved�r�r�cCs|dkr|jSdS)NrwF)�
is_site_localr�rrr�_ip_options_site_local�sr�cCr�r)�is_unspecifiedr�rrr�_ip_options_unspecified�r�r�cCsztttttttttttttttd�}|st|�Sdd�|�	d�D�}|�
�D]\}}||vr8|||�}|s8dSq&t|�S)N)�globalz
link-localZ	linklocalZllZ
link_localZloopback�loZ	multicastZprivateZpublicZreservedz
site-local�slZ
site_local�unspecifiedcSsg|]}|���qSr)rl)r�optionrrrr ��z_ip_options.<locals>.<listcomp>�,)r�r�r�r�r�r�r�r��strrm�items)r�rxr�Zoptions_fun_mapZoptions_listr�ZfunZfun_resrrr�_ip_options�s4�
�r�cCsx|sd}|dvr
dSzt�|�}Wnty-zt�|�}Wnty*YYdSwYnw|j|ks5dSt|||d�S)NrP�rPrwr�)rrQr��ip_interfacerxr�)r�rxr�r�rrr�_is_ipv�s"���
r�cC�t|d|d�}t|t�S)a+
    Returns a bool telling if the value passed to it was a valid IPv4 address.

    ip
        The IP address.

    net: False
        Consider IP addresses followed by netmask.

    options
        CSV of options regarding the nature of the IP address. E.g.: loopback, multicast, private etc.
    rPr��r��
isinstancer�)r�r�Z_is_ipv4rrrr���
r�cCr�)a+
    Returns a bool telling if the value passed to it was a valid IPv6 address.

    ip
        The IP address.

    net: False
        Consider IP addresses followed by netmask.

    options
        CSV of options regarding the nature of the IP address. E.g.: loopback, multicast, private etc.
    rwr�r�)r�r�Z_is_ipv6rrrr��r�r�csR�dvrdSt|ttf�rt|��d�St|tttjf�r'��fdd�|D�SdS)Nr�r�cs,g|]}t|��d�durt|��d��qS)r�N)r�rS�r�rxrrr s
�z_ipv_filter.<locals>.<listcomp>)r�r��bytesr�rV�tuple�types�
GeneratorType)�valuerxr�rr�r�_ipv_filter�s��r��ipv4cC�t|d|d�S)z6
    Filters a list and returns IPv4 values only.
    rPr��r��r�r�rrrr�
��ipv6cCr�)z6
    Filters a list and returns IPv6 values only.
    rwr�r�r�rrrr�r��ipaddrcCs8t||d�}t||d�}|dus|dur|p|S||S)z4
    Filters and returns only valid IP objects.
    r�N)r�r�)r�r�Zipv4_objZipv6_objrrrr�s
cCs^d}|r|dkrt||�}n|dkrt||�}nt||�}|s!dSt|tttjf�s-|g}|S)NrPrw)r�r�r�r�rVr�r�r��r�r�rxZipaddr_filter_outrrr�_filter_ipaddr-s
�
r��ip_hostcCsHt|||d�}|sdSt|tttjf�stt�|d��Sdd�|D�S)zB
    Returns the interfaces IP address, e.g.: 192.168.0.1/28.
    r�NrcSsg|]	}tt�|���qSr)r�rr��rZip_arrrr Gszip_host.<locals>.<listcomp>)	r�r�rVr�r�r�r�rr�r�rrrr�=scCsdd�tj|dd���D�S)NcS�g|]}t|��qSr�r�)rr#rrrr Ks�z"_network_hosts.<locals>.<listcomp>F��strict)r�
ip_networkrq�Z
ip_addr_entryrrr�_network_hostsJs�r��
network_hostscC�Bt|||d�}|sdSt|tttjf�st|d�Sdd�|D�S)z�
    Return the list of hosts within a network.

    .. note::

        When running this command with a large IPv6 network, the command will
        take a long time to gather all of the hosts.
    r�NrcSr�r)r�r�rrrr _r�z!network_hosts.<locals>.<listcomp>)r�r�rVr�r�r�r�r�rrrr�Ps
cCstj|dd�jS)NFr�)rr��
num_addressesr�rrr�
_network_sizebrHr��network_sizecCr�)z$
    Get the size of a network.
    r�NrcSr�r)r�r�rrrr pr�z network_size.<locals>.<listcomp>)r�r�rVr�r�r�r�r�rrrr�fs�	prefixlencCsDt|�}|�d�rd}n
|�d�rd}nd}|dkrt|�Sd|S)z7
    Returns the "natural" mask of an IPv4 address
    Z11Z24�1Z16�8�netmaskr�)�
_ipv4_to_bits�
startswith�cidr_to_ipv4_netmask)r��fmt�bits�maskrrr�natural_ipv4_netmaskss

r�c	Cs"d�t�t�|�d�d�dd��S)z�
    Returns an IP network address padded with zeros.

    Ex: '192.168.3' -> '192.168.3.0'
        '10.209' -> '10.209.0.0'
    �.Z0000rrP)r"�	itertools�islice�chainrmr�rrr�rpad_ipv4_network�s"r�cCs�zt|�}d|krdksWdSWdSWn
ty YdSwd}td�D]#}|r/|d7}|dkr<|d7}|d8}q'|dd	d|d
�7}d}q'|S)z!
    Returns an IPv4 netmask
    r%� rrPr��Z255���dr)r&r��range)Z	cidr_bitsr��idxrrrr��s(���
r�cCstt�|��S)z�
    Returns an IPv4 netmask from the integer representation of that mask.

    Ex. 0xffffff00 -> '255.255.255.0'
        0xffff6400 -> '255.255.100.0'
    )r�rrQ)Zset_bitsrrr�#_number_of_set_bits_to_ipv4_netmask�sr�cCsT||d?d@8}|d?d@|d@}|d?|d@}||d?7}||d?7}|d	@S)
z@
    Returns the number of bits that are set in a 32bit int
    r%iUUUUr�i3333rPir���?r)�xrrr�_number_of_set_bits�sr�csTt�}�fdd�}t�d��|�}|D�]}d}t�}|��D]�}d|vr&qt�d|�}|rL|��\}}	}
d|
�d�vrAd	|d
<nd|d
<|	rK|	|d<q|��}t|�d
k�rt|dd
��\�}|dd�d}
�dv�r|||�\}}}}t�}d|vrĈdkr�d|vr�t	�|d<||d<||d<||d<|
|d<|d�
|�q�dkr�d|vr�t	�|d<||d<||d<||d<|d�
|�q�dkr�d|vr�t	�|d<�|d<||d<||d<||d<|
|d<|d�
|�q�dk�rd|vr�t	�|d<�|d<||d<||d<||d<|d�
|�q��d��r||d<q|�r'|||<~~q|S)z�
    Uses ip to return a dictionary of interfaces with various information about
    each (up/down state, ip address, netmask, and hwaddr)
    cs�d}d}d|vr|�d�\}}n|}d}�dkr,tt|��}d|vr+||�d�d}n�dkr?|}d|vr?||�d�d}||||fS)	zc
        Return a tuple of ip, netmask, broadcast
        based on the current set of cols
        Nr�r��inet�brdr%�inet6�scope)rmr�r&�index)r��colsrrr9r�r��Ztype_rr�
parse_network�s �z%_interfaces_ip.<locals>.parse_networkz
?
\dN� z-^\d*:\s+([\w.\-]+)(?:@)?([\w.\-]+)?:\s+<(.+)>�UPr�T�upF�parentr�r���)r�r�	secondaryr��addressr��	broadcastZlabelrr�rry�link�hwaddr)�dictrD�compilerm�
splitlinesrE�groupsrcr�rVr2r�)r-rurr�group�iface�datarrrEr
Zattrsrr�Ziflabelr�r�rr�addr_objrrr�_interfaces_ip�s�




�


���rcs~t��t�d�}t�d�}tjj��r#t�d�}t�d�}t�d�}nt�d�}t�d�}t�d�}t�d	�}t�d
�}t�d�}t�d��|�}	|	D�]p}
t�}d
�d}|
��D�]}
|�	|
�}|�	|
�}|�	|
�}|�	|
�}|�
|
�}|r||�d��|r�|�d�|d<tjj��r�g}|d�d�D]}|�t
|�dkr�d|��n|��q�d�|�|d<|r�d|vr�t�|d<t�}|�d�|d<|�	|
�}|r�|�d�r�tt|�d�d��}n|�d�}||d<|�	|
�}|r�|�d�|d<|d�|�|r�d}|�rjd|v�r
t�|d<t�}|�d��p|�d�|d<|�	|
�}|�rN|�d��p,|�d�|d<tjj���sN|�d��p@|�d�}|du�rJ|��n||d<tjj���rc|dd k�rj|dd!k�rj|d�|�qY||d"<��v�r�tt|���t��������<d|v�r���d���fd#d$�|dD��d|v�r���d���fd%d$�|dD��n|��<~qK�S)&��
    Uses ifconfig to return a dictionary of interfaces with various information
    about each (up/down state, ip address, netmask, and hwaddr)
    �
^([^\s:]+)z3.*?(?:HWaddr|ether|address:|lladdr) ([0-9a-fA-F:]+)z2.*?(?:inet\s+)([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)(.*)z.*?(?:inet6 )([0-9a-fA-F:]+)z".*?(?:inet6 [0-9a-fA-F:]+/(\d+)).*z$.*?(?:inet addr:|inet [^\d]*)(.*?)\sz/.*?(?:inet6 addr: (.*?)/|inet6 )([0-9a-fA-F:]+)zf.*?(?:inet6 addr: [0-9a-fA-F:]+/(\d+)|prefixlen (\d+))(?: Scope:([a-zA-Z]+)| scopeid (0x[0-9a-fA-F]))?z:.*?(?:Mask:|netmask )(?:((?:0x)?[0-9a-fA-F]{8})|([\d\.]+))rz!.*?(?:Bcast:|broadcast )([\d\.]+)�	
?
(?=\S)rFr%r�:r��0r�r
r�r�rTrr�rMrPNrz::rr	c3�$�|]
}|��dvr|VqdS�r�Nr�rr��rrurr�	<genexpr>����z'_interfaces_ifconfig.<locals>.<genexpr>c3r)rNrr!r"rrr#�r$)rrDrrXrYr^�is_sunosrmrrE�searchrr2rcr"rVr�r&�lowerr�rB)r-�piface�pmac�pip�pip6Zpmask6Zpmask�pupdown�pbcastrrr�updownrr�miface�mmac�mip�mip6�mupdownZ
expand_mac�chunkr�mmask�mbcast�mmask6Z	ipv6scoperr"r�_interfaces_ifconfig's�





�









$


�




�
��
$
�
��r8cCs�t�}tjj�d�}|rdntjj�d�}|rOtj|ddgdtjtjd��	�d}tj|d	dgdtjtjd��	�d}t
d
�tjj�
|�tjj�
|���}|S|rjtj|dgtjtjd��	�d}ttjj�
|��}|S)
z<
    Obtain interface information for *NIX/BSD variants
    r9N�ifconfigrZshowT)�	close_fds�stdout�stderrrrTz{}
{}�-a�r;r<)rrXrY�path�which�
subprocess�Popen�PIPE�STDOUT�communicaterrgrZ�to_strr8)�ifacesZip_path�
ifconfig_pathZcmd1Zcmd2�cmdrrr�linux_interfaces�sH���������rJcCs�t�}t�d�}t�d�}t�d�}t�d�}t�d�}t�d�}t�d��|�}|D]�}	t�}
d}d	}|	��D]�}
|�|
�}|�|
�}|�|
�}|�|
�}|�|
�}|rZ|�d
�}|rc|�d
�|
d<|r�d|
vrnt�|
d<t�}|�d
�|d
<|�d�}|�d�r�t	|�d��|d<|�|
�}|r�|�d
�|d<|
d�
|�|r�d}|r�d|
vr�t�|
d<t�}|�d
�|d
<|�d�}|�d�|d<|�d�|d<|
d�
|�q8||
d<|
||<~
q+|S)rrz.*?address: ([0-9a-f:]+)z.*?inet [^\d]*(.*?)/([\d]*)\sz..*?inet6 ([0-9a-f:]+)%([a-zA-Z0-9]*)/([\d]*)\sr�.*?broadcast ([\d\.]+)rrFr%rr�r
r�r�rTrrMrr�r	)rrDrrmrrEr&rrVr�r2)r-rur(r)r*r+r,r-rrrrr.rrr/r0r1r2r3rr5r6r7rrr�_netbsd_interfaces_ifconfig�sd

















�rLcCs�t�}t�d�}t�d�}t�d�}t�d�}t�d�}t�d�}t�d��|�}|D]�}	t�}
d}d	}d	}
|	��D]�}|�|�}|�|�}|�|�}|�|�}|�|�}|r\|�d
�}|re|�d
�|
d<|r�d|
vrmd
}
d|
vrvt�|
d<|�d�r�t	|�d��|
d<t�}|�d�|d<|�d�}|�d�r�t
|�d��|d<|�|�}|r�|�d
�|d<|
d�|�|r�d
}|r�d|
vr�t�|
d<t�}|�d
�|d<|�d�}|�d�|d<|�d�|d<|
d�|�q:||
d<|
||<~
q+|S)rrzcurr media .*? ([0-9a-f:]+)z�.*?inet\s*(primary)*\s+mtu (\d+)\s+local=[^\d]*(.*?)\s{0,40}dest=[^\d]*(.*?)\/([\d]*)\s{0,40}bcast=((?:[0-9]{1,3}\.){3}[0-9]{1,3})zF.*?inet6 mtu [^\d]+\s{0,40}local=([0-9a-f:]+)%([a-zA-Z0-9]*)/([\d]*)\srrKrrFr%r�primaryTr�r�ZmturMr
�r�rrrr�r	)rrDrrmrrEr&rrVr&r�r2)r-rur(r)r*r+r,r-rrrrr.rMrrr/r0r1r2r3rr5r6r7rrr�_junos_interfaces_ifconfig�sv

��














�rOcCs@tjj�d�}tj|dgtjtjd���d}t	tjj
�|��S)z�
    Obtain interface information for Junos; ifconfig
    output diverged from other BSD variants (Netmask is now part of the
    address)
    r9r=r>r)rXrYr?r@rArBrCrDrErOrZrF�rHrIrrr�junos_interfaces8s��rQcCs^tt��d�td�krt�Stjj�d�}tj	|dgtj
tjd���d}t
tjj�|��S)z�
    Obtain interface information for NetBSD >= 8 where the ifconfig
    output diverged from other BSD variants (Netmask is now part of the
    address)
    r�z8.0r9r=r>r)r
rh�unamerJrXrYr?r@rArBrCrDrErLrZrFrPrrr�netbsd_interfacesGs��rScCs4t�}d}d}t�d�}|��D]�}|sq|�d�r+||�|��d�}d|d<i}q|r�|�dd�\}}|�d�}|��}|rI|d	krI||d
<q|dvrgd|vrVt	�|d<|�
d
�ddd�}|d�|�qd|vr�d|vrtt	�|d<|�
d
�dd�}|d�|�q|dkr�||d<q|dkr�|dk|d<qdS)z�
    Returns a dictionary of interfaces with various information about each
    (up/down state, ip address, netmask, and hwaddr)

    NOTE: This is not used by any function and may be able to be removed in the
    future.
    Nzadapter (\S.+):$ZEthernetr%Tr	r�z .zSubnet Maskr�)z
IP AddresszIPv4 Addressr�z(Preferred))r
r�rzIPv6 Addressr)r
r�zPhysical AddressrzMedia StatezMedia disconnected)rrDrrr�r&rrmrlrV�rstripr2)r-rGrrTZadapter_iface_regexrr�key�valrrr�_interfaces_ipconfigZsJ




�

��rWcCs&tdur
ddlmm}tjj��S)z:
    Obtain interface information for Windows systems
    FrN)�WIN_NETWORK_LOADED�salt.utils.win_networkrYZwin_networkrXZget_interface_info)�_rrr�win_interfaces�sr[cCs<tjj��r	t�Stjj��rt�Stjj��rt�St	�S)zS
    Return a dictionary of information about all the interfaces on the minion
    )
rXrYr^�
is_windowsr[Zis_junosrQ�	is_netbsdrSrJrrrrr�srcCs"tj|�d|��dd�}t|j�S)z+
    Return the address of the network
    r�Fr�)rr�r��network_address)r�r��netrrr�
get_net_start�s
r`cCs@d}|�d�D]}|tt|��dd��d�7}qt|�d��S)zu
    Turns an IPv4 netmask into its corresponding prefix length
    (255.255.255.0 -> 24 as in 192.168.1.10/24).
    rr�r�Nr�r)rm�binr&�zfillrcrT)r�Z
binary_str�octetrrr�get_net_size�s rdcCs(|dur|�d|��}ttj|dd��S)z�
    Takes IP (CIDR notation supported) and optionally netmask
    and returns the network in CIDR-notation.
    (The IP can be any IP inside the subnet)
    Nr�Fr�)r�rr�)r�r�rrr�calc_net�srecCsd�dd�|�d�D��S)zb
    Accepts an IPv4 dotted quad and returns a string representing its binary
    counterpart
    rcSs(g|]}tt|��dd��dd��qS)r�Nr�r)rar&�rjustr!rrrr ��(z!_ipv4_to_bits.<locals>.<listcomp>r�)r"rm)r�rrrr��sr�cCsBt�}||��vr
|dfSd�|d�|����}t�|�d|fS)z
    If `iface` is available, return interface info and no error, otherwise
    return no info and log and return an error
    Fz0Interface "{}" not in available interfaces: "{}"z", "N)r�keysrgr"re�error)r�
iface_info�	error_msgrrr�_get_iface_info�s�
rlcCs�tjddgtjdd|gtjtjd�jtjtjd���d}|r5|�d�}t|�d	kr5|d
�d���}|Sd�	|�}t
�|�|S)
z�
    Return the hardware address (a.k.a. MAC address) for a given interface on AIX
    MAC address not available in through interfaces
    ZgrepzHardware AddressZentstatz-dr>)�stdinr;r<rrrMr��'zJInterface "{}" either not available or does not contain a hardware address)rArBrCrDr;rErmrcrlrgreri)rrI�compsZmac_addrrkrrr�_hw_addr_aix�s.��	�
�
rpcCs@tjj��r
t|�St|�\}}|dur|�|i��dd�S|S)z�
    Return the hardware address (a.k.a. MAC address) for a given interface

    .. versionchanged:: 2016.11.4
        Added support for AIX

    Frr)rXrYr^�is_aixrprl�get�rrjrirrr�hw_addr�srtcCs,t|�\}}|dur|�|i��dd�S|S)zH
    Return the details of `iface` or an error if it does not exist
    Fr�r�rlrrrsrrr�	interface
srvcCsDt|�\}}|dur |�|i��dd�}|r|d�dd�SdS|S)zH
    Return `iface` IPv4 addr or an error if `iface` does not exist
    Fr�Nrr
rru)rrjrir�rrr�interface_ips
rwr�c	s2|durt�}n#t|t�r"i}t���D]\}}||vr |||<qn	|t��|i�i}t�}�dkr7d}d}n�dkr@d}d}nt�d��dS|��D]C}|��g�}	|	�	�fd	d
�|�dg�D��|	D](}
||
vrzt
�d�|
d
|
|��}
nt
�d�|
d
|��}
|
j
s�|�|
j�qfqLdd
�t|�D�S)z=
    Returns a list of subnets to which the host belongs
    Nr�r�r�rr��z"Invalid proto %s calling subnets()c�g|]}|�d��kr|�qS�ry�rrrS�r7rrr C�z_subnets.<locals>.<listcomp>rz{}/{}r
cSr�rr�)rr_rrrr Qr�)rr�rVr�rr�setreri�valuesrBrr�rgrR�add�network�sorted)r7�interfaces_rGrUr�ruZsubnetZ	dflt_cidr�ip_info�addrsZintfrr|r�_subnets&sJ
�������r�cCstd|d�S)zB
    Returns a list of IPv4 subnets to which the host belongs
    r�)r��r�r
rrr�subnetsTsr�cCstd�S)zB
    Returns a list of IPv6 subnets to which the host belongs
    rr�rrrr�subnets6[sr�csvzt����Wntyt�d��YdSw|dur&t�}|�t��n
t|t	t
f�s0|f}t�fdd�|D��S)z\
    Returns True if host or (any of) addrs is within specified subnet, otherwise False
    zInvalid CIDR '%s'FNc3s�|]
}t�|��vVqdSr�rrQ)r�itemr�rrr#rs�zin_subnet.<locals>.<genexpr>)rr�r�rerirorB�	ip_addrs6r�rVr��any)r�rTrr�r�	in_subnetbs�r�csHg}|��D]}|�|��g��|��fdd�|�dg�D��q|S)zM
    Accepts a dict of interface data and returns a list of dictionaries
    cryrzr{rSr|rrr }r}z_get_ips.<locals>.<listcomp>r)rrBrr)rGr7rur�rr|r�_get_ipsus�r�csLt|t�r|nt�}�dur|}|Stjj�����fdd�|��D�}|S)zl
    Gather interface data if not passed in, and optionally filter by the
    specified interface name.
    Ncs,i|]\�}t�fdd��D��r�|�qS)c3s�|]	}t��|�VqdSr)�fnmatch)r�pat��krrr#�s�z0_filter_interfaces.<locals>.<dictcomp>.<genexpr>)r�)r�v�rvr�r�
<dictcomp>�s��z&_filter_interfaces.<locals>.<dictcomp>)r�rrrXrYrZsplit_inputr�)rv�interface_datarGrurr�r�_filter_interfaces�s
�
�r�cCsXtt||�|d�}t�}|D]}t�|�d��}|jr|r"|�|�qdd�t|�D�S)z[
    Return the full list of IP adresses matching the criteria

    proto = inet|inet6
    r|r
cSr�rr�rSrrrr �r�z_ip_addrs.<locals>.<listcomp>)	r�r�r~rrQrrrRr�r�)rv�include_loopbackr�r7r�rurTrrr�	_ip_addrs�s

�r�cC�t|||d�S)z�
    Returns a list of IPv4 addresses assigned to the host. 127.0.0.1 is
    ignored, unless 'include_loopback=True' is indicated. If 'interface' is
    provided, then only IP addresses from that interface will be returned.
    r��r��rvr�r�rrrro��rocCr�)z�
    Returns a list of IPv6 addresses assigned to the host. ::1 is ignored,
    unless 'include_loopback=True' is indicated. If 'interface' is provided,
    then only IP addresses from that interface will be returned.
    rr�r�rrrr��r�r�c	Cs�tt||�|d�}t�}|D]8}|�d�}|�|dkrdnd�}	|rF|	rFztj|�d|	��dd�}
Wn	ty;Yqw|
jrA|rF|�|
�q|sRd	d
�t	|�D�Sdd�|D�}|S)
z�
    Returns a list of networks to which the minion belongs. The results can be
    restricted to a single interface using the ``interface`` argument.
    r|r
r�r�r�r�Fr�cSr�rr�rSrrrr �r�z _ip_networks.<locals>.<listcomp>cSs0i|]}t|�t|j�t|j�|j|jd��qS))r
r�r�r�)r�r^r�r�r�r!rrrr��s���z _ip_networks.<locals>.<dictcomp>)
r�r�r~rrrr�r3rRr�r�)rvr��verboser�r7r�rurT�_ipZ_netZip_netZverbose_retrrr�_ip_networks�s(
�

��	r�cC�t||||dd�S)z�
    Returns the IPv4 networks to which the minion belongs. Networks will be
    returned as a list of network/prefixlen. To get more information about a
    each network, use verbose=True and a dictionary with more information will
    be returned.
    r��rvr�r�r�r7�r��rvr�r�r�rrr�ip_networks��	�r�cCr�)z�
    Returns the IPv6 networks to which the minion belongs. Networks will be
    returned as a list of network/prefixlen. To get more information about a
    each network, use verbose=True and a dictionary with more information will
    be returned.
    rr�r�r�rrr�ip_networks6�r�r�c
sVt|�dkrjg}tddd�D]*}|||d���fdd�tddd�D��|r0|�d����q|�d����qzt�d	�|��}|jrKt|j�WS|j	WStj
yi}zt�d
|�|WYd}~Sd}~wwzt
|d�}Wnty||YSw|r�d
�|d?d@|d?d@|d?d@|d@�Sd�|d?d@|d?d@|d?d@|d@�S)z�
    Convert a hex string to an ip, if a failure occurs the original hex is
    returned. If 'invert=True' assume that ip from /proc/net/<proto>
    r�rr�csg|]
}�||d��qS)r�rr!�Zip_partrrr rUzhex2ip.<locals>.<listcomp>r�z{0[3]}{0[2]}:{0[1]}{0[0]}z{0[0]}{0[1]}:{0[2]}{0[3]}rzhex2ip - ipv6 address error: %sNr�z{3}.{2}.{1}.{0}�r!z{}.{}.{}.{})rcr�r2rgr�IPv6Addressr"�ipv4_mappedr��
compressed�AddressValueErrorrerir&r�)Zhex_ip�invertr��ir
�exZhiprr�r�hex2ips<���$�$�r�cCs�t�dd|���}|dd�d|dd�}tt|dd�d�dB�dd��d�|dd�}|dur>d	�t�d
|��Sztj	|dd�}td
|��d�}||�d|j
��WStybYdSw)zg
    Convert a MAC address to a EUI64 identifier
    or, with prefix provided, a full IPv6 address
    z[.:-]rrrwZfffeNr�r�rz.{4}Fr��0xr�)rD�subr'�hexr&rbr"�findallrr�r�r3)Zmac�prefixZeui64r_Zeuilrrr�	mac2eui64,s4�r�c	Cs�i}dD]T}tj�|�s
qtjj�|d��;}|D]0}tjj�|�}|�	��
d�r)qt|�}tt
|��}||ddkrH||d=|||t|�<qWd�n1sSwYq|S)zT
    Return a dict describing all active tcp connections as quickly as possible
    �z
/proc/net/tcpz/proc/net/tcp6�rbr��stater%N)rhr?�isfilerXrYrjrkrZr[rlr��_parse_tcp_line�next�iterrc)ru�statf�fp_rr�iret�slotrrr�
active_tcpAs&
����
r�cC�t|d�}|S)zN
    Return a set of remote ip addrs attached to the specified local port
    �
local_port��_remotes_on�r+rurrr�local_port_tcpV�
r�cCr�)zQ
    Return a set of ip addrs the current host is connected to on given port
    �remote_portr�r�rrr�remote_port_tcp^r�r�c		Csxt|�}t||�}|dur|St�}d}dD]Z}tj�|�sqd}tjj�	|d��?}|D]4}tjj
�|�}|���
d�r=q,t|�}tt|��}||||kr`||ddkr`|�||d	�q,Wd�n1skwYq|s�tjj��r~t||�Stjj��r�t||�Stjj��r�t||�Stjj��r�t||�Stjj��r�t||�Stjj��r�t||�St||�S|S)
z9
    Return a set of ip addrs active tcp connections
    NFr�T�rr�r�r%�remote_addr) r&�_netlink_tool_remote_onr~rhr?r�rXrYrjrkrZr[rlr�r�r�r�r�r^r%�_sunos_remotes_onZ
is_freebsd�_freebsd_remotes_onr]�_netbsd_remotes_onZ
is_openbsd�_openbsd_remotes_onr\�_windows_remotes_onrq�_aix_remotes_on�_linux_remotes_on)	r+�	which_endruZproc_availabler�r�rrr�r�rrrr�fsL
 ����






r�cCs�i}|����}|d�d�}i||<|d�d�\}}|d�d�\}}t|d�||d<t|d�||d<t|d�||d	<t|d�||d
<t|dd�||d<|S)
zR
    Parse a single line from the contents of /proc/net/tcp or /proc/net/tcp6
    rrr%r�TZ
local_addrr�r�r�r�rMr�)rlrmrTr�r&)rrruror�Zl_addrZl_portZr_addrZr_portrrrr��sr�c
Cs>t�}d}|dkrdnd}zt�dd|d|��g�}Wntjy)t�d��ty2Yd	Swtjj	�
|��d
�}|D]W}d|vrHd}q?d
|vrMq?|��}|d�dd�\}	}
|d�dd�\}}|dkrrt
|�t
|�krrq?|dkrt
|
�t
|�krq?|�d���}|�d�r�|dd	�}|�|�q?|dur�d	}|S)a�
    Returns set of IPv4/IPv6 host addresses of remote established connections
    on local or remote tcp port.

    Parses output of shell 'ss' to get connections

    [root@salt-master ~]# ss -ant
    State      Recv-Q Send-Q               Local Address:Port                 Peer Address:Port
    LISTEN     0      511                              *:80                              *:*
    LISTEN     0      128                              *:22                              *:*
    ESTAB      0      0                      127.0.0.1:56726                  127.0.0.1:4505
    ESTAB      0      0             [::ffff:127.0.0.1]:41323         [::ffff:127.0.0.1]:4505
    Fr��dst�src�ssz-antrz	Failed ssN�
zAddress:PortTZESTABrMr%rPr��[]z::ffff:�)r~rA�check_output�CalledProcessErrorrerirnrXrYrZrFrm�rsplitr&rlr'r�r�)
r+r��remotesZvalidZtcp_endr�linesrr�chunks�
local_hostr��remote_hostr�rrrr��s@
�
r�cCs�t�}z	t�gd��}Wntjyt�d��wtjj�	|��
d�}|D]:}d|vr.q'|�
�}|d�dd�\}}|d�dd�\}	}
|dkrQt|
�|krQq'|d	kr\t|�|kr\q'|�
|	�q'|S)
af
    SunOS specific helper function.
    Returns set of ipv4 host addresses of remote established connections
    on local or remote tcp port.

    Parses output of shell 'netstat' to get connections

    [root@salt-master ~]# netstat -f inet -n
    TCP: IPv4
       Local Address        Remote Address    Swind Send-Q Rwind Recv-Q    State
       -------------------- -------------------- ----- ------ ----- ------ -----------
       10.0.0.101.4505      10.0.0.1.45329       1064800      0 1055864      0 ESTABLISHED
       10.0.0.101.4505      10.0.0.100.50798     1064800      0 1055864      0 ESTABLISHED
    ��netstatz-fr��-n�Failed netstatr��ESTABLISHEDrr�r%r�r��r~rAr�r�rerirXrYrZrFrmr�r&r��r+r�r�rr�rrr�r�r�r�r�rrrr��s(
�r�c
Cs
t|�}t�}ztjj�d|���}t�|�}Wntjy-}zt	�
d|j��d}~wwtjj�
|��d�}|D]H}|��}|sCq:d|dvrJq:t|�dkrQq:|d}	|d	}
|	�d
�\}}|
�d
�\}
}|dkrrt|�|krrq:|dkr}t|�|kr}q:|�|
�q:|S)
a�
    Returns set of ipv4 host addresses of remote established connections
    on local tcp port port.

    Parses output of shell 'sockstat' (FreeBSD)
    to get connections

    $ sudo sockstat -4
    USER    COMMAND     PID     FD  PROTO  LOCAL ADDRESS    FOREIGN ADDRESS
    root    python2.7   1456    29  tcp4   *:4505           *:*
    root    python2.7   1445    17  tcp4   *:4506           *:*
    root    python2.7   1294    14  tcp4   127.0.0.1:11813  127.0.0.1:4505
    root    python2.7   1294    41  tcp4   127.0.0.1:61115  127.0.0.1:4506

    $ sudo sockstat -4 -c -p 4506
    USER    COMMAND     PID     FD  PROTO  LOCAL ADDRESS    FOREIGN ADDRESS
    root    python2.7   1294    41  tcp4   127.0.0.1:61115  127.0.0.1:4506
    zsockstat -4 -c -p �&Failed "sockstat" with returncode = %sNr��COMMANDr%r����rr�local�remote)r&r~rXrYr�shlex_splitrAr�r�reri�
returncoderZrFrmrcr�)r+r�r�rIrr�r�rrr�r�r��lhost�lport�rhost�rportrrrr�s:��r�c
Cst|�}t�}ztjj�d|���}t�|�}Wntjy-}zt	�
d|j��d}~wwtjj�
|��d�}|D]R}|��}|sCq:d|dvrJq:t|�dkrQq:|d�d	�}	|	��}
d	�|	�}|d
�d	�}|��}
d	�|�}|dkr|t|
�|kr|q:|dkr�t|
�|kr�q:|�|�q:|S)
a�
    Returns set of ipv4 host addresses of remote established connections
    on local tcp port port.

    Parses output of shell 'sockstat' (NetBSD)
    to get connections

    $ sudo sockstat -4 -n
    USER    COMMAND     PID     FD  PROTO  LOCAL ADDRESS    FOREIGN ADDRESS
    root    python2.7   1456    29  tcp    *.4505           *.*
    root    python2.7   1445    17  tcp    *.4506           *.*
    root    python2.7   1294    14  tcp    127.0.0.1.11813  127.0.0.1.4505
    root    python2.7   1294    41  tcp    127.0.0.1.61115  127.0.0.1.4506

    $ sudo sockstat -4 -c -n -p 4506
    USER    COMMAND     PID     FD  PROTO  LOCAL ADDRESS    FOREIGN ADDRESS
    root    python2.7   1294    41  tcp    127.0.0.1.61115  127.0.0.1.4506
    zsockstat -4 -c -n -p r�Nr�r�r%r�rNr�rwr�r�)r&r~rXrYrr�rAr�r�rerir�rZrFrmrc�popr"r�)r+r�r�rIrr�r�rrr�r�r�r�r�r�r�rrrr�@s>��

r�c
Cs�t�}z	t�gd��}Wntjy!}zt�d|j��d}~wwtjj	�
|��d�}|D]:}d|vr5q.|��}|d�dd�\}}	|d	�dd�\}
}|d
krXt
|�|krXq.|dkrct
|	�|krcq.|�|
�q.|S)a
    OpenBSD specific helper function.
    Returns set of ipv4 host addresses of remote established connections
    on local or remote tcp port.

    Parses output of shell 'netstat' to get connections

    $ netstat -nf inet
    Active Internet connections
    Proto   Recv-Q Send-Q  Local Address          Foreign Address        (state)
    tcp          0      0  10.0.0.101.4505        10.0.0.1.45329         ESTABLISHED
    tcp          0      0  10.0.0.101.4505        10.0.0.100.50798       ESTABLISHED
    )r�z-nfr�z%Failed "netstat" with returncode = %sNr�r�rMr�r%rPr�r�)r~rAr�r�rerir�rXrYrZrFrmr�r&r�)r+r�r�rr�r�rrr�r�r�r�r�rrrr�}s*��r�cCs�t�}z	t�ddg�}Wntjyt�d��wtjj�	|��
d�}|D]:}d|vr.q'|�
�}|d�dd�\}}|d�dd�\}	}
|d	krQt|
�|krQq'|d
kr\t|�|kr\q'|�
|	�q'|S)a�
    Windows specific helper function.
    Returns set of ipv4 host addresses of remote established connections
    on local or remote tcp port.

    Parses output of shell 'netstat' to get connections

    C:\>netstat -n

    Active Connections

       Proto  Local Address          Foreign Address        State
       TCP    10.2.33.17:3007        130.164.12.233:10123   ESTABLISHED
       TCP    10.2.33.17:3389        130.164.30.5:10378     ESTABLISHED
    r�r�r�r�r�r%rr�r�r�r�r�rrrr��s(
�r�c
CsDt�}t�d�}|dur|Szt�|d|d��ddg�}Wn'tjyD}z|jdkr8t�d�|WYd}~St�	d	|j��d}~wwt
jj�
|��d
�}|D]N}|��}|sZqQd|dvraqQd
|dvrhqQ|d�d�\}	}
|	�dd�\}}|
�dd�\}
}|dkr�t|�|kr�qQ|dkr�t|�|kr�qQ|�|
�d��qQ|S)a�
    Linux specific helper function.
    Returns set of ip host addresses of remote established connections
    on local tcp port port.

    Parses output of shell 'lsof'
    to get connections

    $ sudo lsof -iTCP:4505 -n
    COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
    Python   9971 root   35u  IPv4 0x18a8464a29ca329d      0t0  TCP *:4505 (LISTEN)
    Python   9971 root   37u  IPv4 0x18a8464a29b2b29d      0t0  TCP 127.0.0.1:4505->127.0.0.1:55703 (ESTABLISHED)
    Python  10152 root   22u  IPv4 0x18a8464a29c8cab5      0t0  TCP 127.0.0.1:55703->127.0.0.1:4505 (ESTABLISHED)
    Python  10153 root   22u  IPv4 0x18a8464a29c8cab5      0t0  TCP [fe80::249a]:4505->[fe80::150]:59367 (ESTABLISHED)

    ZlsofNz-iTCP:r�r�z-Pr%z5"lsof" returncode = 1, likely no active TCP sessions.z"Failed "lsof" with returncode = %sr�r�rr�rr�z->rr�r�r�)r~�shutilr@rAr�r�r�rerfrirXrYrZrFrmr�r&r�rl)r+r�r�Zlsof_binaryrr�r�rrr�r�r�rZr�r�r�rrrr��sL

��

��	r�cCs�t�}z	t�gd��}Wntjyt�d��wtjj�	|��
d�}|D]:}d|vr.q'|�
�}|d�dd�\}}|d�dd�\}	}
|d	krQt|
�|krQq'|d
kr\t|�|kr\q'|�
|	�q'|S)ak
    AIX specific helper function.
    Returns set of ipv4 host addresses of remote established connections
    on local or remote tcp port.

    Parses output of shell 'netstat' to get connections

    root@la68pp002_pub:/opt/salt/lib/python2.7/site-packages/salt/modules# netstat -f inet -n
    Active Internet connections
    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
    tcp4       0      0  172.29.149.95.50093    209.41.78.13.4505      ESTABLISHED
    tcp4       0      0  127.0.0.1.9514         *.*                    LISTEN
    tcp4       0      0  127.0.0.1.9515         *.*                    LISTEN
    tcp4       0      0  127.0.0.1.199          127.0.0.1.32779        ESTABLISHED
    tcp4       0      0  127.0.0.1.32779        127.0.0.1.199          ESTABLISHED
    tcp4       0     40  172.29.149.95.22       172.29.96.83.41022     ESTABLISHED
    tcp4       0      0  172.29.149.95.22       172.29.96.83.41032     ESTABLISHED
    tcp4       0      0  127.0.0.1.32771        127.0.0.1.32775        ESTABLISHED
    tcp        0      0  127.0.0.1.32775        127.0.0.1.32771        ESTABLISHED
    tcp4       0      0  127.0.0.1.32771        127.0.0.1.32776        ESTABLISHED
    tcp        0      0  127.0.0.1.32776        127.0.0.1.32771        ESTABLISHED
    tcp4       0      0  127.0.0.1.32771        127.0.0.1.32777        ESTABLISHED
    tcp        0      0  127.0.0.1.32777        127.0.0.1.32771        ESTABLISHED
    tcp4       0      0  127.0.0.1.32771        127.0.0.1.32778        ESTABLISHED
    tcp        0      0  127.0.0.1.32778        127.0.0.1.32771        ESTABLISHED
    r�r�r�r�rMr�r%rPr�r�r�r�rrrr�	s(
�r��gen_mac�AC:DE:48c	Cs(d�|t�dd�t�dd�t�dd��S)a�
    Generates a MAC address with the defined OUI prefix.

    Common prefixes:

     - ``00:16:3E`` -- Xen
     - ``00:18:51`` -- OpenVZ
     - ``00:50:56`` -- VMware (manually generated)
     - ``52:54:00`` -- QEMU/KVM
     - ``AC:DE:48`` -- PRIVATE

    References:

     - http://standards.ieee.org/develop/regauth/oui/oui.txt
     - https://www.wireshark.org/tools/oui-lookup.html
     - https://en.wikipedia.org/wiki/MAC_address
    z{}:{:02X}:{:02X}:{:02X}rr!)rg�random�randint)r�rrrr�;s


��mac_str_to_bytescsZt��dkrnt��dkr�d}��|d��ntd���fdd�tddd�D�}t|�S)	z�
    Convert a MAC address string into bytes. Works with or without separators:

    b1 = mac_str_to_bytes('08:00:27:13:69:77')
    b2 = mac_str_to_bytes('080027136977')
    assert b1 == b2
    assert isinstance(b1, bytes)
    ��r�rzInvalid MAC addressc3s&�|]}t�||d�d�VqdS)r�r�N)r&)r�s��mac_strrrr#gs�$z#mac_str_to_bytes.<locals>.<genexpr>r)rc�replacer�r�r�)r�sep�charsrrrr�Vs
cCs"zt�WdStyYdSw)z:
    issue #21397: force glibc to re-read resolv.conf
    N)�RES_INIT�	NameErrorrrrr�refresh_dnsks
�r
�	dns_checkc
Cs$g}|rtjn	|durtjntj}d}zt�t�|||tj�}t||�}Wnty6t	dd�
|�d��ty@d}Ynw|rt|rtzt�t�||tjtj�}t||�}Wntyit	dd�
|�d��tysd}Ynw|s�d|�d�}	|r�t�
|	�t��t	d|	d��t|d�S)	a�
    Return an ip address resolved by dns in a format usable in URLs (ipv6 in brackets).
    Obeys system preference for IPv4/6 address resolution - this can be overridden by
    the ipv6 flag. Tries to connect to the address before considering it useful. If no
    address can be reached, the first one resolved is used as a fallback.
    Does not exit on failure, raises an exception.
    F�*zHAttempt to resolve address '{}' failed. Invalid or unresolveable address)�code�msgTz#DNS lookup or connection check of 'z	' failed.r)r'r1r(r0r
r/r)�_test_addrsrtrrgrnrerir�
ip_bracket)
rTr+�safer�ror5�socket_errorr}ri�errrrrrvsT	�������
c	Cs�g}|D]=}|d}|dd}||vrq|�|�zt�|tj�}|�d�|�||f�|��|g}W|StyAYqw|S)zj
    Attempt to connect to all addresses, return one if it succeeds.
    Otherwise, return all addrs.
    rrPr�)r2r'r)�
settimeout�connect�closern)r}r+ro�aZ	ip_familyr�rrrrr�s&

��rc
Csnd\}}|dd�}|ddkrEd|vrD|�d��dd�\}}t�|�j}|ddkr3t|�d��}nEt|�dkrDtd|�d	|�d
���n3|�d�dkrv|�	d�\}}}zt|�}Wntyu}zd�
||�}t�|�t|��d}~ww|}zt
|tj�s�t�|�j}|}W||fSW||fSty�t�d|�|t|�kr�t�d
|�td|�d
���Y||fSw)a�
    Takes a string argument specifying host or host:port.

    Returns a (hostname, port) or (ip_address, port) tuple. If no port is given,
    the second (port) element of the returned tuple will be None.

    host:port argument, for example, is accepted in the forms of:
      - hostname
      - hostname:1234
      - hostname.domain.tld
      - hostname.domain.tld:5678
      - [1234::5]:5678
      - 1234::5
      - 10.11.12.13:4567
      - 10.11.12.13
    �NNNr�[�]r%rzfound ambiguous "z" port in "�"z1host_port "{}" port value "{}" is not an integer.z2"%s" Not an IP address? Assuming it is a hostname.zbad hostname: "%s"zbad hostname: ")�lstripr�rr�r�r&rcr��count�	partitionrgrerir��_BaseAddressrQr�r$)�	host_portr#r+Z_s_Z_hostport_separator_Z_e_�errmsg�host_iprrr�parse_host_port�sN��
���	���r#�filter_by_networkscshdd���dur2dd��D��t�t�r���fdd��D�St�t�r)����Stdt�������S)	a�
    Returns the list of IPs filtered by the network list.
    If the network list is an empty sequence, no IPs are returned.
    If the network list is None, all IPs are returned.

    {% set networks = ['192.168.0.0/24', 'fe80::/64'] %}
    {{ grains['ip_interfaces'] | filter_by_networks(networks) }}
    {{ grains['ipv6'] | filter_by_networks(networks) }}
    {{ grains['ipv4'] | filter_by_networks(networks) }}
    cs�fdd�|D�S)Ncs(g|]}�D]}t�|�|vr|�qqSrr�)rr9r_��networksrrr 	rgz7filter_by_networks.<locals>._filter.<locals>.<listcomp>r)r4r&rr%r�_filter	sz#filter_by_networks.<locals>._filterNcSsg|]}t�|��qSr)rr�)rr�rrrr 	sz&filter_by_networks.<locals>.<listcomp>csi|]
}|��|���qSrr)rrv�r'r&rrrr�	s�z&filter_by_networks.<locals>.<dictcomp>zDo not know how to filter a )r�rrr�ry)rr&rr(rr$	s

�

�ipwrapcCs^t|ttf�r g}|D]}t|ddd�rt|�}|�|�q|St|ddd�r+t|�}|}|S)z�
    Returns any input (string, list, tuple) as a string or a list with any IPv6 addresses wrapped in square brackets ([]).
    rwNr�)r�rVr�r�rr2)rrurFrrrr)$	s�cCsHt|�}|�d�}|�d�}t�|�}|jdkr|sd�|�Sd�|�S)z�
    Ensure IP addresses are URI-compatible - specifically, add brackets
    around IPv6 literals if they are not already present.
    rrrwz[{}]z{})r�rrTrrQrxrg)rTrlrrrr7	s



"rrr)r�r )r�)NFNr�)NFN)NFFNr�)NFFN)F)r�)FN)�rIr�r��loggingrhr^r�rDr�r'rAr��collections.abcrr�stringrrZsalt.utils.argsrXZsalt.utils.filesZsalt.utils.pathZsalt.utils.platformZsalt.utils.stringutilsZsalt._compatrZsalt.exceptionsrrZsalt.utils.decorators.jinjar	Zsalt.utils.versionsr
rYrX�ImportError�	getLoggerrre�ctypesZctypes.util�cdll�LoadLibrary�utilZfind_libraryZLIBCZ
__res_initrrn�AttributeErrorrtrZ_get_interfacesrZ_clear_interfacesr$r.r;rsrvr)rzrr�r�r�r�r�rRr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr8rJrLrOrQrSrWr[rr`rdrer�rlrprtrvrwr�r�r�r�r�r�r�ror�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r
rrr#r$r)rrrrr�<module>sD�

�	g





	

$




bl#<F3



.




�

	

�)
�
�

%/5&>=%&A2
=7