ÿØÿà 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 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ZdZdZ	dd Z
dd Zdd	 Zd
d Zdd Zd-ddZd-ddZdd Zdd Zdd Zdd Zdd Zdd Zd-dd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* ZG d+d, d,ejZdS ).    NzNetworkManager.servicez+snap.network-manager.networkmanager.servicec                   C   s   t jddS )NZNETPLAN_GENERATE_PATHz/lib/netplan/generate)osenvironget r   r   '/usr/share/netplan/netplan/cli/utils.pyget_generator_path   s   r   c                   C   s   t jdddtgt jddkS )N	systemctl--quietz
is-enabled)stderrr   )
subprocesscallNM_SNAP_SERVICE_NAMEDEVNULLr   r   r   r   is_nm_snap_enabled#   s   r   c                 C   s,   d}t  rd}tj|g|  tjtjd d S )Nnmcliznetwork-manager.nmclistdoutr
   )r   r   
check_callr   )argsZbinary_namer   r   r   r   '   s   r   c                	   C   s,   zt dg W dS  ttjfy   Y dS w )z"Check if NetworkManager is runningZgeneralTF)r   OSErrorr   ZSubprocessErrorr   r   r   r   
nm_running0   s   
r   c                 C   s   t d}t }| D ]3}t|d$}|D ]}||}|r-|tt||d  nqW d    n1 s8w   Y  q
|S )Nz^interface-name=(.*)$r   )	recompilesetopenmatchupdatefnmatchfiltergroup)pathsZdevicesZpat
interfacespathflinemr   r   r   nm_interfaces:   s   

r(   Fc                 C   s"   t  r
t| tg|S t| tg|S N)r   r   r   NM_SERVICE_NAME)actionsyncr   r   r   systemctl_network_managerH   s   r-   c                 C   s>   t |dkrd| g}|s|d || t| d S d S )Nr   r   z
--no-block)lenappendextendr   r   )r+   servicesr,   Zcommandr   r   r   r   P   s   

r   c                  C   s^   t  } tjg ddd}| D ]}| d}|d  r,|d dvr,| |d  q| S )N)
networkctlz
--no-pagerz--no-legendT)Zuniversal_newlines r   )Z	unmanagedZlinger)r   r   Zcheck_output
splitlinesstripsplit	isnumericadd)r#   outr&   sr   r   r   networkd_interfaces\   s   r<   c                   C   s   t ddg d S )Nr2   reloadr   r   r   r   r   r   networkctl_reloadf   s   r?   c                 C   s*   t | dkrtddgt|   d S d S )Nr   r2   reconfigure)r.   r   r   list)r#   r   r   r   networkctl_reconfigurej   s   rB   c                 C   s   t ddd| gdkrdS dS )z4Return True if at least one matching unit is runningr   r	   z	is-activer   TF)r   r   )Zunit_patternr   r   r   systemctl_is_activeo   s   rC   c                   C   s   t ddg dS )zEReload systemd unit files from disk and re-calculate its dependenciesr   zdaemon-reloadNr>   r   r   r   r   systemctl_daemon_reloadv   s   rD   c                 C   s    t jddd| gt jt jd dS )z8Flush all IP addresses of a given interface via iproute2Zipaddrflushr   N)r   r   r   Zifacer   r   r   ip_addr_flush{   s    rH   c              
   C   s  t jd| }|r\z6tt j|d#}|  }|dkr/td| | 	 W d    W d S W d    n1 s9w   Y  W n ty[ } zt	d| t
| W Y d }~d S d }~ww zt jt j|dd}t j|}W |S  ty } ztd| |t
| W Y d }~d S d }~ww )	Nz/sys/class/netZ	operstateZdownz'device %s operstate is %s, not changingz$Cannot determine operstate of %s: %sZdevicedriverz0Cannot replug %s: cannot read link %s/device: %s)r   r$   joinr   readr6   loggingdebugIOErrorerrorstrrealpathbasename)	interfaceZ	only_downZdevdirr%   stateerI   driver_namer   r   r   get_interface_driver_name   s4   rW   c                 C   s&   t | t ji gd }|ddS )Nr   rE    )	netifacesZifaddressesr   ZAF_LINK)rS   linkr   r   r   get_interface_macaddress   s   r[   c                 C   s   t | |S r)   r   Zfnmatchcase)rS   Z
match_namer   r   r   is_interface_matching_name   s   r]   c                    s2   |}t |tr
|g}t|  t fdd|D S )Nc                 3   s    | ]	}t  |V  qd S r)   r\   ).0patternrV   r   r   	<genexpr>   s
    

z4is_interface_matching_driver_name.<locals>.<genexpr>)
isinstancerP   rW   any)rS   Zmatch_driverZdriver_globsr   r`   r   !is_interface_matching_driver_name   s   
rd   c                 C   s   t | }| | kS r)   )r[   lower)rS   Z	match_mac
macaddressr   r   r    is_interface_matching_macaddress   s   rg   c                    s   t  tsJ  ddr dnd}t| |}t|dkr0 dr0tt fdd|}t|dkrF drFtt fd	d|}t|dkrSt| d S |d
 S )NnameF*r   rf   c                       t |  dS )Nrf   )rg   r   rG   r   r   r   <lambda>       z%find_matching_iface.<locals>.<lambda>rI   c                    rj   )NrI   )rd   r   rG   rk   r   r   rl      rm   r   )	rb   dictr   r   r    r.   rA   rL   info)r#   r   Z	name_globZmatchesr   rk   r   find_matching_iface   s   
rp   c                   @   sF   e Zd ZdddZdd Zdd Zd	d
 Zdd Zdd Zdd Z	dS )NetplanCommandTFc                 C   s   || _ || _|| _|| _d | _d| _d | _i | _d | _d | _	t
jdtjd |f |dd| _| jjdddd	 |sU| jjd
ddd| _| jjdddd}|j| jd d S d S )NFz%s %sr   T)progdescriptionadd_helpz--debug
store_truezEnable debug messages)r+   helpzAvailable commandsrX   
subcommand)titlemetavardestrv   zShow this help message)rs   rv   )func)
command_idrs   leaf_commandtesting_argsrM   commandclasssubcommandsrw   r{   argparseArgumentParsersysargvparseradd_argumentZadd_subparsers
subparsers
add_parserset_defaultsprint_usage)selfr|   rs   leafr~   Zp_helpr   r   r   __init__   s6   
zNetplanCommand.__init__c                 C   s
   || _ d S r)   )r   )r   r   r   r   r   r      s   
zNetplanCommand.updatec                 C   sF   | j j| j| d\}| _| js| js!tdtjd |   d S d S d S )N)r   	namespacezYou need to specify a commandfile)	r   Zparse_known_argsr   rw   r}   printr   r
   r   )r   nsr   r   r   
parse_args   s
   zNetplanCommand.parse_argsc                 C   s8   | j r
| j | j | jrd| jv r|   |   d S )Nrv   )r   r   r   r}   r   r{   r   r   r   r   run_command   s
   zNetplanCommand.run_commandc                 C   s    | j jtjd ttj d S )Nr   )r   Z
print_helpr   r
   exitr   EX_USAGEr   r   r   r   r      s   zNetplanCommand.print_usagec                 C   s   | }i | j |< || j | d< || j | d< |jr"tjdd s"d S | jj|j|j|jdd}|j	|j
|d || j | d< d S )NclassinstanceZENABLE_TEST_COMMANDSF)rs   rv   rt   )r{   r   r   )r   r~   r   r   r   r   r   r|   rs   r   run)r   rh   r   r   pr   r   r   _add_subparser_from_class   s   

z(NetplanCommand._add_subparser_from_classc                 C   s@   dd l }||D ]\}}||rt|tr| || q	d S )Nr   )inspectZ
getmembersZisclass
issubclassrq   r   )r   Z
submodulesr   rh   objr   r   r   _import_subcommands  s   z"NetplanCommand._import_subcommandsN)TF)
__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   rq      s    

rq   )F)r   r   rL   r   r   rY   r   r   r*   r   r   r   r   r   r(   r-   r   r<   r?   rB   rC   rD   rH   rW   r[   r]   rd   rg   rp   Z	Namespacerq   r   r   r   r   <module>   s<   	




