Source code for servermgr.pyro_service
# -*- mode: python; tab-width:8; py-indent-offset:4; indent-tabs-mode:nil -*-
#pylint: disable=C0301
#line length;
"""
Pyro service process management.
Use this module to manage a pyro service.
"""
import multiprocessing
import signal
import sys
import Pyro.core
import Pyro.errors
import base
import my_setproctitle
[docs]class Manager(base.Manager):
"""
Pyro service manager object.
:param service_name: the Pyro service name for this module.
:param service: The object used to handle Pyro requests.
:param ns_host: Pyro nameserver host.
:param ns_port: Pyro nameserver port.
:type ns_port: int
"""
__implements__ = base.ManagerInterface
def __init__(self, service_name, service, ns_host, ns_port, process_name="Pyro Service", **kwargs):
super(Manager, self).__init__(**kwargs)
self.ns_host = ns_host
self.ns_port = ns_port
self.service_name = service_name
self.service = service
self.process_name = process_name
[docs] def health(self):
"""
Check the health of the Pyro Server.
:raises: **base.WorkerError** if we cannot invoke the **health** method of the Pyro Server.
"""
try:
proxy = Pyro.core.getProxyForURI("PYRONAME://%s:%d/%s" % (self.ns_host, self.ns_port, self.service_name))
proxy.health()
except Exception, ex:
raise base.WorkerError(ex)
[docs] def start(self, wait=True, timeout=10.0):
"""
Launch the Pyro Service in a fresh python environment.
:param host: the nameserver host
:param port: the nameserver port
:type port: int
:keyword process_name: the displayed program name;
:keyword module_name: execute function 'main' in the named module;
"""
def unregister():
"Unregister the service."
try:
ns.unregister(self.service_name)
except Pyro.errors.NamingError:
pass
def launch_pyro_service():
"Start the service."
def interrupt(_unused_signum, _unused_frame):
sys.exit()
if self.process_name:
my_setproctitle.setproctitle(self.process_name)
Pyro.core.initServer()
unregister()
daemon = Pyro.core.Daemon()
daemon.useNameServer(ns)
daemon.connect(self.service, self.service_name)
signal.signal(signal.SIGINT, interrupt)
try:
daemon.requestLoop()
finally:
daemon.shutdown(True)
del daemon
try:
unregister(self.service_name)
except Exception:
pass
try:
ns = Pyro.naming.NameServerLocator().getNS(host=self.ns_host, port=self.ns_port)
except Pyro.errors.PyroError, ex:
raise IOError("Cannot connect to Pyro nameserver at %s:%d" % (self.ns_host, self.ns_port), ex)
process = multiprocessing.Process(target=launch_pyro_service)
process.start()
self.process = process
if wait:
self.ready_wait(timeout=timeout)
def main():
"""main routine."""
import optparse
parser = optparse.OptionParser(usage="usage: %prog [options] modulename servicename")
parser.add_option("-n", "--nameserver", action="store", dest="nameserver", help="Pyro Nameserver as host:port")
parser.add_option("-p", "--ps", action="store", dest="nameserver", help="ps display string")
(options, fixed_args) = parser.parse_args()
(service_name, module_name) = fixed_args
# XXX print the help message if fixed_args is not the right length;
# XXX extract ps string from options;
# XXX extract nameserver specs from options;
server = Manager(service_name, module_name, ns_host="localhost", ns_port=7504, process_name="Testing: crawler")
server.start()
server.wait()
if __name__ == "__main__":
main()