܍~cS|ddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z ddlmZmZddlmZmZejeZdZdZgdZgd Zejd fd Zd Zd[dZ d\dZd]dZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'ej(dde)fdZ*ej(dde+fdZ,de-de)fdZ.d]dZ/dZ0d Z1d]de)fd!Z2d]d"Z3d]d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9Gd)d*e:Z;d+Z< d]d,e e e-de e-fd-Z= d]d,e e e-de e-fd.Z> d]d,e e e-de e-fd/Z? d]d,e e e-de e-fd0Z@ d]d,e e e-de e-fd1ZA d]d,e e e-de e-fd2ZB d]d,e e e-de e-fd3ZC d]d,e e e-de e-fd4ZDd^d5ZEd6ZFd_d8ZGd`d:ZH dad;ZId<ZJd=ZKd]deLfd>ZMd?e-de e-fd@ZNd]deLfdAZOd]deLfdBZPd]deLfdCZQd]deLfdDZRd]de+fdEZSdFZTdGe e-efde)fdHZUdIedJe-fdKZVdJe-de)fdLZWdJe-de)fdMZXdJe-de)fdNZYdJe-de)fdOZZdJe-de)fdPZ[dJe-de)fdQZ\de)fdRZ]de-fdSZ^de_fdTZ`de_fdUZadVe-dWe-de-fdXZbGdYdZecZddS)bN)AnyCallableDictListOptional)urlparse)subputil)UrlErrorreadurlz/sys/class/net/eth0)dhcp6 ipv6_slaaczipv6_dhcpv6-statelesszipv6_dhcpv6-stateful) ovs-vsctlz--formatcsvz --no-headingsz --timeout10z --columnsnamefind interfacez type=internalz([0-9]+)c@dtj||DS)aDSorting for Humans: natural sort order. Can be use as the key to sort functions. This will sort ['eth0', 'ens3', 'ens10', 'ens12', 'ens8', 'ens0'] as ['ens0', 'ens3', 'ens8', 'ens10', 'ens12', 'eth0'] instead of the simple python way which will produce ['ens0', 'ens10', 'ens12', 'ens3', 'ens8', 'eth0'].c|g|]9}|rt|n|:S)isdigitintlower).0texts 8/usr/lib/python3/dist-packages/cloudinit/net/__init__.py z$natural_sort_key..3sG    \\^^5D    )resplit)s_nsres rnatural_sort_keyr%,s/  HUA&&   r ctS)z3Simple function to return the global SYS_CLASS_NET.) SYS_CLASS_NETrr rget_sys_class_pathr(9s r c0t|zdz|zS)N/)r(devnamepaths r sys_dev_pathr/>s   ' )C /$ 66r ct||} tj|}nx#ttf$rd}t |dd} | t jt jfvr|||cYd}~S| t j fvr|||cYd}~Sd}~wwxYw| }||S ||S#t$r4}|||cYd}~St d||d}~wwxYw)Nerrnoz5Found unexpected (not translatable) value '%s' in '%s)r/r load_fileOSErrorIOErrorgetattrr1ENOENTENOTDIREINVALstripKeyErrorLOGdebug) r-r. translate on_enoent on_keyerror on_einvaldev_pathcontentsee_errnos r read_sys_netrEBs\GT**H >(++ W !Wd++ u|U]3 3 3$ y||###### u|o % %$ y||###### ~~H ""      ";q>> ! ! ! ! ! ! IIG     sP'B7B/B5BBBB8C C> C9C>C99C>c2d}t||||||S)NcdSNFr)rCs r on_excp_falsez(read_sys_net_safe..on_excp_falsehsur )r?r>r@r=)rE)ifacefieldr=rIs rread_sys_net_saferLgs<   !    r cpt||}|durdS t|S#t$rYdSwxYwrH)rLr ValueError)rJrKvals rread_sys_net_intrPusQ E5 ) )C e||t3xx tts ' 55c2dddd}t|d|S)NTF)upunknowndown operstate)r=rL)r-r=s ris_uprWs(e<>,w99 : ::r c\tjt|dS)NbondingrZr]s ris_bondras 7>>,w :: ; ;;r cjt|d}tj|r|SdS)z8Return the master path for devname, or None if no mastermasterr.N)r/r[r.r\r,s r get_masterres4 h / / /D w~~d 4r c$t|}|dStj|d}tj|d}tj|ptj|S)z@Return a bool indicating if devname's master is a bridge or bondNFr`rY)rer[r.joinr\)r- master_path bonding_path bridge_paths rmaster_is_bridge_or_bondrkskW%%Ku7<< Y77L',,{H55K 7>>, ' ' F27>>++F+FFr ct|}|dSt|d}tj|S)z;Return a bool indicating if devname's master is openvswitchNFzupper_ovs-systemrd)rer/r[r.r\)r-rhovs_paths rmaster_is_openvswitchrnsAW%%KuG*<===H 7>>( # ##r )maxsizereturncttjd}|std|S)zDReturn a bool indicating if Open vSwitch is installed in the system.rz/device/features.r)zdevice/features)rE Exceptionr-featuress rget_dev_featuresrsCH ):;;      Os  ""cft|}|rt|dkrdS|ddkS)z Return True if VIRTIO_NET_F_STANDBY bit (62) is set. https://github.com/torvalds/linux/blob/ 089cf7f6ecb266b6a4164919a2e69bd2f938374a/ include/uapi/linux/virtio_net.h#L60 @F>1)rlenrs rhas_netfail_standby_featurers= ((H s8}}r))u B<3 r c|t|dS|t|}|dkrdSt|sdSdS)zA device is a "netfail master" device if: - The device does NOT have the 'master' sysfs attribute - The device driver is 'virtio_net' - The device has the standby feature bit set Return True if all of the above is True. NF virtio_netTrerrrs ris_netfail_masterrsS'&u ~w'' u &w / /u 4r cht|d}tj|sdS|t |}|dkrdStjtj|}t |}|dkrdSt|}|sdSdS)a7A device is a "netfail primary" device if: - the device has a 'master' sysfs file - the device driver is not 'virtio_net' - the 'master' sysfs file points to device with virtio_net driver - the 'master' device has the 'standby' feature bit set Return True if all of the above is True. rcrdFNrT)r/r[r.r\rbasenamerealpathr)r-rmaster_sysfs_pathmaster_devname master_drivermaster_has_standbys rrrs%W8<<< 7>>+ , ,u ~w'' uW%%bg&6&67H&I&IJJN!.11M $$u4^DD u 4r c|t|dS|t|}|dkrdSt|sdSdS)zA device is a "netfail standby" device if: - The device has a 'master' sysfs attribute - The device driver is 'virtio_net' - The device has the standby feature bit set Return True if all of the above is True. NFrTrrs rrr6sS'"u ~w'' u &w / /u 4r c6t|d}|r|dvrdSdS)a /* interface name assignment types (sysfs name_assign_type attribute) */ #define NET_NAME_UNKNOWN 0 /* unknown origin (not exposed to user) */ #define NET_NAME_ENUM 1 /* enumerated by kernel */ #define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */ #define NET_NAME_USER 3 /* provided by user-space */ #define NET_NAME_RENAMED 4 /* renamed by user-space */ name_assign_type)34TFrV)r-rs r is_renamedrNs2)2DEE, ::t 5r chtt|d}d|vS)Nueventz DEVTYPE=vlan)strrLrx)r-rs ris_vlanr]s1 "7H55 6 6F V..00 00r cd}t|d}tj|r1tjtj|}|S)z8Return the device driver for net device named 'devname'.Nz device/driver)r/r[r.islinkrreadlink)r-r driver_paths rrrbsP Fw88K w~~k""<!!"+k":":;; Mr c2t|d}|durdS|S)z;Return the device id string for net device named 'devname'.z device/deviceFNrV)r-dev_ids r device_devidrms$ w 8 8F t Mr cPtjstjr-tt S t jt}n0#t$r#}|j tj krg}nYd}~nd}~wwxYw|SN) r is_FreeBSDis_DragonFlyBSDlistget_interfaces_by_macvaluesr[listdirr(r3r1r6)devsrCs rget_devicelistrvs 6D0226)++2244555z,..//  7el " "DD  DDDD Ks A66 B#BB#ceZdZdZdS) ParserErrorz6Raised when a parser has issue parsing a file/content.N)__name__ __module__ __qualname____doc__rr rrrs@@@@r rcf|rt|tsdS|ddkS)NFconfigdisabled) isinstancedictget)cfgs ris_disabled_cfgrs7 jd++u 778   **r blacklist_driversctjstjrt|Stjstjrt |St|S)zqGet the list of network interfaces viable for networking. @return List of interfaces, sorted naturally. )r rrfind_candidate_nics_on_freebsd is_NetBSD is_OpenBSD(find_candidate_nics_on_netbsd_or_openbsdfind_candidate_nics_on_linuxrs rfind_candidate_nicsrsp ?D022?-.?@@@   ?T_..?78IJJJ+,=>>>r ctjstjrt|Stjstjrt |St|S)z.Get the name of the 'fallback' network device.)r rrfind_fallback_nic_on_freebsdrr&find_fallback_nic_on_netbsd_or_openbsdfind_fallback_nic_on_linuxrs rfind_fallback_nicrsp =D022=+,=>>>   =T_..=56GHHH)*;<<.s5   ~~j&8&8~ ~~r z4Found unstable nic names: %s; calling udevadm settlez!Waiting for udev events to settle)funcrz%Ignoring interface with %s driver: %saddressz"Ignoring interface without mac: %svethzIgnoring veth interface: %szIgnoring bridge interface: %szIgnoring bond interface: %szIgnoring failover interface: %scarrierzInterface has no carrier: %sdormantrU)rrTlowerlayerdownrSzInterface ignored: %srr)r get_cmdliner;r<rrlog_timeudevadm_settlerrL startswithr^rarrPappendrr%DEFAULT_PRIMARY_INTERFACEremoveinsert) runstablemsg connectedpossibly_connectedrrrrrUsorted_interfaces interfacess rrrs# $*,,,, MNNNN  (**    x== D IIF   6C M#)St/B C C C CI#%%)6)6    y)) & & & II7     I66  II:I F F F     ' '  II3Y ? ? ?  Y    II5y A A A  9    II3Y ? ? ?  ) $ $  II7 C C C "9i88     Y ' ' '  0)<<<#9i88    % %i 0 0 0 %i== H H H  % %i 0 0 0  )95555 "45(( J,<=== $ 2 2   7 8 8 8   a!: ; ; ;Z' r c8t|}|r|dSdS)zGet the 'fallback' network device name on Linux. @param blacklist_drivers: Ignore devices with these drivers. @return List of sorted interfaces. rN)rrs rrr>s( )): ; ;E Qx 4r c|sd}t|}|sdSt|rd|i}n$dt|di}d||d}|rt |}|r ||d d <||id d }|S) zBGenerate network cfg v2 for dhcp on the NIC most likely connected.FrNr macaddressrT)dhcp4set-namematchrr) ethernetsversion)rrrLrr)r config_driver target_namerrrnconfs rgenerate_fallback_configrMs  #6GHHHK t%% % +KCCIIKK kE B BC,{++  ,%+CL "&, ; ;E Lr cd}d}|d}|dkr ||S|dkr ||Std|z)Ncg}|diD]}|ddkr|d}|s4|d}|did}|did}|st|}|st|}|||||g|S) Nrtypephysical mac_addressrparamsr device_id)rrrr)netcfgphysdevsentmacrrrs r _version_1z$extract_physdevs.._version_1hs::h++ < >I -&t,, /(.. OOS$ : ; ; ; ;r cg}|diD]}|d}|s|did}|sF|did}|did}|st|}|st|}|||||g|S)Nrrrrrr)rrrrr)rrrrrrrs r _version_2z$extract_physdevs.._version_2zs::k2..5577 < >K  <:;; ;t ) ##r Tc i}tD]2\}}}}d||||t|d||<3|rtjd}t jgdd\}}t jgdd\} }t } || fD]*} | || +| D]} | dd up | d | v| d <|S) aCollect information necessary for rename_interfaces. returns a dictionary by mac address like: {name: { 'downable': None or boolean indicating that the device has only automatically assigned ip addrs. 'device_id': Device id value (if it has one) 'driver': Device driver (if it has one) 'mac': mac address (in lower case) 'name': name 'up': boolean: is_up(name) }} N)downablerrrrrRz[0-9]+:\s+(\w+)[@:])ipz-6addrshow permanentscopeglobalTcapture)r#z-4r$r%rRFrr") get_interfacesrrWr!compiler setupdatefindallr) check_downablecur_inforrrrnmatchipv6r}ipv4nics_with_addresses bytes_outds r_get_current_rename_infor8sBH*8*:*:  &sFI"99;;++   233Y H H H   dY;;;TJJJ d!ee B BI  & &v~~i'@'@ A A A A""  A$5 HAfI5H$H jMM Or c  t|stddS|t}i|D]U\}}|}|dr|d|d<||d<||<Vtdfd}d}d} d} g} g} g} |}d }d }d  fd }|D]\}}}}|r|}g}||||}|s|r| d |d|dN|d}||krj|s|r| d |d|d|drad}|ds|r| ||||fzd|d<|d|||ff| d|||ff||vr||}|drCd}|ds|r| ||||fz1|d|||ffd}|||vr|dz }||z}| ||v|d||||ff||d<|}|dr| d|||ff|d|||d|ff||d<|}| |z } || | d}t| t| zdkrGt| rtd|ntd|ntd|| | z| | zD]Z\}}}} |||!#t$r-}| d||d|d|d | Yd}~Sd}~wwxYwt| r"td! | dS)"Nzno interfaces to renamerrzDetected interfaces %scZtdDS)Nc3*K|]}|d|fVdS)rNr)rdatas r z<_rename_interfaces..update_byname..s+GGTT&\4(GGGGGGr )rr)bymacr1s r update_bynamez)_rename_interfaces..update_bynames*GGX__5F5FGGGGGGr c>tjddd|d|gddS)Nr#linkr-rTr)r )curnews rrenamez"_rename_interfaces..renames* 4VS94HHHHHHr c<tjddd|dgddS)Nr#rAr-rTTr)rBrs rrTz _rename_interfaces..downs( 4f5tDDDDDDr c<tjddd|dgddS)Nr#rAr-rRTr)rBrGs rrRz_rename_interfaces..ups( 4d3TBBBBBBr z cirename%dc|r(|r&|r$|d|ko|d|ko |d|kS|r|r|d|ko |d|kS|r |d|kSdS)zmatch if set and in datarrrFr)r<rrrs r entry_matchz'_rename_interfaces..entry_matchs  &6 &i &U s"3Nf,3%2   &V &;#%B$x.F*B B  &;#% %ur c fdD}t|r9t|dkrd|dddd }t||dSdS) Nc0g|]}||Srr)rr<rrrKrs rrz:_rename_interfaces..find_entry..s?   {4fi88    r rz2Failed to match a single device. Matched devices "z" with search values "(mac:z driver:z device_id:z)"r)rrrN)rrrrrr1rKs``` r find_entryz&_rename_interfaces..find_entrys        ))    u:: 5zzA~~~uuccc6669996 !oo%8Otr z$[nic not present] Cannot rename mac=z to z, not available.rRz*[busy] Error renaming mac=%s from %s to %sr"FrTz2[busy-target] Error renaming mac=%s from %s to %s.rrE)rErTrRrz(unable to do any work for renaming of %sz$no work necessary for renaming of %sz$achieving renaming of %s with ops %sznknown] Error performing z for z, z:  ) rr;r<r8itemscopyrrrrrg)!renamesstrict_present strict_busy current_inforr<rCr?rErTrRopserrorsups cur_byname tmpname_fmttmpirNrnew_namerrcur_opscur_namertargettmp_nameopmapoprrCr1rKs! @@r_rename_interfacesrcs w<< +,,,/11 H"((** diikk 775>> ,U))++CJF II&111HHHHHIIIEEECCC C F Cx((JK D   $-4==(Xvy  ))++Cjfi00   *-##xxx9 776?? x      *-##xxx9  t9 ;>Cz? CMM#h(A"ABBBCI NNFCH;? @ @ @ JJc8h[9 : : : z ! !)Fd| IJj)I"G cS(H,E&EFFFNNFCH;#GHHHH"h*&<&< &-"h*&<&< NNHc8h5IJ K K K%F6N&x00Jd| ? D#x(=>>>#x#f+x1HIJJJF "]8,,  wt2 6 6E 3xx#c((a v;; G II@' J J J J II D w}}\&/::;;++ VT * **r ct|ddkr*t|}|r|r|dd|ddz}|SdS)zReturns the string value of an Infiniband interface's hardware address. If ethernet_format is True, an Ethernet MAC-style 6 byte representation of the address will be returned. r 32$i3N)rLrg)rethernet_formatrs rget_ib_interface_hwaddrrms\ ((D00''  )? )bf+BCC(C 10r ctjstjrt|Stjrt |Stjrt|St|S)Nr) r rr get_interfaces_by_mac_on_freebsdrget_interfaces_by_mac_on_netbsdr get_interfaces_by_mac_on_openbsdget_interfaces_by_mac_on_linuxrs rrrs  D022 //         ./        //    ./    r rctD]3\}}||kr|cS4dSr)rrPr)r interface_macinterface_names rfind_interface_name_from_macrvs])>)@)@)F)F)H)H""% ~ 99;;---// / /! ! ! ! 0 4r ctjgd\}}d}d}d|||D}|S)N)r-arc3Kd}|dD]%}|dr||z }|r|V|}&|VdS)Nr)rO )r"r)r| curr_blocklines rflattenz1get_interfaces_by_mac_on_freebsd..flattensq IIdOO " "Dt$$ "d" %$$$$! r c3K|D]E}tjd|}|r,|d|dfVFdS)Nz2^(?P\S*): .*ether\s(?P[\da-f:]{17}).*rr)r!searchgroup) flat_listblockms rfind_macz2get_interfaces_by_mac_on_freebsd..find_macsg : :E EuA :wwu~~qwwx'8'89999  : :r ci|]\}}|| Srr)rrrs r z4get_interfaces_by_mac_on_freebsd..sEEE{sFsFEEEr rB)rr|_r}rresultss rrorosgy44455HS!   :::FEhhwws||.D.DEEEG Nr ci}d}tjddg\}}tjdd|}|D]>}tj||}|r%|}|d||d<?|S)NzE(?P\w+).*address:\s(?P([\da-f]{2}[:-]){5}([\da-f]{2})).*rrx\n\s+ rrr r!subrxr groupdict rrtre_field_matchr|rif_linesr|rfieldss rrprp C 6y*d+,,HS!vhS))4466H22 H^T * *  2[[]]F!'!1Cu  Jr ci}d}tjddg\}}tjdd|}|D]>}tj||}|r%|}|d||d<?|S)NzC(?P\w+).*lladdr\s(?P([\da-f]{2}[:-]){5}([\da-f]{2})).*rrxrrrrrrs rrqrqrr c $i}i}t|D]\}}}}||vrd}d|d||d|d}|||kru||dkr.t|d|d |d||d ze|dkr5d }t|d||d ||d|d z|rt||||<|||<t |d} | r-| |vr||| <td ||| | |S) zmBuild a dictionary of tuples {mac: name}. Bridges and any devices that have a 'stolen' mac are excluded.rTduplicate mac found! both '' and ' ' have mac 'z'. hv_netvscz Ignoring 'z' due to driver 'z' having driver hv_netvsc.Fz^Ethernet and InfiniBand interfaces have the same address both '%s' and '%s' have address '%s'.)r+r;warningrrm) rrt driver_maprrr_devidraise_duplicate_mac_errorrib_macs rrrrrsCJ%3+&&&II!c66 #::(, % %CCC((c?k11KK44S33 [((05-KKs888Z___ddd<< ) ("3'''C 3 )t44  *S  "F  =K  Jr c Zg}|g}t}dd}|D]}t|st|r"t |r2t |rBt |t|st|spt|rt|}|s|dkr||dt|krt|rt|}||vr||||t|f|S)zReturn list of interface tuples (name, mac, driver, device_id) Bridges and any devices that have a 'stolen' mac are excluded.N:)00rrrrrrrrrrrrrrrr)rrgr r^rrarerkrnrrgrrrrr)rrtrzero_macrrrs rr+r+9sh C    Dxx %%H<<$T**   T??   4==   4==   d   '+ +D11  $    %%   4< "255.255.255.0" Also supports input as a string.0.0.0.0/)rrrnetmask)prefixs rnet_prefix_to_ipv4_maskrs) y$%8%8%899A B BBr c:tjd|jS)aConvert an ipv4 netmask into a network prefix length. If the input is already an integer or a string representation of an integer, then int(mask) will be returned. "255.255.255.0" => 24 str(24) => 24 "24" => 24 r)rr prefixlen)masks ripv4_mask_to_net_prefixrs!   14 1 1 2 2 < 48 "48" => 48 z::/rrzInvalid network mask '%s') rrrrNrrmin IPV6LENGTH bit_length)rrrmask_inttrailing_zeroes leading_onesall_oness ripv6_mask_to_net_prefixrs (t66@       "4((G7||H1}}yHqL9EEGGO.L$6IY!#Hx4t;<<< s  --rr#c\ttj|d|djS)zCGet string representation of broadcast address from an ip/mask pairr+Fr)rrrbroadcast_address)rr#s rmask_and_ipv4_to_bcast_addrr>s4 nndnnU;;;M  r ceZdZdS)RendererNotFoundErrorN)rrrrr rrrEsDr r)r))NNNNr)NN)F)T)TTN)er1 functoolsrloggingr[r!typingrrrrr urllib.parser cloudinitr r cloudinit.url_helperr r getLoggerrr;r'rrrwr,r%r(r/rErLrPrWr^rarerkrn lru_cacherrrurrrrrrrrrrrrrrrrrrrrrrrrrrrrr r8rcrgrmrrrvrorprqrrr+rrrrrrrrrrrrrrrrrrr rrs  66666666666666!!!!!! 22222222g!!! " % % %!)bj44     7777 """"J    HHH;;;<<<GGG$$$T"""$#"T""" T   #" ( s t           t0B0   111    AAAAA)AAA+++.2 ? ?S * ? #Y ? ? ? ? .2 = =S * = c] = = = =.2JJS *J #YJJJJ.2  S *  c]     .2JJS *J #YJJJJ&.2  S *  c]     .2WWS *W #YWWWWv.2  S *  c]    4-G-G-G`$$$$(++++^BF\+\+\+\+~+++     T    &chsm8  t           PPdPPPPf((d((((V    $4S>$d$$$$N(S& B3 B4 B B B B CS CT C C C C CS CT C C C C P3 P4 P P P P S T     S T     d    CsCCCC =S = = = = S    Fcss     L     r