
    x[h3                         d dl Z d dlmZ d dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZ  e j                  e      Z G d d      Z G d	 d
e	j"                        ZddZy)    N)OrderedDict)Optional)subputil)renderershould_add_gateway_onlink_flag)NetworkStatec                   $    e Zd Zd Zd Zd Zd Zy)	CfgParserc           
      4    t        g g g g g g i d      | _        y )N)MatchLinkNetworkDHCPv4DHCPv6AddressRoute)r   	conf_dict)selfs    8/usr/lib/python3/dist-packages/cloudinit/net/networkd.py__init__zCfgParser.__init__   s(    $

    c                 R   | j                   j                         D ]  }||k(  s	| j                   |   j                  |dz   t        |      z          t	        t
        j                  | j                   |               | j                   |<   | j                   |   j                           y )N=r   keysappendstrlistdictfromkeyssort)r   seckeyvalks        r   update_sectionzCfgParser.update_section    s    $$& 	)ACxq!((sSX)=>$(t~~a7H)I$Jq!q!&&(	)r   c                    | j                   j                         D ]  }||k(  s	|| j                   |   vrg | j                   |   |<   | j                   |   |   j                  |dz   t        |      z          t	        t
        j                  | j                   |   |               | j                   |   |<   | j                   |   |   j                           y)z
        For each route section we use rid as a key, this allows us to isolate
        this route from others on subsequent calls.
        r   Nr   )r   r#   ridr$   r%   r&   s         r   update_route_sectionzCfgParser.update_route_section(   s    
 $$& 		.ACxdnnQ//-/DNN1%c*q!#&--cCi#c(.BC)-MM$.."3C"89*q!#& q!#&++-		.r   c                    d}t        | j                  j                               D ]  \  }}|s	|dk(  r)t        |      D ]  }|d|z   dz   z  }||dz   z  }|dz  } 7|dk(  r<t        |      D ]-  }|d|z   dz   z  }t        ||         D ]
  }||dz   z  } |dz  }/ x|d|z   dz   z  }t        |      D ]
  }||dz   z  } |dz  } |S )N r   [z]

r   )sortedr   items)r   contentsr&   vens         r   get_final_confzCfgParser.get_final_conf8   s   4>>//12 	!DAqI~ %Aa%/HD(H$H% g %Aa%/H#AaD\ - AH,-$H	% C!GeO+ )AD(H)D %	!( r   N)__name__
__module____qualname__r   r'   r*   r5    r   r   r   r      s    
). r   r   c                       e Zd ZdZddZdefdZdefdZdefdZdefdZ	defd	Z
ded
efdZdefdZd Z	 	 ddedee   ddfdZd
edefdZy)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.
    Nc                 h    |si }|j                  dd      | _        |j                  dd      | _        y )Nresolve_conf_fnz/etc/systemd/resolved.confnetwork_conf_dirz/etc/systemd/network/)getr=   r>   )r   configs     r   r   zRenderer.__init__Y   s:    F%zz; 
 !'

 7!
r   cfgc                     d}dddd}|sy |j                         D ]&  \  }}||v s||   s|j                  ||||          ( |d   S )Nr   NameDriver
MACAddress)namedrivermac_addressrF   )r0   r'   )r   ifacerA   r#   
match_dictr&   r2   s          r   generate_match_sectionzRenderer.generate_match_sectionc   sj    '

 $$& 	5DAqEzeAh""3584	5 V}r   c                     d}|sy d|v r|d   r|j                  |d|d          d|v r|d   r|j                  |dd       y y y )Nr   mtuMTUBytesoptionalRequiredForOnlineno)r'   )r   rI   rA   r#   s       r   generate_link_sectionzRenderer.generate_link_sectiont   sZ    E>eElsJe=5#4s$7> $5r   c                     d}dddd}d}d|v rdt        |d         z   }|j                         D ]+  \  }}||vr|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.
        r   GatewayDestinationMetric)gatewaynetworkmetricr,   prefix/rX   N)r   r0   r*   )	r   r)   confrA   r#   route_cfg_maprZ   r&   r2   s	            r   parse_routeszRenderer.parse_routes   s    
  $
 t3tH~..FJJL 	DDAq%I~V$$S#}Q/?C	Dr   c           	      p   d}d}d}|j                  dg       D ]P  }|d   }|dk(  s|dk(  r|dk(  rd}n|d	k(  rd
}n|dk(  r|dk(  rd	}n|dk(  rd
}d|v r*|d   r%|d   D ]  }| j                  d| ||       |dz   } d|v sj|d   }	d|v r|	dt        |d         z   z  }	ddddd}
|j                         D ]  \  }}|dk(  r|j	                  d|
|   |	       "|dk(  rZ|j                  dd| |
|   |       t        ||	      r.t        j                  d||	       |j                  dd| dd
       |dz   }|dk(  s|dk(  s|j	                  ||
|   dj                  |              S |j	                  |d|       t        |j                  d d!      t              r|j	                  |d"|d           |S )#NrQ   r   r   subnetstypedhcp4dhcpipv4ipv6yesdhcp6routesr   addressrZ   r[   r   rT   DNSDomains)rk   rW   dns_nameservers
dns_searchrW   r   azGGateway %s is not contained within subnet %s, adding GatewayOnLink flagGatewayOnLinkrn   ro    DHCPz	accept-rar,   IPv6AcceptRA)r?   r^   r   r0   r'   r*   r   LOGdebugjoin
isinstancebool)r   rI   rA   rc   r#   r)   r3   tiaddrsubnet_cfg_mapr&   r2   s                r   parse_subnetszRenderer.parse_subnets   s)   9b) 1	PA&	AG|qF{4<!DV^ Dg4<!DV^ D1}88 "A %%#iC8'C	"
 A~|q=C#ak"222D((',"+	" GGI PDAqI~**9nQ6GNi 00#qYq0A1 :!TBII!= ! $	  44 '1SEOU "Ag//13D**3q0A388A;O+P91	Pf 	3-eiiR0$7sNE+4FGr   c                    dD ]\  }||vrt        ||         j                         }	 t        j                  |      }|rdnd}|dk(  rd}nd}|j                  |d	|       ^ y # t        $ r  |dk7  rt
        j                  d|       d}Y Hw xY w)
N)dhcp4domaindhcp6domainrf   rQ   routezInvalid dhcp4domain value - %sr   r   r   
UseDomains)r   casefoldr   translate_bool
ValueErrorru   warningr'   )r   drA   itemretsections         r   dhcp_domainzRenderer.dhcp_domain   s    2 	;D1}ag,'')C))#."e
 }$""wc:	;  '>KK @#FCs   A##&BBnsc                 ~   d}|j                  d      }|s)|j                  dk(  r|j                  |j                  d}n|s|j                  dk(  ry |j                  d      r%|j	                  |ddj                  |d                |j                  d	      r&|j	                  |d
dj                  |d	                y y )Nr   dnsrj   )searchnameservers   r   rm   rr   r   rl   )r?   versiondns_searchdomainsrn   r'   rw   )r   rI   rA   r   r#   r   s         r   	parse_dnszRenderer.parse_dns   s    iirzzQ..!11C q778sIsxxH/FG77=!sE388C4F+GH "r   c                     ddddd}|dk(  r|j                  ddd	d
dd       d| d|v rJ|dd| fv r@|d| d   }|j                         D ]#  \  }}||v s|j                  d| |||          % y y y )Nzuse-dnsuse-domainszuse-hostnamezuse-ntp)UseDNSr   UseHostnameUseNTP4zsend-hostnamehostnamezroute-metriczuse-mtuz
use-routes)SendHostnameHostnameRouteMetricUseMTU	UseRoutesrc   
-overridesrf   ipvDHCPv)updater0   r'   )	r   rA   devicerc   r   dhcp_config_mapsdhcp_overridesr&   r2   s	            r   parse_dhcp_overrideszRenderer.parse_dhcp_overrides   s    ')	
 c>##$3 *#1'!- '*%/D'O=
 5
 $d7):$>?N(..0 P1&&&wi'8!^A=NOP5
/r   c                     d}t         j                  d|       |dz   |z   dz   }t        j                  ||       t        j                  |||       y )Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)ru   rv   r   
write_filechownbyname)r   linkr\   nwk_dirnet_fn_ownernet_fns         r   create_network_filezRenderer.create_network_file  sK    (		4d;++d2Z?%|<r   network_state	templatesreturnc                     | j                   }|rt        j                  |      |z   }t        j                  |       | j                  |      }|j                         D ]  \  }}| j                  |||        y N)r>   r   target_pathr   
ensure_dir_render_contentr0   r   )r   r   r   targetnetwork_dirret_dictr&   r2   s           r   render_network_statezRenderer.render_network_state  so     ++**62[@K$''6NN$ 	8DAq$$Q;7	8r   c                 <   i }|j                         D ]  }t               }| j                  ||      }| j                  ||       | j	                  ||      }| j                  |||       d}|j                         D ]  }| j                  d| ||       |dz   } |j                  dk(  r|d   }	|j                  d   j                         D ]"  \  }
}d|v s|j                  d      |	k(  s |
}	 n |	|j                  d   v ru|j                  d   |	   }| j                  ||       dD ]L  }d	| d
|v r.d|j                  d	| di       v r|	 d| d| d}t        |      | j                  ||||       N |j                  ||j!                         i        |S )Nr   crj   r   rF   	ethernetszset-name)r   6rc   domainr   r   z has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)iter_interfacesr   rK   rR   r~   r   iter_routesr^   r   r@   r0   r?   r   RuntimeErrorr   r   r5   )r   r   r   rI   rA   r   rc   r)   r   rF   dev_namedev_cfgr   r   	exceptions                  r   r   zRenderer._render_content/  s   '') 4	:E+C..uc:D&&uc2%%eS1DNN5#r*C)  !!AcU)UC8Ag	 zzQ&+Fm *,;)?)E)E)G "%Hg!W,";;z2d:#+D!	"
 299[11YY{3D9F $$VS1#- N"7)62f< -%zzD	*DbI!J $(&wi @,,39 57!8 &
 #/y"9911#vtWMN OOT3#5#5#789i4	:l r   r   )NN)r6   r7   r8   __doc__r   r   rK   rR   r^   r~   r   r	   r   r   r   r   r    r   r   r9   r   r   r;   r;   Q   s    
 "
?	 
?D9 D0<	 <~;) ;$II I< I"P	 P8= %)	8#8 D>8
 
8 8, 84 8r   r;   c                 V    ddg}ddg}|D ]  }t        j                  |||       r y y)Nip	systemctlz	/usr/sbinz/bin)r   r   FT)r   which)r   expectedr   ps       r   	availabler   j  s=    k"H6"F zz!F6: r   r   )loggingcollectionsr   typingr   	cloudinitr   r   cloudinit.netr   r   cloudinit.net.network_stater	   	getLoggerr6   ru   r   r;   r   r9   r   r   <module>r      sP     #    B 4g!< <~Vx   Vrr   