ÿØÿà 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1                     @   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G dd deZ	G dd de
ZdS )znetplan configuration manager    Nc                   @   sR  e Zd Zdi fddZedd Zedd Zedd	 Zed
d Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zed d! Zed"d# Zed$d% Zed&d' Zg fd(d)Zd*d+ ZdAd-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdBd8d9Zd:d; Z d<d= Z!d>d? Z"d@S )CConfigManager/c                 C   sP   || _ tjdd| _tj| jd| _tj| jd| _|| _	i | _
t | _d S )NZnetplan_)prefixetcrun)r   tempfileZmkdtemptempdirospathjointemp_etctemp_runextra_filesconfigsetnew_interfaces)selfr   r    r   +/usr/share/netplan/netplan/configmanager.py__init__   s   zConfigManager.__init__c                 C   
   | j d S )Nnetwork)r   r   r   r   r   r   (      
zConfigManager.networkc                 C   sh   i }| | j | | j | | j | | j | | j | | j | | j | | j |S N)	update	ovs_ports	ethernetsmodemswifisbridgesbondstunnelsvlansr   
interfacesr   r   r   r%   ,   s   zConfigManager.interfacesc                 C   s,   i }| | j | | j | | j |S r   )r   r   r   r   r$   r   r   r   physical_interfaces9   s
   z!ConfigManager.physical_interfacesc                 C   s8   i }| | j | | j | | j | | j |S r   )r   r    r!   r"   r#   r$   r   r   r   virtual_interfacesA   s   z ConfigManager.virtual_interfacesc                 C   r   )Nr   r   r   r   r   r   r   K   r   zConfigManager.ovs_portsc                 C   r   )Nopenvswitchr(   r   r   r   r   r)   O   r   zConfigManager.openvswitchc                 C   r   )Nr   r(   r   r   r   r   r   S   r   zConfigManager.ethernetsc                 C   r   )Nr   r(   r   r   r   r   r   W   r   zConfigManager.modemsc                 C   r   )Nr   r(   r   r   r   r   r   [   r   zConfigManager.wifisc                 C   r   )Nr    r(   r   r   r   r   r    _   r   zConfigManager.bridgesc                 C   r   )Nr!   r(   r   r   r   r   r!   c   r   zConfigManager.bondsc                 C   r   )Nr"   r(   r   r   r   r   r"   g   r   zConfigManager.tunnelsc                 C   r   )Nr#   r(   r   r   r   r   r#   k   r   zConfigManager.vlansc                 C   r   )N
nm-devicesr(   r   r   r   r   
nm_deviceso   r   zConfigManager.nm_devicesc                 C   r   )Nversionr(   r   r   r   r   r,   s   r   zConfigManager.versionc                 C   r   )Nrendererr(   r   r   r   r   r-   w   r   zConfigManager.rendererc                 C   s   |  | jS r   )
strip_treer   r   r   r   r   tree{   s   zConfigManager.treec                 C   sD   i }|   D ]\}}t|trt|}|ddi fvr|||< q|S )zclear empty branches N)items
isinstancedictr   r.   )dataZnew_datakvr   r   r   r.      s   

zConfigManager.strip_treec                    s   i  dD ]}t  tj| j|ddD ]
}| tj|< qq fddt  D }i i i i i i i i i i ddd| jd< |D ]}| 	| q@|D ]}|  j
| 	|O  _
qJtd	tj| jd
d dS )z
        Parse all our config files to return an object that describes the system's
        entire configuration, so that it can later be interrogated.

        Returns a dict that contains the entire, collated and merged YAML.
        )libr   r   netplanz*.yamlc                    s   g | ]} | qS r   r   ).0nameZnames_to_pathsr   r   
<listcomp>   s    z'ConfigManager.parse.<locals>.<listcomp>N)r   r)   r   r   r   r    r!   r"   r#   r*   r,   r-   r   zMerged config:
{}F)Zdefault_flow_style)globr	   r
   r   r   basenamesortedkeysr   _merge_yaml_configr   loggingdebugformatyamldumpr/   )r   Zextra_configZyaml_dir	yaml_filefilesr   r;   r   parse   s0    zConfigManager.parsec                 C   s*   |D ]
}|  |||  q| j| d S r   )
_copy_filer   r   )r   Zconfig_dictZconfig_filer   r   r   add   s   zConfigManager.addTc                 C   s   |r|  tj| jdtj| jd | j tj| jdtj| jdddd | j tj| jdtj| jd	d
dd d S )Nzetc/netplanr8   %run/NetworkManager/system-connectionsZNetworkManagerzsystem-connectionsT)
missing_okrun/systemd/networkZsystemdr   )
_copy_treer	   r
   r   r   r   r   )r   Zbackup_config_dirr   r   r   backup   s   
zConfigManager.backupc              
   C   s  z`t | jD ]}t| j|  | j|= qd| j}d| j}tj|r>t	tj
| jd | |tj
| jd tj|r^t	tj
| jd | |tj
| jd W d S W d S  ty } ztd| td td W Y d }~d S d }~ww )Nz${}/NetworkManager/system-connectionsz{}/systemd/networkrL   rN   z8Something really bad happened while reverting config: {}zZYou should verify the netplan YAML in /etc/netplan and probably run 'netplan apply' again.)r3   r   r	   unlinkrD   r   r
   existsshutilrmtreer   r   rO   	ExceptionrB   errorsysexit)r   Z
extra_fileZtemp_nm_pathZtemp_networkd_pather   r   r   revert   s.   


zConfigManager.revertc                 C   s   t | j d S r   )rT   rU   r   r   r   r   r   cleanup      zConfigManager.cleanupc                 C   s$   z|    W d S  ty   Y d S w r   )r\   FileNotFoundErrorr   r   r   r   __del__   s
   zConfigManager.__del__c                 C   s   t || d S r   )rT   copy)r   srcdstr   r   r   rJ      r]   zConfigManager._copy_fileFc                 C   s.   z	t || W d S  ty   |rY d S  w r   )rT   copytreer^   )r   ra   rb   rM   r   r   r   rO      s   zConfigManager._copy_treec           
      C   s   t  }t }d|v r"|dD ]\}}|i d||< |i d||< qt| }|D ].}||}	||v rFtd|| || 	|	 q*td|| |	||< |
| q*|S )Nports)Zpeerr)   {} exists in {}{} not found in {})r   r3   getlistr@   poprB   rC   rD   r   rK   )
r   orignewr   rd   Zp1Zp2changed_ifacesifnameifacer   r   r   _merge_ovs_ports_config   s    
z%ConfigManager._merge_ovs_ports_configc                 C   sx   t  }t| }|D ].}||}||v r'td|| || | qtd|| |||< || q|S )Nre   rf   )	r   rh   r@   ri   rB   rC   rD   r   rK   )r   rj   rk   r   rl   rm   rn   r   r   r   _merge_interface_config  s   
z%ConfigManager._merge_interface_configc              	   C   sD  t  }zt|}tj|tjd}d }|d ur|d}|rd|v r9| | j|d}||O }|d| jd< d|v rK| 	| j
|d}||O }d|v r]| 	| j|d}||O }d|v ro| 	| j|d}||O }d|v r| 	| j|d}||O }d|v r| 	| j|d}||O }d	|v r| 	| j|d	}||O }d
|v r| 	| j|d
}||O }d|v r| 	| j|d}||O }d|v r|d| jd< d|v r|d| jd< W d    |W S W d    |W S W d    |W S 1 sw   Y  |W S  ttjfy!   td| td Y d S w )N)Loaderr   r)   r   r   r   r    r!   r"   r#   r*   r,   r-   z!Error while loading {}, aborting.   )r   openrE   loadZCSafeLoaderrg   ro   r   r   rp   r   r   r   r    r!   r"   r#   r+   IOErrorZ	YAMLErrorrB   rW   rD   rX   rY   )r   rG   r   fZ	yaml_datar   rk   r   r   r   rA     sl   


&
&
&&z ConfigManager._merge_yaml_configN)T)F)#__name__
__module____qualname__r   propertyr   r%   r&   r'   r   r)   r   r   r   r    r!   r"   r#   r+   r,   r-   r/   staticmethodr.   rI   rK   rP   r[   r\   r_   rJ   rO   ro   rp   rA   r   r   r   r   r      sb    	



	














,

	r   c                   @   s   e Zd ZdZdS )ConfigurationErrorzL
    Configuration could not be parsed or has otherwise failed to apply
    N)rw   rx   ry   __doc__r   r   r   r   r|   M  s    r|   )r}   r=   rB   r	   rT   rX   r   rE   objectr   rV   r|   r   r   r   r   <module>   s     2