B
    ·¶`¹  ã               @   s”   d dl Z d dlZd dlZd dlZd dlmZmZ d dlZd dl	Z	d dl
Zdd„ Zdd„ Zdd„ Zd	d
„ Zdejfdd„Zdd„ ZG dd„ deƒZdS )é    N)ÚSimpleXMLRPCServerÚlist_public_methodsc             C   s<   t  | ¡r*y|  ¡ S  tk
r&   | S X ndd„ | D ƒS d S )Nc             S   s   g | ]}t |ƒ‘qS © )Úconvert)Ú.0Z_vr   r   ú/home/cbp/cbp/daemon_servers.pyú
<listcomp>   s    zconvert.<locals>.<listcomp>)ÚnpZisscalarÚitemÚAttributeError)Úvr   r   r   r      s    
r   c             C   s"   yt dd„ | D ƒƒS    | S dS )z<non intrusive trick to marshall numpy arrays and other stuffc             S   s   g | ]}t |ƒ‘qS r   )r   )r   Úargr   r   r   r      s    zflatten.<locals>.<listcomp>N)Útuple)Úargsr   r   r   Úflatten   s    r   c             C   s6   |d krt  t jt j¡}n| ¡ }t  ||  ¡ ¡ d S )N)ÚosÚopenÚdevnullÚO_RDWRÚfilenoÚdup2)Zsystem_streamZtarget_streamZ	target_fdr   r   r   Úredirect_stream   s    r   c                s   ‡ fdd„}|S )Nc                 s    t  dtˆ ƒ ¡ tˆ | |ŽƒS )NzCall to )ÚloggingÚdebugÚstrr   )r   Úkeys)Úfr   r   Úinner%   s    zlogged_call.<locals>.innerr   )r   r   r   )r   r   Úlogged_call$   s    r   c             C   s²   |d kr®t j  ¡ }tj t d¡d¡}tj |d| | ¡  ¡ f ¡}tj |d|  ¡}tj |¡r’yt 	|¡ t 
||¡ W n tk
r   Y nX |}tj||d|  d d d S )NÚHOMEZlogsz%s-server-%s.logz%s-server.logz%(asctime)s: z: %(message)s)ÚfilenameÚlevelÚformat)ÚdatetimeÚnowr   ÚpathÚjoinÚgetenvÚdateÚ	isoformatÚislinkÚunlinkÚsymlinkÚOSErrorr   ZbasicConfig)ÚnameZlogfiler!   r$   ZlogdirZlognameZ
logsymlinkr   r   r   Úsetup_logging*   s     

r/   c          
   C   sî   yt  ¡ }|dkrt d¡ W nF tk
rd } z(td|j|jf tjd t d¡ W dd}~X Y nX t  	¡  y*t  ¡ }|dkr–td| ƒ t d¡ W nF tk
rÞ } z(td|j|jf tjd t d¡ W dd}~X Y nX || |ƒ dS )z=Make the process a true daemon process through double forkingr   zfork #1 failed: %d (%s))Úfileé   Nz%starting server as daemin with PID %dzfork #2 failed %d (%s))
r   ÚforkÚsysÚexitr-   ÚprintÚerrnoÚstrerrorÚstderrÚsetsid)Úoptionsr   ÚmainÚpidÚer   r   r   Ú	daemonize=   s"    r>   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚBasicServerc             C   s,   || _ t | |¡ || _| j| j_d| _d S )NT)r.   r   Ú__init__Úinstancer4   Z
allow_none)ÚselfZaddrr.   rA   r   r   r   r@   V   s
    
zBasicServer.__init__c             C   s   t | jƒ}|S )N)r   rA   )rB   Úmethodsr   r   r   Ú_listMethods]   s    
zBasicServer._listMethodsc             C   s   d| _ x| j s|  ¡  qW d S )NF)ÚquitZhandle_request)rB   r   r   r   Úserve_forevere   s    zBasicServer.serve_foreverc             C   s
   d| _ dS )NTzServer shutdown)rE   )rB   r   r   r   r4   j   s    zBasicServer.exitc             C   s´   |j r*ttjd ƒ ttjd ƒ ttjd ƒ |  ¡  |  | jd¡ t	 
t| jƒ¡ x:|  ¡ D ].}t| j|ƒ}|  t|ƒ|¡ t	 
d| ¡ qZW t	 
d| j ¡  ¡ |  ¡  |  ¡  d S )Nr4   zregistering method z+server is up and listening at http://%s:%d.)Údaemonr   r3   ÚstdinÚstdoutr8   Z register_introspection_functionsZregister_functionr4   r   Úinfor   rA   rD   Úgetattrr   ZsocketZgetsocknamerF   Zserver_close)rB   r:   r   Úmethodr   r   r   r   r;   n   s    zBasicServer.mainN)Ú__name__Ú
__module__Ú__qualname__r@   rD   rF   r4   r;   r   r   r   r   r?   U   s
   r?   )r   Úinspectr   r3   Zxmlrpc.serverr   r   Zxmlrpc.clientZxmlrpcr#   Znumpyr	   r   r   r   r   ZDEBUGr/   r>   r?   r   r   r   r   Ú<module>   s   		