1#!/usr/bin/env python
2from __future__ import with_statement
3import daemon
4from lockfile.pidlockfile import PIDLockFile
5import sys
6import signal
7import os
8from rpyc.utils.server import ThreadedServer, ForkingServer
9from rpyc.core.service import SlaveService
10from rpyc.lib import setup_logger
11try:
12    from configparser import ConfigParser
13except ImportError:
14    from ConfigParser import ConfigParser
15
16server = None
17cur_dir = os.getcwd()
18bin_dir = os.path.dirname(__file__)
19
20
21def start():
22    global server
23
24    conf = ConfigParser()
25    conf.read([
26        os.path.join(cur_dir, 'rpycd.conf'),
27        os.path.join(bin_dir, 'rpycd.conf'),    # later files trump earlier ones
28    ])
29
30    mode = conf.get("rpycd", "mode").lower()
31    if mode == "threaded":
32        factory = ThreadedServer
33    elif mode == "forking":
34        factory = ForkingServer
35    else:
36        raise ValueError("Invalid mode %r" % (mode,))
37
38    quiet = conf.getboolean("rpycd", "quiet")
39    logfile = os.path.join(cur_dir, conf.get("rpycd", "logfile"))
40    setup_logger(quiet, logfile)
41
42    server = factory(SlaveService, hostname=conf.get("rpycd", "host"),
43                     port=conf.getint("rpycd", "port"), reuse_addr=True)
44    server.start()
45    server.serve_all()
46
47
48def reload(*args):
49    server.close()
50    start()
51
52
53def stop(*args):
54    server.close()
55    sys.exit()
56
57
58if __name__ == "__main__":
59    pid_file = os.path.join(cur_dir, 'rpycd.pid')
60    with daemon.DaemonContext(
61            pidfile=PIDLockFile(pid_file),
62            signal_map={signal.SIGTERM: stop, signal.SIGHUP: reload}):
63        start()
64