܍~cAVddlZddlZddlZddlZddlmZddlmZddlm Z m Z ddl m Z m Z mZddlmZejeZgdZgdZgd Zd Zd Zdd ZdZdZdZdZGdde jZddZddZ dS)N)Optional)log)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 leasetimevendorclientbootfileserverhwaddrproviderframenetnumendpointlocalttlcg}gd}|D]\}}|dkr |dkr|dd|d}|rt||vrpt|tkrd|}d|vr|dd}|d ||t|S) N) rrrrr pointopointrscope dns_searchdns_nameserversrr/prefix _- {0} {1})itemstypelistjoinreplaceappendformatsorted)ifacesubnetcontent valid_mapkeyvalues 3/usr/lib/python3/dist-packages/cloudinit/net/eni.py_iface_add_subnetrF@sG   Illnn = = U )    )  %i000&2B2BCE  =SI%%E{{d""czzkk#s++ NN=//U;; < < < '??c |dkrgSg}gd}gd}ddi}|ddvr|d|D]\}}t|tkr ||rdnd }|r||vr1|d kr,|r*||kr#td |d ||c||vrC|D]?} |d |||| @t|tkrd |}|d ||||t|S)Nr) control device_iddriverindexinetmodenamesubnetsr8)bridge_pathcostbridge_portpriobridge_waitport mac_address hwaddressr8)bondbridge infinibandvlanonoffrzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rOr6r3) r<r7r8boolLOGwarningr=getr9r:r>) r?rLipv4_subnet_mturA ignore_mapmultiline_keysrenamesrCrDvs rE_iface_add_attrsre^s  zz G   JN k*G V}DDD-(((kkmmKK U ;;$  !#J1DDEE z))  %<z*_parse_deb_config_data..sq   rw||M4'H'HII   H%7>>J GLL55KJJrGrsourcerg _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 startswithsplitrvrwr:globlistdiropenreadabspath_parse_deb_config_datadirnamerNET_CONFIG_OPTIONSNET_CONFIG_COMMANDSr<NET_CONFIG_BRIDGE_OPTIONSr;lowerkeys)ifacescontentssrc_dirsrc_pathcurriflineroptionparsed_src_dir dir_contentsentryfpsrc_data abs_entry new_src_pathabs_pathr?rrvaldomainr$ bridge_option bond_optionr|s @rErrsF##%%s;s;zz|| ??3     3q ' ' '"1XN!,,S11 G!#g~!F!F!%>!:!:   !z-88      ,    *EeS))5R#%7799??#4#4555555555555555 " 6 6I*"'//)*D*Di  "x   8L**3// C!w||G\BB !%'-F5M( #&,F5M( #FF { " "Qx7""AhAh*-F6N; ' ' ) ) )%*1XF6N6 " " * * *VF^++)+vv& 6N6 " ) )#((59*=*= > > > >   v & &* ;F6N**(*vu%%%24vu%h/#ABBiCCF6N5)(3::6BBBBC,,,79vu%m4#ABBiHHF6N5)-8??GGGG   y ) ) ;vf~--+-vx(222 &y"a @ @ :?(vx(77>))46vx(1"122YDDE6N8,W5<>##u,,6;AhF6N8,U336;AhF6N8,U33,,,VF^H%===;=F6N8,Z8AFqvx(4U1X>>,,,VF^H%===;=F6N8,Z8AFqvx(4U1X>   w ' ' ;VF^++)+vv& .."a88K27(F6N6 "; /**  & &$)F5M& !**s$2'D% %D) ,D) +'HH" %H" cBi}t|d5}|}dddn #1swxYwYtj|}t ||tj|||S)z+Parses a debian network configuration file.r~N)rrrrvrwrrr)rwrrrrs rEparse_deb_configr7s F dC%B7799??$$%%%%%%%%%%%%%%%wt$$H"'//(33X Ms'AA  A cJi}t||ddt|S)N)rr)r_ifaces_to_net_config_data)eni_datars rEconvert_eni_datarCs, F68TDIIII %f - --rGc~i|D]\}}|dd}|vr)|dkrd}nd}||gd|<d|vr|d|d<||d d }|d rd |d <nd |d <|d dkr |d|d<dD]}||vr ||||<d|vr1dD].}||dvr"|d|r|d||d|z</|d| dfdt DdS)zReturn network config that represents the ifaces data provided. ifaces = parse_deb_config("/etc/network/interfaces") config = ifaces_to_net_config_data(ifaces) state = parse_net_config_data(config).:rloloopbackphysical)r8rOrPrUrTr)_orig_eni_namer8rgrImanualstaticr)rrrr)rrdns_rPrtc g|] }| Srkrk)r{ddevss rEr}z._ifaces_to_net_config_data..ps$C$C$CT!W$C$C$CrG)versionconfig)r7 partitionr_r<r>) rrOdatadevnamedtyper@copy_keynrs @rErrJs Dllnn00 d..%%a( $  $""%*GKKDMd""/3K/@W m,$($x.AA 88F   ) &F9   (F9  88H   ) ) $YF9 ; 2 2H4#'>x D==. 8 8U ##U A#)-eQF6A:& W i ''////$C$C$C$CfTll$C$C$C D DDrGcXeZdZdZd dZddZddZddZ dd ed e e d dfd Z dS)Rendererz@Renders network information in a /etc/network/interfaces format.Nc|si}|dd|_|dd|_|dd|_dS)Neni_pathetc/network/interfaces eni_header netrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r_rrr)selfrs rE__init__zRenderer.__init__vs\ F :/GHH  **\488#ZZ G  rGrcHg}|dz}|dz}d}ddd}d}|dd kr|d d krd }n|dd kr|d dkrd}d} dD]} |r| dkr | dkr| |d|| d|| z } +| |vrm| dkrPd|| vr| dz } n$|d dkr| dz } n| dz } d |vr| d|| d|d z } | d|| d|| z } ||| z|z||| 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::r2rz -A inet6 default)rrrrr3rz -A inet6 z -hostz -netr1)r_r<) rrouteindentrAr r or_truemapping default_gw route_lineks rE _render_routezRenderer._render_routes ) ),,     y ( (U9-=-J-J#JJ 9  % %%/Q*>*>,J 1 D DA a9nnI~~JJJ E!HHMM e >>eAh"k1 8,,22"h. "g- 5((" %(((E(OO&LL Jgajjj%(("CCJrJ0111tj(72333rGFc g}di}dd}dd}|rdd<|rt|D]\}}d} |d<|dd<|d d d <d } t|r| d z } n|d } | d <|ddks|ddks |ddkrdd<| |rdndd<nM|ddkr d d<dd<n6|ddkr d d<dd<nt|rdd<| |rdndd<dfd|Dvrdd <t t ||t |zt|| z} |dgD],} | | | d-| | ng} dvsd vr | d!j d%i| d"j d%i| td#d$| | |S)&NrPz accept-ra wakeonlangz ethernet-wolrLr8rNrIrgrM6rdhcp4dhcp6zipv6_dhcpv6-statefuldhcp10 accept_razipv6_dhcpv6-stateless ipv6_slaacrTc*g|]}ddz|vS)zauto %srOrk)r{rr?s rEr}z*Renderer._render_iface..s4<@Iv/47rGaliasrnroutesz )rz bond-masterz bond-slavesz auto {name}ziface {name} {inet} {mode}r)rLr`rk) r_pop enumerater r9rqrFreextendrr<r=) rr?rnsectionsrPr ethernet_wolrLr@r` subnet_inetrprs ` rE _render_ifacezRenderer._render_ifacesV))Ir**IIk400 yyd33  ($'E. ! B #!*7!3!37 '7 ' v"&!&g &vf #)::i#@#@i $ !&))83&KK&,jj&7&7O +f 6Ng--f~00f~)???%+E&M ,4=-FSS3k*F^'>>>$*E&M$'E&MMF^|33$*E&M$'E&MM#F++G$,E&M ,4=-FSS3k*DL(/E)$&u7G(v667'ue_EE F$ZZ"55KKELL!3!3E&!3!I!IJJJJ&&&&o7 'tE%%%)?)? 1]1::E::;;; LL<5<EEuEE F F F LL aFFF    OOE " " "rGcX ddddddgd}|D]/}|ddkrtj|}0|j}|r$d ||d d d <|j}|r$d ||d d d <d dddddd g}|||t| fdD]F}|ddkr||||G| D]*}| | |+dd|DdzS)z1Given state, emit etc/network/interfaces content.rrrMrrg)r8rI)rOr8rMrPrOr3rPrr0r/rtrr)rrrXrVrWrYc0|d|dfS)Nr8rOrk)rorders rEz-Renderer._render_interfaces..&s56+QvY7rG)rCrz c8g|]}d|S) )r:)r{ss rEr}z/Renderer._render_interfaces..2s";;;QDIIaLL;;;rGr) iter_interfacesr_rldeepcopyr0r:dns_searchdomainsrrr> iter_routesr<r) r network_staternrr?r searchdomainsrrrs @rE_render_interfaceszRenderer._render_interfacess !+??@    #2244 * *Eyy  D((]5))#3  H25((;2G2GByM! . /%7  E-0XXm-D-DByM! \ *    **2..///  ) ) + +7777    E yy  D(( OO""5;K"LL    #..00 7 7E OOD..u55 6 6 6 6{{;;(;;;<  rGrcd}t||dd}|sd}|ds|dz }|j||}||zS)Nr)rrr)rrrr)rendswithr)rrrnrrrs rEnetwork_state_to_enirGs'H  !  H  ??4 $*x*(8H H rGcgd}ddg}|D]}tj|||sdStj|d}tj|sdSdS)N)ifqueryifupifdownz/sbinz /usr/sbin)rrFrT)rwhichr rvrwrx)rexpectedrpenis rE availabler&[s~,,,H{ #F z!F6::: 55   6#; < >#  u 4rGr)NFr)!rlrrvrytypingr cloudinitrloggingrr cloudinit.netrrr cloudinit.net.network_stater getLoggerrr]rrrrFrerqrrrrrrr&rkrGrEr-s $$$$$$ ??????????444444g!!   8<999x0B*B*B*J   ...&E&E&ERQQQQQx QQQh(      rG