HEX
Server: nginx/1.28.3
System: Linux lightweb-s1 5.15.0-173-generic #183-Ubuntu SMP Fri Mar 6 13:29:34 UTC 2026 x86_64
User: dawonefr-98 (1071)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/cloudinit/net/__pycache__/networkd.cpython-310.pyc
o

�t�h_�@s�ddlZddlmZddlmZmZmZmZmZm	Z	ddl
mZmZddl
mZmZddlmZe�e�Zdeeeefdeeeeffd	d
�Zdedefdd�ZGd
d�d�ZGdd�dej�Zddd�ZdS)�N)�defaultdict)�Any�Callable�Dict�List�Optional�Tuple)�subp�util)�renderer�should_add_gateway_onlink_flag)�NetworkState�data�returncCs&i}|��D]
\}}t|�||<q|S)z�
    Normalize a dictionary of lists.
    - Assumes top-level keys map to lists.
    - Each list and any nested dicts/lists will be recursively normalized.
    )�items�_normalize_value)r�
normalized�key�value�r�8/usr/lib/python3/dist-packages/cloudinit/net/networkd.py�	normalizesrcCs�t|t�ri}t|�D]
}t||�||<q|St|t�rHg}|D]}t|ttf�r/t|�}n|}|�|�q!zt|�WStyG|YSw|S)z�
    Recursively normalize a dictionary or list:
    - Dicts: keys sorted, values normalized
    - Lists: items normalized and sorted (if comparable)
    )�
isinstance�dict�sortedr�list�append�	TypeError)rrr�normalized_items�item�normalized_itemrrrrs$



�rc@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�	CfgParserc
Cs$ggggggiggggid�|_dS)N)�Match�Link�Network�DHCPv4�DHCPv6�Address�Route�NetDev�VLAN�Bond�Bridge�RoutingPolicyRule)�	conf_dict)�selfrrr�__init__:s�zCfgParser.__init__cCs^|j��D]'}||kr,|j|�|�d|���tt�|j|��|j|<|j|��qdS)N�=�r.�keysrrr�fromkeys�sort)r/�secr�val�krrr�update_sectionJs��zCfgParser.update_sectioncCs�|j��D]=}||krB||j|vrg|j||<|j||�|�d|���tt�|j||��|j||<|j||��qdS)z�
        For each route section we use rid as a key, this allows us to isolate
        this route from others on subsequent calls.
        r1Nr2)r/r6�ridrr7r8rrr�update_route_sectionQs���zCfgParser.update_route_sectioncCs�d}t|j�|_t|j���D]`\}}|sq|dkr-t|�D]
}|d|�d|�d�7}qq|dvrUt|�D]}|d|�d�7}t||�D]	}||�d�7}qE|d7}q5q|d|�d�7}t|�D]	}||�d�7}qa|d7}q|S)N�r'�[z]
�

)r(r-�
)rr.rr)r/�contentsr8�v�e�nrrr�get_final_confas*�
�
zCfgParser.get_final_confN)�__name__�
__module__�__qualname__r0r9r;rDrrrrr!9s
r!c@s
eZdZdZd*dd�Zdefdd�Zdefdd	�Zdefd
d�Zdefdd
�Z	defdd�Z
dedefdd�Zdefdd�Z
d+dd�Z		d,dedeeddfdd�Zdefdd�Zdefd d!�Zdefd"d#�Zdedefd$d%�Zdedefd&d'�Zdedefd(d)�ZdS)-�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.
    NcCs(|si}|�dd�|_|�dd�|_dS)N�resolve_conf_fnz/etc/systemd/resolved.conf�network_conf_dirz/etc/systemd/network/)�getrIrJ)r/�configrrrr0�s�
�zRenderer.__init__�cfgcCsfd}ddd�}|ddkrd|d<|sdS|��D]\}}||vr.||r.|�||||�q|d	S)
Nr"�Name�Driver)�name�driver�type�physical�
MACAddress�mac_addressrP)rr9)r/�ifacerMr6�
match_dictr8rArrr�generate_match_section�s��zRenderer.generate_match_sectioncCszd}|sdS|�d�r|�|d|d�|ddkr(|�d�r(|�|d|d�d|vr9|dr;|�|d	d
�dSdSdS)Nr#�mtu�MTUBytesrRrSrUrT�optional�RequiredForOnline�no)rKr9)r/rVrMr6rrr�generate_link_section�s
�zRenderer.generate_link_sectionc	Cspd}ddddd�}d}d|vrd	|d��}|��D]\}}||vr#q|d
kr+||7}|�|||||�qdS)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�Table)�gateway�network�metric�tabler<�prefix�/rdN)rr;)	r/r:�confrMr6�
route_cfg_maprgr8rArrr�parse_routes�s ��zRenderer.parse_routesc	Cs�d}d}d}|�dg�D]�}|d}|dvr$|dkrd}n|dkr#d	}n|d
kr5|dkr/d}n|dkr5d	}d|vrR|drR|dD]}|�d|��||�|d
}qAd|vr�|d}	d|vrg|	d|d��7}	ddddd�}
|��D]O\}}|dkr�|�d|
||	�qr|dkr�|�dd|��|
||�t||	�r�t�d||	�|�dd|��dd	�|d
}qr|dvr�|�||
|d�|��qrq|�|d|�t	|�d�t
�r�d}
|dr�d	}
|�|d|
�|S) Nr]r$r�subnetsrR>�dhcp�dhcp4�ipv4�ipv6�yes�dhcp6�routes�r��addressrgrhr'r_�DNS�Domains)rvrc�dns_nameservers�
dns_searchrcr(�azGGateway %s is not contained within subnet %s, adding GatewayOnLink flag�
GatewayOnLink>rzry� �DHCPz	accept-ra�IPv6AcceptRA)rKrkrr9r;r�LOG�debug�joinr�bool)r/rVrMrmr6r:rB�t�i�addr�subnet_cfg_mapr8rAr7rrr�
parse_subnets�sp�
��
��
�zRenderer.parse_subnetsc	Cs�dD]B}||vr	qt||���}z
t�|�}|rdnd}Wnty3|dkr1t�d|�d}Ynw|dkr;d}nd}|�|d	|�qdS)
N)�dhcp4domain�dhcp6domainrqr]�routezInvalid dhcp4domain value - %sr�r%r&�
UseDomains)�str�casefoldr
�translate_bool�
ValueErrorr��warningr9)r/�drMr�ret�sectionrrr�dhcp_domain
s$
���zRenderer.dhcp_domain�nscCs�d}|�d�}|s|jdkr|j|jd�}n	|s|jdkrdS|�d�r0|�|dd�|d��|�d	�rC|�|d
d�|d	��dSdS)Nr$�dnsru)�search�nameservers�r�rxr}r�rw)rK�version�dns_searchdomainsryr9r�)r/rVrMr�r6r�rrr�	parse_dnss
�

�zRenderer.parse_dnsc	Cs�ddddd�}|dkr|�ddd	d
dd��d
|�d�|vrH|dd|��fvrJ|d
|�d�}|��D]\}}||vrG|�d|��|||�q3dSdSdS)Nzuse-dns�use-domainszuse-hostnamezuse-ntp)�UseDNSr��UseHostname�UseNTP�4z
send-hostname�hostnamezroute-metriczuse-mtuz
use-routes)�SendHostname�Hostname�RouteMetric�UseMTU�	UseRoutesrm�
-overridesrq�ipv�DHCPv)�updaterr9)	r/rM�devicermr��dhcp_config_maps�dhcp_overridesr8rArrr�parse_dhcp_overrides-s2���
���zRenderer.parse_dhcp_overrides�.networkcCsVd}t�d|�|�d|�|��}|�d�r|dd�}t�||�t�|||�dS)Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-r>���)r�r��endswithr
�
write_file�chownbyname)r/�linkri�nwk_dir�ext�net_fn_owner�net_fnrrr�create_network_fileIs
zRenderer.create_network_file�
network_state�	templatesrcCs�|j}|rt�|�|}t�|�|�|�}|�di�}|�di�}|�di�}|��D]\}	}
|�|	|
|�q,|��D]
\}	}
|j|	|
|dd�q<|��D]
\}	}
|j|	|
|dd�qN|��D]
\}	}
|j|	|
|dd�q`dS)N�vlan_netdev�bond_netdev�
bridge_netdevz.netdev)r�)	rJr	�target_pathr
�
ensure_dir�_render_content�poprr�)r/r�r��target�network_dirrdr�r�r�r8rArrr�render_network_stateTs"

�zRenderer.render_network_statecCsDd}d}|D]}|��D]\}}|�|||��|�q|d7}qdS)Nrr-ru)rr;�
capitalize)r/�policyrMr:rr7r8rArrr�parseRoutingPolicyqs
�zRenderer.parseRoutingPolicy�nsCfgcCsJi}d}dD]}||vr
q||��D]\}}||vr!||||<qq|S)Nzrouting-policy)�	ethernets�bonds�vlans�bridges)r)r/r��routingPoliciesrr�rV�settingsrrr�extractRoutingPoliciesys��zRenderer.extractRoutingPoliciesc Cs�i}i}i}i}d|jvr|�|�}|d}|d}||d<d|jvr4|�|�}|d}	|d}|	|d<d|jvrJ|�|�}
|
d}|
d	}||d<|�|j�}|��D�]}
t�}|
d
}|�|g�}|D]	}|�dd|�qf|�|�}|r}|�	||�|�|�}|r�|�dd
|�|�|�}|r�|d�|i��|�}|r�|�dd|�|d�|i��|�}|r�|�dd|�|�dd|�|�
|
|�}|�|
|�|�|
|�}|�
|
||�d}|��D]}|�d|��||�|d}q�|jdk�ra|
d
}|jd��D]\}}d|v�r|�d�|k�r|}n�q||jdv�ra|jd|}|�||�dD]0}d|�d�|v�rWd|�d|�d�i�v�rW|�d|�d|�d �}t|��|�||||��q0|�||��i�qT|S)!Nr�r��	vlan_linkr�r��	bond_linkr�r��bridge_linkrPr$r*r+�	path-costr,�Cost�
port-priority�Priorityr�crur�r�zset-name)r��6rm�domainr�r�z has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)rL�render_vlans�render_bonds�render_bridgesr��iter_interfacesr!rKr9r�rXr^r�r��iter_routesrkr�rr��RuntimeErrorr�r�rD) r/r��ret_dictr�r�r��	vlan_dictr��	bond_dictr��bridge_dictr�r�rVrM�
iface_name�vlan_link_namer��rPolicy�bond_link_name�bridge_link_namer7r�rmr:r�rP�dev_name�dev_cfgr�r��	exceptionrrrr��s�








��


����zRenderer._render_contentcCs�tt�}i}|j�di�}|��D]`\}}|�d�}|�d�}|dus'|dur.t�d|�q||�|�t�}	|	�	dd|�|	�	ddd�|�d	�}
|
rT|	�	dd
|
�|�d�}
|
rd|	�	dd|
�
��|	�	d
d|�|	��||<q||d�S)Nr��idr�z)Skipping VLAN %s - missing 'id' or 'link'r)rN�Kind�vlanrYrZ�
macaddressrTr*�Id)r�r�)rrrLrKrr�r�rr!r9�lowerrD)r/r��vlan_link_info�vlan_ndev_configsr��	vlan_name�vlan_cfg�vlan_id�parentrMr7rrrr��s4

�

�zRenderer.render_vlansc	s*i}i}d}|j�di�}|��D]�\�}|�d�}|s#t�d��q|��fdd�|D��t�}|�dd��|�dd	d
�|�d�}	|	rN|�dd|	�|�d
�}	|	r^|�dd|	���|�di�}
t	t
tt
tt
gt
fff}iddt
f�dddd�f�ddt
f�dddd�f�ddt
f�dddd�f�d d!t
f�d"d#t
f�d$d%t
f�d&d't
f�d(d)d*d�f�d+d,t
f�d-d.t
f�d/d0t
f�d1d2t
f�d3d4t
f�d5d6d7d�f�}|��D]\}
\}}|
|
vr�|�||||
|
��q�d8|
v�r	|
d8}t|t
�r�|g}|�|d9d:�|��|��|�<q||d;�S)<Nr+r��
interfacesz'Skipping bond %s - missing 'interfaces'csi|]}|��qSrr)�.0rV��	bond_namerr�
<dictcomp>.sz)Renderer.render_bonds.<locals>.<dictcomp>r)rNr��bondrYrZr�rT�
parametersz	ad-select�AdSelectzall-slaves-active�AllSlavesActivecSst|���S�N)r�r��rArrr�<lambda>Fsz'Renderer.render_bonds.<locals>.<lambda>zarp-all-targets�
ARPAllTargetszarp-interval�ARPIntervalSeccS�
|�d�S�N�msrrrrrrI�
zarp-validate�ARPValidatez
down-delay�DownDelaySeccSr	r
rrrrrrKrzfail-over-mac-policy�FailOverMACPolicyzgratuitous-arp�
GratuitousARPz	lacp-rate�LACPTransmitRatezlearn-packet-interval�LearnPacketIntervalSeczmii-monitor-interval�
MIIMonitorSeccSr	r
rrrrrrPrz	min-links�MinLinks�mode�Modezpackets-per-slave�PacketsPerSlavezprimary-reselect-policy�PrimaryReselectPolicyztransmit-hash-policy�TransmitHashPolicyzup-delay�
UpDelaySeccSr	r
rrrrrrVrzarp-ip-targets�ARPIPTargetsr})r�r�)rLrKrr�r�r�r!r9r�rr�rr�objectrr�rD)r/r��bond_link_info�bond_ndev_configsr�r��bond_cfgr�rMr7�params�ParamMapType�	param_mapr�option�	formatter�targetsrr�rr� s�
�

������	�
���
���������

�zRenderer.render_bondscCsjiiid�}i}|j�di�}|��D]�\}}|�dg�}|s&t�d|�q|D]}|||<q(t�}	|	�dd|�|	�ddd�|�d	�}
|
rN|	�dd
|
�|�d�}
|
r^|	�dd|
���|�d
i�}ddddddd�}|��D]\}
}|�|
�}
|
r�t|
t	�r�|
r�dnd}
|	�d||
�qq|�d�}
|
r�|
|d|<|�d�}
|
r�|
|d|<|	�
�||<q||d�S)N)r�r�r�r�r�z)Skipping bridge %s - missing 'interfaces'r)rNr��bridgerYrZr�rTr�
AgeingTimeSec�ForwardDelaySec�HelloTimeSec�	MaxAgeSecr��STP)zageing-timez
forward-delayz
hello-timezmax-age�priority�stprqr]r,r�r�)r�r�)rLrKrr�r�r!r9r�rr�rD)r/r��bridge_link_info�bridge_ndev_configsr��bridge_name�
bridge_cfgr�rVrMr7r r"r�sysd_keyrrrr�jsb��


�

�

�zRenderer.render_bridgesr)r�)NN)rErFrG�__doc__r0r!rXr^rkr�r�r
r�r�r�rrr�r�rr�r�r�r�r�rrrrrH{s4

B
���
�u&JrHcCs2ddg}ddg}|D]}tj||d�sdSq
dS)N�ip�	systemctlz	/usr/sbinz/bin)r�FT)r	�which)r��expectedr��prrr�	available�s�r9r)�logging�collectionsr�typingrrrrrr�	cloudinitr	r
�
cloudinit.netrr�cloudinit.net.network_stater
�	getLoggerrEr�r�rrr!rHr9rrrr�<module>s  
*B7