13 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
13 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
14 # details. |
14 # details. |
15 # |
15 # |
16 # You should have received a copy of the GNU Lesser General Public License along |
16 # You should have received a copy of the GNU Lesser General Public License along |
17 # with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
17 # with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
18 """Pyro RQL server |
18 """Pyro RQL server""" |
19 |
19 |
20 """ |
|
21 __docformat__ = "restructuredtext en" |
20 __docformat__ = "restructuredtext en" |
22 |
21 |
23 import os |
22 import os |
24 import sys |
23 import sys |
25 import select |
24 import select |
26 import warnings |
25 import warnings |
27 from time import localtime, mktime |
26 from time import localtime, mktime |
|
27 |
|
28 from logilab.common.daemon import daemonize |
28 |
29 |
29 from cubicweb.cwconfig import CubicWebConfiguration |
30 from cubicweb.cwconfig import CubicWebConfiguration |
30 from cubicweb.server.repository import Repository |
31 from cubicweb.server.repository import Repository |
31 |
32 |
32 class Finished(Exception): |
33 class Finished(Exception): |
81 self.repo = Repository(config, debug=debug) |
82 self.repo = Repository(config, debug=debug) |
82 self.ns = None |
83 self.ns = None |
83 self.quiting = None |
84 self.quiting = None |
84 # event queue |
85 # event queue |
85 self.events = [] |
86 self.events = [] |
86 # start repository looping tasks |
|
87 |
87 |
88 def add_event(self, event): |
88 def add_event(self, event): |
89 """add an event to the loop""" |
89 """add an event to the loop""" |
90 self.info('adding event %s', event) |
90 self.info('adding event %s', event) |
91 self.events.append(event) |
91 self.events.append(event) |
101 except Finished: |
101 except Finished: |
102 self.events.remove(event) |
102 self.events.remove(event) |
103 |
103 |
104 def run(self, req_timeout=5.0): |
104 def run(self, req_timeout=5.0): |
105 """enter the service loop""" |
105 """enter the service loop""" |
|
106 # start repository looping tasks |
106 self.repo.start_looping_tasks() |
107 self.repo.start_looping_tasks() |
107 while self.quiting is None: |
108 while self.quiting is None: |
108 try: |
109 try: |
109 self.daemon.handleRequests(req_timeout) |
110 self.daemon.handleRequests(req_timeout) |
110 except select.error: |
111 except select.error: |
128 import signal |
129 import signal |
129 self.info('installing signal handlers') |
130 self.info('installing signal handlers') |
130 signal.signal(signal.SIGINT, lambda x, y, s=self: s.quit()) |
131 signal.signal(signal.SIGINT, lambda x, y, s=self: s.quit()) |
131 signal.signal(signal.SIGTERM, lambda x, y, s=self: s.quit()) |
132 signal.signal(signal.SIGTERM, lambda x, y, s=self: s.quit()) |
132 |
133 |
133 def daemonize(self, pid_file=None): |
|
134 """daemonize the process""" |
|
135 # fork so the parent can exist |
|
136 if (os.fork()): |
|
137 return -1 |
|
138 # deconnect from tty and create a new session |
|
139 os.setsid() |
|
140 # fork again so the parent, (the session group leader), can exit. |
|
141 # as a non-session group leader, we can never regain a controlling |
|
142 # terminal. |
|
143 if (os.fork()): |
|
144 return -1 |
|
145 # move to the root to avoit mount pb |
|
146 os.chdir('/') |
|
147 # set paranoid umask |
|
148 os.umask(077) |
|
149 if pid_file is not None: |
|
150 # write pid in a file |
|
151 f = open(pid_file, 'w') |
|
152 f.write(str(os.getpid())) |
|
153 f.close() |
|
154 # filter warnings |
|
155 warnings.filterwarnings('ignore') |
|
156 # close standard descriptors |
|
157 sys.stdin.close() |
|
158 sys.stdout.close() |
|
159 sys.stderr.close() |
|
160 |
|
161 from logging import getLogger |
134 from logging import getLogger |
162 from cubicweb import set_log_methods |
135 from cubicweb import set_log_methods |
163 LOGGER = getLogger('cubicweb.reposerver') |
136 LOGGER = getLogger('cubicweb.reposerver') |
164 set_log_methods(CubicWebConfiguration, LOGGER) |
137 set_log_methods(RepositoryServer, LOGGER) |