f[ddlZddlZddlZddlmZmZddlmZddlmZm Z ddl m Z ddl m Z ejeZggddd Zd Ze j&d d dZdZdZddZdZdZdZdZdZddZy)N)copydeepcopy) IPv4Network)subputil)net_prefix_to_ipv4_mask) SimpleTableFipv4ipv6hwaddrupc 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_typeetheraddressr UPLOWER_UP)rrr r addr_infofamilyinet prefixlenz0.0.0.0/local broadcastscope)ipmaskbcastrr inet6/@)rscope6r ifname)jsonloadsgetboolstrrnetmaskappend) ipaddr_json ipaddr_datadevsdevrrdev_infoaddrr parsed_addrrs 3/usr/lib/python3/dist-packages/cloudinit/netinfo.py_netdev_info_iproute_jsonr5+s**[)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+.*r0@rr,r rrr r!z?\s+inet6\s(?P\S+)(\s(peer\s\S+))?\sscope\s(?P\S+).*z*Could not parse ip addr show: (line:%d) %sr rzd\s+inet\s(?P\S+)(\smetric\s(?P\d+))?(\sbrd\s(?P\S+))?\sscope\s(?P\S+).*cidr4r"32r r r)rr rrlinkz-\s+link/(?P\S+)\s(?P\S+).*rrr) enumerate splitlinesrematchgrouplowersplitr)LOGwarningr, groupdictpop partitionr) ipaddr_outr/dev_namenumlinemrrBr<r2_prefixs r4_netdev_info_iprouterRas2 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 Kr6ci}|jD]^}t|dk(r|ddvr?|jd}|jdr|dd}||vrt t ||<|j jj}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<a|S)Nr  :zflags=[x\d]+Trrr"r )rrrr zaddress:rr!addr:r rrscope:r$scopeid .*<(\S+)>)r@lenrEendswithrDEFAULT_NETDEV_INFOrDstriprAsearchranger,r startswithlstriprBrC) ifconfig_datar/rNcurdevtoksinetworknet_bitsaddr6ress r4_netdev_info_ifconfig_netbsdros D((*(E t9>  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  7+ %ZZ\!_Fs#T!'(;<V zz|!!#))+ 7d?!%DL Y]yy)473%)V T"s4y! EAAw& V V$++4A;--g67a##H-48GNN84LV V$R(1aK'48QKV V$R(1a##G,377>>'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' commandsr ct|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) isinstancedictitemstuplelistr? TypeError)datanew_val empty_valsmyiterkeyvalfill recurse_typess r4rznetdev_info..fill9su dD !ZZ\F udm ,t_F67 7 #HCj #S C/S'"  #r6)r)r )r r6)r is_NetBSDrrowhichr5ProcessExecutionErrorrRrqrFrGryr{r|)emptyr/ ifcfg_out_errrKrrs @@r4 netdev_infors 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. r r r ) destinationrgatewaygenmaskifacemetricUrdefault0.0.0.0rrr"r=HrviarYGr0rrr)rz --onelinez-6router|tableallrtz::/0UG::expirese) r@rrEr,rrdr_insertjoinrr) iproute_dataroutesentriesdefault_route_entryrNentryrirr2cidrrj iproute_data6_err6entries6s r4_netdev_route_info_iprouterMsFF6NF6N%%'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)Nr r rKernel DestinationInternet Internet6Routing-rYr[)rrrrrrefuser)netstatz-Ar!--route --numericrtProtoActive)rrrrrrrrlorz/128z\/128$r ) r@rEr_r,rr`rAsubr) route_datarrrNrir route_data6rrs r4_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)rz-orr|r)rrrz--extendrrYrtz;Could not print routes: missing 'ip' and 'netstat' commands)rrrrrFrG)r iproute_outr route_outs r4 route_infors F zz$"ii(EFd+K8 M I  II ;!Q D,I6 M I  Mr6c g}d} t|}|sygd}t|}t|jD]\}}|j dD]5}|j ||d|d|d|j d ||d f7|j d D]2}|j ||d|d||j d ||d f4t |j d t |j dzd k(s|j ||d||||d f|j}t t|jt } tjdd| } |j| |gdj#|dzS#t$rI} |jtjdjt!| ddYd} ~ ad} ~ wwxYw)N.)r )DeviceUpAddressMaskScopez Hw-Addressr rrrrrr r$rrzNet device info+z Net device info failed ({error})error!P)rr sortedrzr(add_rowr_ get_stringmaxr@rcenterextend Exceptionr,formatr*r) linesrnetdevfieldstblr0r~r2netdev_smax_lenheaderrs r4netdev_pformatr s E E-)5)K&!!&,,.1 KS$(  T T V %0X   (  T T 51X   488F#$s488F+;'<<A $t*eUE4>J1 6>>#c(--/S9:.W= fh'( 99U d ""Y   KK299A9G    s F G2)?G--G2c 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 )RouterGatewayGenmask InterfaceFlagsrrrrrrzRoute info formatting error: %srzRoute IPv4 inforr )rrrrrrrzRoute IPv6 infozRoute info failed ({error})rrrzRoute info failed: %sr)rr(r r?r*rKeyErrorrlogexcrFrr_rr@rrrr,rr) rr fields_v4tbl_v4nrroute_idrroute_srr fields_v6tbl_v6s r4 route_pformatrAs EC, ::f I!+F#FJJv$67 LAq6 LNN$m,EE)Y7iLgJgJ   L'')G#g002<=G[[!2CAF LL&'* + ::f I!+F#FJJv$67 LAq6W:% 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)rr@r,rrr)rQr netdev_linesrN route_liness r4 debug_infors E!#..0L   2D LL640 1 2  \"/,,.K  2D LL640 1 2  [! 99U r6)r )z ci-info: )r&loggingrArr ipaddressr cloudinitrrcloudinit.net.network_statercloudinit.simpletabler getLogger__name__rFrar5deprecate_callrRrorqrrrrrrrr6r4rs  ! ?-g!& "25I3lK K  K\-`6r-`UpRj&1#hF#Rr6