x[hS6ddlZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddl mZmZmZddlmZej&eZgdZgdZgd Zd Zd Zdd Zd Ze j:ddZdZGddej@Z ddZ!y)N)suppress)Optional) performancesubputil) 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_subnetrGAsG 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 hwaddressrR)bondbridge infinibandvlanonoffrzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rPr7r4) r=r8r9boolLOGwarningr>getr:r;r?) r@rMipv4_subnet_mturB ignore_mapmultiline_keysrenamesrDrEvs rF_iface_add_attrsrg_sD  z G JN k*G V}DD-(kkmK U eT "!#JDEEz)  %rar=)r@rMrender_hwaddressrkrJrlsubstliness rF_iface_start_entryrssV}HIG& L 7"w& JJLE LLh78 $##,e,/(//8%8 EEIIm4 9299BEBC LrHc * d}|jD]F}|j}|jdr&|jd}|d}|dk(r]|d}|jds tj j ||}tj|D] } t j| } | D cgc]u} tj jtj j | | r6tjd|  tj j | | w} } | D]o} tj| j} tj j| }t|| tj j!||q|d k(r|d}|jds tj j ||}tj|D]} t#| d 5}|j%j} dddtj j| }t| tj j!||s|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 |ddW|jdr}d||vri||d<|dk(r1g||dd<|ddD]}||ddj-||dk(sg||dd<|ddD]}||ddj-||jdr d||vri||d<|t.vr#|j1dd d}|d||d|<1|d!k(r1g||dd"<|ddD]}||dd"j-|g|d#k(r6|dj3d$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)sd*||vri||d*<|j1d)d d}|d||d*|<I|j5D]}d ||vs d+||d <ycc} w#1swYZxYw),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#r4rzsource-directoryr2z^[a-zA-Z0-9_-]+$sourcerri _source_pathTr@familyz Interface z* can only be defined once. Re-defined in 'z'.methodrWetherzdns-dnsz dns-searchsearchzdns-nameservers nameserversbridge_rY bridge_portsports bridge_hwmacrSpathcostrTportpriozbond-rXF) splitlinesstrip startswithsplitospathr;globlistdirisfilerematchrload_text_fileabspath_parse_deb_config_datadirnameopenreadrNET_CONFIG_OPTIONSNET_CONFIG_COMMANDSr=NET_CONFIG_BRIDGE_OPTIONSr<lowerkeys)ifacescontentssrc_dirsrc_pathcurriflineroptionparsed_src_dir expanded_path dir_contentsrentrysrc_data abs_entry new_src_pathfpabs_pathr@r{r|valdomainr% bridge_option bond_options rFrrsQF##%r;zz| ??3   3q ' '"1XN!,,S1!#g~!F!%>!:  !zz-8 !- rww||M4'HIHH%7>J GGLL5   *E#2259??AH " 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 "; /er;f*  &$)F5M& !*O &11s=A:VVV zConverting eni datac:i}t||ddt|S)z=Return a network config representation of what is in eni_dataN)rr)r_ifaces_to_net_config_data)eni_datars rFconvert_eni_datar7s"F68TDI %f --rHci}|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)rRrPrQrWrVr|)_orig_eni_namerRrirJmanualstaticr)rrrr)rrdns_rQrv)versionconfig)r8 partitionrar=r?) rdevsrPdatadevnamedtyperAcopy_keynds rFrr?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)rarrr)selfrs rF__init__zRenderer.__init__ksFF :/GH  **\48#ZZ G rHcg}|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::r3rz -A inet6 default)rrrrr4rz -A inet6 z -hostz -netr2)rar=) rrouteindentrBr r or_truemapping default_gw route_lineks rF _render_routezRenderer._render_routetse ) ),,    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(723rHc tj|}tt5|j ddddg}|j di}|j dd}|j dd}|rd|d<|rit |D]X\}}d} ||d<|d|d <|j d d |d <d } t|r| d z } n|j d} | |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 <tt|||t||zt||| z} |j dgD]$} | j|j| d &|j| [|Sg} d!|vsd"|vr!| jd#jd'i|| jd$jd'i|| jt|d%d&|j| |S#1swY1xYwcc} w)(N config_idrQz accept-ra wakeonlangz ethernet-wolrMrRrOrJrirN6rdhcp4dhcp6zipv6_dhcpv6-statefuldhcp10 accept_razipv6_dhcpv6-stateless ipv6_slaacrTzauto %srPaliasrproutesz )rz bond-masterz bond-slavesz auto {name}ziface {name} {inet} {mode}r)rMrbrm)rndeepcopyrKeyErrorpopra enumerater r:rsrGrgextendrr=r>)rr@rpsectionsrQr ethernet_wolrMrArb subnet_inetrrrrs rF _render_ifacezRenderer._render_ifaces e$h  # IIk " #))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 "Y # #dsI&I3&I0c 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.rrrNrri)rRrJ)rPrRrNrQrPr4rQrr1r0rvr~rz)rrrZrXrYr[c|d|dfS)NrRrPrm)rorders rFz-Renderer._render_interfaces.. s56+QvY7rH)rDrz  ) iter_interfacesrarnrr1r;dns_searchdomainsrrr? iter_routesr=r) r network_staterprr@r searchdomainsrrsrs @rF_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;  rHrcgd}ddg}|D]}tj|||rytj|d}tjj |syy)N)ifqueryifupifdownz/sbinz /usr/sbin)rr FrT)rwhichr rrr)r expectedrpenis rF availabler!Cs^,H{ #F zz!F6:   6#; >#  rHrr)"rnrloggingrr contextlibrtypingr cloudinitrrr cloudinit.netrr r cloudinit.net.network_stater getLoggerrr_rrrrGrgrsrtimedrrrr!rmrHrFr*s  --??4g! 8<9x0A*H().*.&ERXx  Xv rH