
    ܍~cKZ                         d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ  ej                    Zg g dd	d
Zd Zd Zd Zd ZddZd Zd Zd Zd Zd ZddZdS )    N)copydeepcopy)IPv4Network)log)subputil)net_prefix_to_ipv4_mask)SimpleTable Fipv4ipv6hwaddrupc           	         t          j        |           }i }|D ]}d|v r|d         ng }|                    d          dk    r|d         nd}|t          d|v od|v           g g d}|                    d	g           D ]3}|                    d
          dk    rd|v r*t	          t          d|d                    j                  nd}|                    dd          ||                    dd          |                    dd          d}	|d                             |	           |d
         dk    r||                    dd          }
|
r0|                    d          s|
 d|                    dd           }
|
|                    dd          d}	|d                             |	           5|||d         <   |S )a&  Get network device dicts from ip route and ip link info.

    ipaddr_json: Output string from 'ip --json addr' command.

    Returns a dict of device info keyed by network device name containing
    device configuration values.

    Raises json.JSONDecodeError if json could not be decoded
    flags	link_typeetheraddressr   UPLOWER_UP)r   r   r   r   	addr_infofamilyinet	prefixlenz0.0.0.0/local	broadcastscope)ipmaskbcastr   r   inet6/@   )r   scope6r   ifname)jsonloadsgetboolstrr   netmaskappend)ipaddr_jsonipaddr_datadevsdevr   r   dev_infoaddrr    parsed_addrr   s              3/usr/lib/python3/dist-packages/cloudinit/netinfo.py_netdev_info_iproute_jsonr6   +   s    *[))KD %' %' '3GB$'GGK$8$8G$C$C#i..tu}<u)<==	
 
 GGK,, 	5 	5Dxx!!V++ #d** $BtK/@$B$BCCKLLL  ((7B// !XXk266!XXgr22	   ''4444h7**XXgr**  =dhhy11 =<<+r!:!:<<B"hhw33   ''444&S]K    c                    i }d}t          |                                           D ]Y\  }}t          j        d|          }|r|                    d                                                              d          d         }|                    d                              d          }g g dt          d	|v od
|v           d||<   d|v rit          j        d|          }|st          	                    d||           ||         d         
                    |                                           d|v rt          j        d|          }|st          	                    d||           I|                                }|                    d          }|                    d          \  }	}
}|sd}||         d         
                    |	|d         r|d         ndt          |          |d         d           d|v r{t          j        d|          }|st          	                    d||           |                    d          dk    r |                    d          ||         d<   Ld||         d<   Y[|S )an  
    DEPRECATED: Only used on distros that don't support ip json output
    Use _netdev_info_iproute_json() when possible.

    @param ipaddr_out: Output string from 'ip addr show' command.

    @returns: A dict of device info keyed by network device name containing
              device configuration values.
    @raise: TypeError if ipaddr_out isn't a string.
    Nz.^\d+:\s(?P<dev>[^:]+):\s+<(?P<flags>\S+)>\s+.*r1   @r   r   ,r   r   r   r   r"   z?\s+inet6\s(?P<ip>\S+)(\s(peer\s\S+))?\sscope\s(?P<scope6>\S+).*z*Could not parse ip addr show: (line:%d) %sr   r   zd\s+inet\s(?P<cidr4>\S+)(\smetric\s(?P<metric>\d+))?(\sbrd\s(?P<bcast>\S+))?\sscope\s(?P<scope>\S+).*cidr4r#   32r   r!   r   )r   r!   r    r   linkz-\s+link/(?P<link_type>\S+)\s(?P<hwaddr>\S+).*r   r   r   )	enumerate
splitlinesrematchgrouplowersplitr*   LOGwarningr-   	groupdictpop	partitionr	   )
ipaddr_outr0   dev_namenumlinemr   rA   r;   r3   _prefixs               r5   _netdev_info_iprouterQ   a   s    DHz446677 @ @	THFMM >	wwu~~++--33C88;HGGG$$**3//E45=@Z5-@AA	 DNN __. 	 A  @#t   N6"))!++--8888t^^-  A  @#t   KKMMEIIg&&E#ooc22OD!V N6"))/4W~EU7^^23F;;"7^	     t^^@$ A  @#t   ww{##w..+,778+<+<Xx((+-Xx((Kr7   c                    i }|                                  D ]=}t          |          dk    r|d         dvrT|                                d         }|                    d          r
|d d         }||vrt	          t
                    ||<   |                                                                                                }t          |          dk    r&t          j	        d|d                   rd||         d<   t          t          |                    D ]9}||         d	k    rS||dz                                d
          \  }}||         d                             |t          |          d           b||         dk    r!||dz            ||         d         d         d<   ||         dk    r||dz            ||         d<   ||         dk    rj||dz            dk    r-||         d                             d||dz            i           ||         d                             d||dz            i           &||         dk    rB||         d         d         d         d
z   ||dz            z   }|||         d         d         d<   t||                             d          r2||                             d          ||         d         d         d<   ||         dk    rlt          j        d||dz                      }	|	r,|	                    d          ||         d         d         d<   ||dz            ||         d         d         d<   ;?|S )Nr   	 :   zflags=[x\d]+<up.*>Tr   r   r#   r   )r   r    r   r!   zaddress:r   r"   addr:r   r      r   scope:r%   scopeid	.*<(\S+)>)r?   lenrD   endswithr   DEFAULT_NETDEV_INFOrC   stripr@   searchranger-   r	   
startswithlstriprA   rB   )
ifconfig_datar0   rM   curdevtoksinetworknet_bitsaddr6ress
             r5   _netdev_info_ifconfig_netbsdrn      sm   D((** (E (Et99>>7+%%ZZ\\!_Fs## %T!!'(;<<Vzz||!!##))++t99q==y.Q88 *%)VT"s4yy!! 	E 	EAAw&  $(QK$5$5c$:$:!VV$++",CH,M,MNN    aK''48QKVV$R(11aJ&&)-a!eVX&&aG##A;'))L(//tAE{0CDDDDL(//tAE{0CDDDDaK''VV,R06<tAE{J16VV$R(..a##H-- E59!W^^H5M5MVV$R(22aI%%h|T!a%[99 E9<1DL(,X669=a!eDL(,X63	E6 Kr7   c                 d   i }|                                  D ]}t          |          dk    r|d         dvrT|                                d         }|                    d          r
|d d         }||vrt	          t
                    ||<   |                                                                                                }|d         dk    rd||         d<   n9t          |          dk    r&t          j	        d|d                   rd||         d<   t          t          |                    D ]}||         d	k    r@||         d
                             d||dz                                d          i           O||                             d          r1||                             d          ||         d
         d         d<   ||         dk    r!||dz            ||         d
         d         d<   ||                             d          r2||                             d          ||         d
         d         d<   ||         dk    r"||dz            ||         d
         d         d<   C||         dk    s||         dk    r||dz            ||         d<   q||         dk    rk||dz            dk    r.||         d                             d||dz            i           ||         d                             d||dz            i           ||         dk    rB||         d         d         d         dz   ||dz            z   }|||         d         d         d<   6||                             d          r2||                             d          ||         d         d         d<   ||         dk    rlt          j        d||dz                      }|r,|                    d          ||         d         d         d<   ||dz            ||         d         d         d<   |S )Nr   rS   rV   rW   r   TrX   zflags=\d+<up,r   r   r   rY   zbcast:r!   r   zmask:r    r,   r   r   r"   r   rZ   r   r#   r[   r%   r\   r]   )r?   r^   rD   r_   r   r`   rC   ra   r@   rb   rc   r-   re   rd   rA   rB   )rf   r0   rM   rg   rh   ri   rl   rm   s           r5   _netdev_info_ifconfigrp      sD   D((** 1E 1Et99>>7+%%ZZ\\!_Fs## %T!!'(;<<Vzz||!!##))++7d??!%DL YY]]y)4733 *%)VT"s4yy!! 	E 	EAAw&  VV$++4A;--g667    a##H-- E48GNN84L4LVV$R(11aK''48QKVV$R(11a##G,, E377>>'3J3JVV$R(00aI%%37A;VV$R(00aH$$Q7(:(:)-a!eVX&&aG##A;'))L(//tAE{0CDDDDL(//tAE{0CDDDDaK''VV,R06<tAE{J16VV$R(..a##H-- E59!W^^H5M5MVV$R(22aI%%h|T!a%[99 E9<1DL(,X669=a!eDL(,X6=	E@ Kr7   c                    i }t          j                    r-t          j        ddgddg          \  }}t          |          }nt          j        d          rg	 t          j        g d          \  }}t          |          }n# t          j        $ r+ t          j        g d          \  }}t          |          }Y n_w xY wt          j        d          r-t          j        ddgddg          \  }}t          |          }nt          
                    d	           | d
k    r|S t          t          t          fdfd	 ||            |S )Nifconfigz-ar   rX   rcsr   )r   z--jsonr3   )r   r3   showz>Could not print networks: missing 'ip' and 'ifconfig' commandsr   r   r7   c                 .   t          | t                    r|                                 }n;t          | t          t          f          rt          |           }nt          d          |D ]+\  }}||v r|| |<   t          |          r ||           ,dS )zQRecursively replace 'empty_vals' in data (dict, tuple, list)
        with new_valzUnexpected input to fillN)
isinstancedictitemstuplelistr>   	TypeError)datanew_val
empty_valsmyiterkeyvalfillrecurse_typess         r5   r   znetdev_info.<locals>.fill7  s     dD!! 	8ZZ\\FFudm,, 	8t__FF6777 	# 	#HCj  #S		C// #S'"""		# 	#r7   )r   )r   rv   )r   	is_NetBSDr   rn   whichr6   ProcessExecutionErrorrQ   rp   rE   rF   ry   r{   r|   )emptyr0   	ifcfg_out_errrJ   r   r   s        @@r5   netdev_infor     s   D~ 
 Iz4&8q!fEEED+I66	D		 
	4!%+C+C+C!D!DZ,Z88DD) 	4 	4 	4!%+A+A+A!B!BZ'
33DDD	4 
J		 
 Iz4&8q!fEEED$Y//L	
 	
 	
 {{5$'M# # # # # # #  	DuKs   (B 7B=<B=c                    i }g |d<   g |d<   |                                  }ddddddd}|D ]o}t          |          }|s|                                }dg}|d         dk    rd|d	<   d|d
<   nvd|d         v r|d                             d          \  }}	n1|d         }d}	|                    d           t	          |	          |d
<   ||d	<   t	          |	          |d
<   d|d<   t          t          |                    D ]f}
||
         dk    r$||
dz            |d<   |                    dd           ||
         dk    r||
dz            |d<   ||
         dk    r||
dz            |d<   gd                    |          |d<   |d                             |           q	 t          j	        g dddg          \  }}|                                 }|D ]}i }|s|                                }|d         dk    rd|d	<   d|d<   n|d         |d	<   d|d<   d|d<   t          t          |                    D ]o}
||
         dk    r||
dz            |d<   d|d<   ||
         dk    r||
dz            |d<   ||
         dk    r||
dz            |d<   ||
         dk    r|d         dz   |d<   p|d                             |           n# t          j
        $ r Y nw xY w|S )aP  
    Get network route dicts from ip route info.

    @param iproute_data: Output string from ip route command.

    @returns: A dict containing ipv4 and ipv6 route entries as lists. Each
              item in the list is a route dictionary representing destination,
              gateway, flags, genmask and interface information.
    r   r   r   )destinationr   gatewaygenmaskifacemetricUr   defaultz0.0.0.0r   r   r#   r<   Hr   viarX   Gr1   r   r   r   )r   z	--onelinez-6router|   tableallrs   z::/0UGz::expirese)r?   r   rD   r-   r	   rc   r^   insertjoinr   r   )iproute_dataroutesentriesdefault_route_entryrM   entryrh   r   r3   cidrri   iproute_data6_err6entries6s                 r5   _netdev_route_info_iprouter   K  s    FF6NF6N%%''G   % %()) 	zz||7i#,E- (E)d1g~~#Aw}}S11ttAwS!!!#:4#@#@i #'E- 6t<<E)(E)s4yy!! 	. 	.AAw%#'A;i Q$$$Aw%!%a!egAw("""&q1u+hgve$$$$)!%FFFA"
 "
 "
 !++-- 	) 	)DE ::<<DAw)##'-m$!%g'+Awm$#'i !$g3t99%% 	: 	:7e##'+AE{E)$%)E'N7e##%)!a%[E'N7h&&&*1q5kE(O7i''%*7^c%9E'N6N!!%((((-	)	 %   6 Ms   K KKc           
          i }g |d<   g |d<   |                                  }|D ]}|s|                                }t          |          dk     s<|d         dk    s0|d         dk    s$|d         dk    s|d         dk    s|d         d	k    rjt          |          d
k     r:|                    d           |                    d           |d         |d<   d|d<   |d         |d         |d         |d         |d         |d         |d         |d         d}|d                             |           	 t	          j        g dddg          \  }}|                                 }|D ] }|s|                                }t          |          dk     s<|d         dk    s0|d         dk    s$|d         dk    s|d         dk    s|d         dk    rj|d         |d         |d         |d         |d         |d         |d         d}|d         dk    r|d                             d          rt          j        dd|d                   |d<   |d                             |           n# t          j        $ r Y nw xY w|S )Nr   r      r   KernelDestinationInternet	Internet6Routing   -      rX   rZ         )r   r   r   r   r   refuser   )netstatz-Ar"   --route	--numericrs   ProtoActive)r   r   r   r   r   r   r   r   lor   z/128z\/128$r   )	r?   rD   r^   r-   r   r_   r@   subr   )	
route_datar   r   rM   rh   r   route_data6r   r   s	            r5   _netdev_route_info_netstatr     s   FF6NF6N##%%G #% #% 	zz|| IIMMAw(""Aw-''Aw*$$Aw+%%Aw)##t99q==KKKK1gDGDG7AwAw!W1g77!W	
 	
 	ve$$$$&)#y>>>QF 
  
  
e ))++ 	) 	)D ::<<DD		A7h&&7m++7j((7g%%7h&&#Aw7aq'AwAwa E W~%%]#,,V44 ')vr5#7( (m$ 6N!!%((((=	)	 %   F Ms   3I) )I;:I;c                  :   i } t          j        d          r)t          j         g d          \  }}t          |          } n[t          j        d          r-t          j         g dddg          \  }}t          |          } nt                              d           | S )	Nr   )r   z-or   r|   r   )r   r   r   z--extendr   rX   rs   z;Could not print routes: missing 'ip' and 'netstat' commands)r   r   r   r   rE   rF   )r   iproute_outr   	route_outs       r5   
route_infor     s    Fz$ 
"i(E(E(EFFd+K88	I		 	
 I;;;!Q
 
 
D ,I66I	
 	
 	
 Mr7   c                     g } d}	 t          |          }|sdS g d}t          |          }t          |                                          D ].\  }}|                    d          D ]I}|                    ||d         |d         |d         |                    d	|          |d
         f           J|                    d          D ]C}|                    ||d         |d         ||                    d|          |d
         f           Dt          |                    d                    t          |                    d                    z   dk    r'|                    ||d         ||||d
         f           0|                                }t          t          |	                                t                              }	t          j        dd|	          }
|                     |
|g           na# t          $ rT}|                     t          j        d                    t!          |                    dd                     Y d }~nd }~ww xY wd                    |           dz   S )N.)r   
)DeviceUpAddressMaskScopez
Hw-Addressr   r   r   r    r   r   r   r%   r   r   zNet device info+z Net device info failed ({error})error!P   )r   r
   sortedrz   r)   add_rowr^   
get_stringmaxr?   r   centerextend	Exceptionr-   formatr+   r   )linesr   netdevfieldstblr1   r~   r3   netdev_smax_lenheaderr   s               r5   netdev_pformatr     s   EE-)5)))  	4KKK&!!!&,,..11 	 	KS$(( 
 
T
T
V%00X	 	 	 	 (( 
 
T
T
511X	 	 	 	 488F##$$s488F+;+;'<'<<AA$t*eUE4>J   >>##c(--//S999::.W==fh'((((W  
 
 
K299A9GG 	
 	
 	
 	
 	
 	
 	
 	

X 99Ud""s   G5 5
I?A
IIc            
         g } 	 t                      }|                    d          rg d}t          |          }t          |                    d                    D ]M\  }}t	          |          }|                    ||d         |d         |d         |d         |d         g           N|                                }t          t          |	                                t                              }t          j        d	d
|          }	|                     |	|g           |                    d          rg d}
t          |
          }t          |                    d                    D ]S\  }}t	          |          }|d         dk    r!|                    ||d         |d         |d         |d         g           T|                                }t          t          |	                                t                              }t          j        dd
|          }	|                     |	|g           n~# t          $ rq}|                     t          j        d                    t	          |                    dd                     t          j        t"          d|z             Y d }~nd }~ww xY wd                    |           dz   S )Nr   )Router   GatewayGenmask	InterfaceFlagsr   r   r   r   r   r   zRoute IPv4 infor   r   )r   r   r   r   r   r   zRoute IPv6 infozRoute info failed ({error})r   r   r   zRoute info failed: %sr   )r   r)   r
   r>   r+   r   r   r^   r   r?   r   r   r   r   r-   r   logexcrE   r   )r   r   	fields_v4tbl_v4nrroute_idroute_sr   r   	fields_v6tbl_v6r   s                r5   route_pformatr   ?  s   E=, ::f 	,  I !++F#FJJv$6$677  Aq66 -())'
'
	 	 	 	 ''))G#g0022<<<==G[!2CAAFLL&'*+++::f 	,  I !++F#FJJv$6$677  Aq66W:%% -()'
'
    ''))G#g0022<<<==G[!2CAAFLL&'*+++w  6 6 6K-443q664BBC 	
 	
 	

 	C014555555556x 99Ud""s   H5 5
J0?A'J++J0	ci-info: c                    g }t                                                      }| r|D ]}|                    | |           n|                    |           t	                                                      }| r|D ]}|                    | |           n|                    |           d                    |          S )Nr   )r   r?   r-   r   r   r   )rP   r   netdev_linesrM   route_liness        r5   
debug_infor     s    E!##..00L #  	2 	2DLL664401111	2 	\"""//,,..K " 	2 	2DLL664401111	2 	[!!!99Ur7   )r   )r   )r'   r@   r   r   	ipaddressr   	cloudinitr   loggingr   r   cloudinit.net.network_stater	   cloudinit.simpletabler
   	getLoggerrE   r`   r6   rQ   rn   rp   r   r   r   r   r   r   r    r7   r5   <module>r     s    				         ! ! ! ! ! ! $ $ $ $ $ $                 ? ? ? ? ? ? - - - - - -g&  "25II 3 3 3lN N Nb- - -`6 6 6r- - - -`U U UpR R Rj  &1# 1# 1#h@# @# @#F     r7   