
    Vh31                    J    d dl mZ d dlZd dlZd dlZd dlmZ  G d de      Zy)    )annotationsN)Networkc                  ~    e Zd ZdZdZddZd Zd ZddZd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)GenericBsdIfconfigNetworka-  
    This is a generic BSD subclass of Network using the ifconfig command.
    It defines
    - interfaces (a list of interface names)
    - interface_<name> dictionary of ipv4, ipv6, and mac address information.
    - all_ipv4_addresses and all_ipv6_addresses: lists of all configured addresses.
    Generic_BSD_IfconfigNc                   i }| j                   j                  d      }||S | j                   j                  d      }||S | j                  |      \  }}| j                  |      \  }}| j	                  |      }| j                  ||d       | j                  ||d       t        t        |j                                     |d<   |D ]
  }	||	   ||	<    ||d<   ||d<   |d   |d<   |d	   |d	<   |S )
Nifconfigrouteipv4ipv6
interfacesdefault_ipv4default_ipv6all_ipv4_addressesall_ipv6_addresses)	moduleget_bin_pathget_default_interfacesget_interfaces_infodetect_type_mediamerge_default_interfacesortedlistkeys)
selfcollected_factsnetwork_factsifconfig_path
route_pathr   r   r   ipsifaces
             ^/home/dcms/DCMS/lib/python3.12/site-packages/ansible/module_utils/facts/network/generic_bsd.pypopulatez"GenericBsdIfconfigNetwork.populate#   s   00<   [[--g6
  %)%@%@%L"l22=A
C++J7
$$\:vF$$\:vF&,T*//2C-D&El# 	5E#-e#4M% 	5 )5n%(4n%.12F.G*+.12F.G*+    c                f    |D ]+  }d||   v sd||   d   j                         v s$d||   d<   - |S )Nmediaethertype)lower)r   r   r!   s      r"   r   z+GenericBsdIfconfigNetwork.detect_type_mediaA   sP     	8E*U++j/8>>@@07Ju%f-	8 r$   c                    t        |dddg|ddddg      }t        i i       }dD ]  }|dk(  rt        j                  s| j                  j	                  ||         \  }}}|s>|j                         D ]}  }|j                         j                  d      }	t        |	      dkD  s1|	d	   d
k(  r|	d   ||   d
<   |	d	   dk(  r|	d   ||   d<   |	d	   dk(  r|	d   ||   d<   |	d	   dk(  ss|	d   ||   d<     |d   |d   fS )Nz-ngetdefaultz-inet6)v4v6r.   z:    r   	interfacegatewayz
if addressaddressz
local addrr-   )	dictsockethas_ipv6r   run_command
splitlinesstripsplitlen)
r   r   commandr0   vrcouterrlinewordss
             r"   r   z0GenericBsdIfconfigNetwork.get_default_interfacesH   s?    :tUI>%tUHiHJ B2&	 	;ADy;;2271:>LBS ( ;

**40u:>Qx;.49!H	![1Qx9,27(	!Y/Qx</27(	!Y/Qx</27(	!Y/;	;0 	$//r$   c                   i }i }t        g g       }| j                  j                  ||g      \  }}}|j                         D ]|  }	|	s|	j	                         }
|
d   dk(  r t        j                  d|	      r(t        |
      dkD  r| j                  |
      }|||d   <   ^|
d   j                  d      r| j                  |
||       |
d   dk(  r| j                  |
||       |
d   d	k(  r| j                  |
||       |
d   d
k(  r| j                  |
||       |
d   dk(  r| j                  |
||       |
d   dk(  r| j                  |
||       |
d   dk(  r| j!                  |
||       0|
d   dk(  r| j#                  |
||       M|
d   dk(  r| j%                  |
||       j| j'                  |
||        ||fS )N)r   r   r   passz^\S   devicezoptions=nd6r'   zmedia:zstatus:lladdrinetinet6tunnel)r3   r   r6   r7   r9   rematchr:   parse_interface_line
startswithparse_options_lineparse_nd6_lineparse_ether_lineparse_media_lineparse_status_lineparse_lladdr_lineparse_inet_lineparse_inet6_lineparse_tunnel_lineparse_unknown_line)r   r   ifconfig_optionsr   
current_ifr    r=   r>   r?   r@   rA   s              r"   r   z-GenericBsdIfconfigNetwork.get_interfaces_infon   s   

!!
 {{..?O/PQCNN$ 	DD

8v%XXfd+E
Q!%!:!:5!AJ7AJz(341X((4++E:sC1X&''z3?1X())%SA1X)))%SA1X***5*cB1X)**5*cB1X'((
C@1X())%SA1X)**5*cB++E:sC;	D> 3r$   c                    |d   dd }|g g dd}| j                  |d         |d<   d|d   v rd|d	<   d|d
<   t        |      dk\  r|d   |d<   |d   |d<   |S |d   |d<   |S )Nr   unknown)rE   r   r   r(   r/   flagsLOOPBACKloopbackr(   
macaddress   rD   metricmtu)get_optionsr:   )r   rA   rE   rZ   s       r"   rM   z.GenericBsdIfconfigNetwork.parse_interface_line   s    q!B &B	R
"..uQx8
7G,,!+Jv#,
< u:?#(8Jx  %aJu  !&aJur$   c                2    | j                  |d         |d<   y )Nr   optionsre   r   rA   rZ   r    s       r"   rO   z,GenericBsdIfconfigNetwork.parse_options_line        $ 0 0q :
9r$   c                2    | j                  |d         |d<   y )Nr/   rg   rh   ri   s       r"   rP   z(GenericBsdIfconfigNetwork.parse_nd6_line   rj   r$   c                    |d   |d<   d|d<   y )Nr/   ra   r'   r(    ri   s       r"   rQ   z*GenericBsdIfconfigNetwork.parse_ether_line   s    #(8
< $
6r$   c                    |d   |d<   t        |      dkD  r|d   |d<   t        |      dkD  r|d   dd  |d<   t        |      dkD  r| j                  |d         |d<   y y )	Nr/   r&      media_selectrD   
media_type   media_options)r:   re   ri   s       r"   rR   z*GenericBsdIfconfigNetwork.parse_media_line   sq    #Ah
7u:>).qJ~&u:>',Qx|J|$u:>*.*:*:58*DJ' r$   c                    |d   |d<   y )Nr/   statusrm   ri   s       r"   rS   z+GenericBsdIfconfigNetwork.parse_status_line       $Qx
8r$   c                    |d   |d<   y )Nr/   rG   rm   ri   s       r"   rT   z+GenericBsdIfconfigNetwork.parse_lladdr_line   rv   r$   c           	        |d   dk(  r|d= d|d   i}d|d   v r{|d   j                  d      \  }}||d<   t        |      }ddt        |      z	  z
  }t        j                  t	        j
                  d|            |d<   t        |      dkD  r|d	   |d
<   n	 |j                  d      dz   }	t        j                  d||	         r	d||	   z   }
n||	   }
|
j                  d      r8t        j                  t	        j
                  dt        |
d                  |d<   n|
|d<   t	        j                  dt        j                  |d               d   }t	        j                  dt        j                  |d               d   }t        j                  t	        j
                  d||z              |d<   d
|vr	 |j                  d
      dz   }||   |d
<   |d   j                  d      s|d   j                  |d          |d   j                  |       y # t        $ r d	}	Y qw xY w# t        $ r6 t        j                  t	        j
                  d|| dz  z              |d
<   Y w xY w)Nr/   aliasr2   /l        z!Lnetmaskrb   rD   	broadcastz([0-9a-f]){8}$0x   )baser   networkl    z127.r   r   )r9   intr4   	inet_ntoastructpackr:   index
ValueErrorrK   rL   rN   unpack	inet_atonappend)r   rA   rZ   r    r2   
ip_address	cidr_masknetmask_lengthnetmask_binnetmask_idxr{   address_binbroadcast_idxs                r"   rU   z)GenericBsdIfconfigNetwork.parse_inet_line   sp   
 8waeAh' ')$$$+I$6$<$<S$A!J	!+GI ^N"w#n2E'EFK!'!1!1&++dK2P!QGI5zA~',Qx$ #kk)4q8
 xx(%*<={!33,!!$'%+%5%5fkk$GZ\H]6^%_	" &-	"mmD&*:*:79;M*NOPQRmmD&*:*:79;M*NOPQR#--fkk$k@Y.Z[	g%< %K 81 < (-]';$ Qx""6*$%,,WY-?@6!!'*=    ,  v'-'7'7D+ZeYehrYrJs8t'u$vs$   H 1H HH<IIc                t   d|d   i}d|d   v r8|d   j                  d      \  }}||d<   ||d<   t        |      dkD  rE|d   |d<   n<t        |      dk\  r|d   d	k(  r|d
   |d<   t        |      dk\  r|d   dk(  r|d   |d<   g d}|d   |vr|d   j                  |d          |d   j                  |       y )Nr2   r/   rz   prefixrb   scoperr   ro   	prefixlenrD      scopeid)z::1z::1/128zfe80::1%lo0r   r   )r9   r:   r   )r   rA   rZ   r    r2   r   r   
localhost6s           r"   rV   z*GenericBsdIfconfigNetwork.parse_inet6_line  s    eAh' ')$$$+I$6$<$<S$A!J	!+GI )GH5zA~#(8 E
aeAh+&=$)!H!E
aeAh)&;#(8 6
9Z/$%,,WY-?@6!!'*r$   c                    d|d<   y )NrJ   r(   rm   ri   s       r"   rW   z+GenericBsdIfconfigNetwork.parse_tunnel_line  s    %
6r$   c                     y Nrm   ri   s       r"   rX   z,GenericBsdIfconfigNetwork.parse_unknown_line  s     	r$   c                    |j                  d      dz   }|j                  d      }|dkD  r#|dkD  r||dz   kD  r||| }|j                  d      S g S )N<r/   >r   ,)findrfindr9   )r   option_stringstartend
option_csvs        r"   re   z%GenericBsdIfconfigNetwork.get_options#  s`    ""3'!+!!#&AIC!G#	/&uS1J##C((Ir$   c                $   d|vry |d   |vry ||d      }|D ]  }|dk7  s	|dk7  s||   ||<    g }d|v r||   D cg c]  }|d   |d   k(  s| }}t        |      dk(  r||   }t        |      dkD  r|d   D ]  }|d   |   ||<    y y c c}w )Nr0   r   r   r2   r   )r:   )r   defaultsr   ip_typeifinfoitemipinfoxs           r"   r   z1GenericBsdIfconfigNetwork.merge_default_interface,  s    h&$
2H[12 	.Dv~$&.!'	.  !'XAAiLHYDW4WaXFXv;!G_Fv;?q	 1!'41  Ys   BBr   )z-a)__name__
__module____qualname____doc__platformr#   r   r   r   rM   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   re   r   rm   r$   r"   r   r      sg     &H<$0L+Z ;;%E((9+v+.&1r$   r   )
__future__r   rK   r4   r   'ansible.module_utils.facts.network.baser   r   rm   r$   r"   <module>r      s$     # 	   ;g1 g1r$   