
    *Ce                     p    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mZ  G d de	      Z
 G d de      Zy)znetplan configuration manager    N)Optionalc                   t    e Zd Zdi fdZd Zed        Zed        ZddZd Z	dd	Z
d
 Zd Zd Zd ZddZy)ConfigManager/c                 >   || _         t        j                  d      | _        t        j
                  j                  | j                  d      | _        t        j
                  j                  | j                  d      | _        || _	        t               | _        d | _        y )Nnetplan_)prefixetcrun)r	   tempfilemkdtemptempdirospathjointemp_etctemp_runextra_filessetnew_interfacesnp_state)selfr	   r   s      //usr/share/netplan/netplan_cli/configmanager.py__init__zConfigManager.__init__   sh    ''z:T\\59T\\59&!e15    c                 T    | j                   J d       t        | j                   |      S Nz.Must call parse() before accessing the config.)r   getattr)r   attrs     r   __getattr__zConfigManager.__getattr__(   s)    }}(Z*ZZ(t}}d++r   c                    | j                   J d       i }|j                  | j                   j                         |j                  | j                   j                         |j                  | j                   j                         |S r   )r   update	ethernetsmodemswifisr   
interfacess     r   physical_interfacesz!ConfigManager.physical_interfaces,   sk    }}(Z*ZZ(
$--112$--../$----.r   c                 6   | j                   J d       i }|j                  | j                   j                         |j                  | j                   j                         |j                  | j                   j                         |j                  | j                   j
                         |j                  | j                   j                         |j                  | j                   j                         |j                  | j                   j                         |S r   )	r   r"   bridgesbondsdummy_devicestunnelsvirtual_ethernetsvlansvrfsr&   s     r   virtual_interfacesz ConfigManager.virtual_interfaces5   s    }}(Z*ZZ(
$--//0$----.$--556$--//0$--99:$----.$--,,-r   Nc                 z   t        j                         }	 |j                  | j                         |r|D ]  }|j	                  |        t        j
                         | _        | j                  j                  |       t        j                         5 }| j                  j                  |       t        j                  dj!                  |j#                                      ddd       | j                  S # t         j                  $ r}t        t        |            d}~ww xY w# 1 sw Y   | j                  S xY w)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 libnetplan State wrapper
        )rootdirN)output_filezMerged config:
{})netplanParserload_yaml_hierarchyr	   	load_yamlStater   import_parser_resultsNetplanExceptionConfigurationErrorstrr   TemporaryFile
_dump_yamlloggingdebugformatread)r   extra_configparserfetmps         r   parsezConfigManager.parseC   s     !
	-&&t{{&;% (A$$Q'( $MMODMMM//7
 ##% 	CMM$$$5MM.55chhjAB	C }} '' 	-$SV,,	-	C }}s%   A*C7 AD&7D#
DD#&D:c                     |D ]  }| j                  |||           | j                  j                  |       d | _        y N)
_copy_filer   r"   r   )r   config_dictconfig_files      r   addzConfigManager.add`   sC    & 	CKOOK[)AB	C, r   c                 `   |rb| j                  t        j                  j                  | j                  d      t        j                  j                  | j
                  d             | j                  t        j                  j                  | j                  d      t        j                  j                  | j                  dd      d       | j                  t        j                  j                  | j                  d      t        j                  j                  | j                  d	d
      d       y )Nzetc/netplanr5   %run/NetworkManager/system-connectionsNetworkManagerzsystem-connectionsT)
missing_okrun/systemd/networksystemdnetwork)
_copy_treer   r   r   r	   r   r   )r   backup_config_dirs     r   backupzConfigManager.backuph   s    OOBGGLLmDGGLL	BDT[[2YZT]]4DFZ[#' 	 	) 	T[[2GHT]]IyI#' 	 	)r   c                 &   	 t        | j                        D ]1  }t        j                  | j                  |          | j                  |= 3 dj	                  | j
                        }dj	                  | j
                        }t        j                  j                  |      rwt        j                  t        j                  j                  | j                  d             | j                  |t        j                  j                  | j                  d             t        j                  j                  |      rxt        j                  t        j                  j                  | j                  d             | j                  |t        j                  j                  | j                  d             y y # t        $ rX}t        j                  dj	                  |             t        j                  d       t!        j"                  d       Y d }~y d }~ww xY w)Nz${}/NetworkManager/system-connectionsz{}/systemd/networkrQ   rT   z8Something really bad happened while reverting config: {}zZYou should verify the netplan YAML in /etc/netplan and probably run 'netplan apply' again.)dictr   r   unlinkrB   r   r   existsshutilrmtreer   r	   rW   	Exceptionr@   errorsysexit)r   
extra_filetemp_nm_pathtemp_networkd_pathrG   s        r   revertzConfigManager.reverts   sl   	"4#3#34 1
		$**:67$$Z01 BHHWL!5!<!<T]]!Kww~~l+bggll4;;8_`a "T[[:a bdww~~01bggll4;;8MNO 2 "T[[:O PR 2  		 MMT[[\]^_MMvwHHRLL		s   F+F/ /	H8AHHc                 B    t        j                  | j                         y rK   )r_   r`   r   r   s    r   cleanupzConfigManager.cleanup   s    dll#r   c                 D    	 | j                          y # t        $ r Y y w xY wrK   )rk   FileNotFoundErrorrj   s    r   __del__zConfigManager.__del__   s"    	LLN  		s    	c                 0    t        j                  ||       y rK   )r_   copy)r   srcdsts      r   rL   zConfigManager._copy_file   s    Cr   c                 V    	 t        j                  ||       y # t        $ r |rY y  w xY wrK   )r_   copytreerm   )r   rq   rr   rS   s       r   rW   zConfigManager._copy_tree   s-    	OOC%  			s    ((rK   )T)F)__name__
__module____qualname__r   r    propertyr(   r1   rI   rO   rY   rh   rk   rn   rL   rW    r   r   r   r      sa    !r 6,    :	)4$r   r   c                       e Zd ZdZy)r<   zL
    Configuration could not be parsed or has otherwise failed to apply
    N)ru   rv   rw   __doc__ry   r   r   r<   r<      s     	r   r<   )r{   r@   r5   r   r_   rc   r   typingr   objectr   ra   r<   ry   r   r   <module>r~      s:   $ $   	  
  CF CL	 	r   