
    }fU                        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 dl
mZmZmZ d dlmZ  ej                   e      Zg dZg dZg dZd	 Zd
 ZddZd Zd Zd Z G d dej8                        ZddZddZy)    N)Optional)subputil)ParserErrorrenderersubnet_is_ipv6)NetworkState)zpre-upupzpost-updownzpre-downz	post-down)bridge_ageingbridge_bridgeprio	bridge_fdbridge_gcinitbridge_hellobridge_maxagebridge_maxwait
bridge_stp)addressnetmask	broadcastnetworkmetricgatewaypointtopointmediamtuhostname
leasehours	leasetimevendorclientbootfileserverhwaddrproviderframenetnumendpointlocalttlc                 D   g }g d}|j                         D ]}  \  }}|dk(  r|dk(  r|d   d|d   }|s!||v s&t        |t              rdj                  |      }d|v r|j	                  dd      }|j                  d	j                  ||              t        |      S )
N)
r   r   r   r   r   pointopointr   scope
dns_searchdns_nameserversr   r   /prefix _-    {0} {1})items
isinstancelistjoinreplaceappendformatsorted)ifacesubnetcontent	valid_mapkeyvalues         3/usr/lib/python3/dist-packages/cloudinit/net/eni.py_iface_add_subnetrE   @   s    GI lln 
=
U))%i0&2BCESI%%&czkk#s+NN=//U;<
= '?    c           
      P   |dk7  rg S g }g d}g d}ddi}| d   dvr|j                  d       | j                         D ]  \  }}t        |t              r	| |   rdnd	}|r||v r&|d
k(  r#|r!||k7  rt        j                  d| d   ||       N||v r9|D ]3  }	|j                  dj                  |j                  ||      |	             5 t        |t              rdj                  |      }|j                  dj                  |j                  ||      |              t        |      S )Nr   )	control	device_iddriverindexinetmodenamesubnetstype)bridge_pathcostbridge_portpriobridge_waitportmac_address	hwaddressrP   )bondbridge
infinibandvlanonoffr   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rN   r5   r2   )r;   r6   r7   boolLOGwarningr<   getr8   r9   r=   )
r>   rK   ipv4_subnet_mtur@   
ignore_mapmultiline_keysrenamesrB   rC   vs
             rD   _iface_add_attrsre   ^   sD    z	G
JN k*GV}DD-(kkm K
UeT"!#JDEEz)%<O':&M# .  O}33GKKS4I1MNOeT"HHUOE}++GKKS,A5IJ-K0 '?rF   c                 @   | d   }| d   }|dk(  rd}n|dv rd|z   }nd|z   }| j                         }|j                  ||d        dj                  di | d	j                  di |g}|r2| j                  d
      r!|j	                   dj                  di |       |S )NrN   rH   auto)hotplugzallow-z
# control-)fullnamecverbz{cverb} {fullname}ziface {fullname} {inet} {mode}rT   z    hwaddress {mac_address} )copyupdater<   r_   r;   )r>   rK   render_hwaddressri   rH   rj   substliness           rD   _iface_start_entryrq      s    V}HIG&	L	 7"w&JJLE	LLh78 	$##,e,/(//8%8E EIIm49299BEBCLrF   c                 d   d}|j                         D ]V  }|j                         }|j                  d      r&|j                  d      }|d   }|dk(  rm|d   }|j                  d      s t        j
                  j                  ||      }t        j                  |      D ]  }	t	        j                  |	      }
|
D cg c]u  }t        j
                  j                  t        j
                  j                  |	|            r6t        j                  d|       t        j
                  j                  |	|      w }
}|
D ]  }t        |d	      5 }|j                         j                         }ddd       t        j
                  j                  |      }t        | t        j
                  j!                  |      |         |d
k(  r|d   }|j                  d      s t        j
                  j                  ||      }t        j                  |      D ]  }	t        |	d	      5 }|j                         j                         }ddd       t        j
                  j                  |	      }t        | t        j
                  j!                  |      |        |dk(  r|dd D ]  }|| vrd|i| |<   d| |   d<    |dk(  rB|dd \  }}}|| vrd|i| |<   nd| |   v rt#        d|d|d      || |   d<   || |   d<   |}|dk(  r|d   dk(  r|d   }n|d   }|| |   d<   |t$        v r|d   | |   |<   %|t&        v r:|| |   vrg | |   |<   | |   |   j)                  dj                  |dd              g|j                  d      r}d| |   vri | |   d<   |dk(  r1g | |   d   d<   |dd D ]  }| |   d   d   j)                  |        |dk(  sg | |   d   d<   |dd D ]  }| |   d   d   j)                  |        |j                  d      rd| |   vri | |   d<   |t*        v r#|j-                  dd d      }|d   | |   d   |<   A|d!k(  r1g | |   d   d"<   |dd D ]  }| |   d   d"   j)                  |        w|d#k(  r6|d   j/                         d$k(  r|d   | |   d   d$<   |d   | |   d   d$<   |d%k(  r+d&| |   d   vri | |   d   d&<   |d   | |   d   d&   |d   <   |d'k(  sd(| |   d   vri | |   d   d(<   |d   | |   d   d(   |d   <   |j                  d)      s'd*| |   vri | |   d*<   |j-                  d)d d      }|d   | |   d*   |<   Y | j1                         D ]  }d| |   vsd+| |   d<    yc c}w # 1 sw Y   1xY w# 1 sw Y   gxY w),a~  Parses the file contents, placing result into ifaces.

    '_source_path' is added to every dictionary entry to define which file
    the configuration information came from.

    :param ifaces: interface dictionary
    :param contents: contents of interfaces file
    :param src_dir: directory interfaces file was located
    :param src_path: file path the `contents` was read
    N#r2   r   zsource-directory   r0   z^[a-zA-Z0-9_-]+$rsourcerg   _source_pathTr>      familyz
Interface z* can only be defined once. Re-defined in 'z'.methodrU   ether   zdns-dnsz
dns-searchsearchzdns-nameserversnameserversbridge_rW    bridge_portsports	bridge_hwmacrQ   pathcostrR   portpriozbond-rV   F)
splitlinesstrip
startswithsplitospathr9   globlistdirisfilerematchopenreadabspath_parse_deb_config_datadirnamer   NET_CONFIG_OPTIONSNET_CONFIG_COMMANDSr;   NET_CONFIG_BRIDGE_OPTIONSr:   lowerkeys)ifacescontentssrc_dirsrc_pathcurrifliner   optionparsed_src_direxpanded_pathdir_contentsr   entryfpsrc_data	abs_entrynew_src_pathabs_pathr>   ry   rz   valdomainr#   bridge_optionbond_options                             rD   r   r      sk    F##% s;zz|??3

3q''"1XN!,,S1!#g~!F!%>!: !zz-8 !- rww||M4'HIHH%7>J	 GGLL5    * EeS) 5R#%779??#45 " 6I*"''//)*Di	" x 8L**3/!ww||G\B!%<!8 -- 1!wwy0H177??=9&Hbggooh&?	 vqr -& '%F5M )-uf%- w$)!AJ!E66F" #H!u VE]*!-2H>  '-F5M(#&,F5M(#F{"Qx7"AhAh*-F6N;'))%*1XF6N6"**VF^+)+vv&6N6"))#((59*=>v&F6N*(*vu%%24vu%h/#ABi CF6N5)(3::6BC,,79vu%m4#ABi HF6N5)-8??GHy)vf~-+-vx(22 &y"a @:?(vx(7>)46vx(1"12Y DE6N8,W5<<UCD;&
 8>>#u,6;AhF6N8,U36;AhF6N8,U3,,VF^H%==;=F6N8,Z8AFqvx(4U1X>,,VF^H%==;=F6N8,Z8AFqvx(4U1X>w'VF^+)+vv& .."a8K27(F6N6";/gs;h  *&$)F5M&!*Q 5 51 1s   =A:V
V	!V%V"%V/c                 :    i }t        || d d        t        |      S )N)r   r   )r   _ifaces_to_net_config_data)eni_datar   s     rD   convert_eni_datar   7  s     F68TDI%f--rF   c                    i }| j                         D ]  \  }}|j                  d      d   }||vr"|dk(  rd}nd}||g d||<   d|v r|d   ||   d<   ||d	   d
}|j                  d      rd|d<   nd|d<   |j                  d	      dk(  r|d   |d<   dD ]  }||v s||   ||<    d|v r&dD ]!  }||d   v s|d   |   s|d   |   |d|z   <   # ||   d   j                  |        dt	        |      D 	cg c]  }	||	   	 c}	dS c c}	w )zReturn network config that represents the ifaces data provided.
    ifaces = _parse_deb_config_data(...)
    config = ifaces_to_net_config_data(ifaces)
    state = parse_net_config_data(config).:r   loloopbackphysical)rP   rN   rO   rU   rT   rz   )_orig_eni_namerP   rg   rH   manualstaticr   )r   r   r   r}   )r   r~   dns_rO   rt   )versionconfig)r6   	partitionr_   r;   r=   )
r   devsrN   datadevnamedtyper?   copy_keynds
             rD   r   r   >  sn   
 Dlln 0
d..%a($$""%*GKDM d"/3K/@Wm,$($x.A88F &F9 (F988H) $YF9; 	2H4#'>x 	2 D=. 8U#UA)-eQF6A:&8 	Wi ''/=0@ fTl$CT!W$CDD$Cs   8D	c                   P    e Zd ZdZddZddZddZddZ	 	 ddede	e
   d	dfd
Zy)Rendererz@Renders network information in a /etc/network/interfaces format.Nc                     |si }|j                  dd      | _        |j                  dd       | _        |j                  dd      | _        y )Neni_pathetc/network/interfaces
eni_headernetrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r_   r   r   r   )selfr   s     rD   __init__zRenderer.__init__j  sF    F

:/GH **\48#ZZG
rF   c                    g }|dz   }|dz   }d}ddd}d}|d   d	k(  r|d
   d	k(  rd}n|d   dk(  r
|d   dk(  rd}d}	dD ]  }
|r|
dk(  r|
dk(  r|	|d||
   d||
   z  }	$|
|v s)|
dk(  rCd||
   v r|	dz  }	n|j                  d      dk(  r|	dz  }	n|	dz  }	d|v s_|	d||
   d|d   z  }	q|	d||
   d||
   z  }	 |j                  ||	z   |z          |j                  ||	z   |z          |S )a  When rendering routes for an iface, in some cases applying a route
        may result in the route command returning non-zero which produces
        some confusing output for users manually using ifup/ifdown[1].  To
        that end, we will optionally include an '|| true' postfix to each
        route line allowing users to work with ifup/ifdown without using
        --force option.

        We may at somepoint not want to emit this additional postfix, and
        add a 'strict' flag to this function.  When called with strict=True,
        then we will not append the postfix.

        1. http://askubuntu.com/questions/168033/
                 how-to-set-static-routes-in-ubuntu-server
        zpost-up route addzpre-down route delz || truegwr   )r   r   r   r   z0.0.0.0r   z defaultz::r1   r   z -A inet6 default)r   r   r   r   r2   r   z	 -A inet6    z -hostz -netr0   )r_   r;   )r   routeindentr@   r
   r   or_truemapping
default_gw
route_lineks              rD   _render_routezRenderer._render_routes  se    )),,

 
y(U9-=-J#J9%%/Q*>,J
1 	DAa9nI~J
E!HMM
e	>eAh"k1
8,2"h.
"g-
5("%(E(O&LL
gaj%("CCJ!	D" 	rJ01tj(723rF   c           	      Z   g }|j                  di       }|j                  dd       }|j                  dd       }|rd|d<   |rit        |      D ]X  \  }}d }	||d<   |d   |d<   |j                  d	d
      |d	<   d}
t        |      r|
dz  }
n|j                  d      }	|
|d<   |d   dk(  s|d   dk(  s|d   dk(  rd|d<   |K|rdnd|d<   nA|d   dk(  rd
|d<   d|d<   n.|d   dk(  rd
|d<   d|d<   nt        |      rd|d<   |	|rdnd|d<   d|D cg c]  }d|d   z  |v  c}v rd|d	<   t	        t        |||      t        ||      z   t        |||	      z         }|j                  dg       D ]$  }|j                  | j                  |d             & |j                  |       [ |S g }d |v sd!|v r!|j                   d"j                  d&i |       |j                   d#j                  d&i |       |j                  t        |d$d %             |j                  |       |S c c}w )'NrO   z	accept-ra	wakeonlangzethernet-wolrK   rP   rM   rH   rg   rL   6r   dhcp4dhcp6zipv6_dhcpv6-statefuldhcp10	accept_razipv6_dhcpv6-stateless
ipv6_slaacr   Tzauto %srN   aliasrn   routesz    )r   zbond-masterzbond-slaveszauto {name}ziface {name} {inet} {mode}r   )rK   r`   rk   )r_   pop	enumerater   r8   rq   rE   re   extendr   r;   r<   )r   r>   rn   sectionsrO   r   ethernet_wolrK   r?   r`   subnet_inetr   rp   r   s                 rD   _render_ifacezRenderer._render_iface  s   ))Ir*IIk40	yyd3$'E.!!*7!3 7'v"&!&g &vf#)::i#@i $!&)3&K&,jj&7O +f6Ng-f~0f~)?? %+E&M ,4=S3k*F^'>>$*E&M$'E&MF^|3$*E&M$'E&M#F+$,E&M ,4=S3k* DL<@Iv/47  (/E)$&u7G (v67 'ue_E	F $ZZ"5 KELL!3!3E&!3!IJK &o7'D  E%%)?1]11:E:;LL<5<<EuEFLL aF OOE"5s   H(c                   
 ddddddgd}|j                         D ],  }|j                  d      dk(  st        j                  |      }. |j                  }|rd	j                  |      |d
   d   d<   |j                  }|rd	j                  |      |d
   d   d<   ddddddd
g }|j                  | j                  |             t        |j                         
fd      D ]9  }|j                  d      dk(  r|j                  | j                  ||             ; |j                         D ]"  }|j                  | j                  |             $ dj                  |D 	cg c]  }	dj                  |	       c}	      dz   S c c}	w )z1Given state, emit etc/network/interfaces content.r   r   rL   r   rg   )rP   rH   )rN   rP   rL   rO   rN   r2   rO   r   r/   r.   rt   r|      rx      )r   r   rX   rV   rW   rY   c                     | d      | d   fS )NrP   rN   rk   )r   orders    rD   <lambda>z-Renderer._render_interfaces.<locals>.<lambda>  s    56+QvY7 rF   )rB   r   z


)iter_interfacesr_   rl   deepcopyr/   r9   dns_searchdomainsr   r   r=   iter_routesr;   r   )r   network_statern   r   r>   r   searchdomainsr   r   sr   s             @rD   _render_interfaceszRenderer._render_interfaces  s    !+?@	
 #224 	*Eyy D(]]5)	* $3325((;2GByM!./%77-0XXm-DByM!\*
 
 **2./))+7
 		E
 yy D(OO""5;K"L		 #..0 	7EOOD..u56	7 {{(;QDIIaL;<tCC;s   %Fr   	templatesreturnc                 8   t        j                  || j                        }t        j                  t
        j                  j                  |             | j                  r| j                  nd}t        j                  ||| j                  |      z          | j                  rzt        j                  || j                        }t        j                  t
        j                  j                  |             t        j                  || j                  |      d       y y )Nr   T)r@   preserve_mode)r   target_pathr   r   
ensure_dirr   r   r   r   
write_filer   r   _render_persistent_net)r   r   r   targetfpeniheadernetruless          rD   render_network_statezRenderer.render_network_state(  s       7./$(OOv(?(?(NNO''0B0BCHOOBGGOOH56OO33MB" rF   N)r   F)NN)__name__
__module____qualname____doc__r   r   r   r   r	   r   dictr  rk   rF   rD   r   r   g  sK    J
2hKZ2Dn %)	# D>
 
rF   r   c                     d}t        ||d d      }|sd}|j                  d      s|dz  } |j                  | |      }||z   S )Nr   )r   r   r   )r   r   r   r   )r   endswithr   )r   r
  rn   r   r   r   s         rD   network_state_to_enir  =  sc    'H  !
H ??4 $*x**(8H HrF   c                     g d}ddg}|D ]  }t        j                  |||       r y t        j                  | d      }t        j                  j                  |      syy)N)ifqueryifupifdownz/sbinz	/usr/sbin)r~   r  Fr   T)r   whichr  r   r   r   )r  expectedr~   penis        rD   	availabler  Q  s^    ,H{#F zz!F6: 

6#;
<C77>>#rF   r  )NFr  )rl   r   loggingr   r   typingr   	cloudinitr   r   cloudinit.netr   r   r   cloudinit.net.network_stater	   	getLoggerr  r]   r   r   r   rE   re   rq   r   r   r   r   r  r  rk   rF   rD   <module>r&     s       	 	    ? ? 4g! 	  8<9x0B*J.&ERSx   Sl(
rF   