܍~cKZddlZddlZddlmZmZddlmZddlmZddlm Z m Z ddl m Z ddl mZejZggdd d Zd Zd Zd ZdZddZdZdZdZdZdZddZdS)N)copydeepcopy) IPv4Network)log)subputil)net_prefix_to_ipv4_mask) SimpleTableFipv4ipv6hwaddrupc tj|}i}|D]}d|vr|dng}|ddkr|dnd}|td|vod|vggd}|d gD]3}|d d krd |vr*t t d |d jnd}|dd||dd|ddd} |d| |d dkr||dd} | r0|ds| d|d d} | |ddd} |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_typeetheraddressr UPLOWER_UP)rrr r addr_infofamilyinet prefixlenz0.0.0.0/local broadcastscope)ipmaskbcastrr inet6/@)rscope6rifname)jsonloadsgetboolstrrnetmaskappend) ipaddr_json ipaddr_datadevsdevrrdev_infoaddrr parsed_addrrs 3/usr/lib/python3/dist-packages/cloudinit/netinfo.py_netdev_info_iproute_jsonr6+s*[))K D%'%' '3G B$'GGK$8$8G$C$C#i..tu}<u)<==    GGK,, 5 5Dxx!!V++#d** $BtK/@$B$BCCKLLL ((7B// !XXk266!XXgr22   '' 4444h7**XXgr** =dhhy11=<<+r!:!:<[^:]+):\s+<(?P\S+)>\s+.*r1@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) %srrzd\s+inet\s(?P\S+)(\smetric\s(?P\d+))?(\sbrd\s(?P\S+))?\sscope\s(?P\S+).*cidr4r#32r r!r)rr!r rlinkz-\s+link/(?P\S+)\s(?P\S+).*rrr) enumerate splitlinesrematchgrouplowersplitr*LOGwarningr- groupdictpop partitionr ) ipaddr_outr0dev_namenumlinemrrAr;r3_prefixs r5_netdev_info_iprouterQas DHz446677@@ T HF M M > wwu~~++--33C88;HGGG$$**3//E45=@Z5-@AA DNN __. A   @#t N6 " ) )!++-- 8 8 8 8 t^^- A  @#tKKMMEIIg&&E#ooc22OD!V  N6 " ) )/4W~EU7^^23F;;"7^     t^^@$A  @#tww{##w..+,778+<+<Xx((+-Xx((  Kr7ci}|D]=}t|dkr|ddvrT|d}|dr |dd}||vrt t ||<|}t|dkr&tj d|dr d||d<tt|D]9}||d krS||dzd \}}||d  |t|d b||d kr!||dz||d dd<||dkr||dz||d<||dkrj||dzdkr-||d d||dzi||d d||dzi&||dkrB||dddd z||dzz}|||ddd<t|| dr2||d||ddd<||dkrltjd||dz} | r,| d||ddd<||dz||ddd<;?|S)Nr  :zflags=[x\d]+Trrr#r )rr rr!zaddress:rr"addr:rrrscope:r%scopeid .*<(\S+)>)r?lenrDendswithrDEFAULT_NETDEV_INFOrCstripr@searchranger-r startswithlstriprArB) ifconfig_datar0rMcurdevtoksinetworknet_bitsaddr6ress r5_netdev_info_ifconfig_netbsdrnsm D((**(E(E t99>>  7+ % %ZZ\\!_Fs## %T!!'(;<<V zz||!!##))++ t99q==y.Q88 *%)V T"s4yy!! E EAAw&  $(QK$5$5c$:$:!V V$++",CH,M,MNNaK''48QKV V$R(11aJ&&)-a!eV X&&aG##A;'))L(//tAE{0CDDDDL(//tAE{0CDDDDaK''V V,R06>  7+ % %ZZ\\!_Fs## %T!!'(;<<V zz||!!##))++ 7d??!%DL  YY]]y)4733 *%)V T"s4yy!! E EAAw&  V V$++4A;--g667a##H-- E48GNN84L4LV V$R(11aK''48QKV V$R(11a##G,, E377>>'3J3JV V$R(00aI%%37A;V V$R(00aH$$Q7(:(:)-a!eV X&&aG##A;'))L(//tAE{0CDDDDL(//tAE{0CDDDDaK''V V,R06Could not print networks: missing 'ip' and 'ifconfig' commandsr r r7c.t|tr|}n;t|ttfrt |}nt d|D]+\}}||vr|||<t|r ||,dS)zQRecursively replace 'empty_vals' in data (dict, tuple, list) with new_valzUnexpected input to fillN) isinstancedictitemstuplelistr> TypeError)datanew_val empty_valsmyiterkeyvalfill recurse_typess r5rznetdev_info..fill7s dD ! ! 8ZZ\\FF udm , , 8t__FF677 7 # #HCj  #S C// #S'"""  # #r7)r)r rv)r is_NetBSDrrnwhichr6ProcessExecutionErrorrQrprErFryr{r|)emptyr0 ifcfg_out_errrJrrs @@r5 netdev_infors D ~  Iz4&8q!fEEED+I66 D    4!%+C+C+C!D!D Z,Z88DD) 4 4 4!%+A+A+A!B!B Z' 33DDD 4 J    Iz4&8q!fEEED$Y// L    {{ 5$'M#######  Du Ks(B7B=<B=ci}g|d<g|d<|}ddddddd}|D]o}t|}|s|}dg}|ddkr d|d <d|d <nvd |dvr|dd \}} n1|d}d } |d t | |d <||d <t | |d <d|d<t t |D]f} || dkr$|| dz|d<|dd|| dkr|| dz|d<|| dkr|| dz|d<gd||d<|d|q tj gdddg\} } | } | D]}i}|s|}|ddkr d|d <d|d<n|d|d <d|d<d|d<t t |D]o} || dkr|| dz|d<d|d<|| dkr|| dz|d<|| dkr|| dz|d<|| dkr|ddz|d<p|d|n#tj $rYnwxYw|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 rr ) destinationrgatewaygenmaskifacemetricUrdefaultz0.0.0.0rrr#r<HrviarXGr1rrr)rz --onelinez-6router|tableallrsz::/0UGz::expirese) r?rrDr-r rcr^insertjoinrr) iproute_dataroutesentriesdefault_route_entryrMentryrhrr3cidrri iproute_data6_err6entries6s r5_netdev_route_info_iprouterKsFF6NF6N%%''G %%())  zz|| 7i  #,E- (E)  d1g~~#Aw}}S11 ttAw S!!!#:4#@#@i #'E- 6t< > >QF   e ))++ ) )D ::<J>>##c(--//S999::.W== fh'((((W     K299A9GG           X 99U  d ""sG55 I?A IIc g} t}|drgd}t|}t|dD]M\}}t |}|||d|d|d|d|dgN|}tt| t}tj d d |} | | |g|d rgd } t| } t|d D]S\}}t |}|dd kr!| ||d|d|d|dgT| }tt| t}tj dd |} | | |gn~#t$rq} |tj dt | ddtjt"d| zYd} ~ nd} ~ wwxYwd|dzS)Nr )RouterGatewayGenmask InterfaceFlagsrrrrrrzRoute IPv4 inforr)rrrrrrzRoute IPv6 infozRoute info failed ({error})rrrzRoute info failed: %sr)rr)r r>r+rrr^rr?rrrrr-rlogexcrEr) rr fields_v4tbl_v4nrroute_idroute_srr fields_v6tbl_v6rs r5 route_pformatr?s E=, ::f   ,I!++F#FJJv$6$677  Aq66 -() ) ' '     ''))G#g0022<<<==G[!2CAAF LL&'* + + + ::f   ,I!++F#FJJv$6$677  Aq66W:%% -() ' ' ''))G#g0022<<<==G[!2CAAF LL&'* + + +w 666 K-443q664BBC     C01455555555 6x 99U  d ""sH55 J0?A'J++J0 ci-info: cg}t}|r|D]}|||n||t }|r|D]}|||n||d|S)Nr)rr?r-rrr)rPr netdev_linesrM route_liness r5 debug_infors E!##..00L #  2 2D LL66440 1 1 1 1 2  \"""//,,..K " 2 2D LL66440 1 1 1 1 2  [!!! 99U  r7)r )r)r'r@rr ipaddressr cloudinitrloggingrrcloudinit.net.network_stater cloudinit.simpletabler getLoggerrEr`r6rQrnrprrrrrrrr7r5rs !!!!!!$$$$$$ ??????------g& "25II333lNNNb---`666r----`UUUpRRRj&1#1#1#h@#@#@#Fr7