
    VhuH                        d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZ  G d de      Z G d de	      Zy)	    )annotationsN)NetworkNetworkCollector)get_file_contentc                  F    e Zd ZdZdZddddddZdd
Zd ZddZd Z	d Z
y	)LinuxNetworkad  
    This is a Linux-specific subclass of Network.  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.
    - ipv4_address and ipv6_address: the first non-local address for each family.
    Linuxether
infinibandppploopbacktunnel)13251277265534Nc                @   i }| j                   j                  d      }||S | j                  ||      \  }}| j                  |||      \  }}|j	                         |d<   |D ]
  }||   ||<    ||d<   ||d<   |d   |d<   |d   |d<   | j                  |      |d<   |S )	Nip)collected_facts
interfacesdefault_ipv4default_ipv6all_ipv4_addressesall_ipv6_addresseslocally_reachable_ips)moduleget_bin_pathget_default_interfacesget_interfaces_infokeysget_locally_reachable_ips)	selfr   network_factsip_pathr   r   r   ipsifaces	            X/home/dcms/DCMS/lib/python3.12/site-packages/ansible/module_utils/facts/network/linux.pypopulatezLinuxNetwork.populate.   s    ++**40?  %)%@%@Q` &A &b"l227L,W
C&0oo&7l# 	5E#-e#4M% 	5(4n%(4n%.12F.G*+.12F.G*+151O1OPW1X-.    c                    t        g g       fd}|dddddg}| j                  j                  |      \  }}}|dk(  r ||       |d	ddddg}| j                  j                  |      \  }}}|dk(  r ||       S )
N)ipv4ipv6c                    | j                         D ]`  }|s|j                         }|d   dk7  r|d   }d|v r|d   vs0d   j                  |       E|d   vsMd   j                  |       b y )Nr   local   :r-   r,   )
splitlinessplitappend)outputlinewordsaddressr   s       r(   parse_locally_reachable_ipszKLinuxNetwork.get_locally_reachable_ips.<locals>.parse_locally_reachable_ipsK   s    ))+ F

8w&('>&;F&CC-f5<<WE&;F&CC-f5<<WEFr*   -4routeshowtabler/   r   -6)dictr   run_command)r#   r%   r9   argsrcroutesdummyr   s          @r(   r"   z&LinuxNetwork.get_locally_reachable_ipsE   s     $!

	F wA KK33D9FE7'/wA KK33D9FE7'/$$r*   c                   |xs i }t        |ddddg|ddddg      }t        i i       }dD ]-  }|dk(  r6|j                  d	      d
k(  r"|j                  dd      j                  d      r?|dk(  rt        j                  sU| j
                  j                  ||   d      \  }}}|s||j                         d   j                         }	t        |	      dkD  s|	d   ||   d   k(  st        t        |	      dz
        D ]Y  }
|	|
   dk(  r|	|
dz      ||   d<   |	|
   dk(  r|	|
dz      ||   d<   1|	|
   dk(  s:|	|
dz      ||   d   k7  sL|	|
dz      ||   d<   [ 0 |d   |d   fS )Nr:   r;   getz8.8.8.8r>   z2404:6800:400a:800::1012)v4v6rH   ansible_os_familyRedHatansible_distribution_version z4.surrogate_then_replaceerrorsr   r0   dev	interfacesrcr8   viagatewayrG   )r?   rF   
startswithsockethas_ipv6r   r@   r2   r3   lenrange)r#   r%   r   commandrR   vrB   outerrr7   is              r(   r   z#LinuxNetwork.get_default_interfacese   s   )/R
 wy9w/IJ
 B2&	 	?AT	o112EF(R#''(FKVVW[\Dy;;2271:F^2_LBS NN$Q'--/E5zA~%(gajn"<s5zA~. ?AQx5(49!a%L	![1qU*27A,	!Y/qU*uQU|wqz"~/M27A,	!Y/?	?* 	$//r*   c                   i t        g g       t        j                  d      D ]  }t        j                  j	                  |      s$t        j                  j                  |      di<   t        j                  j                  t        j                  j                  |d            r:t        t        j                  j                  |d      d      rdk7  r   d<   t        j                  j                  t        j                  j                  |d	            r8t        t        t        j                  j                  |d	                     d	<   t        j                  j                  t        j                  j                  |d
            r2t        t        j                  j                  |d
            dk7     d<   t        j                  j                  t        j                  j                  |ddd            rbt        j                  j                  t        j                  j                  t        j                  j                  |ddd                     d<   t        j                  j                  t        j                  j                  |d            rKt        t        j                  j                  |d            }| j                  j                  |d         d<   t        j                  j                  t        j                  j                  |d            rNd   d<   t        j                  t        j                  j                  |dd            D cg c]!  }t        j                  j                  |      # c}   d<   t        j                  j                  t        j                  j                  |dd            r2t        t        j                  j                  |dd      d         d<   t        j                  j                  t        j                  j                  |dd            r3t        t        j                  j                  |dd            dk(     d<   t        j                  j                  t        j                  j                  |d            rd   d<   t        t        j                  j                  |dd      d      j                            d<   t        t        j                  j                  |dd      d      j                         d      d<   t        t        j                  j                  |dd      d      j                         d      d<   t        t        j                  j                  |dd      d      j                         d      d<   t        t        j                  j                  |dd             }|r\|   d <   t        j                  j                  |dd!      }t        j                  j                  |      rt        |      dk(     d!<   t        j                  j                  t        j                  j                  |d"            r2t        t        j                  j                  |d"d#      d         d$<   t        j                  j                  t        j                  j                  |d            rVt        j                  j                  t        j                  t        j                  j                  |d                     d%<   t        j                  j                  t        j                  j                  |d&            r<t        t        j                  j                  |d&            }|t        |         d&<   t        j                  j                  t        j                  j                  |d'            rEd(}	t        t        t        j                  j                  |d'            d)      }
|
d*z  dkD  }	|	   d+<   d7fd,	}|d-d.d d/g}| j                  j!                  |d01      \  }}}|dk(  r	 ||       n5|d-d.d/g}| j                  j!                  |d01      \  }}
}|dk(  r ||
       |d-d.d2d/g}| j                  j!                  |d01      \  }}}|dk(  r
 ||d34          j#                  | j%                               	 i }D ]'  }d5|v r|   ||j'                  d5d6      <    |   ||<   ) |fS c c}w )8N)r   r   z/sys/class/net/*devicer8   rL   )defaultz00:00:00:00:00:00
macaddressmtu	operstatedownactivedriverr   typeunknownbridgebrif*r   	bridge_idid	stp_stater   stpbondingslavesmoder   miimon	lacp_rateprimaryall_slaves_activebonding_slaveperm_hwaddrperm_macaddresspciidspeedflagsF      promiscc           	        | j                         D ]  }|s|j                         }d}|d   dk(  rd|d   v r3|d   j                  d      \  }}t        |      dkD  r|d   dk(  r|d   }n|d   }d	}t        j                  d
t        j                  |            d   }ddt        |      z	  z
  }t        j                  t        j                  d
|            }	t        j                  t        j                  d
||z              }
|d   }|k7  ri |<   |sd|   vr|||	|
|d|   d<   n,d|   vrg |   d<   |   d   j                  |||	|
|d       |r1d   vrg    d<   |k7  r   d   j                  |||	|
|d       dv rLd   |k(  rD|d<   |	d<   |
d<   |d<   d<      d   d<      j                  dd      d<   |d   d<   |j                  d      rމd   j                  |       |d   dk(  sd|d   k(  r"|d   }|d   j                  d      \  }}|d   }n|d   j                  d      \  }}|d   }d   vrg    d<      d   j                  |||d        dv r:d   |k(  r2|d<   |d!<   d<      d   d<      j                  dd      d<   |d"k(  rd#   j                  |        y )$NrL   r   inet/r0         brdr   z!Ll        rP   r,   )r8   	broadcastnetmasknetworkprefixipv4_secondariesr8   r   r   r   r   rc   rd   ri   rj   aliasz127.r   inet6peer   r-   )r8   r   scoper   z::1r   )r2   r3   rY   structunpackrW   	inet_atonint	inet_ntoapackr4   rF   rV   )r5   	secondaryr6   r7   r   r8   netmask_lengthaddress_binnetmask_binr   r   r'   rD   r   r   r   r   ra   r   r&   rc   s                  r(   parse_ip_outputz9LinuxNetwork.get_interfaces_info.<locals>.parse_ip_output   s   "--/ \FD  JJLE "IQx6)%(?6;AhnnS6I3G^"5zA~#(8u#405aI ',AhG-1N&,mmD&:J:J7:S&TUV&W'.7c.>Q3Q&R"("2"26;;t[3Q"R"("2"26;;t[S^E^3_"` %b	 !F?02Ju-(V:e;L-LDKFODKDKCQ	9;Ju-f5  2E9JJHJ
5 12D E&u-.@AHH+2-6+2+2*8J  %1F9KKIK
6 23E F% *6 23E F M M/61:/6/6.<O" !# %4i9PT[9[8AL56=L36=L35CL29CL62<V2DU2KL/3=f3E3I3I&R[3\L049"IL1&11&9 45<<WEqW,!U1X-&+AhG,1!HNN3,?ME6$)!HE.3AhnnS.AOGV$)!HE!F);;9;Jv.v6"6*6299'.&,%*;  %4i9PT[9[5;L249L19CL62<V2DU2KL/3=f3E3I3I&R[3\L0&%/ 45<<WEy\Fr*   addrr<   rQ   rM   rN   r   T)r   r1   _)F)r?   globospathisdirbasenameexistsjoinr   r   realpathINTERFACE_TYPErF   r3   readlinkr   r@   updateget_ethtool_datareplace)r#   r%   r   r   r   _typebrw   r}   promisc_modedatar   rA   rB   primary_datastderrsecondary_datanew_interfacesr_   ra   r   r&   rc   s     ``               @@@@r(   r    z LinuxNetwork.get_interfaces_info   s{   
!!
 II01 i	ED77==&WW%%d+F"*F!3Jvww~~bggll4;<-bggll4.KUWX
*0C"C7AJv&|4ww~~bggll478,/0@dTYAZ0[,\
6"5)ww~~bggll4=>/?TS^@_/`dj/j
6"8,ww~~bggll48XNO/1ww/?/?@P@PQSQXQXQ]Q]^bdlnv  yA  RB  AC  0D
6"8,ww~~bggll489(dF)CD-1-@-@-D-DUI-V
6"6*ww~~bggll4:;-5
6"6*QUQZQZ[][b[b[g[ghlntvy[zQ{3|ABGG4D4DQ4G3|
6"<077>>"'',,tX{"KL/?TS[]h@isu/vJv&t,77>>"'',,tX{"KL0@dT\^iAj0kor0rJv&u-ww~~bggll4;<-6
6"6*/?TS\^f@gqs/t/z/z/|
6"8,-=bggll4QZ\b>cmo-p-v-v-xyz-{
6"6*/?TS\^f@gqs/t/z/z/|}~/
6"8,2B277<<PTV_alCmwy2z  3A  3A  3C  DE  3F
6";/*277<<i+ST4;Jv&y177<<i9LMDww~~d+BRSWBX\_B_
6*+>?ww~~bggll4AB8HVZ\kmzI{  FH  9I
6"#45ww~~bggll4:;.0gg.>.>r{{277<<X\^fKg?h.i
6"7+ww~~bggll49:(dG)DE$25e*Jv&w/ ww~~bggll49:$ +BGGLLw,GH"M $v 10<
6"9-]F ]F~ VVYvFD'+{{'>'>tLd'>'e$BfQw-  ?#';;#:#:4H`#:#a D&7#D)VV[%HD)-)@)@Nf)@)g&BQw$?v%%d&;&;F&CDSi	EX  	2Aax6@mqyyc23$.qMq!		2
 s"" 4}s   5&e c                T   i }| j                   j                  d      }|r}|d|g}| j                   j                  |d      \  }}}|dk(  ri }|j                         j	                         D ]^  }	|	r|	j                  d      r|	j                  d      \  }
}|s.|j                         ||
j                         j                  dd	      <   ` ||d
<   |d|g}| j                   j                  |d      \  }}}|dk(  rt        j                  d|      D cg c]  }|j                          c}|d<   t        j                  d|      D cg c]  }|j                          c}|d<   t        j                  d|      }|rt        |j                         d         |d<   |S c c}w c c}w )Nethtoolz-krM   rN   r   r1   z: -r   featuresz-TzSOF_TIMESTAMPING_(\w+)timestampingzHWTSTAMP_FILTER_(\w+)hw_timestamp_filterszPTP Hardware Clock: (\d+)	phc_index)r   r   r@   stripr2   endswithr3   r   refindalllowersearchr   groups)r#   ra   r   ethtool_pathrA   rB   stdoutr   r   r6   keyvaluems                r(   r   zLinuxNetwork.get_ethtool_dataG  s   {{//	: $/D!%!8!8F^!8!_BQw"LLN557 LD4==#5 !%D!1JC  >CkkmHSYY[00c:;L $,Z  $/D!%!8!8F^!8!_BQw;=::F_ag;h'ia	'i^$CE::NfhnCo/pa	/p+,II:FC(+AHHJqM(:D% (j/ps   F 
F%)N)__name__
__module____qualname____doc__platformr   r)   r"   r   r    r    r*   r(   r   r      sA     HN.%@!0F}#~r*   r   c                  (    e Zd ZdZeZ eddg      Zy)LinuxNetworkCollectorr	   distributionr   N)r   r   r   	_platformr   _fact_classsetrequired_factsr   r*   r(   r   r   g  s    IK.*56Nr*   r   )
__future__r   r   r   r   rW   r   'ansible.module_utils.facts.network.baser   r    ansible.module_utils.facts.utilsr   r   r   r   r*   r(   <module>r      s;     #  	 	   M =G7 GT
7, 7r*   