proxy class created
[nepi.git] / src / nepi / util / server.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import errno
5 import os
6 import select
7 import socket
8 import sys
9 import threading
10
11 CTRL_SOCK = "ctrl.sock"
12 STD_ERR = "stderr.log"
13 MAX_FD = 1024
14
15 STOP_MSG = "STOP"
16
17 class Server(object):
18     def __init__(self):
19         self.stop = False
20         self.ctrl_sock = None
21
22     def run(self):
23         if self.daemonize():
24             self.loop()
25             self.cleanup()
26
27     def daemonize(self):
28         if True:
29             return 1
30
31         pid1 = os.fork()
32         if pid1 > 0:
33             return 0
34
35         # Decouple from parent environment.
36         #os.chdir(?)
37         os.umask(0)
38         os.setsid()
39
40         # fork 2
41         pid2 = os.fork()
42         if pid2 > 0:
43             return 0
44
45         # close all open file descriptors.
46         for fd in range(0, MAX_FD):
47             try:
48                 os.close(fd)
49             except OSError:
50                 pass
51
52         # Redirect standard file descriptors.
53         stdout = stderr = file(STD_ERR, "a", 0)
54         stdin = open('/dev/null', 'r')
55         os.dup2(stdin.fileno(), sys.stdin.fileno())
56         os.dup2(stdout.fileno(), sys.stdout.fileno())
57         os.dup2(stderr.fileno(), sys.stderr.fileno())
58         return 1
59
60     def loop(self):
61         self.ctrl_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
62         self.ctrl_sock.bind(CTRL_SOCK)
63         self.ctrl_sock.listen(0)
64         while not self.stop:
65             print 'accept'
66             conn, addr = self.ctrl_sock.accept()
67             conn.settimeout(5)
68             while True:
69                 try:
70                     print 'recv'
71                     data = conn.recv(1024)
72                 except socket.timeout, e:
73                     print e
74                     break
75                     
76                 if data == STOP_MSG:
77                     self.stop = True
78                 else:
79                     conn.send("%s received" % data)
80             conn.close()
81         
82     def cleanup(self):
83         self.ctrl_sock.close()
84         try:
85             s.remove(CTRL_SOCK)
86         except:
87             pass
88
89 class Forwarder(object):
90     def __init__(self):
91         self.ctrl_sock = None
92
93     def forward(self):
94         self.connect()
95         while True:
96             msg = sys.stdin.readline()
97             self.send(msg)
98             reply = self.ctrl_sock.recv(1024)
99             sys.stdout.write(reply)
100
101     def send(self, msg):
102         try:
103             self.ctrl_sock.send(msg)
104         except IOError, e:
105             if e.errno == errno.EPIPE:
106                 self.connect()
107                 self.ctrl_sock.send(msg)
108             else:
109                 raise e
110     
111     def connect(self):
112         try:
113             self.ctrl_sock.close()
114         except:
115             pass
116         self.ctrl_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
117         self.ctrl_sock.connect(CTRL_SOCK)
118
119 # Client
120 # import subprocess
121 # s = subprocess.Popen(['python' ,'-c' 'import server;c=server.Forwarder();c.forward()'], stdin = subprocess.PIPE)
122 # s.stdin.write('aaaa\n')