From: dbs Date: Tue, 9 Nov 2010 16:21:15 +0000 (+0000) Subject: Give opensrf.py reasonable defaults for options X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=af2086961e21419f6cfc3e1bf45440fe64c8e640;p=opensrf%2Fbjwebb.git Give opensrf.py reasonable defaults for options Rather than: opensrf.py -l -d -f /openils/conf/opensrf_core.xml -p /openils/var/run/ -a start_all you can now use: opensrf.py -l -d -a start_all Isn't that better? Note that we put the PIDs into PID_DIR/run/opensrf/ so that if/when OpenSRF is installed outside of the /openils/ prefix, the names of the processes won't conflict with any other application PIDs. Unlikely, but you never know. git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@2067 9efc2488-bf62-4759-914b-345cdb29e865 --- diff --git a/configure.ac b/configure.ac index 7418c82..6cc828c 100644 --- a/configure.ac +++ b/configure.ac @@ -340,6 +340,7 @@ if test "x$OSRF_INSTALL_CORE" = "xtrue"; then src/libopensrf/Makefile src/perl/Makefile src/ports/strn_compat/Makefile + src/python/opensrf.py src/router/Makefile src/srfsh/Makefile bin/opensrf-perl.pl diff --git a/src/python/opensrf.py b/src/python/opensrf.py deleted file mode 100755 index 27c5773..0000000 --- a/src/python/opensrf.py +++ /dev/null @@ -1,237 +0,0 @@ -#!/usr/bin/python -# ----------------------------------------------------------------------- -# Copyright (C) 2008 Equinox Software, Inc. -# Bill Erickson -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA -# ----------------------------------------------------------------------- - -''' -Provides an environment for managing OpenSRF services written in Python -''' - -import sys, getopt, os, signal -import osrf.system, osrf.server, osrf.app, osrf.set, osrf.json - -def do_help(): - ''' - Print help for the OpenSRF Python application process manager - ''' - - print ''' - Manage OpenSRF application processes - - Options: - -a - start -- Start a service - stop -- stop a service - restart -- restart a service - start_all -- Start all services - stop_all -- Stop all services - restart_all -- Restart all services - - -s - The service name - - -f - The OpenSRF config file - - -c - The OpenSRF config file context - - -p - The location of application PID files. Default is /tmp - - -d - If set, run in daemon (background) mode. This creates a PID - file for managing the process. - - -l - If set, run in 'localhost' mode - - -h - Prints help message - ''' - sys.exit(0) - -def get_pid_file(service): - ''' - Return the PID file for the named service - ''' - - return "%s/%s.pid" % (pid_dir, service) - -def do_init(): - ''' - Initialize the Python service environment - ''' - - global domain - global settings - - # connect to the OpenSRF network - osrf.system.System.net_connect( - config_file = config_file, config_context = config_ctx) - - if as_localhost: - domain = 'localhost' - else: - domain = osrf.conf.get('domain') - - osrf.set.load(domain) - - settings = osrf.set.get('apps') - - for key in settings.keys(): - svc = settings[key] - if isinstance(svc, dict) and 'language' in svc and svc['language'] == 'python': - services[key] = svc - - -def do_start(service): - ''' - Start the named Python service - ''' - - pidfile = get_pid_file(service) - - if service not in services: - print "* service %s is not a 'python' application" % service - return - - if os.path.exists(pidfile): - print "* service %s already running" % service - return - - print "* starting %s" % service - - if as_daemon: - - if osrf.system.System.daemonize(False): - return # parent process returns - - # write PID file - pid_fd = open(pidfile, 'w') - pid_fd.write(str(os.getpid())) - pid_fd.close() - - svc_settings = services[service] - - osrf.app.Application.load(service, svc_settings['implementation']) - osrf.app.Application.register_sysmethods() - osrf.app.Application.application.global_init() - - controller = osrf.server.Controller(service) - controller.max_requests = svc_settings['unix_config']['max_requests'] - controller.max_children = svc_settings['unix_config']['max_children'] - controller.min_children = svc_settings['unix_config']['min_children'] - controller.keepalive = svc_settings['keepalive'] - - controller.run() - os._exit(0) - -def do_start_all(): - ''' - Start all Python services listed in the OpenSRF configuration file - ''' - - print "* starting all services for %s " % domain - for service in services.keys(): - do_start(service) - -def do_stop_all(): - ''' - Stop all Python services listed in the OpenSRF configuration file - ''' - - print "* stopping all services for %s " % domain - for service in services.keys(): - do_stop(service) - -def do_stop(service): - ''' - Stop the named Python service - ''' - - pidfile = get_pid_file(service) - - if not os.path.exists(pidfile): - print "* %s is not running" % service - return - - print "* stopping %s" % service - - pid_fd = open(pidfile) - pid = pid_fd.read() - pid_fd.close() - try: - os.kill(int(pid), signal.SIGTERM) - except: - pass - os.remove(pidfile) - -# ----------------------------------------------------- - -# Parse the command line options -ops, args = None, None -try: - ops, args = getopt.getopt(sys.argv[1:], 'a:s:f:c:p:dhl') -except getopt.GetoptError, e: - print '* %s' % str(e) - do_help() - -options = dict(ops) - -if '-a' not in options or '-f' not in options: - do_help() - -action = options['-a'] -config_file = options['-f'] -pid_dir = options['-p'] - -service_name = options.get('-s') -config_ctx = options.get('-c', 'config.opensrf') -as_localhost = '-l' in options -as_daemon = '-d' in options - -domain = None -settings = None -services = {} - -do_init() - -if action == 'start': - do_start(service_name) - -elif action == 'stop': - do_stop(service_name) - -elif action == 'restart': - do_stop(service_name) - do_start(service_name) - -elif action == 'start_all': - do_start_all() - -elif action == 'stop_all': - do_stop_all() - -elif action == 'restart_all': - do_stop_all() - do_start_all() - -elif action == 'help': - do_help() diff --git a/src/python/opensrf.py.in b/src/python/opensrf.py.in new file mode 100755 index 0000000..cc5d8f4 --- /dev/null +++ b/src/python/opensrf.py.in @@ -0,0 +1,238 @@ +#!/usr/bin/python +# ----------------------------------------------------------------------- +# Copyright (C) 2008 Equinox Software, Inc. +# Bill Erickson +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA +# ----------------------------------------------------------------------- + +''' +Provides an environment for managing OpenSRF services written in Python +''' + +import sys, getopt, os, signal +import osrf.system, osrf.server, osrf.app, osrf.set, osrf.json + +def do_help(): + ''' + Print help for the OpenSRF Python application process manager + ''' + + print ''' + Manage OpenSRF application processes + + Options: + -a + start -- Start a service + stop -- stop a service + restart -- restart a service + start_all -- Start all services + stop_all -- Stop all services + restart_all -- Restart all services + + -s + The service name + + -f + The OpenSRF config file + + -c + The OpenSRF config file context + + -p + The location of application PID files. Default is /tmp + + -d + If set, run in daemon (background) mode. This creates a PID + file for managing the process. + + -l + If set, run in 'localhost' mode + + -h + Prints help message + ''' + sys.exit(0) + +def get_pid_file(service): + ''' + Return the PID file for the named service + ''' + + return "%s/%s.pid" % (pid_dir, service) + +def do_init(): + ''' + Initialize the Python service environment + ''' + + global domain + global settings + + # connect to the OpenSRF network + osrf.system.System.net_connect( + config_file = config_file, config_context = config_ctx) + + if as_localhost: + domain = 'localhost' + else: + domain = osrf.conf.get('domain') + + osrf.set.load(domain) + + settings = osrf.set.get('apps') + + for key in settings.keys(): + svc = settings[key] + if isinstance(svc, dict) and 'language' in svc and svc['language'] == 'python': + services[key] = svc + + +def do_start(service): + ''' + Start the named Python service + ''' + + pidfile = get_pid_file(service) + + if service not in services: + print "* service %s is not a 'python' application" % service + return + + if os.path.exists(pidfile): + print "* service %s already running" % service + return + + print "* starting %s" % service + + if as_daemon: + + if osrf.system.System.daemonize(False): + return # parent process returns + + # write PID file + pid_fd = open(pidfile, 'w') + pid_fd.write(str(os.getpid())) + pid_fd.close() + + svc_settings = services[service] + + osrf.app.Application.load(service, svc_settings['implementation']) + osrf.app.Application.register_sysmethods() + osrf.app.Application.application.global_init() + + controller = osrf.server.Controller(service) + controller.max_requests = svc_settings['unix_config']['max_requests'] + controller.max_children = svc_settings['unix_config']['max_children'] + controller.min_children = svc_settings['unix_config']['min_children'] + controller.keepalive = svc_settings['keepalive'] + + controller.run() + os._exit(0) + +def do_start_all(): + ''' + Start all Python services listed in the OpenSRF configuration file + ''' + + print "* starting all services for %s " % domain + for service in services.keys(): + do_start(service) + +def do_stop_all(): + ''' + Stop all Python services listed in the OpenSRF configuration file + ''' + + print "* stopping all services for %s " % domain + for service in services.keys(): + do_stop(service) + +def do_stop(service): + ''' + Stop the named Python service + ''' + + pidfile = get_pid_file(service) + + if not os.path.exists(pidfile): + print "* %s is not running" % service + return + + print "* stopping %s" % service + + pid_fd = open(pidfile) + pid = pid_fd.read() + pid_fd.close() + try: + os.kill(int(pid), signal.SIGTERM) + except: + pass + os.remove(pidfile) + +# ----------------------------------------------------- + +# Parse the command line options +ops, args = None, None +try: + ops, args = getopt.getopt(sys.argv[1:], 'a:s:f:c:p:dhl') +except getopt.GetoptError, e: + print '* %s' % str(e) + do_help() + +options = dict(ops) + +if '-a' not in options: + do_help() + +action = options['-a'] + +config_file = options.get('-f', '@CONF_DIR@/opensrf_core.xml') +pid_dir = options.get('-p', '@PID_DIR@/run/opensrf') + +service_name = options.get('-s') +config_ctx = options.get('-c', 'config.opensrf') +as_localhost = '-l' in options +as_daemon = '-d' in options + +domain = None +settings = None +services = {} + +do_init() + +if action == 'start': + do_start(service_name) + +elif action == 'stop': + do_stop(service_name) + +elif action == 'restart': + do_stop(service_name) + do_start(service_name) + +elif action == 'start_all': + do_start_all() + +elif action == 'stop_all': + do_stop_all() + +elif action == 'restart_all': + do_stop_all() + do_start_all() + +elif action == 'help': + do_help()