3 \me U@s ddlZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z m Z m Z ddlmZejeZdddd d d gZd d ddddddgZddddddddddddd d!d"d#d$d%d&d'd(d)d*gZd+d,Zd-d.Zd>d0d1Zd2d3Zd4d5Zd6d7ZGd8d9d9e jZd?d:d;Zd@dsz*_parse_deb_config_data..rsourcer@Z _source_pathTr"familyz:Interface %s can only be defined once. Re-defined in '%s'.methodr4Zetherzdns-dnsz dns-searchsearchzdns-nameservers nameserversZbridge_r6Z bridge_portsZportsZ bridge_hwZmacr1Zpathcostr2Zportpriozbond-r5F) splitlinesstrip startswithsplitrLrMrgloblistdiropenreadabspath_parse_deb_config_datadirnamerNET_CONFIG_OPTIONSNET_CONFIG_COMMANDSrNET_CONFIG_BRIDGE_OPTIONSrlowerkeys)ifacescontentssrc_dirsrc_pathZcurriflineraZoptionZparsed_src_dirZ dir_contentsentryfpZsrc_dataZ abs_entryZ new_src_pathZabs_pathr"rWrXvalZdomainrZ bridge_optionZ bond_optionr')rRr(rgs                          "             rgcCsi}t||dddt|S)N)rprq)rg_ifaces_to_net_config_data)Zeni_datarnr'r'r(convert_eni_data7srwcsFix"|jD]\}}|jdd}|krj|dkr>d}nd}||gd|<d|krj|d|d<||d d }|jd rd |d <nd |d <|jd dkr|d|d<x dD]}||kr||||<qWd|krx8dD]0}||dkr|d|r|d||d|<qW|dj|qWdfddtDdS)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)r0r.r/r4r3rX)Z_orig_eni_namer0r@r*Zmanualstaticr r rr rZr\r[Zdns_r/rJcsg|] }|qSr'r')rQd)devsr'r(rSdsz._ifaces_to_net_config_data..)versionconfig)r rr )r\r[)r partitionr;rr!)rnr.dataZdevnameZdtyper#Zcopy_keynr')r~r(rv>s2      rvc@sPeZdZdZdddZdddZdd d Zdd d Zdee e dd ddZ dS)Rendererz@Renders network information in a /etc/network/interfaces format.NcCs6|si}|jdd|_|jdd|_|jdd|_dS)Neni_pathzetc/network/interfaces eni_header netrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r;rrr)selfrr'r'r(__init__js zRenderer.__init__r]c CsPg}|d}|d}d}ddd}d}|dd krD|d d krDd }n|dd kr`|d dkr`d}d} xdD]} |r|| dkr|qj| dkr| d||| || f7} qj| |krj| dkr d|| kr| d7} n |jd dkr| d7} n| d7} d |kr$| d|| |d f7} qj| d|| || f7} qjW|j|| ||j|| ||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 || trueZgwr)rrr]rz0.0.0.0r z defaultz::rrz -A inet6 defaultrz%s %s %srxz -A inet6 z -hostz -netz %s/%sz %s %s)rrr)r;r) rrouteindentr$r r Zor_truemappingZ default_gwZ route_linekr'r'r( _render_routess<       zRenderer._render_routeFc s6g}jdi}jdd}jdd}|r4dd<|rؐxt|D]\}}d} |d<|dd<|jd d d <d } t|r| d 7} n |jd } | d <|ddks|ddks|ddkrdd<|dk r|rdndd<nn|ddkrd d<dd<nN|ddkr&d d<dd<n.t|rTdd<|dk rT|rLdndd<dfdd|Dkrtdd <tt||dt|t|| } x*|jdgD]} | j|j | ddqW|j | qFWnZg} d ksd!kr| j d"j f| j d#j f| jtd$dd%|j | |S)&Nr/z accept-raZ wakeonlangz ethernet-wolr+r0r-r*r@r,6rZdhcp4Zdhcp6zipv6_dhcpv6-statefulZdhcp10 accept_razipv6_dhcpv6-statelessZ ipv6_slaacr|Tcsg|]}dd|kqS)zauto %sr.r')rQrr)r"r'r(rSsz*Renderer._render_iface..alias)rFZroutesz )rz bond-masterz bond-slavesz auto {name}ziface {name} {inet} {mode}r)r+r<) r;pop enumeraterrrHr)r?extendrrr ) rr"rFsectionsr/rZ ethernet_wolr+r#r<Z subnet_inetrGrr')r"r( _render_ifacesb             & zRenderer._render_ifacec s&ddddddgd}x(|jD]}|jddkr tj|}q W|j}|r`d j||d d d <|j}|rd j||d d d <d ddddddg}|j|j|xDt |jfdddD](}|jddkrq|j|j||dqWx |j D]}|j |j |qWdjdd|DdS)z1Given state, emit etc/network/interfaces content.ryr{r,rzr@)r0r*)r.r0r,r/r.rr/rrrrJrYrV)rzr{r7r5r6r8cs|d|dfS)Nr0r.r')r)orderr'r(sz-Renderer._render_interfaces..)r%)rFz cSsg|]}dj|qS) )r)rQsr'r'r(rS&sz/Renderer._render_interfaces..r) Ziter_interfacesr;rDdeepcopyrrZdns_searchdomainsrrr!Z iter_routesrr) r network_staterFryr"r\Z searchdomainsrrr')rr(_render_interfacess>zRenderer._render_interfaces)r templatesreturncCstj||j}tjtjj||jr,|jnd}tj |||j ||j rtj||j }tjtjj|tj ||j |dddS)Nr]T)r$Z preserve_mode) r target_pathrrZ ensure_dirrLrMrhrZ write_filerrZ_render_persistent_net)rrrtargetZfpeniheaderZnetrulesr'r'r(render_network_state(szRenderer.render_network_state)N)r])F)F)NN) __name__ __module__ __qualname____doc__rrrrrrdictrr'r'r'r(rgs 4 M 7 rcCsFd}t||ddd}|sd}|jds0|d7}|j||d}||S)Nzetc/network/interfaces)rrr)rr]r)rF)rendswithr)rrrFrrror'r'r(network_state_to_eni=s   rcCsTdddg}ddg}x |D]}tj|||dsdSqWtj|d}tjj|sPdSd S) NZifqueryZifupZifdownz/sbinz /usr/sbin)r[rFzetc/network/interfacesT)rZwhichrrLrMrN)rZexpectedr[pZenir'r'r( availableQs    r)F)NF)N)rDrbZloggingrLrOZtypingrZ cloudinitrrZ cloudinit.netrrrZcloudinit.net.network_staterZ getLoggerrr:rjrkrir)r?rHrgrwrvrrrr'r'r'r(sr   < )W