o
    va!                     @   s   d 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	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ G d
d de	eZG dd de
eZG dd deZG dd deZdS )zManage the Glances server.    N)	b64decode__version__)SimpleXMLRPCRequestHandlerSimpleXMLRPCServerServer)GlancesAutoDiscoverClient)logger)GlancesStatsServer)Timerc                       sL   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
  ZS )GlancesXMLRPCHandlerzMain XML-RPC handler.)z/RPC2c                    s   |    tt|   d S N)send_my_headerssuperr   end_headersself	__class__ 0/usr/lib/python3/dist-packages/glances/server.pyr   )   s   z GlancesXMLRPCHandler.end_headersc                 C   s   |  dd d S )NzAccess-Control-Allow-Origin*)Zsend_headerr   r   r   r   r   /      z$GlancesXMLRPCHandler.send_my_headersc           
      C   s   z| dd\}}}W n ty   | jj  Y S w | dd\}}}|dks/J d| }t|}| }|d\}}}	| ||	S )NZAuthorization ZBasicz#Only basic authentication supported:)	get	partition	ExceptionserverisAuthencoder   decode
check_user)
r   headersZbasic_ZencodedZencoded_byte_stringZdecoded_bytesdecoded_stringusernamepasswordr   r   r   authenticate3   s   z!GlancesXMLRPCHandler.authenticatec                 C   s6   || j jv rddlm} | }|| j j| |S dS )Nr   )GlancesPasswordF)r   	user_dictZglances.passwordr)   Zcheck_password)r   r&   r'   r)   pwdr   r   r   r"   K   s
   zGlancesXMLRPCHandler.check_userc                 C   s*   t | r| | jrdS | dd dS )NTi  zAuthentication failedF)r   parse_requestr(   r#   Z
send_errorr   r   r   r   r,   T   s
   
z"GlancesXMLRPCHandler.parse_requestc                 G   s   d S r   r   )r   Z
log_formatargsr   r   r   log_message^      z GlancesXMLRPCHandler.log_message)__name__
__module____qualname____doc__Z	rpc_pathsr   r   r(   r"   r,   r.   __classcell__r   r   r   r   r   #   s    	
r   c                       s:   e Zd ZdZdZdef fdd	Zdd Zdd	 Z  Z	S )
GlancesXMLRPCServerz0Init a SimpleXMLRPCServer instance (IPv6-ready).Fi  c              
      s   || _ || _zt||d d | _W n  tjy3 } ztd| t	d W Y d }~nd }~ww t
t| ||f| d S )Nr   zCouldn't open socket: {}   )bind_address	bind_portsocketZgetaddrinfoZaddress_familyerrorr	   formatsysexitr   r5   __init__)r   r7   r8   requestHandlerer   r   r   r>   i   s   zGlancesXMLRPCServer.__init__c                 C   s   |    d| _dS )zStop the serverTN)Zserver_closefinishedr   r   r   r   endv   s   
zGlancesXMLRPCServer.endc                 C   s   | j s|   | j rdS dS )z	Main loopN)rA   Zhandle_requestr   r   r   r   serve_forever{   s   z!GlancesXMLRPCServer.serve_forever)
r0   r1   r2   r3   rA   r   r>   rB   rC   r4   r   r   r   r   r5   c   s    r5   c                   @   sV   e Zd 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d ZdS )GlancesInstancez?All the methods of this class are published as XML-RPC methods.Nc                 C   s.   t ||d| _| j  td| _|j| _d S )N)configr-   r   )r
   statsupdater   timercached_time)r   rE   r-   r   r   r   r>      s   

zGlancesInstance.__init__c                 C   s(   | j  r| j  t| j| _ d S d S r   )rH   rA   rF   rG   r   rI   r   r   r   r   
__update__   s   

zGlancesInstance.__update__c                 C   s   t S r   r   r   r   r   r   init   r/   zGlancesInstance.initc                 C   s   |    t| j S r   )rJ   jsondumpsrF   getAllr   r   r   r   rN      s   zGlancesInstance.getAllc                 C      t | j S r   )rL   rM   rF   ZgetPluginsListr   r   r   r   getAllPlugins   r   zGlancesInstance.getAllPluginsc                 C   rO   r   )rL   rM   rF   ZgetAllLimitsAsDictr   r   r   r   getAllLimits   r   zGlancesInstance.getAllLimitsc                 C   rO   r   )rL   rM   rF   ZgetAllViewsAsDictr   r   r   r   getAllViews   r   zGlancesInstance.getAllViewsc                 C   sD   d}| |rz|   t| j|W S  ty   t|w t|)zOverwrite the getattr method in case of attribute is not found.

        The goal is to dynamically generate the API get'Stats'() methods.
        r   )
startswithrJ   getattrrF   r   AttributeError)r   itemheaderr   r   r   __getattr__   s   
zGlancesInstance.__getattr__)NN)r0   r1   r2   r3   r>   rJ   rK   rN   rP   rQ   rR   rX   r   r   r   r   rD      s    
rD   c                   @   s8   e Zd ZdZeddfddZdd Zdd Zd	d
 ZdS )GlancesServerz.This class creates and manages the TCP server.Nc              
   C   s   || _ zt|j|j|| _W n ty- } ztd| t	
d W Y d }~nd }~ww td|j|j i | j_d| j_| j  | jt|| | j jsbtt ddd || _d S td d S )	NzCannot start Glances server: {}   z*Glances XML-RPC server is running on {}:{}F.r6   r   z)Glances autodiscover announce is disabled)r-   r5   r7   Zportr   r   r	   Zcriticalr;   r<   r=   printr*   r   Z register_introspection_functionsZregister_instancerD   disable_autodiscoverr   r9   Zgethostnamesplitautodiscover_clientinfo)r   r?   rE   r-   r@   r   r   r   r>      s    
 zGlancesServer.__init__c                 C   s   || j j|< d| j _dS )zAdd an user to the dictionary.TN)r   r*   r   )r   r&   r'   r   r   r   add_user   s   zGlancesServer.add_userc                 C   s.   | j jdkr| | j j| j j | j  dS )zCall the main loop. N)r-   r'   ra   r&   r   rC   r   r   r   r   rC      s   zGlancesServer.serve_foreverc                 C   s    | j js	| j  | j  dS )z"End of the Glances server session.N)r-   r]   r_   closer   rB   r   r   r   r   rB      s   
zGlancesServer.end)	r0   r1   r2   r3   r   r>   ra   rC   rB   r   r   r   r   rY      s    
!rY   )r3   rL   r9   r<   base64r   Zglancesr   Zglances.compatr   r   r   Zglances.autodiscoverr   Zglances.loggerr	   Zglances.stats_serverr
   Zglances.timerr   objectr   r5   rD   rY   r   r   r   r   <module>   s   @C