
    *Ce[                        d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZmZmZmZ d dlZd dlZd dlZddlmZ eeedf   ed   eeeeed   f   Zi ddd	d	d
ddddddddddddddddddddddddddddddddddd	dd ddddd!Z G d" d#      Z G d$ d%      Z G d& d'      Zy)(    )defaultdict
namedtupleN)StringIO)DictListTypeUnion   )utilsJSONbondbridgedummyzdummy-deviceerspantunneletherethernetgretapipgreip6greloopbacksittuntunnel6	wireguardwlanwifiwwanmodemvethzvirtual-ethernetvlanvrfz	nm-device)r!   r"   vxlanwifis	ethernetsbridgesbondsz
nm-deviceszdummy-devicesmodemsvlansvrfsc                   4   e Zd ZdedefdZg g ddfdededededef
d	Zd
edefdZ	dedefdZ
defdZedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zy)	Interfaceipreturnc                 d    t        |j                  dd      x}      dk(  r|j                         S y)z
        Extract the MAC address if it's set inside the JSON data and seems to
        have the correct format. Return 'None' otherwise.
        address    N)lengetlower)selfr-   r0   s      +/usr/share/netplan/netplan_cli/cli/state.py__extract_maczInterface.__extract_macL   s0    
 "&&B//w0B6==?"    )NNnd_datanm_dataresolved_data
route_datac                 P	    |j                  dd       _        |j                  dd       _        d|j                  dg       v rdnd _        |j                  dd      j	                          _         j                  |       _        d  _        d  _	        d  _
        g  _        |xs g }t         fd	|D        d        _        t         fd
|D        d        _        d  _        |d   rg  _        |d   D ]  }t!        |d         t!         j                        k(  s(|d   }|d   } j                  j#                  t%        j&                  |dj)                  |D 	cg c]  }	|	j+                  dd       c}	                    d  _        |d   r]g  _        |d   D ]N  }	t!        |	d         t!         j                        k(  s( j,                  j#                  t/        |	d                P g }
d  _        |d   r|
|d   z  }
|d   r|
|d   z  }
|
rg  _        |
D ]  }|j                  d       j                  k(  s#d|j                  d      i}|j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<    j0                  j#                  |        d  _        |j                  d      x}rg  _        |D ]  }g }t5        j6                  |d         j8                  r|j#                  d        j0                  rc j0                  D ]T  }d|v st5        j6                  |d         t5        j6                  |d         k(  s:|d   d k(  sC|j#                  d         n |d   j;                         }|d!|d"   ii}|r|||   d<    j2                  j#                  |        d  _        |j                  d#i       j                  d$      x}r|j?                          _         jA                   j                        xs d% _!        y c c}	w )&NifindexifnameunknownUPflagsDOWN	operstatec              3   H   K   | ]  }|d    j                   k(  s|  yw)IndexN)idx.0xr6   s     r7   	<genexpr>z%Interface.__init__.<locals>.<genexpr>c   s      KAAgJ$((4JaK   ""c              3   H   K   | ]  }|d    j                   k(  s|  yw)deviceNnamerJ   s     r7   rM   z%Interface.__init__.<locals>.<genexpr>d   s      MAAhK4994LaMrN   r   r
      r9   bigdevtodstfamilygatewayviaprefsrcfrommetrictypescopeprotocoltable	addr_infolocallinkdhcpprefix	prefixlenlinkinfo	info_kindr1   )"r4   rI   rR   
adminstateupperrF   _Interface__extract_mac
macaddressr   r   r"   membersnextndnmdns_addressesintappendsocket	inet_ntopjointo_bytes
dns_searchstrroutes	addresses	ipaddress
ip_addressis_link_localr5   iproute_typestripquery_networkctl_networkctl)r6   r-   r:   r;   r<   r=   itripfamilydnsv_routesobjelemvalrb   addrrD   routeip_addrri   s   `                   r7   __init__zInterface.__init__U   s   y"-)4	'+rvvgr/B'Bt ff[)<BBD#11"5	"$ -RKKTRMMtT $(!#D$Q' ys1v;#dhh-/"1vHa&C&&--f.>.>xqtRulmSTS]S]^_afSgRuIv.wx	y
 !% DO"1% 6qt9DHH-OO**3qt956
  a=z!}$Ga=z!}$GDK -775>TYY. #''%.1D!ggh//s/),X!ggi00s0&)U!ggi00s0'*V!ggh//s/),X!ggfo-s-'*V!ggg..s.(+W!ggj11s1+.Z(!ggg..s.(+WKK&&t,'-*  ${++9+DN! , ''W6DDLL(;;!% &"eO ) 4 4U6] CyG[G[\`ah\iGj j$Z0F: %V 4 %& w---/(D,=!>?-2DM'*%%d+," "&z2.22;??9? ) 1D !% 5 5dii @ FB Svs   R#con_namec           	          d }	 t        j                  ddddd|g      }|j                         S # t        $ r9}t	        j
                  dj                  |t        |                   Y d }~|S d }~ww xY w)Nz--get-valuesz802-11-wireless.ssidconshowidz+Cannot query NetworkManager SSID for {}: {})r   	nmcli_outr   	Exceptionloggingwarningformatrz   )r6   r   ssides       r7   query_nm_ssidzInterface.query_nm_ssid   sx    	/??N4J$)64$C DD::< 	/OOIPP$c!f. / /	/s   */ 	A1.A,,A1rA   c           	          d }	 t        j                  ddd|gd      }|S # t        $ r9}t        j                  dj                  |t        |                   Y d }~|S d }~ww xY w)N
networkctlstatusz--Ttextz"Cannot query networkctl for {}: {})
subprocesscheck_outputr   r   r   r   rz   )r6   rA   outputr   s       r7   r   zInterface.query_networkctl   sn    	!,,lHdF-SZ^_F   	!OO@GGA  ! !	!s   ! 	A#.AA#c                    | j                   | j                  | j                  d}| j                  r| j                  |d<   | j                  r| j                  |d<   | j
                  r| j
                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d	<   | j                  r| j                  |d
<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                   r| j                   |d<   | j"                  r| j"                  |d<   | j$                  r| j$                  |d<   | j&                  |fS )N)indexrj   rF   r^   r   tunnel_modebackendr   rm   vendorr|   rr   ry   r{   activation_moder   r   r"   
interfaces)rI   rj   rF   r^   r   r   r   	netdef_idrm   r   r|   rr   ry   r{   r   r   r   r"   rn   rR   )r6   jsons     r7   r   zInterface.json   s   XX//
 9999DL9999DL"&"2"2D<<"llDO>>DJ??!%D;;![[DN>> $D$($6$6D!??!%D;;![[DN&*&:&:D"#;;![[DN9999DL88((DK<<!%D		4  r9   c                 B    | j                   dk(  xr | j                  dk(  S )NrC   rj   rF   r6   s    r7   upzInterface.up   s    $&A4>>T+AAr9   c                 B    | j                   dk(  xr | j                  dk(  S )NrE   r   r   s    r7   downzInterface.down   s    &(ET^^v-EEr9   c                 X   | j                   r| j                   j                  d      nd }|dk(  r| j                   j                  d      }|dk(  r| j                   j                  d      x}r|}t        j                  |      x}r|S t        j                  dj                  |             y )Nr   noneKindr   zUnknown device type: {})rp   r4   DEVICE_TYPESr   r   r   )r6   nd_typekinddevice_types       r7   r^   zInterface.type   s    )-$''++f%dfggkk&)Ggww{{6**t*&**733;3188ABr9   c                 R    | j                   dk(  r| j                  r| j                  S y )Nr   )r^   r   r   s    r7   r   zInterface.tunnel_mode  s%    99 T%6%6$$$r9   c                     | j                   r=d| j                   j                  dd      vrd| j                   j                  dd      v ry| j                  rd| j                  j                  dd      v ry	y )
N	unmanaged
SetupStater1   run/systemd/network/10-netplan-NetworkFilenetworkd.run/NetworkManager/system-connections/netplan-filenameNetworkManager)rp   r4   rq   r   s    r7   r   zInterface.backend  sa    GG477;;|R#@@1TWW[[PR5SSWWITWW[[YcegMhh#r9   c                    | j                   dk(  r@| j                  j                  dd      j                  d      d   j                  d      d   S | j                   dk(  r| j                  j                  d	d      j                  d
      d   j                  d      d   }| j                  j                  dd      dk(  rC| j                  | j                  j                  d            }|r|j                  d|z         d   }|S y )Nr   r   r1   r   r
   z.networkr   r   r   r   z.nmconnectionr^   z802-11-wirelessrR   -)r   rp   r4   splitrq   r   )r6   netdefr   s      r7   r   zInterface.netdef_id  s    <<:%77;;}b177133466;eJ6GK K\\--WW[[R066@BBCEEJU?E[\]_Fww{{62&*;;))$''++f*=>#\\#*5a8FMr9   c                     | j                   r:d| j                   v r,| j                   d   r| j                   d   j                         S y )NVendor)rp   r   r   s    r7   r   zInterface.vendor!  s:    77x477*twwx/@778$**,,r9   c                    | j                   dk(  rr| j                  j                         D ]U  }|j                         }d}|j	                  |      s'|t        |      t        d        j                         }|r|c S d c S  y )Nr   zWiFi access point: z (xB:SS:ID:xx:xx:xx))r^   r   
splitlinesr   
startswithr3   )r6   linekeyr   s       r7   r   zInterface.ssid'  s~    99 ((335 2zz|+??3'C#.D*E)EFLLND#'41T12 r9   c                 D   | j                   dk(  rl| j                  j                         D ]N  }|j                         }d}|j	                  |      s'|t        |      d  j                         }|dk7  r|c S d c S  y | j                   dk(  r| j                  d   dk(  rdS d S y )Nr   zActivation Policy: r   r   autoconnectnomanual)r   r   r   r   r   r3   rq   )r6   r   r   modes       r7   r   zInterface.activation_mode4  s    <<:% ((335 :zz|+??3'C	?002D#'4<49T9:  \\--#ww}5=8G4Gr9   N)__name__
__module____qualname__dictrz   rl   r   tupler   r   r   r   propertyboolr   r   r^   r   r   r   r   r   r    r9   r7   r,   r,   K   s      24R(4,XG4 XG$ XGd XG %XGBGXGt	c 	c 	s s &!d &!P BD B B Fd F F c   S  
    3     
 
c 
 
   r9   r,   c                   ^   e Zd ZdZddZedefd       Zedede	fd       Z
ededefd	       Zedefd
       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zededee   fd       Zedee   ddfd       Zedefd       ZdefdZy)SystemConfigStatez- Collects the system's network configuration Nc                    t        j                  d      slt        j                  d      r*t        j                  d       t        j                  d       t        j                  d       t        j                  ddgd       | j                         }| j                         }|r|s*t        j                  d       t        j                  d       | j                         }| j                         \  }}| j                         \  }}	|D 
cg c]  }
t        |
||||	f||f       c}
| _        | j!                  | j                         | j                  D 
cg c]  }
|
j"                  dk7  s|
 }}
| j%                  |      }r t'        fd	| j                  D        d       g}|D cg c]  }||	 }}r>|g k(  r9t        j                  d
j)                               t        j                  d       d|| j+                         di| _        |r| j                  n|}|D ]$  }
|
j/                         \  }|| j,                  <   & y c c}
w c c}
w c c}w )Nzsystemd-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-networkdrE   c              3   B   K   | ]  }|j                   k(  s|  y wNrQ   )rK   itfrA   s     r7   rM   z-SystemConfigState.__init__.<locals>.<genexpr>m  s     WcCHHPVDVcWs   zCould not find interface {}znetplan-global-state)onlinenameservers)r   systemctl_is_activesystemctl_is_maskedr   errorsysexitdebug	systemctlquery_iproute2query_networkdquery_nmquery_routesquery_resolvedr,   interface_listcorrelate_members_and_uplinkrF   query_online_statero   r   resolvconf_jsonstater   )r6   rA   alliproute2r   nmcliroute4route6rr   ry   r   filteredonline_stater   itf_iterr   s    `              r7   r   zSystemConfigState.__init__H  s*   (()CD(()CD 1 2 MMOPOOG&@%A4H &&(&&(xMMHIHHQK **,$($7$7$9!z GOP?B  )hz?Z*0&)9 ; P 	))$*=*=> $(#6#6RC#--6:QCRR..x8 WT-@-@WY]^_H%-BT1ADBBh"nMM7>>vFGHHQK #&#335%

 +.4&&8 	%C((*KFC!$DJJv	%9P S Cs   I
I+I(I0Ir.   c                    g g d d}	 t        d      5 }|j                         }d|v rd|d<   n	d|v rd|d<   |g|j                         z   D ]Y  }|j                  d      r|d	xx   |j	                         d
d  z  cc<   |j                  d      sD|j	                         d
d  |d<   [ 	 d d d        |S # 1 sw Y   |S xY w# t
        $ r8}t        j                  dj                  t        |                   Y d }~|S d }~ww xY w)N)r|   searchr   z/etc/resolv.confz/# This is /run/systemd/resolve/stub-resolv.confstubr   z*# This is /run/systemd/resolve/resolv.confcompat
nameserverr|   r
   r   z!Cannot parse /etc/resolv.conf: {})
openreadline	readlinesr   r   r   r   r   r   rz   )clsresf	firstliner   r   s         r7   r   z!SystemConfigState.resolvconf_json  s    
	P() 9QJJL	D	Q"(CKAYN"*CK&K!++-7 9D|4K(DJJL,<<(x0(,

QR(8H	99 
9 
  	POO?FFs1vNOO
	Ps;   B? A;B2B2(B? 2B<7B? <B? ?	D -C;;D r   c                    |D ]  }|j                   s|j                  s|j                  s*|j                  s7g }|j                  D ]>  }t	        |j                               d   \  }}d|vsd|d   vs.|j                  |       @ |j                  D cg c]  }|j                  dd       dk(  s| }}|s|s|j                  s y yc c}w )Nr   rD   rd   rV   defaultTF)r   r|   r{   rr   listitemsrt   r4   )	r  r   r   non_local_ipsr   r-   extrarL   default_routess	            r7   r   z$SystemConfigState.query_online_state  s      		 Cvv#--CJJ3;L;L "MM 1D $TZZ\ 21 5IBe+vU7^/K%,,R01 .1ZZ!Z155t;LPY;Y!!Z!Z ^8I8I		   "[s   C2C
cmd_outputc                 ,    t        j                  |      S r   r   loadsr  r  s     r7   process_genericz!SystemConfigState.process_generic  s    zz*%%r9   c                     d }	 t        j                  g dd      }| j                  |      }|S # t        $ r8}t	        j
                  dj                  t        |                   Y d }~|S d }~ww xY w)N)r-   -d-jr   Tr   z(Cannot query iproute2 interface data: {})r   r   r  r   r   criticalr   rz   r  datar   r   s       r7   r   z SystemConfigState.query_iproute2  su    	X$112L7;=F&&v.D   	XGNNsSTvVWW	X   *0 	A1-A,,A1c                 2    t        j                  |      d   S )N
Interfacesr  r  s     r7   process_networkdz"SystemConfigState.process_networkd  s    zz*%l33r9   c                     d }	 t        j                  ddgd      }| j                  |      }|S # t        $ r8}t	        j
                  dj                  t        |                   Y d }~|S d }~ww xY w)Nr   z--json=shortTr   z(Cannot query networkd interface data: {})r   r   r!  r   r   r  r   rz   r  s       r7   r   z SystemConfigState.query_networkd  sy    	X$11<2P7;=F''/D   	XGNNsSTvVWW	Xr  c           
          g }|j                         D ]I  }|j                  d      }|d   r|d   nd }|s#|j                  ||d   |d   |d   |d   |d   d       K |S )	N:r   r
   rS            )rP   rR   uuidr   r^   r   )r   r   rt   )r  r  r  r   r   rU   s         r7   
process_nmzSystemConfigState.process_nm  s~    ))+ 	DJJsOE#Ah%(DC!!!H!!H %a!!H#(8 		 r9   c                     d }	 t        j                  g d      }| j                  |      }|S # t        $ r8}t	        j
                  dj                  t        |                   Y d }~|S d }~ww xY w)N)z-tz-fz*DEVICE,NAME,UUID,FILENAME,TYPE,AUTOCONNECTr   r   z.Cannot query NetworkManager interface data: {})r   r   r)  r   r   r   r   rz   r  s       r7   r   zSystemConfigState.query_nm  sr    	[// +: ;F >>&)D   	[MMJQQRUVWRXYZZ	[s   (. 	A/-A**A/c                    d }d }	 t        j                  g dd      }| j                  |      }t        j                  g dd      }| j                  |      }|r2|D ]-  }|j                  dt        j                  j                  i       / |r2|D ]-  }|j                  dt        j                  j                  i       / ||fS # t        $ r7}t	        j
                  dj                  t        |                   Y d }~d }~ww xY w)N)r-   r  r  z-4r   r   ra   r   Tr   )r-   r  r  z-6r   r   ra   r   z$Cannot query iproute2 route data: {}rX   )r   r   r  r   r   r   r   rz   updateru   AF_INETvalueAF_INET6)r  data4data6output4output6r   r   s          r7   r   zSystemConfigState.query_routes  s    	Q%223l8<>G--g6E%223l8<>G--g6E  ?h(<(<=>? @h(=(=>?@u~  	QMM@GGAOPP	Qs   AC 	D-DDc                 N   d }d }	 t        j                         }|j                  dd      }t        j                  |d      }|j	                  d      }|d   }|d   }||fS # t
        $ r:}t        j                  dj                  t        |                   Y d }~||fS d }~ww xY w)Nzorg.freedesktop.resolve1z/org/freedesktop/resolve1zorg.freedesktop.DBus.Propertiesz org.freedesktop.resolve1.ManagerDNSDomainsz"Cannot query resolved DNS data: {})
dbus	SystemBus
get_objectr,   GetAllr   r   r   r   rz   )r  r|   r   ipcresolve1resolve1_ifr  r   s           r7   r   z SystemConfigState.query_resolved  s    		O.."C~~&@B]^H..3TUK$$%GHCE
I^F 6""  	OMM>EEc!fMNN6""	Os   AA! !	B$*-BB$rA   c           	      N   g }d}	 t        j                  dddddd|gd	      }t        j                  |      }|D ]"  }|j                  |j                  d             $ |S # t        $ r9}t        j                  d
j                  t        |                   g cY d}~S d}~ww xY w)zO Return a list containing the interfaces that are members of a bond/bridge/vrf Nr-   r  r  rd   r   masterTr   zCannot query bridge: {}rA   )r   r   r   r   r   r   rz   r   r  rt   r4   )r  rA   rn   r   r   output_jsonmembers          r7   query_memberszSystemConfigState.query_members
  s     	,,tT668VD4QF jj(! 	1FNN6::h/0	1   	OO5<<SVDEI	s   A" "	B$+.BB$B$c                   	 g d	i }t        t              }t        	fd|      D ]a  }| j                  |j                        }|D ]0  }t        dddg      } ||j                  |j                        ||<   2 |||j                  <   c |D ]  }|j                  |j                        x}r`|j                  dk(  r|j                  |_        |j                  dk(  r|j                  |_	        |j                  dk(  r|j                  |_
        |j                  	v s|j                  |j                        x}s||_         y	)
z
        Associate interfaces with their members and parent interfaces.
        If an interface is a member of a bond/bridge/vrf, identify which interface
        if a member of. If an interface has members, identify what are the members.
        )r   r   r"   c                      | j                   v S r   )r^   )iuplink_typess    r7   <lambda>z@SystemConfigState.correlate_members_and_uplink.<locals>.<lambda>&  s    !&&L*@ r9   MemberrR   r^   r   r   r"   N)r   r  filterrB  rR   r   r^   r4   r   r   r"   rn   )
r  r   members_to_uplinkuplink_to_members	interfacern   rA  member_tupleuplinkrF  s
            @r7   r   z.SystemConfigState.correlate_members_and_uplink  s2    1'- @*M 	8I''	7G! Y)(VV4DE,8,X!&)Y 18inn-	8 $ 	0I*..y~~>>v>;;(*'-{{I$;;&(%+[[IN;;%'$*KKIM~~-/33INNCC7C(/I%	0r9   c                 ,    t        | j                        S r   )r3   r   r   s    r7   number_of_interfacesz&SystemConfigState.number_of_interfaces:  s    4&&''r9   c                     | j                   S r   )r   r   s    r7   get_datazSystemConfigState.get_data>  s    zzr9   )NF)r   r   r   __doc__r   classmethodr   r   r  r   r   rz   r   r  r   r!  r   r)  r   r   r   r   r   rB  r,   r   r   rs   rP  rR  r   r9   r7   r   r   E  s   76%p   . D T   & & & & t   4T 4 4 t   t    	 	 	 U  . #u # # 3 49  " 0d9o 0$ 0 0: (c ( ($ r9   r   c                   0    e Zd ZdZddZdefdZdefdZy)NetplanConfigStatez. Collects the Netplan's network configuration c                 R   t        j                         }|j                  |       t        j                         }|j	                  |       |j
                  | _        t               | _        |dk(  r|j                  | j                         y |j                  d      sdj                  d|f      }t        j                  d|      }|D cg c]  }|j                  dd       }}t               }|j                  |       t        j                  ||| j                         y c c}w )Nr   )output_filenetwork.z	(?<!\\)\.z\.)netplanParserload_yaml_hierarchyStateimport_parser_resultsnetdefsr   r   
_dump_yamlr   rw   rer   replace_dump_yaml_subtree)r6   subtreerootdirparsernp_stater   tmp_ins          r7   r   zNetplanConfigState.__init__E  s    !""7+==?&&v.''Z
eDJJ7%%i0((Iw#78hh|W5G<CDDt||E3/DGDZFF3&&w

C	 Es   D$r.   c                 6    | j                   j                         S r   )r   getvaluer   s    r7   __str__zNetplanConfigState.__str__^  s    zz""$$r9   c                 \    t        j                  | j                  j                               S r   )yaml	safe_loadr   rk  r   s    r7   rR  zNetplanConfigState.get_dataa  s    ~~djj11344r9   N)r   /)	r   r   r   rS  r   rz   rl  r   rR  r   r9   r7   rV  rV  B  s#    8D2% %5$ 5r9   rV  )collectionsr   r   r}   r   r   rb  ru   r   r   ior   typingr   r   r   r	   rn  r7  r[  r1   r   rz   rs   floatr   r   r   r,   r   rV  r   r9   r7   <module>ru     s  ( 0    	   
  * *    T#v+Vc3tT$ZOP 
F h  ^  h	 
 Z  h  X  h  
  
8  h  
8  x    F   G! " # $  #? Fw wtz zz 5  5r9   