ÿØÿà JFIF      ÿÛ C      

!"$"$ÿÛ C  ÿÂ p " ÿÄ              ÿÄ             ÿÚ    ÕÔË®
(%	aA*‚XYD¡(J„¡E¢RE,P€XYae )(E¤²€B¤R¥	BQ¤¢ X«)X…€¤   @  

  ..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ C      

!"$"$ÿÛ C  ÿÂ p " ÿÄ              ÿÄ             ÿÚ    ÕÔË®
(%	aA*‚XYD¡(J„¡E¢RE,P€XYae )(E¤²€B¤R¥	BQ¤¢ X«)X…€¤   @  

  ..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     o
    )b"                     @   s   d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ dZddgZG dd	 d	e	ZdS )
znetplan set command line    N)NetplanCommand)ConfigManagerz70-netplan-setrendererversionc                       sb   e Zd Z fddZdd Zdd Zdeeffdd	Zd
d Z	dd Z
dddZdddZ  ZS )
NetplanSetc                    s   t  jdddd d S )NsetzTAdd new setting by specifying a dotted key=value pair like ethernets.eth0.dhcp4=trueT)
command_iddescriptionleaf)super__init__self	__class__ ./usr/share/netplan/netplan/cli/commands/set.pyr   &   s   
zNetplanSet.__init__c                 C   sR   | j jdtdd | j jdtdd | j jdddd	 | j| _|   |   d S )
N	key_valuezNThe nested key=value pair in dotted format. Value can be NULL to delete a key.)typehelpz--origin-hintzCan be used to help choose a name for the overwrite YAML file.                                        A .yaml suffix will be appended automatically.z
--root-dir/zAOverwrite configuration files in this root directory instead of /)defaultr   )parseradd_argumentstrcommand_setfunc
parse_argsrun_commandr   r   r   r   run+   s   


zNetplanSet.runc                 C   s0   t |trt| dgkr|d d u rdS dS )NnetworkTF)
isinstancedictlistkeys)r   treer   r   r   is_emtpy_yaml9   s   (zNetplanSet.is_emtpy_yamlreturnc                    s0  | di  t } D ]U}|tv rq  |g }|d u r,dd t|| jD }| |< |D ]1}t}t|| j}|rEtj	
|d d }d||  | |iii}| | |i |||< q.qt fddtD rt|dkrxt|d nt}tD ]}	d|	  |	ii}
| | |i |
||< q|| S )	Nr    c                 S   s   i | ]}|d qS Nr   ).0devr   r   r   
<dictcomp>J   s    z1NetplanSet.split_tree_by_hint.<locals>.<dictcomp>c                 3   s    | ]}  |V  qd S r(   )get)r)   keyr    r   r   	<genexpr>X   s    z0NetplanSet.split_tree_by_hint.<locals>.<genexpr>   r   )r-   r"   GLOBAL_KEYS
libnetplannetplan_get_ids_for_devtyperoot_dirFALLBACK_HINTnetplan_get_filename_by_idospathbasenamemergeanylenr#   items)r   set_treeZsubtreesdevtypeZdevtype_contentnetdefhintfilenameZnetdef_treer.   r%   r   r/   r   split_tree_by_hint>   s.   zNetplanSet.split_tree_by_hintc                 C   s"  | j d urt| j dkrtd| jdd}t|dkr!td|\}}| |t|}| |rnt	j
dd}| j rVt	j
| j|| j d	 }t	j
|rTt	| d S tt	j
| j|d
}|D ]}t	| qdd S | j |fg}	| j d u r~| |}	|	D ]\}
}| ||
d	 | j qd S )Nr   zInvalid/empty origin-hint=r1      zInvalid value specifiedetcnetplanz.yamlz*.yaml)Zorigin_hintr=   	Exceptionr   split	parse_keyyaml	safe_loadr&   r8   r9   joinr5   isfileremoveglobrD   
write_file)r   rJ   r.   valuer?   r9   Z	hint_pathZ
yaml_filesfhintsrB   Zsubtreer   r   r   r   b   s0   



zNetplanSet.command_setc           	      C   st   | ds|dksd| }td|}i }d}|}|D ]}|dd}i }|t|kr-|}|||}|d7 }q|S )Nznetwork.r    z	(?<!\\)\.r1   z\..)
startswithrerJ   replacer=   
setdefault)	r   r.   rS   rJ   r%   itpartvalr   r   r   rK      s   
zNetplanSet.parse_keyNc                 C   s   |du rg }|D ]<}||v r>t || tr-t || tr-| || || |t|g  q|| du r7||= q|| ||< q|| ||< q|S )z9
        Merges tree/dict 'b' into tree/dict 'a'
        N)r!   r"   r;   r   )r   abr9   r.   r   r   r   r;      s   "zNetplanSet.merger   c                 C   s  t jdd}tjdd}ttj|j| di i}tj|||}tj|rRt|j	dkrRt
|d}t|}	|	d urC|	}W d    n1 sMw   Y  | ||}
t|
}td|| d|v rt|d  d	gkrtd
| tj|rt| d S d S d|v rtj|j||}t
|d}tj|ddd}|| W d    n1 sw   Y  t| t|| t| d S |i krtd| tj|rt| d S d S td|)Nznetplan-set_)prefixrG   rH   r    r   rzWriting file {}: {}r   zEmpty YAML, deleting file {}zw+rF   F)indentdefault_flow_stylez,Removed last key from YAML, deleting file {}zInvalid input: {})tempfileTemporaryDirectoryr8   r9   rN   makedirsnamerO   statst_sizeopenrL   rM   r;   r   
strip_treeloggingdebugformatr#   r$   rP   dumpwriter3   netplan_parseshutilcopy2rI   )r   r?   rh   rootdirZtmprootr9   configZabsprT   cZnew_treestrippedZtmppZnew_yamlr   r   r   rR      sF   


zNetplanSet.write_filer(   )r   )__name__
__module____qualname__r   r   r&   r   r"   rD   r   rK   r;   rR   __classcell__r   r   r   r   r   $   s    $
r   )__doc__r8   rL   re   rX   rm   rs   rQ   netplan.cli.utilsr   netplan.libnetplanr3   netplan.configmanagerr   r6   r2   r   r   r   r   r   <module>   s   