3
ھ_                 @   s`   d dl Z d dlZd dlZd dlZd dlZd dlZG dd dZG dd deZG dd dZdS )    Nc               @   s0   e Zd Zf Zdd Zdd Zdd Zdd Zd	S )
SignalHandlerc             C   s   |  j t||f7  _ d S )N)SIGNALS	SigAction)selfsignumcallback r   3/var/www/html/amocrm/callthelist/PyDaemon/daemon.pyregister   s    zSignalHandler.registerc             C   s   | j S )N)r   )r   r   r   r	   
getActions   s    zSignalHandler.getActionsc             C   s   dst d|  d S )Nr   z5You must define a handler(signum, frame) method in %s)AssertionError)r   r   framer   r   r	   handler   s    zSignalHandler.handlerc             C   s   d| j j S )Nz
<Class:%s>)	__class____name__)r   r   r   r	   __repr__   s    zSignalHandler.__repr__N)r   
__module____qualname__r   r
   r   r   r   r   r   r   r	   r   
   s
   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )r   c             C   s    || _ || _tj| j | j d S )N)r   r   signalr   )r   r   r   r   r   r	   __init__   s    zSigAction.__init__c             C   s   | j   d S )N)r   )r   r   r   r   r   r	   r   !   s    zSigAction.handlerc             C   s   d| j j| jf S )Nz<Class:%s signal:%s>)r   r   r   )r   r   r   r	   r   $   s    zSigAction.__repr__N)r   r   r   r   r   r   r   r   r   r	   r      s   r   c               @   sb   e 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	i Z
dd Zdd Zdd ZdS )Daemon	/dev/nullc             C   s   || _ || _|| _|| _d S )N)stdinstdoutstderrpidfile)r   r   r   r   r   r   r   r	   r   (   s    zDaemon.__init__c             C   s
   || _ d S )N)sigDict)r   Zsigdictr   r   r	   metaInit/   s    zDaemon.metaInitc             C   s  yt j }|dkrtjd W nD tk
rb } z(tjjd|j|jf  tjd W Y dd}~X nX t j	d t j
  t jd yt j }|dkrtjd W nD tk
r } z(tjjd|j|jf  tjd W Y dd}~X nX tjj  tjj  t| jd}t| jd}t| jd}t j|j tjj  t j|j tjj  t j|j tjj  tj| j tt j }t| jd	jd
|  dS )z
        do the UNIX double-fork magic, see Stevens' "Advanced 
        Programming in the UNIX Environment" for details (ISBN 0201563177)
        http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
        r   zfork #1 failed: %d (%s)
   N/zfork #2 failed: %d (%s)
rza+zw+z%s
)osforksysexitOSErrorr   writeerrnostrerrorchdirsetsidumaskr   flushopenr   dup2filenoatexitr
   delpidstrgetpidr   )r   pideZsiZsoZser   r   r	   	daemonize2   s8    



zDaemon.daemonizec             C   s   t j| j d S )N)r!   remover   )r   r   r   r	   r1   _   s    zDaemon.delpidc             C   s0   t  }x$t| jD ]}|j|| j|  qW d S )N)r   iterr   r
   )r   Zassigneeir   r   r	   signalAssignb   s    zDaemon.signalAssignc             C   s   y(t | jd}t|j j }|j  W n tk
r@   d}Y nX |rd| }tj|dtj	tj	dd}t
|jdkrd}tjj|| j  tjd	 | j  | j  | j  dS )
z"
        Start the daemon
        r    Nzps -p TzUTF-8)shellr   r   encoding   z2pidfile %s already exist. Daemon already running?
r   )r-   r   intreadstripcloseIOError
subprocessrunPIPElenr   r#   r   r&   r$   r6   r:   )r   pfr4   checkanswermessager   r   r	   startg   s"    


zDaemon.startc             C   s   y(t | jd}t|j j }|j  W n tk
r@   d }Y nX |rd| }tj|dtj	tj	dd}t
|jdkrd}tjj| tjd qd}tjj| tjd nd	}tjj| tjd d S )
Nr    zps -p TzUTF-8)r;   r   r   r<   r=   zstatus: ranning
r   zstatus: not ranning
)r-   r   r>   r?   r@   rA   rB   rC   rD   rE   rF   r   r#   r&   r$   )r   rG   r4   rH   rI   rJ   r   r   r	   status   s(    

zDaemon.statusc             C   s   y(t | jd}t|j j }|j  W n tk
r@   d}Y nX |s`d}tjj	|| j  dS y*x$t
j|tj tjd td qdW W nj tk
r } zNt|}|jddkrt
jj| jrt
j| j ntt| tjd W Y dd}~X nX dS )	z!
        Stop the daemon
        r    Nz/pidfile %s does not exist. Daemon not running?
g?zSuccessfully stoppedzNo such processr   r   )r-   r   r>   r?   r@   rA   rB   r#   r   r&   r!   killr   SIGTERMtimesleepprintr%   r2   findpathexistsr7   r$   )r   rG   r4   rJ   errr   r   r	   stop   s,    

zDaemon.stopc             C   s   | j   | j  dS )z$
        Restart the daemon
        N)rV   rK   )r   r   r   r	   restart   s    zDaemon.restartc             C   s   t d d S )NZdummy)rQ   )r   r   r   r	   rD      s    z
Daemon.runN)r   r   r   )r   r   r   r   r   r6   r1   r:   rK   rL   r   rV   rW   rD   r   r   r   r	   r   '   s    
- r   )	r#   r!   rO   r0   r   rC   r   r   r   r   r   r   r	   <module>   s   