a
    ^ŠÝg‰  ã                   @   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ddlZe 	e
¡ZdZddhZG dd„ dejƒZG dd	„ d	ƒZG d
d„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZeddfdd„ZdS )zþ
Simplistic RPC implementation.
Exposes all functions of a Server object.

This code is for demonstration purposes only, and does not include certain
security protections. It is not meant to be run on an untrusted network or
in a production environment.
é    Ni /  Únumpyznumpy.core.multiarrayc                   @   s   e Zd Zdd„ ZdS )ÚRestrictedUnpicklerc                 C   s.   |t v rtt |¡|ƒS t d||f ¡‚d S )Nzglobal '%s.%s' is forbidden)Úsafe_modulesÚgetattrÚ	importlibÚimport_moduleÚpickleÚUnpicklingError)ÚselfÚmoduleÚname© r   ú_/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/faiss/contrib/rpc.pyÚ
find_class%   s
    ÿzRestrictedUnpickler.find_classN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   #   s   r   c                   @   s2   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZdS )ÚFileSockz7 wraps a socket so that it is usable by pickle/cPickle c                 C   s   || _ d| _d S )Nr   )ÚsockÚnr)r
   r   r   r   r   Ú__init__1   s    zFileSock.__init__c                 C   s:   d}d}|t |ƒk r6| j |||| … ¡}||7 }qd S )Né   r   )Úlenr   Úsend)r
   ÚbufÚbsÚnsÚsentr   r   r   Úwrite5   s
    zFileSock.writer   c                 C   sZ   |  j d7  _ g }d}t|ƒ|k rP| j || ¡}|s8qP| |¡ |t|ƒ7 }qd |¡S )Né   r   ó    )r   r   r   ÚrecvÚappendÚjoin)r
   r   ÚbÚnbÚrbr   r   r   Úread?   s    
zFileSock.readc                 C   s>   t ƒ }|  d¡}||7 }qt|ƒdks6t|d ƒdkr:|S dS )zmay be optimized...r   r   Ú
N)Úbytesr'   r   Úchr)r
   ÚsÚcr   r   r   ÚreadlineM   s
    

zFileSock.readlineN)r   )r   r   r   Ú__doc__r   r   r'   r-   r   r   r   r   r   .   s
   

r   c                   @   s   e Zd ZdS )Ú
ClientExitN©r   r   r   r   r   r   r   r/   W   s   r/   c                   @   s   e Zd ZdS )ÚServerExceptionNr0   r   r   r   r   r1   Z   s   r1   c                   @   sH   e Zd ZdZejdfdd„Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ ZdS )ÚServerzr
    server protocol. Methods from classes that subclass Server can be called
    transparently from a client
    Ú c                 C   s    || _ || _|| _t|ƒ| _d S ©N)ÚlogfÚ
log_prefixÚconnr   Úfs)r
   r+   r5   r6   r   r   r   r   d   s    zServer.__init__c                 C   s   | j  d| j|f ¡ d S )NzSever log %s: %s
)r5   r   r6   )r
   r+   r   r   r   Úlogn   s    z
Server.logc              
   C   s:  zt | jƒ ¡ \}}W n ty0   tdƒ‚Y n0 |  d| ¡ d}d}zt| |ƒ}W n( ty~   td| ƒ}|  d¡ Y n0 z||Ž }W nf tyò } zNd 	t
 t ¡ d ¡¡t|ƒ }|  d¡ t
 d	| j¡ | j ¡  W Y d}~n
d}~0 0 t d
¡ ztj||f| jdd W n ty4   tdƒ‚Y n0 dS )aÑ  
        Executes a single function with associated I/O.
        Protocol:
        - the arguments and results are serialized with the pickle protocol
        - client sends : (fname,args)
            fname = method name to call
            args = tuple of arguments
        - server sends result: (rid,st,ret)
            rid = request id
            st = None, or exception if there was during execution
            ret = return value or None if st!=None
        z	read argszexecuting method %sNzunknown method zunknown methodr3   é   zexception in methodé2   Úreturné   ©Úprotocolzfunction return)r   r8   ÚloadÚEOFErrorr/   r9   r   ÚAttributeErrorÚ	Exceptionr#   Ú	tracebackÚ	format_tbÚsysÚexc_infoÚstrÚ	print_excr5   ÚflushÚLOGÚinfor   Údump)r
   ÚfnameÚargsÚstÚretÚfÚer   r   r   Úone_functionq   s0     
 
zServer.one_functionc              
   C   sê   |   d¡ z|  ¡  qW nÂ tyJ } z|   d| ¡ W Y d}~nšd}~0  tjyŠ } z(|   d| ¡ t d| j¡ W Y d}~nZd}~0  ty²   |   d¡ t d| j¡ Y n* t	yÚ   t dt
j¡ t
 d¡ Y n0 t d¡ dS )	z3 main execution loop. Loops and handles exit stateszin exec_loopzClientExit %sNzsocket error %sr;   zEOF during communicationr   z
exit sever)r9   rT   r/   ÚsocketÚerrorrD   rI   r5   rA   ÚBaseExceptionrF   ÚstderrÚexitrK   rL   )r
   rS   r   r   r   Ú	exec_loop    s    
""
zServer.exec_loopc                 C   s   d S r4   r   )r
   r   r   r   Úexec_loop_cleanup¶   s    zServer.exec_loop_cleanupc                 C   s8   d}t  ddt  ¡   d d ¡}|D ]}||7 }q&|S )Nr3   zFecho ============ `hostname` uptime:; uptime;echo ============ self:; z*ps -p %d -o pid,vsize,rss,%%cpu,nlwp,psr; zecho ============ run queue:;z?ps ar -o user,pid,%cpu,%mem,ni,nlwp,psr,vsz,rss,cputime,command)ÚosÚpopenÚgetpid)r
   rQ   rR   Úlr   r   r   Úget_ps_stats¼   s    
þýü
zServer.get_ps_statsN)r   r   r   r.   rF   rX   r   r9   rT   rZ   r[   r`   r   r   r   r   r2   ^   s   
/r2   c                   @   s6   e Zd ZdZedfdd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚClientza
    Methods of the server object can be called transparently. Exceptions are
    re-raised.
    Fc                 C   sP   |r
t jnt j}t   |t j¡}t d|||¡ | ||f¡ || _t|ƒ| _	d S )Nz$connecting to %s:%d, socket type: %s)
rU   ÚAF_INET6ÚAF_INETÚSOCK_STREAMrK   rL   Úconnectr   r   r8   )r
   ÚHOSTÚportÚv6Úsocktyper   r   r   r   r   Ì   s    zClient.__init__c                 C   s   t j||f| jdd |  ¡ S )Nr=   r>   )r   rM   r8   Ú
get_result)r
   rN   rO   r   r   r   Úgeneric_funÕ   s    zClient.generic_func                 C   s,   t | jƒ ¡ \}}|d kr$t|ƒ‚n|S d S r4   )r   r8   r@   r1   )r
   rP   rQ   r   r   r   rj   Ú   s    
zClient.get_resultc                    s   ‡ ‡fdd„S )Nc                     s   ˆ  ˆ | ¡S r4   )rk   )Úx©r   r
   r   r   Ú<lambda>â   r    z$Client.__getattr__.<locals>.<lambda>r   )r
   r   r   rm   r   Ú__getattr__á   s    zClient.__getattr__N)	r   r   r   r.   ÚPORTr   rk   rj   ro   r   r   r   r   ra   Ç   s
   	ra   Fc              
   C   s  d}|rt jnt j}t   |t j¡}| t jt jd¡ t d||¡ | 	||f¡ | 
d¡ t d¡ |d ur”t d|¡ t|dƒ dt  ¡ |f ¡ z| ¡ \}}W n@ t jyä }	 z&|	d d	krÎW Y d }	~	q”‚ W Y d }	~	n
d }	~	0 0 t d
|¡ | |ƒ}
t |
jd¡}t d|¡ q”d S )Nr3   r   z
bind %s:%dé   zaccepting connectionszstoring host+port in %sÚwz%s:%d zInterrupted system callzConnected to %sr   zThread ID: %d)rU   rb   rc   rd   Ú
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRrK   rL   ÚbindÚlistenÚopenr   ÚgethostnameÚacceptrV   Ú_threadÚstart_new_threadrZ   Údebug)Znew_handlerrg   Zreport_to_filerh   rf   ri   r+   r7   ÚaddrrS   ZibsÚtidr   r   r   Ú
run_serverå   s(    

r€   )r.   r   r\   r   rF   r{   rD   rU   ÚloggingÚ	getLoggerr   rK   rp   r   Ú	Unpicklerr   r   rC   r/   r1   r2   ra   r€   r   r   r   r   Ú<module>   s(   	
þ)i