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 list_all -- List all services
40 start -- Start a service
41 stop -- stop a service
42 restart -- restart a service
43 start_all -- Start all services
44 stop_all -- Stop all services
45 restart_all -- Restart all services
51 The OpenSRF config file
54 The OpenSRF config file context
57 The location of application PID files. Default is @PID_DIR@/run/opensrf
60 If set, run in daemon (background) mode. This creates a PID
61 file for managing the process.
64 If set, run in 'localhost' mode
71 def get_pid_file(service):
73 Return the PID file for the named service
76 return "%s/%s.pid" % (pid_dir, service)
80 Initialize the Python service environment
86 # connect to the OpenSRF network
87 osrf.system.System.net_connect(
88 config_file = config_file, config_context = config_ctx)
93 domain = osrf.conf.get('domain')
97 settings = osrf.set.get('apps')
98 activeapps = osrf.set.get('activeapps')
100 for key in (set(settings.keys()) & set(activeapps['appname'])):
102 if isinstance(svc, dict) and 'language' in svc and svc['language'] == 'python':
105 def do_start(service):
107 Start the named Python service
110 pidfile = get_pid_file(service)
112 if service not in services:
113 print "* service %s is not a 'python' application" % service
116 if os.path.exists(pidfile):
118 pid_fd = open(pidfile, 'r')
119 alive = os.getsid(int(pid_fd.read()))
120 print "* service %s already running" % service
125 print "* starting %s" % service
129 if osrf.system.System.daemonize(False):
130 return # parent process returns
133 pid_fd = open(pidfile, 'w')
134 pid_fd.write(str(os.getpid()))
137 svc_settings = services[service]
139 osrf.app.Application.load(service, svc_settings['implementation'])
140 osrf.app.Application.register_sysmethods()
141 osrf.app.Application.application.global_init()
143 controller = osrf.server.Controller(service)
144 controller.max_requests = svc_settings['unix_config']['max_requests']
145 controller.max_children = svc_settings['unix_config']['max_children']
146 controller.min_children = svc_settings['unix_config']['min_children']
147 controller.keepalive = svc_settings['keepalive']
154 List all Python services listed in the OpenSRF configuration file
156 for service in services.keys():
161 Start all Python services listed in the OpenSRF configuration file
164 # You can't start more than one service without daemonizing
168 print "* starting all services for %s " % domain
169 for service in services.keys():
174 Stop all Python services listed in the OpenSRF configuration file
177 print "* stopping all services for %s " % domain
178 for service in services.keys():
181 def do_stop(service):
183 Stop the named Python service
186 pidfile = get_pid_file(service)
188 if not os.path.exists(pidfile):
189 print "* %s is not running" % service
192 print "* stopping %s" % service
194 pid_fd = open(pidfile)
198 os.kill(int(pid), signal.SIGTERM)
203 # -----------------------------------------------------
205 # Parse the command line options
206 ops, args = None, None
208 ops, args = getopt.getopt(sys.argv[1:], 'a:s:f:c:p:dhl')
209 except getopt.GetoptError, e:
210 print '* %s' % str(e)
215 if '-a' not in options:
218 action = options['-a']
220 config_file = options.get('-f', '@CONF_DIR@/opensrf_core.xml')
221 pid_dir = options.get('-p', '@PID_DIR@/run/opensrf')
223 service_name = options.get('-s')
224 config_ctx = options.get('-c', 'config.opensrf')
225 as_localhost = '-l' in options
226 as_daemon = '-d' in options
234 if action == 'start':
235 do_start(service_name)
237 elif action == 'stop':
238 do_stop(service_name)
240 elif action == 'restart':
241 do_stop(service_name)
242 do_start(service_name)
244 elif action == 'list_all':
247 elif action == 'start_all':
250 elif action == 'stop_all':
253 elif action == 'restart_all':
257 elif action == 'help':