o
    va'                     @   s   d Z ddlZddlZddlmZ ddlmZ zddlmZ	m
Z
mZmZ dZW n ey1   dZY nw erXdZed	d
 e	dD Zede	 eek rXed ed dd ZG dd deZG dd deZG dd deZG dd deZdS )zBManage autodiscover Glances server (thk to the ZeroConf protocol).    N)BSD)logger)__version__ServiceBrowserServiceInfoZeroconfTF)r      r   c                 C   s   g | ]}t |qS  )int).0Znumr	   r	   6/usr/lib/python3/dist-packages/glances/autodiscover.py
<listcomp>*   s    r   .zZeroconf version {} detected.z'Please install zeroconf 0.17 or higher.   z_%s._tcp.local.glancesc                   @   8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )AutoDiscoveredz1Class to manage the auto discovered servers dict.c                 C   s
   g | _ d S N_server_listselfr	   r	   r   __init__:   s   
zAutoDiscovered.__init__c                 C   s   | j S z.Return the current server list (list of dict).r   r   r	   r	   r   get_servers_list?   s   zAutoDiscovered.get_servers_listc                 C   s   || j | |< dS zCSet the key to the value for the server_pos (position in the list).Nr   r   Z
server_poskeyvaluer	   r	   r   
set_serverC   s   zAutoDiscovered.set_serverc              	   C   sJ   || dd ||ddddd}| j| tdt| j| jf  d	S )
zAdd a new server to the list.:r   r    ZUNKNOWNZDYNAMIC)r   nameipportZusernameZpasswordstatustype%Updated servers list (%s servers): %sN)splitr   appendr   debuglen)r   r"   r#   r$   Z
new_serverr	   r	   r   
add_serverG   s   	
zAutoDiscovered.add_serverc              	   C   sv   | j D ]5}|d |kr8z| j | td|  tdt| j | j f  W q ty7   td|  Y qw qdS )zRemove a server from the dict.r   zRemove server %s from the listr'   z%Cannot remove server %s from the listN)r   remover   r*   r+   
ValueErrorerror)r   r"   ir	   r	   r   remove_serverV   s   
zAutoDiscovered.remove_serverN)	__name__
__module____qualname____doc__r   r   r   r,   r1   r	   r	   r	   r   r   6   s    r   c                   @   r   )GlancesAutoDiscoverListenerz%Zeroconf listener for Glances server.c                 C   s   t  | _d S r   )r   serversr   r	   r	   r   r   h   s   z$GlancesAutoDiscoverListener.__init__c                 C   s
   | j  S r   )r7   r   r   r	   r	   r   r   l   s   
z,GlancesAutoDiscoverListener.get_servers_listc                 C   s   | j ||| dS r   )r7   r   r   r	   r	   r   r   p   s   z&GlancesAutoDiscoverListener.set_serverc                 C   sv   |t krdS td||f  |||}|r4t|j}|j}| j	||| t
d|||f  dS td dS )zMethod called when a new Zeroconf client is detected.

        Return True if the zeroconf client is a Glances server
        Note: the return code will never be used
        Fz"Check new Zeroconf server: %s / %sz+New Glances server detected (%s from %s:%s)zCNew Glances server detected, but Zeroconf info failed to be grabbedT)zeroconf_typer   r*   Zget_service_infosocketZ	inet_ntoaaddressr$   r7   r,   infoZwarning)r   zeroconfsrv_typesrv_namer;   Znew_server_ipZnew_server_portr	   r	   r   add_servicet   s$   z'GlancesAutoDiscoverListener.add_servicec                 C   s   | j | td|  dS )z Remove the server from the list.z2Glances server %s removed from the autodetect listN)r7   r1   r   r;   )r   r<   r=   r>   r	   r	   r   remove_service   s   z*GlancesAutoDiscoverListener.remove_serviceN)	r2   r3   r4   r5   r   r   r   r?   r@   r	   r	   r	   r   r6   d   s    r6   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )GlancesAutoDiscoverServerzMImplementation of the Zeroconf protocol (server side for the Glances client).Nc              
   C   s   t r>td zt | _W n tjy+ } ztd|  d| _W Y d }~d S d }~ww t | _	t
| jt| j	| _d| _d S td d| _d S )Nz*Init autodiscover mode (Zeroconf protocol)zCannot start Zeroconf (%s)FTz>Cannot start autodiscover mode (Zeroconf lib is not installed))zeroconf_tagr   r;   r   r<   r9   r/   zeroconf_enable_tagr6   listenerr   r8   Zbrowser)r   argser	   r	   r   r      s    




z"GlancesAutoDiscoverServer.__init__c                 C   s   t r
| jr
| j S g S )z.Return the current server list (dict of dict).)rB   rC   rD   r   r   r	   r	   r   r      s   

z*GlancesAutoDiscoverServer.get_servers_listc                 C   s&   t r| jr| j||| dS dS dS r   )rB   rC   rD   r   r   r	   r	   r   r      s   
z$GlancesAutoDiscoverServer.set_serverc                 C   s    t r| jr| j  d S d S d S r   )rB   rC   r<   closer   r	   r	   r   rG      s   
zGlancesAutoDiscoverServer.closer   )r2   r3   r4   r5   r   r   r   rG   r	   r	   r	   r   rA      s    
rA   c                   @   s.   e Zd ZdZd	ddZedd Zdd ZdS )
GlancesAutoDiscoverClientzMImplementation of the zeroconf protocol (client side for the Glances server).Nc                 C   st  t r|j}zt | _W n tjy& } ztd| W Y d }~nd }~ww ts=z
|dkr2| 	 }W n	 t
y<   Y nw t||jd d }zttd||jtt|||jddi |d| _W n" ty   ttd||jtt||g|jddi |d| _Y nw z	| j| j W n ty } ztd| W Y d }~d S d }~ww td| d S td	 d S )
NzCannot start zeroconf: {}z0.0.0.0r   z{}:{}.{})r:   r$   weightpriority
propertiesserver)r"   Z	addressesr$   rI   rJ   rK   rL   z)Error while announcing Glances server: {}z<Announce the Glances server on the LAN (using {} IP address)zJCannot announce Glances server on the network: zeroconf library not found.)rB   Zbind_addressr   r<   r9   r/   r   formatr   find_active_ip_addressKeyErrorZgetaddrinfor$   r   r8   Z	inet_ptonr;   	TypeErrorZregister_service	Exceptionprint)r   ZhostnamerE   Zzeroconf_bind_addressrF   Zaddress_familyr	   r	   r   r      sl   
z"GlancesAutoDiscoverClient.__init__c                  C   s6   ddl } |  d | j d }| || j d d S )z$Try to find the active IP addresses.r   Ndefaultr   Zaddr)	netifacesZgatewaysZAF_INETZifaddresses)rT   Zgateway_itfr	   r	   r   rN      s   z0GlancesAutoDiscoverClient.find_active_ip_addressc                 C   s$   t r| j| j | j  d S d S r   )rB   r<   Zunregister_servicer;   rG   r   r	   r	   r   rG      s   zGlancesAutoDiscoverClient.closer   )r2   r3   r4   r5   r   staticmethodrN   rG   r	   r	   r	   r   rH      s    
:
rH   )r5   r9   sysZglances.globalsr   Zglances.loggerr   r<   r   Z__zeroconf_versionr   r   r   rB   ImportErrorZzeroconf_min_versiontupler(   Zzeroconf_versionr*   rM   Zcriticalexitr8   objectr   r6   rA   rH   r	   r	   r	   r   <module>   s.   

./&