*Ce[ddlmZmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZmZmZddlZddlZddlZddlmZee edfedeeeeedfZiddd d d d d d dddd dd dd dddd d d dd dd dd ddddddddd ddd dd d dddd! ZGd"d#ZGd$d%ZGd&d'Zy)() defaultdict namedtupleN)StringIO)DictListTypeUnion)utilsJSONbondbridgedummyz dummy-deviceerspantunneletherethernetgretapipgreip6greloopbacksittuntunnel6 wireguardwlanwifiwwanmodemvethzvirtual-ethernetvlanvrfz nm-device) r!r"vxlanwifis ethernetsbridgesbondsz nm-devicesz dummy-devicesmodemsvlansvrfsc 4eZdZdedefdZggddfdededededef d Zd edefd Z d edefd Z defdZ e de fdZe de fdZe defdZe defdZe defdZe defdZe defdZe defdZe defdZy) Interfaceipreturncdt|jddx}dk(r|jSy)z Extract the MAC address if it's set inside the JSON data and seems to have the correct format. Return 'None' otherwise. addressN)lengetlower)selfr-r0s +/usr/share/netplan/netplan_cli/cli/state.py __extract_maczInterface.__extract_macLs0 "&&B//w 0B 6==? ")NNnd_datanm_data resolved_data route_datacP |jdd_|jdd_d|jdgvrdnd_|jddj _j |_d_d_ d_ g_ |xsg}tfd |Dd_ tfd |Dd_d_|d rg_|d D]}t!|d t!jk(s(|d }|d }jj#t%j&|dj)|D cgc]} | j+d dc} d_|d r]g_|d D]N} t!| d t!jk(s(j,j#t/| d Pg} d_|d r| |d z } |d r| |d z } | rg_| D]} | jdjk(s#d| jdi} | jdx} r| | d<| jdx} r| | d<| jdx} r| | d<| jdx} r| | d<| jdx} r| | d<| jdx} r| | d<| jdx} r| | d<| jdx} r| | d<j0j#| d_|jdx}rg_|D]}g}t5j6|dj8r|j#dj0rcj0D]T}d|vst5j6|dt5j6|dk(s:|dd k(sC|j#d n|dj;}|d!|d"ii} |r|| |d<j2j#| d_|jd#ijd$x}r|j?_jAjxsd%_!ycc} w)&NifindexifnameunknownUPflagsDOWN operstatec3HK|]}|djk(s|yw)IndexN)idx.0xr6s r7 z%Interface.__init__..cs KAAgJ$((4JaK""c3HK|]}|djk(s|yw)deviceNnamerJs r7rMz%Interface.__init__..ds MAAhK4994LaMrNrr r9bigdevtodstfamilygatewayviaprefsrcfrommetrictypescopeprotocoltable addr_infolocallinkdhcpprefix prefixlenlinkinfo info_kindr1)"r4rIrR adminstateupperrF_Interface__extract_mac macaddressrr r"membersnextndnm dns_addressesintappendsocket inet_ntopjointo_bytes dns_searchstrroutes addresses ipaddress ip_address is_link_localr5 iproute_typestripquery_networkctl _networkctl)r6r-r:r;r<r=itripfamilydnsv_routesobjelemvalrbaddrrDrouteip_addrris` r7__init__zInterface.__init__Usy"-)4 '+rvvgr/B'Bt ff[)<BBD#11"5  "$ -RKKTRMMtT$(  !#D $Q' ys1v;#dhh-/"1vHa&C&&--f.>.>xqtRulmSTS]S]^_afSgRuIv.wx  y !%   DO"1% 6qt9DHH -OO**3qt95 6   a= z!} $G a= z!} $G DK -775>TYY. #''%.1D!ggh//s/),X!ggi00s0&)U !ggi00s0'*V !ggh//s/),X!ggfo-s-'*V !ggg..s.(+W !ggj11s1+.Z(!ggg..s.(+W KK&&t,' -* ${+ +9 +DN! , ''W 6DDLL(;;!%&"eO ) 4 4U6] CyG[G[\`ah\iGj j$Z0F: % V 4 % & w---/(D,=!>?-2DM'*%%d+ ,""&z2.22;? ?9 ? ) 1D !% 5 5dii @ FBSvsR#con_namec d} tjddddd|g}|jS#t$r9}t j dj |t|Yd}~|Sd}~wwxYw)Nz --get-valuesz802-11-wireless.ssidconshowidz+Cannot query NetworkManager SSID for {}: {})r nmcli_outr Exceptionloggingwarningformatrz)r6rssides r7 query_nm_ssidzInterface.query_nm_ssidsx /??N4J$)64$CDD::<  / OOIPP$c!f. / /  /s*/ A1.A,,A1rAc d} tjddd|gd}|S#t$r9}tjdj |t |Yd}~|Sd}~wwxYw)N networkctlstatusz--Ttextz"Cannot query networkctl for {}: {}) subprocess check_outputrrrrrz)r6rAoutputrs r7rzInterface.query_networkctlsn !,,lHdF-SZ^_F  ! OO@GGA  ! !  !s! A#.AA#c|j|j|jd}|jr|j|d<|jr|j|d<|j r|j |d<|j r|j |d<|jr|j|d<|jr|j|d<|jr|j|d<|jr|j|d <|jr|j|d <|jr|j|d <|jr|j|d <|jr|j|d <|jr|j|d<|j r|j |d<|j"r|j"|d<|j$r|j$|d<|j&|fS)N)indexrjrFr^r tunnel_modebackendrrmvendorr|rrryr{activation_moderr r" interfaces)rIrjrFr^rrr netdef_idrmrr|rrryr{rrr r"rnrR)r6jsons r7rzInterface.jsonsXX// 9999DL 9999DL   "&"2"2D  <<"llDO >>DJ ??!%D  ;;![[DN >> $D    $($6$6D ! ??!%D  ;;![[DN   &*&:&:D" # ;;![[DN 9999DL 88((DK <>T+AAr9cB|jdk(xr|jdk(S)NrErrs r7downzInterface.downs&(ET^^v-EEr9cX|jr|jjdnd}|dk(r|jjd}|dk(r|jjdx}r|}tj|x}r|Stjdj |y)NrnoneKindrzUnknown device type: {})rpr4 DEVICE_TYPESrrr)r6nd_typekind device_types r7r^zInterface.types)-$''++f%d f ggkk&)G g ww{{6**t*&**73 3; 3 188ABr9cR|jdk(r|jr |jSy)Nr)r^rrs r7rzInterface.tunnel_modes% 99 T%6%6$$ $r9c|jr=d|jjddvrd|jjddvry|jrd|jjddvry y) N unmanaged SetupStater1run/systemd/network/10-netplan- NetworkFilenetworkd.run/NetworkManager/system-connections/netplan-filenameNetworkManager)rpr4rqrs r7rzInterface.backendsa GG477;;|R#@@1TWW[[PR5SS WWITWW[[YcegMhh#r9c|jdk(r@|jjddjddjddS|jdk(r|jjd djd djd d}|jjd dd k(rC|j |jjd}|r|jd|zd}|Sy)Nrrr1rr z.networkrrrrz .nmconnectionr^z802-11-wirelessrR-)rrpr4splitrqr)r6netdefrs r7rzInterface.netdef_ids <<: %77;;}b177133466;eJ6GK K \\- -WW[[R066@BBCEEJU?E[\]_Fww{{62&*;;))$''++f*=>#\\#*5a8FMr9c|jr:d|jvr,|jdr|jdjSy)NVendor)rprrs r7rzInterface.vendor!s: 77x477*twwx/@778$**, ,r9c|jdk(rr|jjD]U}|j}d}|j |s'|t |t d j}|r|cSdcSy)NrzWiFi access point: z (xB:SS:ID:xx:xx:xx))r^r splitlinesr startswithr3)r6linekeyrs r7rzInterface.ssid's~ 99 ((335 2zz|+??3'C#.D*E)EFLLND#'41T1  2 r9cD|jdk(rl|jjD]N}|j}d}|j |s'|t |dj}|dk7r|cSdcSy|jdk(r|j ddk(rdSdSy)NrzActivation Policy: rr autoconnectnomanual)rrrrrr3rq)r6rrmodes r7rzInterface.activation_mode4s <<: %((335 :zz|+??3'C ?002D#'4<49T9  :\\- -#ww}5=8 G4 Gr9N)__name__ __module__ __qualname__dictrzrlr tuplerrrrpropertyboolrrr^rrrrrrr9r7r,r,Ks24R(4,XG4XG$XGdXG %XGBGXGt c c ss&!d&!PBDBBFdFF c  S  3    c     r9r,c^eZdZdZddZedefdZedede fdZ ede de fd Z ede fd Zede fd Zede fd Zede fd Zede fdZedefdZedefdZede dee fdZedeeddfdZedefdZdefdZy)SystemConfigStatez- Collects the system's network configuration Nc tjdsltjdr*tjdt j dtjdtjddgd|j}|j}|r|s*tjdt j d|j}|j\}}|j\}} |D cgc]} t| |||| f||fc} |_|j!|j|jD cgc]} | j"dk7s| } } |j%| } r t'fd |jDdg} | D cgc]} | |  } } r>| gk(r9tjd j)t j dd | |j+d i|_|r |jn| }|D]$} | j/\}||j,<&ycc} wcc} wcc} w) Nzsystemd-networkd.servicez^'netplan status' depends on networkd, but systemd-networkd.service is masked. Please start it.r z3systemd-networkd.service is not active. Starting...startTz,Could not query iproute2 or systemd-networkdrEc3BK|]}|jk(s|ywNrQ)rKitfrAs r7rMz-SystemConfigState.__init__..msWcCHHPVDVcWszCould not find interface {}znetplan-global-state)online nameservers)r systemctl_is_activesystemctl_is_maskedrerrorsysexitdebug systemctlquery_iproute2query_networkdquery_nm query_routesquery_resolvedr,interface_listcorrelate_members_and_uplinkrFquery_online_staterorresolvconf_jsonstater)r6rAalliproute2rnmcliroute4route6rrryrfiltered online_stateritf_iterrs ` r7rzSystemConfigState.__init__Hs*(()CD(()CD 12 MMO P OOG&@%A4 H&&(&&(x MMH I HHQK **,$($7$7$9! zGOP?B )h z?Z*0&)9 ;P ))$*=*=>$(#6#6RC#--6:QCRR..x8  WT-@-@WY]^_H%-BT1ADBB h"n MM7>>vF G HHQK #&#335%  +.4&&8 %C((*KFC!$DJJv  %9PSCs I I+I(I0Ir.cggdd} td5}|j}d|vrd|d<n d|vrd|d<|g|jzD]Y}|jdr|d xx|j d dz cc<|jd sD|j d d|d <[ ddd|S#1swY|SxYw#t $r8}t jd jt|Yd}~|Sd}~wwxYw) N)r|searchrz/etc/resolv.confz/# This is /run/systemd/resolve/stub-resolv.confstubrz*# This is /run/systemd/resolve/resolv.confcompat nameserverr|r rz!Cannot parse /etc/resolv.conf: {}) openreadline readlinesrrrrrrrz)clsresf firstlinerrs r7rz!SystemConfigState.resolvconf_jsons  P() 9QJJL D Q"(CKAYN"*CK&K!++-79D|4K(DJJL,<<(x0(, QR(8H 9 9  9  P OO?FFs1vN O O  Ps; B?A;B2B2(B?2B<7B?<B?? D-C;;Drc|D]}|js|js|js*|js7g}|jD]>}t |j d\}}d|vsd|dvs.|j |@|jDcgc]}|jdddk(s|}}|s|s|jsyycc}w)NrrDrdrVdefaultTF)rr|r{rrlistitemsrtr4) rrr non_local_ipsrr-extrarLdefault_routess r7rz$SystemConfigState.query_online_states Cvv#--CJJ3;L;L " MM1D $TZZ\ 21 5IBe+vU7^/K%,,R01.1ZZ!Z155t;LPY;Y!!Z!Z ^8I8I "[s C2C cmd_outputc,tj|Srrloadsrrs r7process_genericz!SystemConfigState.process_genericszz*%%r9cd} tjgdd}|j|}|S#t$r8}t j dj t|Yd}~|Sd}~wwxYw)N)r--d-jrTrz(Cannot query iproute2 interface data: {})rrrrrcriticalrrzrdatarrs r7rz SystemConfigState.query_iproute2su X$112L7;=F&&v.D  X   GNNsSTvV W W  X*0 A1-A,,A1c2tj|dS)N Interfacesrrs r7process_networkdz"SystemConfigState.process_networkdszz*%l33r9cd} tjddgd}|j|}|S#t$r8}t j dj t|Yd}~|Sd}~wwxYw)Nrz --json=shortTrz(Cannot query networkd interface data: {})rrr!rrrrrzrs r7rz SystemConfigState.query_networkdsy X$11<2P7;=F''/D  X   GNNsSTvV W W  Xrc g}|jD]I}|jd}|dr|dnd}|s#|j||d|d|d|d|ddK|S) N:rr rS)rPrRuuidrr^r)rrrt)rrrrrrUs r7 process_nmzSystemConfigState.process_nms~))+ DJJsOE#Ah%(DC !!!H!!H %a!!H#(8   r9cd} tjgd}|j|}|S#t$r8}t j dj t|Yd}~|Sd}~wwxYw)N)z-tz-fz*DEVICE,NAME,UUID,FILENAME,TYPE,AUTOCONNECTrrz.Cannot query NetworkManager interface data: {})r rr)rrrrrzrs r7rzSystemConfigState.query_nmsr [//+:;F>>&)D  [ MMJQQRUVWRXY Z Z  [s(. A/-A**A/cd}d} tjgdd}|j|}tjgdd}|j|}|r2|D]-}|jdtjji/|r2|D]-}|jdtjji/||fS#t$r7}t j dj t|Yd}~d}~wwxYw)N)r-rrz-4rrrarTr)r-rrz-6rrrarz$Cannot query iproute2 route data: {}rX) rrrrrrrrzupdateruAF_INETvalueAF_INET6)rdata4data6output4output6rrs r7rzSystemConfigState.query_routess Q%223l8<>G--g6E%223l8<>G--g6E  ? h(<(<=> ?  @ h(=(=>? @u~ Q MM@GGAO P P QsAC D-DDcNd}d} tj}|jdd}tj|d}|j d}|d}|d}||fS#t $r:}t jdjt|Yd}~||fSd}~wwxYw)Nzorg.freedesktop.resolve1z/org/freedesktop/resolve1zorg.freedesktop.DBus.Propertiesz org.freedesktop.resolve1.ManagerDNSDomainsz"Cannot query resolved DNS data: {}) dbus SystemBus get_objectr,GetAllrrrrrz)rr|ripcresolve1 resolve1_ifrrs r7rz SystemConfigState.query_resolveds  O.."C~~&@B]^H..3TUK$$%GHCE I^F6"" O MM>EEc!fM N N6"" OsAA!! B$*-BB$rAc Ng}d} tjdddddd|gd }tj|}|D]"}|j|jd $|S#t$r9}tjd j t |gcYd}~Sd}~wwxYw) zO Return a list containing the interfaces that are members of a bond/bridge/vrf Nr-rrrdrmasterTrzCannot query bridge: {}rA) rrrrrrrzrrrtr4)rrArnrr output_jsonmembers r7 query_memberszSystemConfigState.query_members s ,,tT668VD4QF jj( ! 1F NN6::h/ 0 1  OO5<z@SystemConfigState.correlate_members_and_uplink..&s!&&L*@r9MemberrRr^rr r"N) rr filterrBrRrr^r4rr r"rn) rrmembers_to_uplinkuplink_to_members interfacernrA member_tupleuplinkrFs @r7rz.SystemConfigState.correlate_members_and_uplinks21 '- @*M 8I'' 7G! Y)(VV4DE ,8,X!&) Y18 inn -  8$ 0I*..y~~>>v>;;(*'-{{I$;;&(%+[[IN;;%'$*KKIM~~-/33INNCC7C(/I% 0r9c,t|jSr)r3rrs r7number_of_interfacesz&SystemConfigState.number_of_interfaces:s4&&''r9c|jSr)rrs r7get_datazSystemConfigState.get_data>s zzr9)NF)rrr__doc__r classmethodrrr rrrzr rrr!rr)rrrrrrBr,rrrsrPrRrr9r7rrEs76%p. D T  &&&&t4T44tt    U. #u # #349"0d9o0$00:(c(($r9rc0eZdZdZddZdefdZdefdZy)NetplanConfigStatez. Collects the Netplan's network configuration cRtj}|j|tj}|j ||j |_t |_|dk(r|j|jy|jdsdjd|f}tjd|}|Dcgc]}|jdd}}t }|j|tj|||jycc}w)Nr) output_filenetwork.z (?rus(0   **  T#v+ V c3tT$Z OP  F  h  ^  h   Z   h  X  h    8  h  8 x   F   G! " # $    #  ?  Fwwtzzz 5 5r9