fUddlZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z m Z m Z ddlmZej eZgdZgdZgdZd Zd Zdd Zd Zd ZdZGdde j8ZddZddZy)N)Optional)subputil) ParserErrorrenderersubnet_is_ipv6) NetworkState)zpre-upupzpost-updownzpre-downz post-down) bridge_ageingbridge_bridgeprio bridge_fd bridge_gcinit bridge_hello bridge_maxagebridge_maxwait bridge_stp)addressnetmask broadcastnetworkmetricgateway pointtopointmediamtuhostname leasehours leasetimevendorclientbootfileserverhwaddrproviderframenetnumendpointlocalttlcDg}gd}|jD]}\}}|dk(r |dk(r |dd|d}|s!||vs&t|trdj|}d|vr|j dd}|j d j ||t|S) N) rrrrr pointopointrscope dns_searchdns_nameserversrr/prefix _- {0} {1})items isinstancelistjoinreplaceappendformatsorted)ifacesubnetcontent valid_mapkeyvalues 3/usr/lib/python3/dist-packages/cloudinit/net/eni.py_iface_add_subnetrE@sG Illn = U )   ) %i0&2BCE SI%%&czkk#s+ NN=//U; < = '?c P|dk7rgSg}gd}gd}ddi}|ddvr|jd|jD]\}}t|tr ||rdnd }|r||vr&|d k(r#|r!||k7rtj d |d ||N||vr9|D]3} |jd j |j||| 5t|trdj|}|jd j |j|||t|S)Nr) control device_iddriverindexinetmodenamesubnetstype)bridge_pathcostbridge_portpriobridge_waitport mac_address hwaddressrP)bondbridge infinibandvlanonoffrzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rNr5r2) r;r6r7boolLOGwarningr<getr8r9r=) r>rKipv4_subnet_mtur@ ignore_mapmultiline_keysrenamesrBrCvs rD_iface_add_attrsre^sD  z G JN k*G V}DD-(kkmK U eT "!#JDEEz)  %rKrender_hwaddressrirHrjsubstliness rD_iface_start_entryrqsV}HIG& L 7"w& JJLE LLh78 $##,e,/(//8%8 EEIIm4 9299BEBC LrFc d d}|jD]V}|j}|jdr&|jd}|d}|dk(rm|d}|jds tj j ||}tj|D]} t j| } | D cgc]u} tj jtj j | | r6tjd|  tj j | | w} } | D]} t| d 5} | jj}dddtj j| }t|tj j!|||d k(r|d}|jds tj j ||}tj|D]} t| d 5} | jj}dddtj j| }t|tj j!|||d k(r|ddD]}||vrd |i||<d ||d <|dk(rB|dd\}}}||vrd |i||<nd||vrt#d|d|d|||d<|||d<|}|dk(r|ddk(r|d}n|d}|||d<|t$vr |d|||<%|t&vr:|||vrg|||<|||j)dj |ddg|jdr}d||vri||d<|dk(r1g||dd<|ddD]}||ddj)||dk(sg||dd<|ddD]}||ddj)||jdr d||vri||d<|t*vr#|j-dd d}|d||d|<A|d!k(r1g||dd"<|ddD]}||dd"j)|w|d#k(r6|dj/d$k(r|d||dd$<|d||dd$<|d%k(r+d&||dvr i||dd&<|d||dd&|d<|d'k(sd(||dvr i||dd(<|d||dd(|d<|jd)s'd*||vri||d*<|j-d)d d}|d||d*|<Y|j1D]}d ||vs d+||d <ycc} w#1swY1xYw#1swYgxYw),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#r2rzsource-directoryr0z^[a-zA-Z0-9_-]+$rsourcerg _source_pathTr>familyz Interface z* can only be defined once. Re-defined in 'z'.methodrUetherzdns-dnsz dns-searchsearchzdns-nameservers nameserversbridge_rW bridge_portsports bridge_hwmacrQpathcostrRportpriozbond-rVF) splitlinesstrip startswithsplitospathr9globlistdirisfilerematchopenreadabspath_parse_deb_config_datadirnamerNET_CONFIG_OPTIONSNET_CONFIG_COMMANDSr;NET_CONFIG_BRIDGE_OPTIONSr:lowerkeys)ifacescontentssrc_dirsrc_pathcurriflineroptionparsed_src_dir expanded_path dir_contentsrentryfpsrc_data abs_entry new_src_pathabs_pathr>ryrzvaldomainr# bridge_option bond_options rDrrskF##%s;zz| ??3   3q ' '"1XN!,,S1!#g~!F!%>!:  !zz-8 !- rww||M4'HIHH%7>J GGLL5   *EeS)5R#%779??#45 " 6I*"''//)*Di  "x  8L**3/!ww||G\B !%'-F5M( #&,F5M( #F { "Qx7"AhAh*-F6N; ' ) )%*1XF6N6 " * *VF^+)+vv& 6N6 " ) )#((59*= >   v &F6N*(*vu%%24vu%h/#ABiCF6N5)(3::6BC,,79vu%m4#ABiHF6N5)-8??GH   y )vf~-+-vx(22 &y"a @ :?(vx(7>)46vx(1"12YDE6N8,W5<>#u,6;AhF6N8,U36;AhF6N8,U3,,VF^H%==;=F6N8,Z8AFqvx(4U1X>,,VF^H%==;=F6N8,Z8AFqvx(4U1X>   w 'VF^+)+vv& .."a8K27(F6N6 "; /gs;h*  &$)F5M& !*Q 5511s=A:V V !V%V" %V/ c:i}t||ddt|S)N)rr)r_ifaces_to_net_config_data)eni_datars rDconvert_eni_datar7s F68TDI %f --rFci}|jD]\}}|jdd}||vr"|dk(rd}nd}||gd||<d|vr |d||d<||d d }|jd rd |d <nd |d <|jd dk(r|d|d<dD]}||vs||||<d|vr&dD]!}||dvs |d|s|d||d|z<#||dj|dt |D cgc]} ||  c} dScc} 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).:rloloopbackphysical)rPrNrOrUrTrz)_orig_eni_namerPrgrHmanualstaticr)rrrr})rr~dns_rOrt)versionconfig)r6 partitionr_r;r=) rdevsrNdatadevnamedtyper?copy_keynds rDrr>sn Dlln0 d..%a( $ $""%*GKDMd"/3K/@W m,$($x.A 88F  &F9  (F9  88H  ) $YF9 ; 2H4#'>x  2 D=. 8U #U A)-eQF6A:& 8 W i ''/=0@fTl$CT!W$C DD$Cs8 D cPeZdZdZd dZd dZd dZd dZ ddede e d dfd Z y)Rendererz@Renders network information in a /etc/network/interfaces format.Nc|si}|jdd|_|jdd|_|jdd|_y)Neni_pathetc/network/interfaces eni_header netrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r_rrr)selfrs rD__init__zRenderer.__init__jsFF :/GH  **\48#ZZ G rFcg}|dz}|dz}d}ddd}d}|dd k(r |d d k(rd }n|dd k(r |d dk(rd}d} dD]} |r| dk(r | dk(r| |d|| d|| z } $| |vs)| dk(rCd|| vr| dz } n|jd dk(r| dz } n| dz } d |vs_| d|| d|d z } q| d|| d|| z } |j|| z|z|j|| z|z|S)aWhen 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 zpost-up route addzpre-down route delz || truegwr)rrrrz0.0.0.0rz defaultz::r1rz -A inet6 default)rrrrr2rz -A inet6 z -hostz -netr0)r_r;) rrouteindentr@r r or_truemapping default_gw route_lineks rD _render_routezRenderer._render_routesse ) ),,    y (U9-=-J#J 9  %%/Q*>,J 1 DAa9nI~J E!HMM e >eAh"k1 8,2"h. "g- 5("%(E(O&LL gaj%("CCJ! D" rJ01tj(723rFc Zg}|jdi}|jdd}|jdd}|rd|d<|rit|D]X\}}d} ||d<|d|d<|jd d |d <d } t|r| d z } n|jd } | |d <|ddk(s|ddk(s|ddk(rd|d<|K|rdnd|d<nA|ddk(r d |d<d|d<n.|ddk(r d |d<d|d<nt|rd|d<| |rdnd|d<d|D cgc] } d|dz| vc} vrd|d <t t |||t ||zt||| z} |jdgD]$} | j|j| d&|j| [|Sg} d |vsd!|vr!| jd"jd&i|| jd#jd&i|| jt|d$d%|j| |Scc} w)'NrOz accept-ra wakeonlangz ethernet-wolrKrPrMrHrgrL6rdhcp4dhcp6zipv6_dhcpv6-statefuldhcp10 accept_razipv6_dhcpv6-stateless ipv6_slaacrTzauto %srNaliasrnroutesz )rz bond-masterz bond-slavesz auto {name}ziface {name} {inet} {mode}r)rKr`rk) r_pop enumeraterr8rqrEreextendrr;r<)rr>rnsectionsrOr ethernet_wolrKr?r` subnet_inetrrprs rD _render_ifacezRenderer._render_ifaces))Ir*IIk40 yyd3 $'E. ! !*7!37 ' v"&!&g &vf #)::i#@i $ !&)3&K&,jj&7O +f 6Ng-f~0f~)??%+E&M ,4=S3k*F^'>>$*E&M$'E&MF^|3$*E&M$'E&M#F+$,E&M ,4=S3k*DL<@Iv/47(/E)$&u7G(v67'ue_E F$ZZ"5KELL!3!3E&!3!IJK&o7 'DE%%)? 1]11:E:; LL<5<<EuE F LL aF  OOE "5sH(c ddddddgd}|jD],}|jddk(stj|}.|j}|rd j ||d d d <|j }|rd j ||d d d <d dddddd g}|j|j|t|j fdD]9}|jddk(r|j|j||;|jD]"}|j|j|$dj |D cgc]} dj | c} dzScc} w)z1Given state, emit etc/network/interfaces content.rrrLrrg)rPrH)rNrPrLrOrNr2rOrr/r.rtr|rx)rrrXrVrWrYc|d|dfS)NrPrNrk)rorders rDz-Renderer._render_interfaces..s56+QvY7rF)rBrz  ) iter_interfacesr_rldeepcopyr/r9dns_searchdomainsrrr= iter_routesr;r) r network_staternrr>r searchdomainsrrsrs @rD_render_interfaceszRenderer._render_interfacess !+?@   #224 *Eyy D(]]5) *$33 25((;2GByM! . /%77 -0XXm-DByM! \ *   **2./  ) ) +7 E yy D( OO""5;K"L  #..0 7E OOD..u5 6 7{{(;QDIIaL;  rFrcd}t||dd}|sd}|jds|dz }|j||}||zS)Nr)rrr)rrrr)rendswithr)rr rnrrrs rDnetwork_state_to_enir=sc'H  ! H  ??4 $*x**(8H H rFcgd}ddg}|D]}tj|||rytj|d}tjj |syy)N)ifqueryifupifdownz/sbinz /usr/sbin)r~rFrT)rwhichrrrr)rexpectedr~penis rD availablerQs^,H{ #F zz!F6:   6#; >#  rFr)NFr )rlrloggingrrtypingr cloudinitrr cloudinit.netrrrcloudinit.net.network_stater getLoggerrr]rrrrErerqrrrrrrrkrFrDr&s   ??4g! 8<9x0B*J.&ERSx  Sl( rF