Current File : //lib/python2.7/site-packages/cloudinit/net/netplan.pyc
�
oB�]c@s�ddlZddlZddlmZddlmZmZmZddlm	Z
ddlmZddlmZddl
mZmZd	Ze
je�Zd
�Zdd�Zd�Zdd
�Zdejfd��YZdd�Zdd�ZdS(i����Ni(trenderer(tsubnet_is_ipv6tNET_CONFIG_TO_V2tIPV6_DYNAMIC_TYPES(tlog(tutil(tsafeyaml(t
SYS_CLASS_NETtget_devicelists4# 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
cs t�fd�|j�D��S(Nc3s0|]&\}}|j��r||fVqdS(N(t
startswith(t.0tkeytvalue(tmatch(s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pys	<genexpr>"s	(tdicttitems(tconfigR
((R
s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt_get_params_dict_by_match!sc	Cs[dd�}|d"kr!g}ng}g}g}g}|jdg�}	|	d"kr`g}	nxy|	D]q}
|
jd�}|jd�r�|dkr�|d7}n|jit|6�qg|tkr�|jitd6�qg|d#krgd	|
jd
�}d|
kr#|d|
jd�7}nd
|
kr�|
jd
�r�|
jd
�}
d|
krp|ji|
d6�q�|ji|
d6�nd|
kr�|||
jdg��7}nd|
kr�|||
jdg��7}nd|
kr0d}t|
�rd|krd}n|ji|
jd�|6�nx�|
jdg�D]�}d|jd�|jd�f}i|jd
�d6|d6}d|kr�|ji|jdd�d6�n|j|�qCW|j|�qgqgWd|kr;|jd�}|r*|d|kr*tj	d||d|�q;|d|d<nt
|�dkrd|ji|d6�nt
|�dkr�|ji|d6�nt
|�dkr�i|d6}|ji|d6�nt
|�dkr|jdi�}|ji|d 6�|ji|d6�nd!|krW|d!d"k	rW|jitj|jd!��d!6�nd"S($s�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}

    t cSsD|st|�tgkr |S||kr9|j|�S|gSdS(sBHelper to convert strings to list of strings, handle single stringN(ttypetstrtsplit(tobjttoken((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt_listifyKs

tsubnetsRtdhcpt4tdhcp6tstatics%staddresstprefixs/%dtgatewayt:tgateway6tgateway4tdns_nameserverst
dns_searchtmtusipv6-mtutroutess%s/%stnetworktviattotmetricidsZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.it	addressestnameserverstsearchs	accept-raN(R(
tNonetgetR	tupdatetTrueRRtappendtLOGtwarningtlenRtis_true(RtentrytifnametfeaturesRR,R'R-t
searchdomainsRtsubnettsn_typetaddrR tmtukeytroutetto_nett	new_routet	entry_mtutns((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt_extract_addresses&s�%			

	 
#
cCsptg|j�D]*\}}|jdd�|kr|^q�}t|�dkrl|ji|d6�ndS(Nsbond-masterit
interfaces(tsortedRR0R/R6R1(RFR8tbond_mastertnametcfgtbond_slave_names((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt_extract_bond_slaves_by_name�s'cCs�tj|d�}tjj|�s(dStj|dt�}|tkrMdSgdD]}tj||�^qT}g|D]}tjj|�ry|^qy}tj	d||�x"|g|D]}tj
|�q�WdS(Ns etc/netplan/00-snapd-config.yamltdecodes-run/systemd/network/10-netplan-all-en.networks.run/systemd/network/10-netplan-all-eth.networks#run/systemd/generator/netplan.stamps9removing known config '%s' and derived existing files: %s(s-run/systemd/network/10-netplan-all-en.networks.run/systemd/network/10-netplan-all-eth.networks#run/systemd/generator/netplan.stamp(Rttarget_pathtostpathtisfilet	load_filetFalsetKNOWN_SNAPD_CONFIGR4tdebugtunlink(ttargetttpathtcontenttftderivedtexisting((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt_clean_default�s"+	
tRenderercBsqeZdZddgZddgZd
d�Zed��Zd
d
d�Z	e
d�Ze
d�Zd	�Z
RS(sBRenders network information in a /etc/netplan/network.yaml format.tnetplantgeneratetinfocCs||si}n|jdd�|_|jdd�|_|jdt�|_|jdt�|_|jdd�|_dS(Ntnetplan_pathsetc/netplan/50-cloud-init.yamltnetplan_headertpostcmdst
clean_defaultR:(	R0RbR/RcRSt	_postcmdsR2Ret	_features(tselfR((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt__init__�s		cCs�|jdkr�yBtj|jdt�\}}tj|�}|dd|_Wq�tjk
rgq�tt	fk
r�}t
jd|�q�Xn|jS(Ntcaptures
netplan.ioR:s-Failed to list features from netplan info: %s(RgR/RtsubptNETPLAN_INFOR2t	load_yamltProcessExecutionErrort	TypeErrortKeyErrorR4RU(Rht	info_blobt_errRate((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyR:�scCs�tjjtj|�|j�}tjtjj|��|jrL|jnd}|j	|�}|j
d�s}|d7}ntj|||�|jr�t
d|�n|jd|j�|jd|j�dS(Nts
RWtrun(RORPtjoinRRNRbt
ensure_dirtdirnameRct_render_contenttendswitht
write_fileReR]t_netplan_generateRft_net_setup_link(Rht
network_statet	templatesRWtfpnplantheaderRY((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pytrender_network_state�s!
	cCs1|stjd�dStj|jdt�dS(Ns!netplan generate postcmd disabledRj(R4RURRktNETPLAN_GENERATER2(RhRu((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyR|�s
cCs�|stjd�dSdddg}xXgt�D]-}tjjt|�r3|t|g^q3D]}tj|dt	�qdWdS(s�To ensure device link properties are applied, we poke
           udev to re-evaluate networkd .link files and call
           the setup_link udev builtin command
        s'netplan net_setup_link postcmd disabledNtudevadmstest-builtintnet_setup_linkRj(
R4RURRORPtislinkRRRkR2(RhRut	setup_lnktifacetcmd((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyR}�s

1c*Cs|jdkr?tjd�tji|jd6dtdt�Si}i}i}i}i}g}|jjdg�}|j	}	|j
}
xz|j�D]l}|jd�}td�|j
�D��}
|
jd	�}|d
kr�i|d6|
jdd�d6}|ddkr\|
jd
d�}|dk	rKi|j�d6|d<q\|d=|d=nt|
|||j�|ji||6�q�|dkr�i}i}tjd�}x�ddgD]s}t|
|�}x[|j
�D]M\}}|j|jdd��}|dkrq�n|ji||6�q�Wq�Wt|�dkr]|ji|d6�n|
jd
�r�|
jd
�j�|d<n|
jd�}|dkr�t|||�nt|
|||j�|ji||6�q�|dkrsttj|
jd���}i|d6}d}t|
|�}i}tjd�}x�|j
�D]�\}}|j|�}|dkr~qQn|ji||6�|d-krQi} x0|D](}!|!j�\}"}#t|#�| |"<q�W|ji| |6�qQqQWt|�dkr|ji|d6�n|
jd
�rF|
jd
�j�|d<nt|
|||j�|ji||6�q�|dkr�i|
jd�d6|
jd �d!6}$|
jd
d�}|dk	r�|j�|$d<nt|
|$||j�|ji|$|6�q�q�W|	s|
r�i|	d"6|
d#6}%xo|||||gD]U}&xL|&j
�D]>\}'}(d$|(ksPd"|(krzqPn|(ji|%d$6�qPWq=Wnd%�})|jd&�||)d'|�7}||)d(|�7}||)d)|�7}||)d*|�7}||)d+|�7}d,j|�S(.NisV2 to V2 passthroughR(texplicit_starttexplicit_endRFRIcss-|]#\}}|dk	r||fVqdS(N(R/(R
RR((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pys	<genexpr>s	Rtphysicalsset-nameR
tmac_addresst
macaddresstbondtbond_sbond-t_t-it
parameterssbond-slavestnonetbridgetbridge_portstbridge_s	path-costs
port-prioritytvlantvlan_idtidsvlan-raw-devicetlinkR,R.R-cSsK|rGtji||6dtdtdt�}tj|d�}|gSgS(NR�R�tnoaliasRis    (RtdumpsRSR2Rtindent(RItsectiontdumpttxt((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt_render_section�s	snetwork:
    version: 2
t	ethernetstwifistbondstbridgestvlansRt(s	path-costs
port-priority(tversionR4RURR�RRSt_network_stateR0R$tdns_searchdomainstiter_interfacesRRR/tlowerRER:R1RRtreplaceR6RLRGtcopyRtintR3Rv(*RhR~R�R�R�R�R�RYRFR-R;RR9tifcfgtif_typetethtmacaddrR�tbond_configtv2_bond_mapR
tbond_paramstparamRtnewnametslave_interfacestportsR�tmatch_prefixtparamst	br_configt
v2_bridge_maptnewvaluetvaltporttportvalR�tnscfgR�t_nameRJR�((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyRys�
		


	

N(t__name__t
__module__t__doc__R�RlR/RitpropertyR:R�RSR|R}Ry(((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyR^�s
cCsIdg}ddg}x-|D]%}tj|d|d|�stSqWtS(NR_s	/usr/sbins/sbinR.RW(RtwhichRSR2(RWtexpectedR.tp((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt	available�s	
cCsbd}ti|d6|d6�}|s/d}n|jd�sK|d7}n|j|�}||S(Nsetc/network/50-cloud-init.yamlRbRcRts
(R^RzRy(R~R�RbRtcontents((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pytnetwork_state_to_netplan�s
	
(R�RORtRR~RRRt	cloudinitRtloggingRRt
cloudinit.netRRRTt	getLoggerR�R4RR/RERLR]R^R�R�(((s9/usr/lib/python2.7/site-packages/cloudinit/net/netplan.pyt<module>s 	w	�