o
    rh                     @   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 )Nzglobal '%s.%s' is forbidden)safe_modulesgetattr	importlibimport_modulepickleUnpicklingError)selfmodulename r   O/var/www/html/alpaca_bot/venv/lib/python3.10/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   sH   d}d}|t |k r"| j||||  }||7 }|t |k s
d S d S )N   r   )lenr   send)r
   bufbsnssentr   r   r   write5   s   zFileSock.writer   c                 C   sd   |  j d7  _ g }d}t||k r-| j|| }|sn|| |t|7 }t||k s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)zmay be optimized...Tr   )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                   @      e Zd ZdS )
ClientExitNr   r   r   r   r   r   r   r/   W       r/   c                   @   r.   )ServerExceptionNr0   r   r   r   r   r2   Z   r1   r2   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*   r6   r7   r   r   r   r   d   s   zServer.__init__c                 C   s   | j d| j|f  d S )NzSever log %s: %s
)r6   r   r7   )r
   r*   r   r   r   logn   s   z
Server.logc              
   C   s.  zt | j \}}W n ty   tdw | d|  d}d}zt| |}W n ty=   td| }| d Y nw z|| }W n3 tyw } z'd	t
t d t| }| d t
d	| j | j  W Y d}~nd}~ww td
 ztj||f| jdd W dS  ty   tdw )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 methodr4      zexception in method2   return   protocolzfunction return)r   r9   loadEOFErrorr/   r:   r   AttributeError	Exceptionr#   	traceback	format_tbsysexc_infostr	print_excr6   flushLOGinfor   dump)r
   fnameargsstretfer   r   r   one_functionq   s:    

zServer.one_functionc              
   C   s   |  d z	 |   q ty$ } z|  d|  W Y d}~nMd}~w tjyD } z|  d|  td| j W Y d}~n-d}~w tyX   |  d td| j Y n t	yl   tdt
j t
d Y nw td	 dS )
z3 main execution loop. Loops and handles exit stateszin exec_loopTzClientExit %sNzsocket error %sr<   zEOF during communicationr   z
exit sever)r:   rU   r/   socketerrorrE   rJ   r6   rB   BaseExceptionrG   stderrexitrL   rM   )r
   rT   r   r   r   	exec_loop   s(   

zServer.exec_loopc                 C   s   d S r5   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 )Nr4   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
   rR   rS   lr   r   r   get_ps_stats   s   

zServer.get_ps_statsN)r   r   r   r-   rG   rY   r   r:   rU   r[   r\   ra   r   r   r   r   r3   ^   s    
/r3   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)
rV   AF_INET6AF_INETSOCK_STREAMrL   rM   connectr   r   r9   )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   rN   r9   
get_result)r
   rO   rP   r   r   r   generic_fun   s   zClient.generic_func                 C   s&   t | j \}}|d krt||S r5   )r   r9   rA   r2   )r
   rQ   rR   r   r   r   rk      s   zClient.get_resultc                    s    fddS )Nc                     s     | S r5   )rl   )xr   r
   r   r   <lambda>   s    z$Client.__getattr__.<locals>.<lambda>r   )r
   r   r   rn   r   __getattr__   s   zClient.__getattr__N)	r   r   r   r-   PORTr   rl   rk   rp   r   r   r   r   rb      s    	rb   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rJtd| t|ddt  |f  	 z| \}}W n t jym }	 z|	d d
krhW Y d }	~	qJ d }	~	ww td| | |}
t|
jd}td| qK)Nr4   r   z
bind %s:%d   zaccepting connectionszstoring host+port in %swz%s:%d TzInterrupted system callzConnected to %sr   zThread ID: %d)rV   rc   rd   re   
setsockopt
SOL_SOCKETSO_REUSEADDRrL   rM   bindlistenopenr   gethostnameacceptrW   _threadstart_new_threadr[   debug)new_handlerrh   report_to_fileri   rg   rj   r*   r8   addrrT   ibstidr   r   r   
run_server   s0   

r   )r-   r   r]   r   rG   r|   rE   rV   logging	getLoggerr   rL   rq   r   	Unpicklerr   r   rD   r/   r2   r3   rb   r   r   r   r   r   <module>   s*   	
)i