x[h3ddlZddlmZddlmZddlmZmZddlm Z m Z ddl m Z ejeZGddZGd d e j"Zd d Zy) N) OrderedDict)Optional)subputil)renderershould_add_gateway_onlink_flag) NetworkStatec$eZdZdZdZdZdZy) CfgParserc 4tggggggid|_y)N)MatchLinkNetworkDHCPv4DHCPv6AddressRoute)r conf_dict)selfs 8/usr/lib/python3/dist-packages/cloudinit/net/networkd.py__init__zCfgParser.__init__s($   cR|jjD]}||k(s |j|j|dzt|zt t j |j||j|<|j|jy)N=rkeysappendstrlistdictfromkeyssort)rseckeyvalks rupdate_sectionzCfgParser.update_section s$$& )ACxq!((sSX)=>$(t~~a7H)I$Jq!q!&&(  )rc|jjD]}||k(s ||j|vrg|j||<|j||j|dzt|zt t j |j|||j||<|j||jy)z For each route section we use rid as a key, this allows us to isolate this route from others on subsequent calls. rNr)rr#ridr$r%r&s rupdate_route_sectionzCfgParser.update_route_section(s $$& .ACxdnnQ//-/DNN1%c*q!#&--cCi#c(.BC)-MM$.."3C"89*q!#&q!#&++- .rcd}t|jjD]\}}|s |dk(r)t|D]}|d|zdzz }||dzz }|dz }7|dk(r>//12 !DAqI~%Aa%/HD(H$H%g%Aa%/H#AaD\- AH,-$H % C!GeO+)AD(H)D % !(rN)__name__ __module__ __qualname__rr'r*r5rrr r s  ). rr ceZdZdZddZdefdZdefdZdefdZdefdZ defd Z ded e fd Z defd Z d Z dde deeddfdZd e defdZy)Rendererz Renders network information in /etc/systemd/network This Renderer is currently experimental and doesn't support all the use cases supported by the other renderers yet. Nch|si}|jdd|_|jdd|_y)Nresolve_conf_fnz/etc/systemd/resolved.confnetwork_conf_dirz/etc/systemd/network/)getr=r>)rconfigs rrzRenderer.__init__Ys:F%zz ; !'  7! rcfgcd}dddd}|sy|jD]&\}}||vs ||s|j||||(|dS)Nr NameDriver MACAddress)namedriver mac_addressrF)r0r')rifacerAr# match_dictr&r2s rgenerate_match_sectionzRenderer.generate_match_sectioncsj'  $$& 5DAqEzeAh""3584 5V}rcd}|syd|vr|dr|j|d|dd|vr|dr|j|ddyyy)NrmtuMTUBytesoptionalRequiredForOnlineno)r')rrIrAr#s rgenerate_link_sectionzRenderer.generate_link_sectiontsZ  E>eEl   sJe =  5#4   s$7 >$5 rcd}dddd}d}d|vrdt|dz}|jD]+\}}||vr |d k(r||z }|j|||||-y ) zy Parse a route and use rid as a key in order to isolate the route from others in the route dict. rGateway DestinationMetric)gatewaynetworkmetricr,prefix/rXN)rr0r*) rr)confrAr# route_cfg_maprZr&r2s r parse_routeszRenderer.parse_routess  $  t 3tH~..FJJL DDAq %I~V   $ $S#}Q/? C  Drc pd}d}d}|jdgD]P}|d}|dk(s|dk(r|dk(rd}n|d k(rd }n|d k(r|dk(rd }n|dk(rd }d |vr*|d r%|d D]}|jd ||||dz}d|vsj|d} d|vr| dt|dzz } ddddd} |jD]\} } | dk(r|j d| | | "| dk(rZ|j dd|| | | t | | r.tjd| | |j dd|dd |dz}| dk(s| dk(s|j || | dj| S|j |d|t|jd d!tr|j |d"|d |S)#NrQrrsubnetstypedhcp4dhcpipv4ipv6yesdhcp6routesraddressrZr[rrTDNSDomains)rkrWdns_nameservers dns_searchrWrazGGateway %s is not contained within subnet %s, adding GatewayOnLink flag GatewayOnLinkrnro DHCPz accept-rar, IPv6AcceptRA) r?r^rr0r'r*rLOGdebugjoin isinstancebool) rrIrArcr#r)r3tiaddrsubnet_cfg_mapr&r2s r parse_subnetszRenderer.parse_subnetss)9b)1 PA& AG|qF{4<!DV^ Dg4<!DV^ D1}88"A%%#iC8'C " A~|q=C#ak"222D((',"+ " GGIPDAqI~**9nQ6GNi00#qYq0A1:!TBII!= ! $   44 '1SEOU"Ag//1 3D**3q0A388A;O+P91 Pf 3- eii R0$ 7   sNE+4F G rcdD]\}||vrt||j} tj|}|rdnd}|dk(rd}nd}|j|d |^y#t$r |dk7rt j d|d}YHwxYw) N) dhcp4domain dhcp6domainrfrQroutezInvalid dhcp4domain value - %srrr UseDomains)rcasefoldrtranslate_bool ValueErrorruwarningr')rdrAitemretsections r dhcp_domainzRenderer.dhcp_domains2 ;D1}ag,'')C ))#."e }$""   w c : ; '>KK @#FC sA##&B  B nsc~d}|jd}|s)|jdk(r|j|jd}n|s|jdk(ry|jdr%|j |ddj |d|jd r&|j |d dj |d yy) Nrdnsrj)search nameserversrrmrrrrl)r?versiondns_searchdomainsrnr'rw)rrIrArr#rs r parse_dnszRenderer.parse_dnssiirzzQ..!11Cq  778    sIsxxH /F G 77= !   sE388C 4F+G H "rcddddd}|dk(r|jddd d d d d |d|vrJ|dd|fvr@|d |d}|jD]#\}}||vs |jd||||%yyy)Nzuse-dns use-domainsz use-hostnamezuse-ntp)UseDNSr UseHostnameUseNTP4z send-hostnamehostnamez route-metriczuse-mtuz use-routes) SendHostnameHostname RouteMetricUseMTU UseRoutesrc -overridesrfipvDHCPv)updater0r') rrAdevicercrdhcp_config_mapsdhcp_overridesr&r2s rparse_dhcp_overrideszRenderer.parse_dhcp_overridess')   c>  # #$3 *#1'!-  '* % /D 'O= 5 $d7):$>?N(..0 P1&&&wi'8!^A=NO P 5 /rcd}tjd||dz|zdz}tj||tj|||y)Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)rurvr write_file chownbyname)rlinkr\nwk_dir net_fn_ownernet_fns rcreate_network_filezRenderer.create_network_filesK(  4d;++d2Z? % |r target_pathr ensure_dir_render_contentr0r)rrrtarget network_dirret_dictr&r2s rrender_network_statezRenderer.render_network_stateso ++ **62[@K  $'' 6NN$ 8DAq  $ $Q; 7 8rc<i}|jD]}t}|j||}|j|||j ||}|j |||d}|j D]}|jd||||dz}|jdk(r|d} |jdjD]"\} } d| vs | jd| k(s | } n| |jdvru|jd| } |j| |dD]L} d | d | vr.d | jd | d ivr| d | d| d}t||j|| || N|j||j!i|S)NrcrjrrF ethernetszset-name)r6rcdomainrrz has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)iter_interfacesr rKrRr~r iter_routesr^rr@r0r?r RuntimeErrorrrr5)rrrrIrArrcr)rrFdev_namedev_cfgrr exceptions rrzRenderer._render_content/s'')4 :E+C..uc:D  & &uc 2%%eS1D NN5#r *C) !!AcU)UC8Ag   zzQ&+Fm*,;)?)E)E)G"%Hg!W,";;z2d:#+D! " 299[11YY{3D9F$$VS1#- N"7)62f< -%zzD *DbI!J$(&wi@,,3957!8& #/y"9911#vtWM N OOT3#5#5#78 9i4 :lrr)NN)r6r7r8__doc__rr rKrRr^r~rr rrrrr rrr9rrr;r;Qs " ? ?D9D0< <~;);$III<I"P P8=%) 8#8D>8  8 8,848rr;cVddg}ddg}|D]}tj|||ryy)Nip systemctlz /usr/sbinz/bin)rrFT)rwhich)rexpectedrps r availablerjs=k"H6 "F zz!F6: rr)logging collectionsrtypingr cloudinitrr cloudinit.netrrcloudinit.net.network_stater getLoggerr6rur r;rr9rrrsP# B4g!<<~Vx  Vrr