??????????????????????
???  ?????????????????
 JFIF      ?? C      


!"$"$?? C    
?? p 
" ??     
         ??             ?   
   ????

(%	aA*?XYD?(J??E  RE,P XYae?)(E  2 B  R  	BQ    X?)X     ?  @  

adadasdasdasasdasdas


.....................................................................................................................................??????????????????????
???  
 JFIF      ?? C      


!"$"$?? C    
?? p 
" ??     
         ??             ?   
   ????

(%	aA*?XYD?(J??E  RE,P XYae?)(E  2 B  R  	BQ    X?)X     ?  @  

adadasdasdasasdasdas


.....................................................................................................................................ó
xdcc           @   sÿ   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 Z d Z d „  Z d „  Z	 d „  Z
 d „  Z d e f d	 „  ƒ  YZ e d
 k rû e ƒ  j ƒ  Z e d e j d e j d e j d e j d e j ƒ Z e j ƒ  Z e j e ƒ n  d S(   iÿÿÿÿNs   /etc/netplan/s   90-vz-c          C   s“   t  j d ƒ }  |  j d d d d d d ƒ|  j d d d d ƒ|  j d d d d d t ƒ|  j d d d d ƒ|  j d d d d d d ƒ|  S(   su   
	Init argparse
		- "device" is mandatory for all commands.
		- "ip" is used for gateway \ route related operations
	s   Netplan configuration editors   -as   --actiont   actiont   storet   choicest   get_dhcpt   restartt   set_dhcpt   set_gatewayt   set_ipt	   set_routes   -is   --ips   -ds   --devicet   requireds   -ps   --protos   -os	   --optionst   defaultt    (   R   R   R   R   R   R   (   t   argparset   ArgumentParsert   add_argumentt   True(   t   parser(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   getArgParser   s    c         C   sb   d  } t | ƒ d k r- d t |  ƒ k } n' t | ƒ d k rT d t |  ƒ k } n  | r^ t St S(   Ni   t   .i   t   :(   t   Nonet   intt   listR   t   False(   t   addrt   protot   res(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   is_ip_proto%   s    c         C   s•   d } d } t  j d |  j ƒ  ƒ } | j ƒ  d k rI t | d ƒ } n  t  j d | d ƒ } | j ƒ  d k r~ | d } n  | d } | | | f S(   sz   
	Split route string into elemenets
	 "X.X.X.X/Z=X.X.X.Ym100" -> "X.X.X.X/Z X.X.X.Y 100"
	Return tuple (to, via, metric)
	s   0.0.0.0R   t   mi   i   t   =i    (   t   ret   splitt   stript   __len__R   (   t   routet   viat   metricR   t   to(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   split_route0   s    
c         C   s;   t  g  |  j d ƒ D]! } t t | ƒ ƒ j d ƒ ^ q ƒ S(   sF   
	Convert netmask to CIDR notation. Netplan does not accept netmasks
	R   t   1(   t   sumR   t   binR   t   count(   t   netmaskt   x(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   netmask_to_cidrB   s    t   npConfigc           B   s†   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z RS(   c         K   sm   | d |  _  | d |  _ | d |  _ | d |  _ | d |  _ i  } t t |  j  d |  _ |  j ƒ  d  S(   Nt   deviceR    t   ipR   t   optionss   .yaml(	   t   _ifnamet   _actiont   _ipt   _protot   _optionst   NETPLAN_CFG_DIRt   NETPLAN_CFG_PREFIXt   filenamet   _npConfig__load(   t   selft   kwargst   config(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __init__I   s    c         C   s,   i i d d 6i i  |  j  6d 6d 6|  _ d S(   s   
		Generate skeleton config
		i   t   versiont	   ethernetst   networkN(   R2   R=   (   R;   (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __generate_skeleton_configU   s    c         C   sW   d |  j  d d |  j k r= g  |  j  d d |  j d <n  |  j  d d |  j d S(   s+   
		Retrieve pointer to the route subtree
		t   routesRA   R@   (   R=   R2   (   R;   (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __get_route_tree[   s    c         C   sP  |  j  d d |  j } xB |  j j ƒ  D]1 } d | k r( d | k rY | j d ƒ qY q( q( Wxì |  j j ƒ  D]Û } d | k r… qm n  |  j ƒ  } |  j d ƒ rÚ i | d 6d d 6d	 d
 6} | | k r| j | ƒ qn( d } t | d ƒ rø d } n  | | | <| d k rm i d d
 6d d 6d d 6} | | k rH| j | ƒ qHqm qm Wd S(   s:   
		set_gateway action implementation for netplan config
		RA   R@   t   removeRC   s   default-routesR#   t   trues   on-linkR
   R%   t   gateway4i   t   gateway6s   169.254.0.1s   0.0.0.0t   linkt   scopeN(	   R=   R2   R4   R   t   popt   _npConfig__get_route_treet   _npConfig__checkFeaturet   appendR   (   R;   t   ifcfgR0   t
   route_treeR"   t   gw_proto(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __set_gatewayf   s*    	
c         C   sr   |  j  ƒ  |  j d d |  j } xI t |  j ƒ D]8 } | d k rQ d | d <n  | d k r2 d | d <q2 q2 Wd S(	   s±  
		set_dhcp action implementation for netplan config
		TODO: its necessary to decide what to do with this function.
		Original shell script removes configuration entirely and rewrites it
		when dhcp is set. While it should be reasonable just to remove relevant
		protocol (ipv4/ipv6) configuration and set dhcp.
		For the sake of compatibility, function replicates existing behavior,
		wipes configuration file and just sets dhcp.
		RA   R@   t   4t   yest   dhcp4t   6t   dhcp6N(   t#   _npConfig__generate_skeleton_configR=   R2   R   R5   (   R;   RO   R   (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt
   __set_dhcp‰   s    

c         C   s!  |  j  ƒ  } x|  j j ƒ  D]ý } | d k re xè | D]) } t | d d ƒ r5 | j | ƒ q5 q5 Wq | d k r¨ x¥ | D]) } t | d d ƒ rx | j | ƒ qx qx Wq t | ƒ \ } } } i | d 6| d 6} | rä | | d <n  | d k rý d	 | d
 <n  | | k r | j | ƒ q q Wd S(   s8   
		set_route action implementation for netplan config
		RE   R%   i   t   remove6i   R#   R$   s   169.254.0.1RI   RJ   N(   RL   R4   R   R   RE   R&   RN   (   R;   RP   R0   R"   R%   R#   R$   (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __set_route   s$    c         C   s  |  j  ƒ  |  j d d |  j } xö |  j j ƒ  D]å } |  j d k s2 |  j d k r\ q2 n  d | k ru g  | d <n  d t | ƒ k r° t | d ƒ r£ | d 7} q| d	 7} nV t | d ƒ r| j d ƒ \ } } d
 | k rt | ƒ } | d t | ƒ } qn  | d j	 | ƒ q2 Wt
 | d <t
 | d <xI |  j j ƒ  D]8 } | d k r^t | d <n  | d k r?t t d <q?q?Wd S(   sÓ   
		set_ip action implementation for netplan config
		IMPORTANT: on each use old config is flushed. That is to ensure
		backward-compatibility. prl_nettool supplies full list of IPs on each
		set_ip invocation
		RA   R@   RE   RZ   t	   addressest   /i   s   /32s   /64R   RU   RW   t   dhcpN(   RX   R=   R2   R4   R   R   R   R-   t   strRN   R   R6   R   t   fcfg(   R;   RO   R0   R   R+   t   opt(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __set_ipº   s0    


c         C   s‡   t  j d j ƒ  d t  j d t  j ƒ} | j ƒ  } | j ri d | j t | d ƒ t | d ƒ f GHt S| t | d ƒ k rƒ t St S(   sI   
		check if current version of netplan supports default-routes feature
		s   netplan infot   stdoutt   stderrs.   netplan info failed [%d].
stdout:%s
stderr:%s
i    i   (	   t
   subprocesst   PopenR   t   PIPEt   communicatet
   returncodeR_   R   R   (   R;   t   featuret   pt   out(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __checkFeatureâ   s    '	&c         C   so   t  j d j ƒ  d t  j d t  j ƒ} | j ƒ  } | j rh d | j t | d ƒ t | d ƒ f GHn  | j S(   s6   
		restart action implementation for netplan config
		s   netplan applyRc   Rd   s/   netplan apply failed [%d].
stdout:%s
stderr:%s
i    i   (   Re   Rf   R   Rg   Rh   Ri   R_   (   R;   Rk   Rl   (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt	   __restartò   s    '	)c         C   so   t  j d j ƒ  d t  j d t  j ƒ} | j ƒ  } | j rh d | j t | d ƒ t | d ƒ f GHn  | j S(   s6   
		restart action implementation for netplan config
		s   netplan generateRc   Rd   s2   netplan generate failed [%d].
stdout:%s
stderr:%s
i    i   (   Re   Rf   R   Rg   Rh   Ri   R_   (   R;   Rk   Rl   (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt
   __generateÿ   s    '	)c         C   s_   |  j  d d |  j } |  j d k r0 d } n d } | | k rW | | rP d Sd Sn d Sd	 S(
   s7   
		get_dhcp action implementation for netplan config
		RA   R@   i   RW   RU   i    i   i   N(   R=   R2   R5   (   R;   RO   t   dhcpvp(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt
   __get_dhcp  s    	
c         C   s_   t  j j |  j ƒ rQ t |  j ƒ ( } t j | j ƒ  d t j ƒ|  _	 Wd QXn
 |  j
 ƒ  d S(   sU   
		Read configuration file from disk. If it is missing - construct skeleton config
		t   LoaderN(   t   ost   patht   existsR9   t   opent   yamlt   loadt   readt
   SafeLoaderR=   RX   (   R;   t   f(    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __load  s    *c      	   C   sŽ   t  |  j d d ƒ & } | j t j |  j d t ƒƒ Wd QXt j j	 |  j ƒ rp t j
 |  j |  j d ƒ n  t j
 |  j d |  j ƒ d S(   s   
		Write config to the disk
		s   .tmpt   wt   default_flow_styleNs   .bkp(   Rv   R9   t   writeRw   t   dumpR=   R   Rs   Rt   Ru   t   rename(   R;   R{   (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   __save)  s
    %c         C   sº   |  j  d k r |  j ƒ  S|  j  d k r2 |  j ƒ  S|  j  d k rN |  j ƒ  nT |  j  d k rj |  j ƒ  n8 |  j  d k r† |  j ƒ  n |  j  d k r¢ |  j ƒ  n  |  j ƒ  |  j ƒ  d S(   s)   
		Perform action over the config file
		R   R   R   R   R   R   i    (	   R3   t   _npConfig__get_dhcpt   _npConfig__restartt   _npConfig__set_dhcpt   _npConfig__set_routet   _npConfig__set_ipt   _npConfig__set_gatewayt   _npConfig__savet   _npConfig__generate(   R;   (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   perform_action3  s    



(   t   __name__t
   __module__R>   RX   RL   Rˆ   R…   R†   R‡   RM   R„   RŠ   Rƒ   R:   R‰   R‹   (    (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyR.   H   s   				#			(					
	
t   __main__R    R/   R0   R   R1   (   R   Rw   Rs   R   Re   t   sysR7   R8   R   R   R&   R-   t   objectR.   RŒ   t
   parse_argst   argsR    R/   R0   R   R1   t   npcfgR‹   R   t   exit(    (    (    s.   /usr/lib/vz-tools/tools/scripts/netplan-cfg.pyt   <module>   s&   				ÿ 