Current File : //lib/python2.7/site-packages/cloudinit/net/network_state.pyo
�
oB�]c@s�ddlZddlZddlZddlZddlZddlZddlmZddlmZej	e
�ZdZddddgZ
id	d
dgd6Zdd
dddddddddddddgZiidd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d86id9d:6d;d<6d=d>6ed?6d@dA6dBdC6edD6dEdF6dGdH6dIdJ6edK6dL6ZedM�ZedN�ZdO�ZdP�ZdQefdR��YZdS�ZdTefdU��YZdVefdW��YZeje�dXefdY��Y�ZdZ�Z fd[�Z!d\�Z"d]�Z#d^�Z$d_�Z%d`�Z&da�Z'db�Z(dc�Z)dd�Z*dS(ei����N(tsafeyaml(tutilitdhcp6t
ipv6_slaacsipv6_dhcpv6-statelesssipv6_dhcpv6-statefultversiontconfigt
network_statet	addressestdhcp4sdhcp4-overridessdhcp6-overridestgateway4tgateway6t
interfacestmatchtmtutnameserverstrenderersset-namet	wakeonlans	accept-ras	ad-selectsbond-ad-selectsarp-intervalsbond-arp-intervals
arp-ip-targetsbond-arp-ip-targetsarp-validatesbond-arp-validates
down-delaysbond-downdelaysfail-over-mac-policysbond-fail-over-macs	lacp-ratesbond-lacp-ratesmii-monitor-intervalsbond-miimons	min-linkssbond-min-linkstmodes	bond-modesgratuitious-arpsbond-num-grat-arptprimarysbond-primarysprimary-reselect-policysbond-primary-reselectsup-delaysbond-updelaystransmit-hash-policysbond-xmit-hash-policytbondsageing-timet
bridge_ageingtprioritytbridge_bridgeprios
forward-delayt	bridge_fdtbridge_gcints
hello-timetbridge_hellosmax-aget
bridge_maxagetbridge_maxwaits	path-costtbridge_pathcosts
port-prioritytbridge_portpriotstpt
bridge_stptbridge_waitporttbridgecCs�d}|jd�}|jd�}|dkr9|}n|r|dk	rtd|d|�}|jd|�|j�}n|S(sfParses the config, returns NetworkState object

    :param net_config: curtin network config dict
    RRitskip_brokenN(tNonetgettNetworkStateInterpretertparse_configtget_network_state(t
net_configR"tstateRRtnsi((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytparse_net_config_data?s	cCsCd}tj|�}d|kr?t|jd�d|�}n|S(sJParses a curtin network configuration file and
       return network statetnetworkR"N(R#Rt	read_confR+R$(tpathR"tnsR(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytparse_net_configTscCs)tj|�}t�}|j|�|S(N(RR-R%tload(t
state_fileR)R*((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytfrom_state_file_s	
cCs.t|�}x|D]}|j|�qW|S(N(tsettdiscard(texpectedtactualtmissingtkey((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt	diff_keysfs
tInvalidCommandcBseZRS((t__name__t
__module__(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR;mscs�fd�}|S(Ncs%tj����fd��}|S(NcsJ�r7t�|�}|r7td|�f��q7n�||||�S(Ns&Command missing %s of required keys %s(R:R;(tselftcommandtargstkwargstmissing_keys(tfunct
required_keys(s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt	decoratorus(t	functoolstwraps(RCRE(RD(RCs?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytwrapperss!
((RDRH((RDs?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytensure_command_keysqstCommandHandlerMetacBseZdZd�ZRS(sMetaclass that dynamically creates a 'command_handlers' attribute.

    This will scan the to-be-created class for methods that start with
    'handle_' and on finding those will populate a class attribute mapping
    so that those methods can be quickly located and called.
    cCs�i}x[|j�D]M\}}t|�r|jd�r|td�}|r`|||<q`qqW||d<tt|�j||||�S(Nthandle_tcommand_handlers(titemstcallablet
startswithtlentsuperRJt__new__(tclstnametparentstdctRLt	attr_nametattrthandles_what((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRR�s
(R<R=t__doc__RR(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRJ�stNetworkStatecBs�eZed�Zed��Zed��Zed��Zed��Zed��Z	d
d�Zd
d�Zd�Z
d	�ZRS(cCs=tj|�|_||_|jdt�|_d|_dS(Ntuse_ipv6(	tcopytdeepcopyt_network_statet_versionR$tFalseR\R#t_has_default_route(R>RR((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt__init__�s	cCs|jdS(NR(R_(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�scCs|jS(N(R`(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�scCs,y|jddSWntk
r'gSXdS(NtdnsR(R_tKeyError(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytdns_nameservers�s
cCs,y|jddSWntk
r'gSXdS(NRdtsearch(R_Re(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytdns_searchdomains�s
cCs(|jdkr!|j�|_n|jS(N(RbR#t_maybe_has_default_route(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythas_default_route�sccs[|jjdi�}x?tj|�D].}|dkr?|Vq%||�r%|Vq%q%WdS(NR(R_R$tsixt
itervaluesR#(R>tfilter_functifacestiface((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytiter_interfaces�sccsLxE|jjdg�D].}|dk	r?||�rD|VqDq|VqWdS(Ntroutes(R_R$R#(R>Rmtroute((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytiter_routes�s
cCs�x'|j�D]}|j|�r
tSq
Wxa|j�D]S}xJ|jdg�D]6}x-|jdg�D]}|j|�ritSqiWqPWq7WtS(NtsubnetsRq(Rst_is_default_routetTrueRpR$Ra(R>RrRotsubnet((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRi�scCs.d}|jd�dko-|jd�|kS(Ns::s0.0.0.0tprefixiR,(s::s0.0.0.0(R$(R>Rrtdefault_nets((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRu�sN(R<R=tNETWORK_STATE_VERSIONRctpropertyRRRfRhRjR#RpRsRiRu(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR[�s		R%cBs�eZiid6gd6igd6gd6d6ed6d+d6Zed+d�Zed��Zed	��Z	e	j
d
��Z	d�Zd�Zd
�Z
d�Zd�Zed�Zed�Zed�Zedg�d��Zedg�d��Zedddg�d��Zedddg�d��Zeddg�d��Zedg�d��Zedg�d ��Zed!g�d"��Zd#�Zd$�Zd%�Zd&�Z d'�Z!d(�Z"d+d)�Z#d*�Z$RS(,RRqRRgRdR\RcCsA||_||_tj|j�|_||jd<t|_dS(NR(R`t_configR]R^tinitial_network_stateR_Rat_parsed(R>RR((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyRc�s
		
cCst|jd|j�S(NR(R[R_R`(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�scCs|jjd�S(NR\(R_R$(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR\�scCs|jji|d6�dS(NR\(R_tupdate(R>tval((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR\�scCs1i|jd6|jd6|jd6}tj|�S(NRRR(R`R|R_Rtdumps(R>R)((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytdumps



cCs�d|kr(tjd�td��nt|d}t||�}|rqd|}tj|�t|��nxAg|D]}|dkr{|^q{D]}t||||�q�WdS(NRs$Invalid state, missing version fieldsInvalid state, missing keys: %s(sversion(tLOGterrort
ValueErrortNETWORK_STATE_REQUIRED_KEYSR:tsetattr(R>R)RDRBtmsgtkR9((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR1s


,cCstj|j�S(N(RR�R_(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytdump_network_statescCsi|jd6|jd6S(NRR(R`R|(R>((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytas_dictscCs
|j}|S(N(R(R>R/((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR's	cCsZ|jdkr+|jd|�t|_n+|jdkrV|jd|�t|_ndS(NiR"i(R`tparse_config_v1RvR~tparse_config_v2(R>R"((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR&"scCs�x�|jD]�}|d}y|j|}Wn!tk
rNtd|��nXy|||�Wq
tk
r�|s|�q�tjd|dt�tj|j	��q
Xq
WdS(Nttypes!No handler found for command '%s'sSkipping invalid command: %stexc_info(
R|RLRetRuntimeErrorR;R�twarningRvtdebugR�(R>R"R?tcommand_typethandler((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�*s


cCs�x�|jj�D]�\}}|dkr.qny|j|}Wn!tk
rbtd|��nXy|||�|j|�Wqtk
r�|s��q�tjd|dt	�tj
|j��qXqWdS(NRs!No handler found for command '%s'sSkipping invalid command: %sR�(R|RMRLReR�t
_v2_commonR;R�R�RvR�R�(R>R"R�R?R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�<s"


RTcCs
|j|�S(N(thandle_physical(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_loopbackPsc	Cs�|jjdi�}|j|di�}x:|jdi�j�D] \}}|ji||6�qDWt|jd��}|js�xK|D]@}|jd�jd�s�t|jd��r�t|_Pq�q�Wn|jdd�}|dk	rt
j|�}n|ji
|jd�d6|jd�d6|jd	�d	6d
d
6dd6|jd
�d
6dd6dd6|d6|d6�|jdji||jd�6�|j�dS(s�
        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ],
            'accept-ra': 'true'
        }
        RRTtparamsRtR�t6taddresss	accept-ratmac_addresstinettmanualRR
tgatewayN(
R_R$RMRt_normalize_subnetsR\tendswithtis_ipv6_addrRvR#Rtis_trueR�(	R>R?RRotparamR�RtRwt	accept_ra((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�Ts6%	
		$tvlan_idt	vlan_linkcCs|jjdi�}|j|�|j|jd�i�}|jd�|d<|jd�|d<|ji||d6�dS(s�
            auto eth0.222
            iface eth0.222 inet static
                    address 10.10.10.1
                    netmask 255.255.255.0
                    hwaddress ether BC:76:4E:06:96:B3
                    vlan-raw-device eth0
        RRTR�svlan-raw-deviceR�N(R_R$R�R(R>R?RRo((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_vlan�s

tbond_interfacesR�c	Cs�|j|�|jjd�}|j|jd�i�}x7|jd�j�D] \}}|ji||6�qPW|jidd6�|jdji||d6�x�|jd�D]�}||kr�i|d6dd6}|j|�n|jjdi�}|j|�}|jd�|d	<x7|jd�j�D] \}}|ji||6�q:W|jdji||6�q�Wd
S(s
    #/etc/network/interfaces
    auto eth0
    iface eth0 inet manual
        bond-master bond0
        bond-mode 802.3ad

    auto eth1
    iface eth1 inet manual
        bond-master bond0
        bond-mode 802.3ad

    auto bond0
    iface bond0 inet static
         address 192.168.0.10
         gateway 192.168.0.1
         netmask 255.255.255.0
         bond-slaves none
         bond-mode 802.3ad
         bond-miimon 100
         bond-downdelay 200
         bond-updelay 200
         bond-lacp-rate 4
        RRTR�tnonesbond-slavesR�RR�sbond-masterN(R�R_R$RMR(	R>R?RRoR�R�tifnametcmdtbond_if((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_bond�s&
"
"tbridge_interfacesc	Cs�|jjdi�}xC|jd�D]2}||kr=q%ni|d6}|j|�q%W|jjdi�}|j|�|j|jd�i�}|d|d<x:|jdi�j�D] \}}|ji||6�q�W|jd�}|dk	rit|�tkri|dkr%t}n-|dkr:t	}nt
d
jd|���|ji|d6�n|ji||d6�dS(s�
            auto br0
            iface br0 inet static
                    address 10.10.10.1
                    netmask 255.255.255.0
                    bridge_ports eth0 eth1
                    bridge_stp off
                    bridge_fd 0
                    bridge_maxwait 0

        bridge_params = [
            "bridge_ports",
            "bridge_ageing",
            "bridge_bridgeprio",
            "bridge_fd",
            "bridge_gcint",
            "bridge_hello",
            "bridge_hw",
            "bridge_maxage",
            "bridge_maxwait",
            "bridge_pathcost",
            "bridge_portprio",
            "bridge_stp",
            "bridge_waitport",
        ]
        RR�RTtbridge_portsR�Rtont1itofft0is2Cannot convert bridge_stp value ({stp}) to booleanRN(R�R�i(R�R�i(R_R$R�RMRR#R�tboolRvRaR�tformat(	R>R?RR�R�RoR�R�R((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt
handle_bridge�s0

%			cCs|j|�dS(N(R�(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_infiniband
sR�cCs�|jjd�}d|krk|d}t|�tksF|g}nx"|D]}|dj|�qMWnd|kr�|d}t|t�s�|g}nx"|D]}|dj|�q�WndS(NRdR�RRg(R_R$R�tlisttappendt
isinstance(R>R?RdtaddrstaddrtpathsR.((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_nameservers



tdestinationcCs|jdjt|��dS(NRq(R_R�t_normalize_route(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_routescCs|j|dd�dS(s�
        v2_command = {
          bond0: {
            'interfaces': ['interface0', 'interface1'],
            'parameters': {
               'mii-monitor-interval': 100,
               'mode': '802.3ad',
               'xmit_hash_policy': 'layer3+4'}},
          bond1: {
            'bond-slaves': ['interface2', 'interface7'],
            'parameters': {
                'mode': 1,
            }
          }
        }

        v1_command = {
            'type': 'bond'
            'name': 'bond0',
            'bond_interfaces': [interface0, interface1],
            'params': {
                'bond-mode': '802.3ad',
                'bond_miimon: 100,
                'bond_xmit_hash_policy': 'layer3+4',
            }
        }

        tcmd_typeRN(t_handle_bond_bridge(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_bonds#scCs|j|dd�dS(s�
        v2_command = {
          br0: {
            'interfaces': ['interface0', 'interface1'],
            'forward-delay': 0,
            'stp': False,
            'maxwait': 0,
          }
        }

        v1_command = {
            'type': 'bridge'
            'name': 'br0',
            'bridge_interfaces': [interface0, interface1],
            'params': {
                'bridge_stp': 'off',
                'bridge_fd: 0,
                'bridge_maxwait': 0
            }
        }

        R�R!N(R�(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_bridgesBsc
CsLxE|j�D]7\}}idd6|jd|�d6}|jdi�}|jdd�}|stjd|t|��n||d<|jd	d�}|r�i|d	6|d
<nx7dddd
gD]#}||kr�||||<q�q�W|j|�}	t|	�dkr'|ji|	d6�ntjd|�|j	|�q
WdS(s�
        ethernets:
          eno1:
            match:
              macaddress: 00:11:22:33:44:55
              driver: hv_netsvc
            wakeonlan: true
            dhcp4: true
            dhcp6: false
            addresses:
              - 192.168.14.2/24
              - 2001:1::1/64
            gateway4: 192.168.14.1
            gateway6: 2001:1::2
            nameservers:
              search: [foo.local, bar.local]
              addresses: [8.8.8.8, 8.8.4.4]
          lom:
            match:
              driver: ixgbe
            set-name: lom1
            dhcp6: true
            accept-ra: true
          switchports:
            match:
              name: enp2*
            mtu: 1280

        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ]
        }
        tphysicalR�sset-nameRTRt
macaddresssHNetworkState Version2: missing "macaddress" info in config entry: %s: %sR�tdriverR�R
Rs	accept-raiRts!v2(ethernets) -> v1(physical):
%sN(
RMR$R#R�R�tstrt_v2_to_v1_ipcfgRPRR�(
R>R?tethtcfgtphy_cmdRR�R�R9Rt((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_ethernets\s*&	
cCs�x�|j�D]�\}}idd6|d6|jd�d6|jd�d6}d|krj|d|d<n|j|�}t|�d	kr�|ji|d
6�ntjd|�|j|�q
WdS(
sq
        v2_vlans = {
            'eth0.123': {
                'id': 123,
                'link': 'eth0',
                'dhcp4': True,
            }
        }

        v1_command = {
            'type': 'vlan',
            'name': 'eth0.123',
            'vlan_link': 'eth0',
            'vlan_id': 123,
            'subnets': [{'type': 'dhcp4'}],
        }
        tvlanR�RTtidR�tlinkR�R
iRtsv2(vlans) -> v1(vlan):
%sN(RMR$R�RPRR�R�R�(R>R?R�R�tvlan_cmdRt((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_vlans�scCstjd�dS(NsNWifi configuration is only available to distros withnetplan rendering support.(R�R�(R>R?((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pythandle_wifis�scCs�tjd|�d|kr�|jd�jdg�}|jd�jdg�}idd6}t|�dkr�|ji|d6�nt|�dkr�|ji|d6�ntjd|�|j|�ndS(	Nsv2_common: handling config:
%sRRgRt
nameserverR�is$v2(nameserver) -> v1(nameserver):
%s(R�R�R$RPRR�(R>R�RgRdtname_cmd((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s
c
s�td�tj|�j�D���xw|j�D]i\}}td�|j�D��}|d}|jdd�}|r�||d<ni|d6|d6|jd�|d	6t�fd
�|jdi�j�D��d6}d|kr�|d|d<n|j|�}	t|	�d
kr5|ji|	d6�nt	j
d|||�|dkrg|j|�q2|dkr�|j|�q2t
djd|���q2WdS(s(Common handler for bond and bridge typescss!|]\}}||fVqdS(N((t.0R�tv((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>�scss-|]#\}}|tkr||fVqdS(N(tNETWORK_V2_KEY_FILTER(R�R9tvalue((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>�s	t
parameterssgratuitous-arpsgratuitious-arpR�RTRt_interfacesc3s%|]\}}�||fVqdS(N((R�R�R�(tv2key_to_v1(s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>�sR�R
iRtsv2(%s) -> v1(%s):
%sR!Rs Unknown command type: {cmd_type}R�N(tdicttNET_CONFIG_TO_V2R$RMtpopR#R�RPRR�R�R�R�R�R�(
R>R?R�t	item_nametitem_cfgtitem_paramsR�t
grat_valuetv1_cmdRt((R�s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s6		

#c
Csyd�}g}|jd�rTidd6}||jdi�|�|j|�n|jd�r�idd6}t|_||jdi�|�|j|�nd}d}i}x?|jdg�D]+}idd6|d	6}d
|kr.d|krl|dkrl|jd�}|ji|d6�qln>d
|krl|dkrl|jd
�}|ji|d6�nd|kr�|r�|jd�jd�}	|	r�|	|d<n|jd�jd�}
|
r�|
|d<n|j|�n|j|�q�Wg}xM|jdg�D]9}|jti|jd�d6|jd�d6��qWt|�rut|�ru||dd<n|S(s7Common ipconfig extraction from v2 to v1 subnets array.cSs!d|kr|d|d<ndS(Nsroute-metrictmetric((t	overridesRw((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt_add_dhcp_overrides�sRR�sdhcp4-overridesRsdhcp6-overridesRtstaticR�t:R
R�R	RRfRgt
dns_searchRqttoR�tviaiN(R$R�RvR\R#RR�RP(
R>R�R�RtRwR	R
RR�RRgRqRr((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��sR	

	


	.N(%R<R=RaR#R}RzRcR{RR\tsetterR�R1R�R�R'RvR&R�R�RIR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR%�sH
					05@			?	!		
)cCs�tj|�}td�|j�D��}|jd�dkr\|jt|dd��ng|jdg�D]}t|�^qo|d<d�}xd
D]}|||�q�W|S(Ncss'|]\}}|r||fVqdS(N((R�R�R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>5sR�R�tstatic6taddress_keysR�RqcSs;||kr7t||t�r7||j�||<ndS(N(R�R�tsplit(tsnetRT((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytlistify=s R�Rf(sstaticR�(saddress(s
dns_searchsdns_nameservers(R]R^R�RMR$Rt_normalize_net_keysR�(Rwt
normal_subnettrR�R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt_normalize_subnet2s,	
c
Cs�td�|j�D��}d
}x'|D]}|j|�r)|}Pq)q)W|s�ddj|�|f}tj|�t|��n|j|�}t|�}|jd�}d|kr|j	d�\}	}
}|	||<yt
|�}WqXtk
rt|�}qXXnF|r't|�}n1d|krFt
|d�}n|rRdnd}d|kr�t|d�t|�kr�tj
d	||�n||d<|r�d|kr�|d=q�nt|d�|d<|S(s�Normalize dictionary network keys returning prefix and address keys.

    @param network: A dict of network-related definition containing prefix,
        netmask and address_keys.
    @param address_keys: A tuple of keys to search for representing the address
        or cidr. The first address_key discovered will be used for
        normalization.

    @returns: A dict containing normalized prefix and matching addr_key.
    css'|]\}}|r||fVqdS(N((R�R�R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>Rss/No config network address keys [%s] found in %st,tnetmaskt/Rxi@is;Overwriting existing 'prefix' with '%s' in network info: %sN(R�RMR#R$tjoinR�R�R�R�t	partitiontinttmask_to_net_prefixR�R�tnet_prefix_to_ipv4_mask(
R,R�tnettaddr_keyR9tmessageR�tipv6R�t	addr_partt_tmaybe_prefixRx((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR�GsF



(	


cCs�td�|j�D��}d|kr@|d|d<|d=n|jt|dd��|jd�}|r�yt|�|d<Wq�tk
r�tdj|���q�Xn|S(s�normalize a route.
    return a dictionary with only:
       'type': 'route' (only present if it was present in input)
       'network': the network portion of the route as a string.
       'prefix': the network prefix for address as an integer.
       'metric': integer metric (only if present in input).
       'netmask': netmask (string) equivalent to prefix iff network is ipv4.
       css-|]#\}}|dkr||fVqdS(tN(RN(R#(R�R�R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pys	<genexpr>�s	R�R,R�R�s(Route config metric {} is not an integer(snetworksdestination(	R�RMRR�R$R�R�t	TypeErrorR�(Rrtnormal_routeR�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s


cCs,|sg}ng|D]}t|�^qS(N(R�(Rtts((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s	cCs|s
tSdt|�kS(NR�(RaR�(R�((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��scCsT|djd�s#|dtkr'tS|ddkrPt|jd��rPtStS(s:Common helper for checking network_state subnets for ipv6.R�R�R�R�(R�tIPV6_DYNAMIC_TYPESRvR�R$Ra(Rw((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytsubnet_is_ipv6�s
#%cCs1tjtjdddt|�>d@��}|S(s�Convert a network prefix to an ipv4 netmask.

    This is the inverse of ipv4_mask_to_net_prefix.
        24 -> "255.255.255.0"
    Also supports input as a string.s>II����i (tsockett	inet_ntoatstructtpackR�(Rxtmask((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s'cCs�t|t�r|St|tj�rJyt|�SWqVtk
rFqVXntd��d|krutd|��n|jd�}t|�dkr�td|t|�f��ntg|D]!}t	t|��j
d�^q��S(sConvert an ipv4 netmask into a network prefix length.

    If the input is already an integer or a string representation of
    an integer, then int(mask) will be returned.
       "255.255.255.0" => 24
       str(24)         => 24
       "24"            => 24
    s mask '%s' is not a string or intt.s#netmask '%s' does not contain a '.'isnetmask '%s' had only %d partsR�(R�R�Rktstring_typesR�RR�RPtsumtbintcount(Rttokstx((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytipv4_mask_to_net_prefix�s	
cCs
t|t�r|St|tj�rJyt|�SWqVtk
rFqVXntd��d|krqtd��ndddddd	d
ddd
dddddddg}d}xS|jd�D]B}|s�t|d�dkr�Pn||jt|d��7}q�W|S(s�Convert an ipv6 netmask (very uncommon) or prefix (64) to prefix.

    If 'mask' is an integer or string representation of one then
    int(mask) will be returned.
    s mask '%s' is not a string or intR�smask '%s' does not have a ':'ii�i�i�i�i�i�i�i�i��i��i�i�i��i��i��i��i(R�R�RkRR�RR�tindex(RtbitCountRxtword((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytipv6_mask_to_net_prefix�s&
 cCsFyt|�SWntk
r!nXt|�r8t|�St|�SdS(sXReturn the network prefix for the netmask provided.

    Supports ipv4 or ipv6 netmasks.N(R�R�R�RR(R((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyR��s

cCs�tdjg|jd�D] }tt|�d�d^q�d�}t|�}|dd|dB}djgtd�d	d	d
�D]}t||d>?d@�^q��}|S(sZCalculate the broadcast address from the subnet mask and ip addr.

    Supports ipv4 only.RRiiii iiNi����i�(R�R�R�RRtrangeR�(RtipRtip_bintmask_dect	bcast_bintit	bcast_str((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pytmask_and_ipv4_to_bcast_addrsH	>(+R]RFtloggingR
RRkt	cloudinitRRt	getLoggerR<R�RzRR�R�R#R�RvR+R0R3R:t	ExceptionR;RIR�RJtobjectR[t
add_metaclassR%R�R�R�R�R�RR�RRR�R%(((s?/usr/lib/python2.7/site-packages/cloudinit/net/network_state.pyt<module>s�	

			H��T	: