B
    y^                 @   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rt j  }tjtdd}tj|d| |  f }tj|d|  }tj|ryt	| t
|| W n tk
r   Y nX |}tj|d d S )NHOMElogsz%s-server-%s.logz%s-server.log)level)datetimenowr   pathjoingetenvdate	isoformatislinkunlinksymlinkOSErrorr   basicConfig)namelogfiler!   r#   logdirlogname
logsymlinkr   r   r   setup_logging*   s    

r3   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rt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"    rB   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__instancer8   Z
allow_none)selfZaddrr.   rE   r   r   r   rD   S   s
    
zBasicServer.__init__c             C   s   t | j}|S )N)r   rE   )rF   methodsr   r   r   _listMethodsZ   s    
zBasicServer._listMethodsc             C   s   d| _ x| j s|   qW d S )NF)quitZhandle_request)rF   r   r   r   serve_foreverb   s    zBasicServer.serve_foreverc             C   s
   d| _ dS )NTzServer shutdown)rI   )rF   r   r   r   r8   g   s    zBasicServer.exitc             C   s   t j|jt jd| j d d |jrHttjd  ttj	d  ttj
d  |   | | jd t t| j x:|  D ].}t| j|}| t|| t d|  qxW t d| j   |   |   d S )Nz%(asctime)s: z: %(message)s)filenamer!   formatr8   zregistering method z+server is up and listening at http://%s:%d.)r   r-   log_fileDEBUGr.   daemonr   r7   stdinstdoutr<   Z register_introspection_functionsZregister_functionr8   infor   rE   rH   getattrr   ZsocketZgetsocknamerJ   Zserver_close)rF   r>   r   methodr   r   r   r   r?   k   s"    zBasicServer.mainN)__name__
__module____qualname__rD   rH   rJ   r8   r?   r   r   r   r   rC   R   s
   rC   )r   inspectr   r7   Zxmlrpc.serverr   r   Zxmlrpc.clientZxmlrpcr"   Znumpyr	   r   r   r   r   rN   r3   rB   rC   r   r   r   r   <module>   s   		