관리-도구
편집 파일: netplan.cpython-39.pyc
a ����'�Dg�R����������������������@���s ��d�dl�Z�d�dlZd�dlZd�dlZd�dlZd�dlmZ�d�dlmZm Z m Z �d�dlmZm Z mZmZ�d�dlmZmZmZmZmZmZ�d�dlmZmZ�dZdZe�e�Zd d ��Ze e ed�dd �Z!dd��Z"ddd�Z#e$e%d�dd�Z&e$e$e%d�dd�Z'e$e$d�dd�Z(G�dd��dej)�Z)d dd�Z*dS�)!�����N)�SpooledTemporaryFile)�Callable�List�Optional)�features�safeyaml�subp�util)�IPV6_DYNAMIC_TYPES� SYS_CLASS_NET�get_devicelist�renderer�should_add_gateway_onlink_flag�subnet_is_ipv6)�NET_CONFIG_TO_V2�NetworkStatez/etc/netplan/50-cloud-init.yamls4��# This is the initial network config. # It can be overwritten by cloud-init or console-conf. network: version: 2 ethernets: all-en: match: name: "en*" dhcp4: true all-eth: match: name: "eth*" dhcp4: true c��������������������s���t���fdd�|����D���S�)Nc�����������������3���s$���|�]\}}|�����r||fV��qd�S�)N)� startswith)�.0�key�value��match���9/usr/lib/python3.9/site-packages/cloudinit/net/netplan.py� <genexpr>,���s��� �z,_get_params_dict_by_match.<locals>.<genexpr>)�dict�items)�configr���r���r���r����_get_params_dict_by_match+���s�����r���)r����entryr���c�������������� ���C���s��d$dd�}g�}g�}g�}g�}|���dg��} | du�r2g�} | D��]�} | ��d�}|�d�rp|dkr`|d7�}|�|d i��q6|tv�r�|�d d i��q6|dv�r6d| ��d ��}d| v�r�|d| ��d��7�}| ��d��r| ��d�dd�} t| d�|���r�t�d| d�|��d | d<�|�| ��d| v��r&||| ��dg���7�}d| v��rD||| ��dg���7�}d| v��r�d}t| ��rld|��v��rld}|�|| ��d�i��| ��dg��D�]X}d|��d�|��d�f�}|��d�|d�} d|v��r�| �d|��dd�i��|�| ���q�|�|��q6d|�v��r<|��d�}|�r0|�d�|k�r0t� d||�d�|��n|�d�|d<�t |�dk�rX|�d |i��t |�dk�rt|�d|i��t |�dk�r�d |i}|�d!|i��t |�dk�r�|��d!i��}|�d"|i��|�d!|i��d#|�v��r�|�d#�du�r�|�d#t�|���d#��i��dS�)%a���This method parse a cloudinit.net.network_state dictionary (config) and maps netstate keys/values into a dictionary (entry) to represent netplan yaml. (config v1 -> netplan) An example config dictionary might look like: {'mac_address': '52:54:00:12:34:00', 'name': 'interface0', 'subnets': [ {'address': '192.168.1.2/24', 'mtu': 1501, 'type': 'static'}, {'address': '2001:4800:78ff:1b:be76:4eff:fe06:1000", 'mtu': 1480, 'netmask': 64, 'type': 'static'}], 'type: physical', 'accept-ra': 'true' } An entry dictionary looks like: {'set-name': 'interface0', 'match': {'macaddress': '52:54:00:12:34:00'}, 'mtu': 1501} After modification returns {'set-name': 'interface0', 'match': {'macaddress': '52:54:00:12:34:00'}, 'mtu': 1501, 'address': ['192.168.1.2/24', '2001:4800:78ff:1b:be76:4eff:fe06:1000"], 'ipv6-mtu': 1480} � c�����������������S���s.���|�rt�|�t�s|�S�||�v�r$|��|�S�|�gS�dS�)zT Helper to convert strings to list of strings, handle single string N)� isinstance�str�split)�obj�tokenr���r���r����_listifyX���s���� �z$_extract_addresses.<locals>._listify�subnetsN�typeZdhcp�4TZdhcp6)ZstaticZstatic6z%s�address�prefixz/%dZgateway�default)Zvia�tozAGateway %s is not contained within subnet %s, adding on-link flagzon-link�dns_nameserversZ dns_searchZmtuzipv6-mtu�routesz%s/%s�networkZmetric�d���zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r���� addresses�nameservers�searchz accept-ra)r ���) �getr����updater ���r����LOG�debug�appendr����warning�lenr ���Zis_true)r���r����ifnamer���r&���r2���r/���r3���� searchdomainsr'���ZsubnetZsn_type�addrZ new_routeZmtukeyZrouteZto_netZ entry_mtu�nsr���r���r����_extract_addresses3���s�����% �� � �r@���c��������������������s8���t���fdd�|����D���}t|�dkr4|�d|i��d�S�)Nc��������������������s$���g�|�]\}}|��d�d���kr|�qS�)zbond-masterN)r5���)r����name�cfg��bond_masterr���r���� <listcomp>����s����z0_extract_bond_slaves_by_name.<locals>.<listcomp>r���� interfaces)�sortedr���r;���r6���)rF���r���rD���Zbond_slave_namesr���rC���r����_extract_bond_slaves_by_name����s���� ��rH���c��������������������s~���t����d�}tj�|�sd�S�t�|�}|tkr2d�S���fdd�dD��}dd��|D��}t� d||��|g|�D�]}t� |��qjd�S�)Nz etc/netplan/00-snapd-config.yamlc��������������������s���g�|�]}t����|��qS�r���)r����target_path�r����f��targetr���r���rE�������s����z"_clean_default.<locals>.<listcomp>)z-run/systemd/network/10-netplan-all-en.networkz.run/systemd/network/10-netplan-all-eth.networkz#run/systemd/generator/netplan.stampc�����������������S���s���g�|�]}t�j�|�r|�qS�r���)�os�path�isfilerJ���r���r���r���rE������������z9removing known config '%s' and derived existing files: %s)r���rI���rN���rO���rP���r ���Zload_binary_file�KNOWN_SNAPD_CONFIGr7���r8����unlink)rM���Ztpath�contentZderived�existingrK���r���rL���r����_clean_default����s"���� ��rV���)�net_config_content�returnc�������������� ���C���s��zddl�m}�ddlm}�W�n �ty<���t�dt��Y�dS�0�z�tdd��b}|� |���|� ���|�dtj ��|��}|�|��|��}|�|��|�tj�t���W�d����n1�s�0����Y��W�n6�t��y��}�zt�d t|��W�Y�d}~dS�d}~0�0�t�d ��dS�)ad��Use netplan.State._write_yaml_file to write netplan config Where netplan python API exists, prefer to use of the private _write_yaml_file to ensure proper permissions and file locations are chosen by the netplan python bindings in the environment. By calling the netplan API, allow netplan versions to change behavior related to file permissions and treatment of sensitive configuration under the API call to _write_yaml_file. In future netplan releases, security-sensitive config may be written to separate file or directory paths than world-readable configuration parts. r���)�Parser)�Statez.No netplan python module. Fallback to write %sF�w��modeNzUUnable to render network config using netplan python module. Fallback to write %s. %sz0Rendered netplan config using netplan python APIT)Znetplan.parserrY���Z netplan.staterZ����ImportErrorr7���r8����CLOUDINIT_NETPLAN_FILEr����write�flush�seek�io�SEEK_SET� load_yamlZimport_parser_resultsZ_write_yaml_filerN���rO����basename� Exceptionr:���)rW���rY���rZ���rK����parserZstate_output_file�er���r���r����netplan_api_write_yaml_file����s<����� �&� rj���)�cfg_filerT���rX���c�����������������C���s.���t�j�|��sdS�t�t�|���}|t�|�kS�)z<Return True when new netplan config has changed vs previous.T)rN���rO����existsr ���re���Zload_text_file)rk���rT���Z prior_cfgr���r���r����has_netplan_config_changed��s����rm���)rk���rT���c�����������������C���sH���t�jr dnd}tj�|��r4t�|��}||@�|kr4|}tj|�||d��dS�)zDWrite netplan config to cfg_file because python API was unavailable.i���i���r\���N)r���ZNETPLAN_CONFIG_ROOT_READ_ONLYrN���rO���rl���r ���Zget_permissionsZ write_file)rk���rT���r]���Zcurrent_moder���r���r����fallback_write_netplan_yaml ��s���� rn���c�������������������@���s~���e�Zd�ZdZddgZddgZddd�Zee�d�d d �Z de ee�dd�dd �Z eed�dd�Zddd�Ze ed�dd�ZdS�)�RendererzBRenders network information in a /etc/netplan/network.yaml format.�netplanZgenerate�infoNc�����������������C���sT���|si�}|��dt�|�_|��dd��|�_|��dd�|�_|��dd�|�_|��d�pLg�|�_d�S�)N�netplan_path�netplan_headerZpostcmdsF� clean_defaultTr���)r5���r_���rr���rs���� _postcmdsrt���� _features)�selfr���r���r���r����__init__1��s����zRenderer.__init__)rX���c�������������� ���C���s����|�j�s~z0tj|�jdd�\}}t�|�}|d�d�|�_�W�nF�tjyJ���Y�n4�ttfy|�}�zt� d|��W�Y�d�}~n d�}~0�0�|�j�S�)NT�Zcapturez netplan.ior���z-Failed to list features from netplan info: %s) rv���r����NETPLAN_INFOr ���re����ProcessExecutionError� TypeError�KeyErrorr7���r8���)rw���Z info_blobZ_errrq���ri���r���r���r���r���:��s���� "zRenderer.features)� network_state� templatesrX���c�����������������C���s����t�j�t�|�|�j�}t�t�j�|���|�� |�}|�j r>|�j nd}|�d�sT|d7�}||�}t||�}t |�sxt||��|�jr�t|d��|�j|�j|d��|�j|�jd��d�S�)N��� rL�����run�config_changed)r����)rN���rO����joinr���rI���rr���r ���Z ensure_dir�dirname�_render_contentrs����endswithrm���rj���rn���rt���rV����_netplan_generateru����_net_setup_link)rw���r~���r���rM���ZfpnplanrT����headerZnetplan_config_changedr���r���r����render_network_stateH��s ���� �zRenderer.render_network_stater����c�����������������C���s8���|st��d��d�S�|s$t��d��d�S�tj|�jdd��d�S�)Nz"netplan generate postcmds disabledzEskipping call to `netplan generate`. reason: identical netplan configTry���)r7���r8���r����NETPLAN_GENERATE)rw���r����r����r���r���r���r����i��s���� �zRenderer._netplan_generateFc�����������������C���s����|st��d��dS�dt���v�r,t��d��dS�g�d�}td�D�]n}z>t��D�],}tj�t |��rHt j |t |�g�dd��qHW��q�W�q<�t jy��}�z|}W�Y�d}~q<d}~0�0�q<td �|�dS�) z�To ensure device link properties are applied, we poke udev to re-evaluate networkd .link files and call the setup_link udev builtin command z'netplan net_setup_link postcmd disabledNz net.ifnames=0z%Predictable interface names disabled.)Zudevadmztest-builtinZnet_setup_link����Try���zQ'udevadm test-builtin net_setup_link' unable to run successfully for all devices.) r7���r8���r ���Zget_cmdline�ranger���rN���rO����islinkr���r���r{����RuntimeError)rw���r����Z setup_lnk�_Zifaceri���Zlast_exceptionr���r���r���r����u��s,���� � ��zRenderer._net_setup_link)r~���rX���c�����������+��� ���C���sV��|j�dkr*t�d��tjd|jiddd�S�i�}i�}i�}i�}i�}g�}|j�dg��}|j} |j } |� ��D��]&}|�d�}ttdd ��|� ����} | �d �}|dk�r|| �dd��d �}|d�d�u�r�| �dd��}|d�ur�d|���i|d<�n|d=�|d=�t| |||�j��|�||i��qd|dk�r�i�}i�}td�}dD�]R}t| |�}|� ��D�]8\}}|�|�dd��}|d�u��rj�qB|�||i���qB�q,t|�dk�r�|�d|i��| �d��r�| d����|d<�| �d�}|dk�r�t|||��t| |||�j��|�||i��qd|dk�r.| �d�}|d�u��r,t�dd|��d���qdtt�|��}d|i}d}t| |�}i�}td�} |� ��D�]p\}}| �|�}|d�u��r��qd|�||i��|dv��rdi�}!|D�]}"|"���\}#}$t|$�|!|#<��q�|�||!i���qdt|�dk�r�|�d|i��| �d��r| d����|d<�t| |||�j��|�||i��qd|d krd| �d!�| �d"�d#�}%| �dd��}|d�u�rn|���|%d<�t| |%||�j��|�||%i��qd| �s�| �r�| | d$�}&|||||fD�]@}'|'� ��D�]0\}(})d%|)v��s�d&|)v�rސq�|)�d%|&i���q��q�d'd(��}*|�d)��||*d*|�7�}||*d+|�7�}||*d,|�7�}||*d-|�7�}||*d.|�7�}d/�|�S�)0N����zV2 to V2 passthroughr0���F)�explicit_start�explicit_endrF���rA���c�����������������S���s���|�d�d�uS�)N����r���)�itr���r���r����<lambda>���rQ���z*Renderer._render_content.<locals>.<lambda>r(���Zphysicalr���)�set-namer���Zmac_addressZ macaddressr�����bond)Zbond_zbond-r�����-r���� parameterszbond-slavesZnone�bridge�bridge_portszInvalid config. The keyz'bridge_ports' is required in �.Zbridge_)z path-costz port-priority�vlanZvlan_idzvlan-raw-device)�id�link)r2���r4���r3���r2���c�����������������S���s0���|r,t�j|�|idddd�}t�|d�}|gS�g�S�)NFT)r����r����Znoaliasz )r����dumps�textwrap�indent)rA����section�dumpZtxtr���r���r����_render_section ��s�����z1Renderer._render_content.<locals>._render_sectionznetwork: version: 2 � ethernets�wifis�bonds�bridges�vlansr����)�versionr7���r8���r���r����r���Z_network_stater5���r.���Zdns_searchdomainsZiter_interfacesr����filterr����lowerr@���r���r6���r���r����replacer;���rH���r:���rG����copyr#����intr9���r����)+rw���r~���r����r����r����r����r����rT���rF���r3���r=���r���r<���ZifcfgZif_typeZethZmacaddrr����Zbond_configZv2_bond_mapr���Zbond_paramsZparamr���ZnewnameZslave_interfacesr����Zportsr����Zmatch_prefix�paramsZ br_configZ v2_bridge_mapZnewvalue�val�portZportvalr����Znscfgr�����_namerB���r����r���r���r���r�������s����� � � �� � zRenderer._render_content)N)NN)F)�__name__� __module__�__qualname__�__doc__r����rz���rx���r���r"���r���r���r���r���r�����boolr����r����r����r���r���r���r���ro���+��s��� ����! !ro���c�����������������C���s2���dg}ddg}|D�]}t�j|||�d�s�dS�qdS�)Nrp���z /usr/sbinz/sbin)r4���rM���FT)r����which)rM���Zexpectedr4����pr���r���r���� available6��s����r����)N)N)+r����rc���ZloggingrN���r����Ztempfiler����typingr���r���r���Z cloudinitr���r���r���r ���Z cloudinit.netr ���r���r���r ���r���r���Zcloudinit.net.network_stater���r���r_���rR���Z getLoggerr����r7���r���r���r@���rH���rV���r"���r����rj���rm���rn���ro���r����r���r���r���r����<module>���s0��� � 4 ��