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