
    ~f[.              	          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Zddlm	Z	 d dl
mZmZ dZdZdZdZd	d
ddd ddddZe	eefZd Zd Zd ZdedefdZd Zd ZdedefdZdeddfdZd3dZd3deded efd!Z d" Z!d# Z"d$ Z#d% Z$d& Z%d' Z&d( Z'd) Z(d3d*Z)d+ Z*d,efd-Z+d.edefd/Z,de-fd0Z. G d1 d2ej^                        Z0y)4    N   )ConfigurationError)NetDefinitionNetplanExceptionzNetworkManager.servicez+snap.network-manager.networkmanager.servicez/etc/iproute2/rt_tablesz/usr/share/iproute2/rt_tablesunspecdefaultmainlocal         )r   r   r   r   r   r   r	   r
   c                  B    t         j                  j                  dd      S )NNETPLAN_GENERATE_PATHz/usr/libexec/netplan/generate)osenvironget     +/usr/share/netplan/netplan_cli/cli/utils.pyget_generator_pathr   *   s    ::>>13RSSr   c                  b    t        j                  dddt        gt         j                        dk(  S )N	systemctl--quiet
is-enabled)stderrr   )
subprocesscallNM_SNAP_SERVICE_NAMEDEVNULLr   r   r   is_nm_snap_enabledr    .   s*    ??KLBVW`j`r`rswxxxr   c                 t    t        j                  dg| z   t         j                  t         j                         y )Nnmclistdoutr   r   
check_callr   argss    r   r"   r"   2   s)     7)d*:3E3EjN`N`ar   r(   returnc                 8    t        j                  dg| z   d      S )Nr"   Ttext)r   check_outputr'   s    r   	nmcli_outr.   8   s     ""G9t#3$??r   c                  \    	 t        dg       y# t        t        j                  f$ r Y yw xY w)z"Check if NetworkManager is runninggeneralTF)r"   OSErrorr   SubprocessErrorr   r   r   
nm_runningr3   >   s1    ykZ//0 s    ++c                 F   t        j                  d      }t               }| D ]p  }t        |d      5 }|D ]T  }|j	                  |      }|s|j                  t        t        j                  ||j                  d                          n d d d        r |S # 1 sw Y   ~xY w)Nz^interface-name=(.*)$r   )	recompilesetopenmatchupdatefnmatchfiltergroup)pathsdevicespat
interfacespathflinems           r   nm_interfacesrH   H   s    
**,
-CJ $_ 	 IIdO%%c'..!''!**M&NO	 	 	 	s   BA BB 		interfacec           	          t        dddddd| g      }|j                         j                  d      }|d   }|d	k7  r|S d
S )Nz-mtabularz-fzGENERAL.CONNECTIONdeviceshow
r6   z-- )r.   stripsplit)rI   outputlines
connections       r   nm_get_connection_for_interfacerU   V   sN    i/CXvW`abFLLN  &EqJ#t+:33r   rT   c                 T    	 t        dd| g       y # t        j                  $ r Y y w xY w)NrT   up)r"   r   CalledProcessError)rT   s    r   nm_bring_interface_uprY   ]   s.    |T:./(( s    ''c                 ^    t               rt        | t        g|      S t        | t        g|      S N)r    r   r   NM_SERVICE_NAME)actionsyncs     r   systemctl_network_managerr_   d   s/     "6!7>>Vo.55r   r]   servicesr^   c                     t        |      dk\  r>d| g}|s|j                  d       |j                  |       t        j                  |       y y )Nr6   r   z
--no-block)lenappendextendr   r&   )r]   r`   r^   commands       r   r   r   l   sF    
8}'NN<(x g& r   c                     t               } t        j                  g dd      }|j                         D ]Q  }|j	                         j                  d      }|d   j                         s6|d   dvs>| j                  |d          S | S )N)
networkctlz
--no-pagerz--no-legendTr+    r   )	unmanagedlinger)r9   r   r-   
splitlinesrP   rQ   	isnumericadd)rC   outrF   ss       r   networkd_interfacesrq   x   s{    J

!
!"MTX
YC  !JJLs#Q4>>"-D DNN1Q4 ! r   c                  2    t        j                  ddg       y )Nrg   reloadr   r&   r   r   r   networkctl_reloadru      s    <23r   c                 h    t        |       dk\  r$t        j                  ddgt        |       z          y y )Nr6   rg   reconfigure)rb   r   r&   list)rC   s    r   networkctl_reconfigurery      s0    
:!|];d:>NNO r   c                 >    t        j                  ddd| g      dk(  ryy)z4Return True if at least one matching unit is runningr   r   z	is-activer   TF)r   r   )unit_patterns    r   systemctl_is_activer|      s"    Y\JKqPr   c                     t        j                  dd| gt         j                  t         j                  d      }|j                  dkD  rd|j                  v ryy)z5Return True if output is "masked" or "masked-runtime"r   r   Tr$   r   r,   r   maskedF)r   runPIPE
returncoder$   r{   ress     r   systemctl_is_maskedr      sH    
..+|\B *
"$C ~~h#**4r   c                     t        j                  dd| gt         j                  t         j                  d      }|j                  dk7  ryy)z7Return True if returncode is other than "not-found" (4)r   r   Tr~      F)r   r   r   r   r   s     r   systemctl_is_installedr      s=    
..+|\B *
"$C ~~r   c                  2    t        j                  g d       y)zEReload systemd unit files from disk and re-calculate its dependencies)r   zdaemon-reloadz--no-ask-passwordNrt   r   r   r   systemctl_daemon_reloadr      s    MNr   c                 t    t        j                  ddd| gt         j                  t         j                         y)z8Flush all IP addresses of a given interface via iproute2ipaddrflushr#   Nr%   )ifaces    r   ip_addr_flushr      s*    4%8ASAS\f\n\nor   c           	         t         j                  j                  d|       }|rx	 t        t         j                  j                  |d            5 }|j	                         j                         }|dk7  r!t        j                  d| |       	 d d d        y 	 d d d        	 t         j                  j                  t         j                  j                  |dd            }t         j                  j                  |      }|S # 1 sw Y   ixY w# t        $ r*}t        j                  d| t        |             Y d }~y d }~ww xY w# t        $ r+}t        j                  d| |t        |             Y d }~y d }~ww xY w)	Nz/sys/class/net	operstatedownz'device %s operstate is %s, not changingz$Cannot determine operstate of %s: %srL   driverz0Cannot replug %s: cannot read link %s/device: %s)r   rD   joinr:   readrP   loggingdebugIOErrorerrorstrrealpathbasename)rI   	only_downdevdirrE   stateer   driver_names           r   get_interface_driver_namer      s'   WW\\*I6F	bggll6;78  A(F?MM"KYX]^	   " !!"'',,vx"JKgg&&v.
 !   
  	MM@)SQRVT	  H)U[]`ab]cdsN   )D <C;	D D AD= ;D D 	D: D55D:=	E1!E,,E1c                     t        j                  |       j                  t         j                  i g      d   }|j                  dd      S )Nr   r   rO   )	netifacesifaddressesr   AF_LINK)rI   links     r   get_interface_macaddressr      s=      +//	0A0AB4HKD88FBr   rC   c                     t        t              sJ j                  sJ t        t	        fd|             }t        |      dk7  rt        j                  |       y |d   S )Nc                 P    j                  | t        |       t        |             S )N)
iface_nameiface_driver	iface_mac)_match_interfacer   r   )itfnetdefs    r   <lambda>z%find_matching_iface.<locals>.<lambda>   s*    f&=&=237.s3 '> '5 r   r6   r   )
isinstancer   
_has_matchrx   r>   rb   r   info)rC   r   matchess    ` r   find_matching_ifacer      sg    fm,,,6 5 7AB CG 7|qW1:r   
macaddressc                 6    d}t        j                  ||       d uS )NzT^[a-fA-F0-9][a-fA-F0-9](:[a-fA-F0-9][a-fA-F0-9]){5}((:[a-fA-F0-9][a-fA-F0-9]){14})?$)r7   r;   )r   MAC_PATTERNs     r   is_valid_macaddressr      s    hK88K,D88r   c                     i } t         }t        j                  j                  |      st        }	 t        |d      5 }|D ]]  }|j                         }t        |      dk(  s"|d   j                         s6|d   | t        |d         <   t        |d         | |d   <   _ 	 d d d        | S # 1 sw Y   | S xY w# t        $ r" t        j                  d| d       t        cY S w xY w)Nr5   r   r   r6   zCannot open 'z' for reading)NEW_RT_TABLES_PATHr   rD   existsOLD_RT_TABLES_PATHr:   rQ   rb   rm   int	Exceptionr   r   RT_TABLES_DEFAULT)lookup_tablerD   	rt_tablesrF   
split_lines        r   route_table_lookupr      s    LD77>>$!
!$_ 	E	! E!ZZ\
z?a'JqM,C,C,E7A!}LZ]!3425jm2DLA/	E	E 	E   !tfN;<  !s:   B6 $B) B)4*B)B6 )B3.B6 3B6 6(C! C!c                   8    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	y)
NetplanCommandc                 X   || _         || _        || _        || _        d | _        d| _        d| _        d | _        i | _        d | _	        d | _
        t        j                  t        j                  d   d||d      | _        | j                  j!                  ddd	       | j                  j!                  d
dt        j"                  	       |s^| j                  j%                  ddd      | _        | j&                  j)                  ddd      }|j+                  | j,                         y y )NFr   rh   T)progdescriptionadd_helpz--debug
store_truezEnable debug messages)r]   helpz--breakpointzAvailable commandsrO   
subcommand)titlemetavardestr   zShow this help message)r   r   )func)
command_idr   leaf_commandtesting_argsr   
breakpointcommandclasssubcommandsr   r   argparseArgumentParsersysargvparseradd_argumentSUPPRESSadd_subparsers
subparsers
add_parserset_defaultsprint_usage)selfr   r   leafr   p_helps         r   __init__zNetplanCommand.__init__   s%   $& 

 	--chhqk:3V:E7;= 	  <&= 	! 	?  &.&7&7 	! 	9"kk88?SAC, 9 XDO__//<T5M 0 OF T%5%56 r   c                     || _         y r[   )r   )r   r(   s     r   r<   zNetplanCommand.update  s	    
r   c                     | j                   j                  | j                  |       \  }| _        | j                  s9| j                  s,t        dt        j                         | j                          y y y )N)r(   	namespacezYou need to specify a commandfile)	r   parse_known_argsr   r   r   printr   r   r   )r   nss     r   
parse_argszNetplanCommand.parse_args  sW    554::QU5VDJt'8'81

C (9r   c                    | j                   r%| j                   j                  | j                         | j                  rd| j                  v r| j	                          | j
                  r
t                | j                          y )Nr   )r   r<   r   r   r   r   r   r   s    r   run_commandzNetplanCommand.run_command   sZ    $$TZZ0 4::!5??L		r   c                     | j                   j                  t        j                         t        j                  t
        j                         y )Nr   )r   
print_helpr   r   exitr   EX_USAGEr   s    r   r   zNetplanCommand.print_usage,  s+    CJJ/r   c                     |       }i | j                   |<   || j                   |   d<   || j                   |   d<   |j                  r!t        j                  j	                  dd       sy | j
                  j                  |j                  |j                  |j                  d      }|j                  |j                  |       || j                   |   d<   y )NclassinstanceENABLE_TEST_COMMANDSF)r   r   r   )r   r   r   )r   r   r   r   r   r   r   r   r   r   r   )r   namer   r   ps        r   _add_subparser_from_classz(NetplanCommand._add_subparser_from_class0  s    >!#*.w'-5z*::>>"8$?OO&&x':':3;3G3G,4,@,@05 ' 7 	
HLLx@+,x(r   c                     dd l }|j                  |      D ]:  \  }}|j                  |      st        |t              s)| j                  ||       < y )Nr   )inspect
getmembersisclass
issubclassr   r  )r   
submodulesr  r   objs        r   _import_subcommandsz"NetplanCommand._import_subcommandsB  sH     ++J7 	:ID#s#
3(G..tS9	:r   N)TF)
__name__
__module____qualname__r   r<   r   r   r   r  r	  r   r   r   r   r      s%    78
-$:r   r   )F)1r   r   r   r   r   r   r=   r7   configmanagerr   netplanr   r   r\   r   r   r   r   RuntimeErrorconfig_errorsr   r    r"   rx   r   r.   r3   rH   rU   rY   r_   boolr   rq   ru   ry   r|   r   r   r   r   r   r   r   r   dictr   	Namespacer   r   r   r   <module>r     sS  $  	      	 . 3 +D . 4  yvG S#M  $%5|DTyb@D @S @4s 4s 4c d 6	'c 	'T 	' 	'4P
O
p
. D  9C 9D 9
D ,N:X'' N:r   