2 # -----------------------------------------------------------------------
3 # Copyright (C) 2008 Equinox Software, Inc.
4 # Bill Erickson <erickson@esilibrary.com>
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 # -----------------------------------------------------------------------
23 Provides an environment for managing OpenSRF services written in Python
26 import sys, getopt, os, signal
27 import osrf.system, osrf.server, osrf.app, osrf.set, osrf.json
31 Print help for the OpenSRF Python application process manager
35 Manage OpenSRF application processes
39 start -- Start a service
40 stop -- stop a service
41 restart -- restart a service
42 start_all -- Start all services
43 stop_all -- Stop all services
44 restart_all -- Restart all services
50 The OpenSRF config file
53 The OpenSRF config file context
56 The location of application PID files. Default is /tmp
59 If set, run in daemon (background) mode. This creates a PID
60 file for managing the process.
63 If set, run in 'localhost' mode
70 def get_pid_file(service):
72 Return the PID file for the named service
75 return "%s/%s.pid" % (pid_dir, service)
79 Initialize the Python service environment
85 # connect to the OpenSRF network
86 osrf.system.System.net_connect(
87 config_file = config_file, config_context = config_ctx)
92 domain = osrf.conf.get('domain')
96 settings = osrf.set.get('apps')
98 for key in settings.keys():
100 if isinstance(svc, dict) and 'language' in svc and svc['language'] == 'python':
104 def do_start(service):
106 Start the named Python service
109 pidfile = get_pid_file(service)
111 if service not in services:
112 print "* service %s is not a 'python' application" % service
115 if os.path.exists(pidfile):
117 pid_fd = open(pidfile, 'r')
118 alive = os.getsid(int(pid_fd.read()))
119 print "* service %s already running" % service
124 print "* starting %s" % service
128 if osrf.system.System.daemonize(False):
129 return # parent process returns
132 pid_fd = open(pidfile, 'w')
133 pid_fd.write(str(os.getpid()))
136 svc_settings = services[service]
138 osrf.app.Application.load(service, svc_settings['implementation'])
139 osrf.app.Application.register_sysmethods()
140 osrf.app.Application.application.global_init()
142 controller = osrf.server.Controller(service)
143 controller.max_requests = svc_settings['unix_config']['max_requests']
144 controller.max_children = svc_settings['unix_config']['max_children']
145 controller.min_children = svc_settings['unix_config']['min_children']
146 controller.keepalive = svc_settings['keepalive']
153 List all Python services listed in the OpenSRF configuration file
155 for service in services.keys():
160 Start all Python services listed in the OpenSRF configuration file
163 # You can't start more than one service without daemonizing
167 print "* starting all services for %s " % domain
168 for service in services.keys():
173 Stop all Python services listed in the OpenSRF configuration file
176 print "* stopping all services for %s " % domain
177 for service in services.keys():
180 def do_stop(service):
182 Stop the named Python service
185 pidfile = get_pid_file(service)
187 if not os.path.exists(pidfile):
188 print "* %s is not running" % service
191 print "* stopping %s" % service
193 pid_fd = open(pidfile)
197 os.kill(int(pid), signal.SIGTERM)
202 # -----------------------------------------------------
204 # Parse the command line options
205 ops, args = None, None
207 ops, args = getopt.getopt(sys.argv[1:], 'a:s:f:c:p:dhl')
208 except getopt.GetoptError, e:
209 print '* %s' % str(e)
214 if '-a' not in options:
217 action = options['-a']
219 config_file = options.get('-f', '@CONF_DIR@/opensrf_core.xml')
220 pid_dir = options.get('-p', '@PID_DIR@/run/opensrf')
222 service_name = options.get('-s')
223 config_ctx = options.get('-c', 'config.opensrf')
224 as_localhost = '-l' in options
225 as_daemon = '-d' in options
233 if action == 'start':
234 do_start(service_name)
236 elif action == 'stop':
237 do_stop(service_name)
239 elif action == 'restart':
240 do_stop(service_name)
241 do_start(service_name)
243 elif action == 'list_all':
246 elif action == 'start_all':
249 elif action == 'stop_all':
252 elif action == 'restart_all':
256 elif action == 'help':