
    ܍~cfE                         d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZmZmZmZmZ d dlmZmZ dZ ej        e          Zd Zdd	Zd
 ZddZ G d dej                  ZddZddZdS )    N)Optionalcast)log)safeyamlsubputil)IPV6_DYNAMIC_TYPESSYS_CLASS_NETget_devicelistrenderersubnet_is_ipv6)NET_CONFIG_TO_V2NetworkStates4  # This is the initial network config.
# It can be overwritten by cloud-init or console-conf.
network:
    version: 2
    ethernets:
        all-en:
            match:
                name: "en*"
            dhcp4: true
        all-eth:
            match:
                name: "eth*"
            dhcp4: true
c                 ^    t          fd|                                 D                       S )Nc              3   P   K   | ] \  }}|                               ||fV  !d S N)
startswith).0keyvaluematchs      7/usr/lib/python3/dist-packages/cloudinit/net/netplan.py	<genexpr>z,_get_params_dict_by_match.<locals>.<genexpr>'   sQ        S%>>%  	e         )dictitems)configr   s    `r   _get_params_dict_by_matchr   &   sC        "LLNN     r   c           	         d#d}|g }g }g }g }g }|                      dg           }	|	g }	|	D ]V}
|
                     d          }|                    d          r#|dk    r|dz  }|                    |di           P|t          v r|                    d	di           q|d
v rd|
                     d          z  }d|
v r|d|
                     d          z  z  }d|
v r]|
                     d          rH|
                     d          }d|v r|                    d|i           n|                    d|i           d|
v r"| ||
                     dg                     z  }d|
v r"| ||
                     dg                     z  }d|
v rAd}t	          |
          rd|v rd}|                    ||
                     d          i           |
                     dg           D ]}|                     d          d|                     d          }|                     d          |d}d|v r+|                    d|                     dd          i           |                    |           |                    |           Xd| v rR|                     d          }|r0| d         |k    r$t                              d|| d         |           n| d         |d<   t          |          dk    r|                    d|i           t          |          dk    r|                    d|i           t          |          dk    rd|i}|                    d |i           t          |          dk    rD|                     d i           }|                    d!|i           |                    d |i           d"| v rF| d"         @|                    d"t          j
        |                      d"                    i           dS dS dS )$a  This method parse a cloudinit.net.network_state dictionary (config) and
       maps netstate keys/values into a dictionary (entry) to represent
       netplan yaml.

    An example config dictionary might look like:

    {'mac_address': '52:54:00:12:34:00',
     'name': 'interface0',
     'subnets': [
        {'address': '192.168.1.2/24',
         'mtu': 1501,
         'type': 'static'},
        {'address': '2001:4800:78ff:1b:be76:4eff:fe06:1000",
         'mtu': 1480,
         'netmask': 64,
         'type': 'static'}],
      'type: physical',
      'accept-ra': 'true'
    }

    An entry dictionary looks like:

    {'set-name': 'interface0',
     'match': {'macaddress': '52:54:00:12:34:00'},
     'mtu': 1501}

    After modification returns

    {'set-name': 'interface0',
     'match': {'macaddress': '52:54:00:12:34:00'},
     'mtu': 1501,
     'address': ['192.168.1.2/24', '2001:4800:78ff:1b:be76:4eff:fe06:1000"],
     'ipv6-mtu': 1480}

     c                 p    | rt          |           t          fvr| S || v r|                     |          S | gS )zBHelper to convert strings to list of strings, handle single string)typestrsplit)objtokens     r   _listifyz$_extract_addresses.<locals>._listifyS   sK     	d3iiu,,JC<<99U###  r   Nsubnetsr"   dhcp4Tdhcp6)staticstatic6z%saddressprefixz/%dgateway:gateway6gateway4dns_nameservers
dns_searchmtuzipv6-mturoutesnetwork/)viatometricd   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r   	addressesnameserverssearchz	accept-ra)r    )getr   updater	   r   appendLOGwarninglenr   is_true)r   entryifnamefeaturesr'   r>   r7   r?   searchdomainsr(   subnetsn_typeaddrr0   mtukeyrouteto_net	new_route	entry_mtunss                       r   _extract_addressesrU   .   s   J	 	 	 	 IFKMjjB''G %# %#**V$$f%% #	#&  3LL'4))))***LL'4))))---&**Y///D6!!

8 4 444F""vzz)'<'<" **Y//'>>LL*g!67777LL*g!6777 F**xx

3Db(I(IJJJv%%&**\2*F*F!G!GG!&)) (jH.D.D'Fffjj&7&78999Hb11 ) )$)IIi$8$8$8$8%))H:M:M:MN 99Y//  	 u$$$$h		(C0H0H%IJJJi((((T"""IIe$$	 		))33KK6u    "%=E%L
9~~k9-...
6{{Qh'(((
;!;'mR()))
=AYY}b))
		8]+,,,mR()))f!4!@k4<

;0G0G#H#HIJJJJJ !@!@r   c                     t          fd|                                 D                       }t          |          dk    r|                    d|i           d S d S )Nc                 N    g | ]!\  }}|                     d d          k    |"S )zbond-masterN)rA   )r   namecfgbond_masters      r   
<listcomp>z0_extract_bond_slaves_by_name.<locals>.<listcomp>   s@     	
 	
 	
sww}d++{:: :::r   r   
interfaces)sortedr   rF   rB   )r\   rH   rZ   bond_slave_namess     ` r   _extract_bond_slaves_by_namer_      s    	
 	
 	
 	
)//11	
 	
 	
  q  l$4566666 ! r   c                 `    t          j         d          }t          j                            |          sd S t          j        |d          }|t          k    rd S  fddD             }d |D             }t          	                    d||           |g|z   D ]}t          j
        |           d S )Nz etc/netplan/00-snapd-config.yamlF)decodec                 :    g | ]}t          j        |          S  )r   target_path)r   ftargets     r   r[   z"_clean_default.<locals>.<listcomp>   s6        	##  r   )z-run/systemd/network/10-netplan-all-en.networkz.run/systemd/network/10-netplan-all-eth.networkz#run/systemd/generator/netplan.stampc                 P    g | ]#}t           j                            |          !|$S rc   )ospathisfile)r   re   s     r   r[   z"_clean_default.<locals>.<listcomp>   s+    888abgnnQ&7&78888r   z9removing known config '%s' and derived existing files: %s)r   rd   rh   ri   rj   r   	load_fileKNOWN_SNAPD_CONFIGrD   debugunlink)rf   tpathcontentderivedexistingre   s   `     r   _clean_defaultrs      s     V%GHHE7>>%   nU5111G$$$   
  G 987888HIIC   Wx  
	! r   c                       e Zd ZdZddgZddgZddZed             Z	 	 dde	d	e
e         d
dfdZddZddZde	fdZdS )RendererzBRenders network information in a /etc/netplan/network.yaml format.netplangenerateinfoNc                    |si }|                     dd          | _        |                     dd           | _        |                     dd          | _        |                     dd          | _        |                     dd           | _        d S )	Nnetplan_pathzetc/netplan/50-cloud-init.yamlnetplan_headerpostcmdsFclean_defaultTrJ   )rA   rz   r{   	_postcmdsr}   	_features)selfr   s     r   __init__zRenderer.__init__   s     	F"JJ<
 
 %jj)94@@J66#ZZ>>J55r   c                 >   | j         	 t          j        | j        d          \  }}t          j        |          }|d         d         | _         nI# t          j        $ r Y n8t          t          f$ r%}t          	                    d|           Y d }~nd }~ww xY w| j         S )NTcapturez
netplan.iorJ   z-Failed to list features from netplan info: %s)
r   r   NETPLAN_INFOr   	load_yamlProcessExecutionError	TypeErrorKeyErrorrD   rm   )r   	info_blob_errrx   es        r   rJ   zRenderer.features   s    >!	N"&)D,=t"L"L"L	4~i00!%l!3J!?-    x( N N N		I1MMMMMMMMN~s   AA B B0BBnetwork_state	templatesreturnc                    t           j                            t          j        |          | j                  }t          j        t           j                            |                     | j	        r| j	        nd}| 
                    |          }|                    d          s|dz  }t          j        |||z              | j        rt          |           |                     | j                   |                     | j                   d S )N 
)rf   )run)rh   ri   joinr   rd   rz   r   
ensure_dirdirnamer{   _render_contentendswith
write_filer}   rs   _netplan_generater~   _net_setup_link)r   r   r   rf   fpnplanheaderrp   s          r   render_network_statezRenderer.render_network_state   s     ',,t/779JKK00111(,(;C$$ &&}55t$$ 	dNF'!1222 	*&))))4>22200000r   Fc                 x    |st                               d           d S t          j        | j        d           d S )Nz!netplan generate postcmd disabledTr   )rD   rm   r   NETPLAN_GENERATE)r   r   s     r   r   zRenderer._netplan_generate  s@     	II9:::F	$'666666r   c                    |st                               d           dS g d}t          }t          d          D ]}}	 t	                      D ]K}t
          j                            t          |z             r"t          j	        |t          |z   gz   d           L dS # t          j
        $ r}|}Y d}~vd}~ww xY wt          d          |)zTo ensure device link properties are applied, we poke
        udev to re-evaluate networkd .link files and call
        the setup_link udev builtin command
        z'netplan net_setup_link postcmd disabledN)udevadmztest-builtinnet_setup_link   Tr   zQ'udevadm test-builtin net_setup_link' unable to run successfully for all devices.)rD   rm   	Exceptionranger   rh   ri   islinkr
   r   r   RuntimeError)r   r   	setup_lnklast_exception_ifacer   s          r   r   zRenderer._net_setup_link  s   
  	II?@@@FAAA	 #q 	" 	"A#+--  Ew~~me&;<< 	%)>(??    - # # #!"# 0  ""s   ABB4(B//B4c           	         |j         dk    r8t                              d           t          j        d|j        idd          S i }i }i }i }i }g }|j                            dg           }|j        }	|j	        }
|
                                D ]l}|                    d          }t          d |                                D                       }|                    d	          }|d
k    r||                    dd           d}|d         8|                    dd           }|d|                                i|d<   n|d= |d= t          |||| j                   |                    ||i           |dk    rUi }i }t#          t          t%          j        d                    }dD ]o}t'          ||          }|                                D ]H\  }}|                    |                    dd                    }|1|                    ||i           Ipt+          |          dk    r|                    d|i           |                    d          r|d                                         |d<   |                    d          }|dk    rt-          |||           t          |||| j                   |                    ||i           B|dk    r|                    d          }t/          t1          j        |                    }d|i}d}t'          ||          }i }t#          t          t%          j        d                    } |                                D ]\  }}|                     |          }||                    ||i           |dv rGi }!|D ]+}"|"                                \  }#}$t5          |$          |!|#<   ,|                    ||!i           t+          |          dk    r|                    d|i           |                    d          r|d                                         |d<   t          |||| j                   |                    ||i           |dk    r|                    d          |                    d          d}%|                    dd           }||                                |%d<   t          ||%|| j                   |                    ||%i           n|	s|
rI|	|
d }&|||||fD ]<}'|'                                D ]%\  }(})d!|)v sd"|)vr|)                    d!|&i           &=d# }*|                    d$           | |*d%|          z  }| |*d&|          z  }| |*d'|          z  }| |*d(|          z  }| |*d)|          z  }d*                    |          S )+N   zV2 to V2 passthroughr8   F)explicit_startexplicit_endr\   rX   c              3   (   K   | ]\  }}|||fV  d S r   rc   )r   r   r   s      r   r   z+Renderer._render_content.<locals>.<genexpr>K  s<         S%$ e$$$$ r   r"   physicalr   )set-namer   mac_address
macaddressr   bond)bond_zbond-r   -r   
parameterszbond-slavesnonebridgebridge_portsbridge_)z	path-costzport-priorityvlanvlan_idzvlan-raw-device)idlink)r>   r@   r?   r>   c                 n    |r2t          j        | |iddd          }t          j        |d          }|gS g S )NFT)r   r   noaliasz    )r   dumpstextwrapindent)rX   sectiondumptxts       r   _render_sectionz1Renderer._render_content.<locals>._render_section  sO     ~7O#(!& 	   odG44uIr   znetwork:
    version: 2
	ethernetswifisbondsbridgesvlansr   )versionrD   rm   r   r   r   _network_staterA   r4   dns_searchdomainsiter_interfacesr   r   lowerrU   rJ   rB   r   r   r   replacerF   r_   r]   copyr$   intrC   r   )+r   r   r   r   r   r   r   rp   r\   r?   rK   r   rI   ifcfgif_typeethmacaddrr   bond_configv2_bond_mapr   bond_paramsparamr   newnameslave_interfacesr   portsr   match_prefixparams	br_configv2_bridge_mapnewvaluevalportportvalr   nscfgr   _namerY   r   s+                                              r   r   zRenderer._render_content1  s     A%%II,--->M01$"    	"155lBGG
#3%7#3355 h	- h	-FZZ''F  $*LLNN    E ii''G*$$ !'"YYw55  w<'#iit<<G*(4gmmoo'FGL
O"5#vt}EEE  &#////F""  #4)9)=f)E)EFF 0 = =E";E5"I"IK*5*;*;*=*= = ="-//%--S2I2I"J"J"?$#**GU+;<<<<	= {##a''KK{ ;<<<99]++ F).})=)C)C)E)ED&#(99]#;#; #v--0T6JJJ"5$FFFfd^,,,,H$$$yy88ty6677 % 
  )25,GG	 !%T+;+?+I+I J J '-llnn > >NUE+//66G $$gu%5666"@@@#%#( : :C.1iikkOT7-0\\HTNN!(('8)<===y>>A%%MM<";<<<99]++ H+0+?+E+E+G+GF<("5&&$-HHH/0000F""  ))I..!II&788   ))M488&)0D&"5$FFFfd^,,,  	7- 	7"-GGE%ueWeD 7 7")--// 7 7JE3$++{#/E/E JJu566667
	 
	 
	 	3444??;	:::??7E222??7E222??9g666??7E222wwwr   r   )NN)F)__name__
__module____qualname____doc__r   r   r   propertyrJ   r   r   r   r   r   r   r   rc   r   r   ru   ru      s        LL!:.v&L	6 	6 	6 	6   X" %)	1 1#1 D>1
 
1 1 1 147 7 7 7" " " ">_ \ _  _  _  _  _  _ r   ru   c                 R    dg}ddg}|D ]}t          j        |||           s dS dS )Nrv   z	/usr/sbinz/sbin)r@   rf   FT)r   which)rf   expectedr@   ps       r   	availabler     sL    {H7#F  z!F6::: 	55	4r   c                     d}t          ||d          }|sd}|                    d          s|dz  } |j        |           }||z   S )Nzetc/network/50-cloud-init.yaml)rz   r{   r   r   )ru   r   r   )r   r   rz   r   contentss        r   network_state_to_netplanr     so    3L($	
 	
 H  ??4   $'x'66HHr   r   ) r   rh   r   typingr   r   	cloudinitr   loggingr   r   r   cloudinit.netr	   r
   r   r   r   cloudinit.net.network_stater   r   rl   	getLoggerr   rD   r   rU   r_   rs   ru   r   r   rc   r   r   <module>r      s    				  ! ! ! ! ! ! ! ! $ $ $ $ $ $ * * * * * * * * * *              G F F F F F F F   g!!  xK xK xK xKv	7 	7 	7   :~  ~  ~  ~  ~ x  ~  ~  ~ B        r   