x[hF`PddlZddlZddlZddlmZmZddlmZddlmZm Z m Z ddl m Z m Z mZddlmZddlmZej&eZggdd d ZGd d e Zd Ze j2dddZdZdZ ddeeeeefffdZdZdZ dZ!dZ"dZ#ddZ$y)N)copydeepcopy) IPv4Network)DictList TypedDict) lifecyclesubputil)net_prefix_to_ipv4_mask) SimpleTableFipv4ipv6hwaddrupcBeZdZUeed<eed<eeed<eeed<y) InterfacerrrrN)__name__ __module__ __qualname__bool__annotations__strrdict3/usr/lib/python3/dist-packages/cloudinit/netinfo.pyrr,s  H K t* t*rrc tj|}i}|D]X}d|vr|dng}|jddk(r|dnd}|td|vxrd|vggd}|jd gD]}|jd d k(rvd |vr$t t d |d j nd}|jdd||jdd|jddd} |dj| |d dk(s|jdd} | r(|jds| d|jd d} | |jddd} |dj| |||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_typeetheraddressrUPLOWER_UP)rrrr addr_infofamilyinet prefixlenz0.0.0.0/local broadcastscope)ipmaskbcastr-rinet6/@)r.scope6rifname)jsonloadsgetrrrnetmaskappend) ipaddr_json ipaddr_datadevsdevr!r$dev_infoaddrr/ parsed_addrr.s r_netdev_info_iproute_jsonrB3s**[)K D%' '3G B$'GGK$8G$C#i.tu}<u)<=   GGK, 5Dxx!V+#d* htK/@.A$BCKKL ((7B/ !XXk26!XXgr2   '' 4h7*XXgr* dhhy14q+r!: ;[^:]+):\s+<(?P\S+)>\s+.*r>@rr!,rr%r&rr1z?\s+inet6\s(?P\S+)(\s(peer\s\S+))?\sscope\s(?P\S+).*z*Could not parse ip addr show: (line:%d) %srr)zd\s+inet\s(?P\S+)(\smetric\s(?P\d+))?(\sbrd\s(?P\S+))?\sscope\s(?P\S+).*cidr4r232rr0r-)r.r0r/r-linkz-\s+link/(?P\S+)\s(?P\S+).*r"r#r) enumerate splitlinesrematchgrouplowersplitrLOGwarningr: groupdictpop partitionr ) ipaddr_outr=dev_namenumlinemr!rNrHr@_prefixs r_netdev_info_iprouter^is2 DHz4467@ T HHF M wwu~++-33C8;HGGG$**3/E45=@Z5-@A DN _. A  @#t N6 " ) )!++- 8 t^- A @#tKKMEIIg&E#ooc2OD!V N6 " ) )/4W~U7^23F;"7^  t^@$A @#tww{#w.+,778+<Xx(+-Xx( A@B Krci}|jD]R}|s|ddvr?|jd}|jdr|dd}||vrtt||<|j j j}t|dkDr!tjd|drd|d<tt|D]}||d k(r>||dzjd \}}|d j|t|d J||d k(r||dz|d dd<g||dk(r||dz|d<~||dk(rK||dzdk(r |djd||dzi|djd||dzi||dk(r*|dddd z||dzz}|||ddd<||jdr"||jd|ddd<9||dk(sCtjd||dz} | r| j!d|ddd<||dz|ddd<U|S)Nr  :zflags=[x\d]+Trr)r2r)r.r/r,r0zaddress:rr1addr:rr.r*scope:r4scopeid .*<(\S+)>)rLrQendswithrDEFAULT_NETDEV_INFOrPstriplenrMsearchranger:r startswithlstriprNrO) ifconfig_datar=rZcurdevtoksinetworknet_bitsaddr6ress r_netdev_info_ifconfig_netbsdr{s D((*(E  7+ %ZZ\!_Fs#T!'(;<V zz|!!#))+ t9q=yy.Q8%)V T"s4y! EAAw& $(QK$5$5c$:!V V$++",CH,MNaK'48QKV V$R(1aJ&)-a!eV X&aG#A;')L(//tAE{0CDL(//tAE{0CDaK'V V,R06>'3JV V$R(0aI%37A;V V$R(0aH$Q7(:)-a!eV X&aG#A;')L(//tAE{0CDL(//tAE{0CDaK'V V,R06Could not print networks: missing 'ip' and 'ifconfig' commandsrct|tr|j}n-t|ttfr t |}n t d|D]%\}}||vr|||<t|s||'y)zQRecursively replace 'empty_vals' in data (dict, tuple, list) with new_valzUnexpected input to fillN) isinstanceritemstuplelistrK TypeError)datanew_val empty_valsmyiterkeyvalfill recurse_typess rrznetdev_info..fillgsu dD !ZZ\F udm ,t_F67 7 #HCj #S C/S'"  #r)r)r)rr)r is_NetBSDr r{whichrBProcessExecutionErrorr^r}rRrSrrr)emptyr= ifcfg_out_errrWrrs @@r netdev_infor%sN D ~~ IIz4&8q!fED+I6 D  4!%+C!D Z,Z8D J  IIz4&8q!fED$Y/ L  { 5$'M#  u KG)) 4!%+A!B Z' 3D 4s%C>>8D98D9ci}g|d<g|d<|j}ddddddd}|D]!}t|}|s|j}dg}|ddk(r d|d <d|d <n]d |dvr|djd \}} n&|d}d } |jd t | |d <||d <t | |d <d|d<t t |D]N} || dk(r|| dz|d<|jdd|| dk(r || dz|d<|| dk(sD|| dz|d<Pdj||d<|dj|$ tjgdddg\} } | j} | D]}i}|s|j}|ddk(r d|d <d|d<n|d|d <d|d<d|d<t t |D]T} || dk(r|| dz|d<d|d<|| dk(r || dz|d<|| dk(r || dz|d<|| dk(sJ|ddz|d<V|dj||S#tj$rY|SwxYw)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. rrr) destinationr!gatewaygenmaskifacemetricUrdefault0.0.0.0rrr2rIHrviareGr>rrr!)r.z --onelinez-6routertableallrz::/0UG::expirese) rLrrQr:r rprninsertjoinr r) iproute_dataroutesentriesdefault_route_entryrZentryrur!r@cidrrv iproute_data6_err6entries6s r_netdev_route_info_iprouter{sFF6NF6N%%'G %() zz| 7i #,E- (E) d1g~#Aw}}S1 tAw S!#:4#@i #'E- 6t>IIc i}g|d<g|d<|j}|D]}|s|j}t|dks(|ddk(s |ddk(s|ddk(s|ddk(s|dd k(rMt|d kr/|jd |jd |d |d <d |d <|d|d|d|d|d|d |d|d d}|dj| t jgdddg\}}|j}|D]}|s|j}t|d ks(|ddk(s |ddk(s|ddk(s|ddk(s|ddk(rM|d|d|d|d|d|d |dd}|ddk(ru|dj drt jdd|d|d<|dj||S#tj$rY|SwxYw)NrrrKernel DestinationInternet Internet6Routing-rerg)rrrr!rrefuser)netstatz-Ar1--route --numericrProtoActive)rrr!rrrrrlorz/128z\/128$r) rLrQrnr:r rkrMsubr) route_datarrrZrur route_data6rrs r_netdev_route_info_netstatrsv FF6NF6N##%G#% zz| IMAw("Aw-'Aw*$Aw+%Aw)#  t9q= KK  KK 1gDGDG7AwAw!W1g77!W   ve$G#%J&)#yy >QF e ))+ )D:: MG  % %  D MG s#GG('G(c,i}tjdr'tjgd\}}t|}|Stjdr+tjgdddg\}}t|}|Stj d|S) Nr.)r.z-orrr)rrrz--extendrrerz;Could not print routes: missing 'ip' and 'netstat' commands)r rrrrRrS)r iproute_outr route_outs r route_infor(s F zz$"ii(EFd+K8 M I  II ;!Q D,I6 M I  Mrc g}d} t|}|sygd}t|}t|jD]\}}|j d}|D]5}|j ||d|d|d|j d ||d f7|j d } | D]2}|j ||d|d||j d ||d f4|r| r|j ||d||||d f|j } tt| jt } tjdd| } |j| | gdj#|dzS#t$rI} |jtjdjt!| ddYd} ~ ad} ~ wwxYw)N.)r )DeviceUpAddressMaskScopez Hw-Addressrrr.r/r-rrr4rzNet device info+z Net device info failed ({error})error!P)rr sortedrr8add_row get_stringrnmaxrLr centerextend Exceptionr:formatrr)linesrnetdevfieldstblr>r ipv4_addrsr@ ipv6_addrsnetdev_smax_lenheaderrs rnetdev_pformatr;s E E0)5)K&! / IC&)J"  T T V %0X   &)J"  T T 51X    $t*eUE4>J7 <>>#c(--/S9:.W= fh'( 99U d ""_   KK299A9G    s E11 G:?F>>Gc g} t}|jdrgd}t|}t|jdD]D\}}t |} |j ||d|jdd|d|d|dgF|j}tt|jt } tjd d | } |j| |g|jd rgd} t| } t|jd D]I\}}t |}|ddk(r | j ||d|jdd|d|dgK| j}tt|jt } tjdd | } |j| |g dj'|dzS#t $r(}tjtd |zYd}~d}~wwxYw#t $r(}tjtd |zYd}~#d}~wwxYw#t $rf}|j#tjdj%t |ddtjtd|zYd}~d}~wwxYw)Nr)RouterGatewayGenmaskrFlagsrrrrrr!zRoute info formatting error: %srzRoute IPv4 inforr)rrrrrrrzRoute IPv6 infozRoute info failed ({error})rrrzRoute info failed: %sr)rr8r rKrrKeyErrorr logexcrRrrnrrLrrrr:rr) rr fields_v4tbl_v4nrroute_idrroute_srr fields_v6tbl_v6s r route_pformatrrs EC, ::f I!+F!&**V"45 L1q6 LNN$m,EE)Y7iLgJgJ   L'')G#g002<=G[[!2CAF LL&'* + ::f I!+F!&**V"45 L1q6W:% LNN$m,EE)T2gJgJ   L '')G#g002<=G[[!2CAF LL&'* + 99U d ""G LKK%F%JKKL: LKK%F%JKKLy 6 KK-443q64BC  C01455 6sH I3G./H". H7HH" I+II KAKKcHg}tj}|r|D]}|j||n|j|t j}|r|D]}|j||n|j|dj |S)Nr)rrLr:rrr)r]r netdev_linesrZ route_liness r debug_infors E!#..0L   2D LL640 1 2  \"/,,.K  2D LL640 1 2  [! 99U r)r)z ci-info: )%r6loggingrMrr ipaddressrtypingrrr cloudinitr r r cloudinit.net.network_stater cloudinit.simpletabler getLoggerrrRrlrrBdeprecate_callr^r{r}rrrrrrrrrrrrs  !((++?-g!& "25I 3lK K  K\-`6t S #tCN# #$SlUpRj&4#nF#Rr