freeipa/install/tools/ipactl
Simo Sorce 2efc08a6fc Introduce ipa control script that reads configuration off ldap
This replace the former ipactl script, as well as replace the current way ipa
components are started.

Instead of enabling each service in the system init scripts, enable only the
ipa script, and then let it start all components based on the configuration
read from the LDAP tree.

resolves: https://fedorahosted.org/freeipa/ticket/294
2010-12-10 12:28:38 -05:00

224 lines
6.2 KiB
Python
Executable File

#!/usr/bin/env python
# Authors: Simo Sorce <ssorce@redhat.com>
#
# Copyright (C) 2008-2010 Red Hat
# see file 'COPYING' for use and warranty information
#
# 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; version 2 only
#
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
import sys
try:
from ipaserver.install import service
from ipapython import config
from ipalib import api, errors
import logging
import ldap
import socket
import syslog
except ImportError:
print >> sys.stderr, """\
There was a problem importing one of the required Python modules. The
error was:
%s
""" % sys.exc_value
sys.exit(1)
def parse_options():
usage = "%prog start|stop|restart|status\n"
parser = config.IPAOptionParser(usage=usage,
formatter=config.IPAFormatter())
parser.add_option("-d", "--debug", action="store_true", dest="debug",
help="Display debugging information")
options, args = parser.parse_args()
safe_options = parser.get_safe_opts(options)
return safe_options, options, args
def emit_err(err):
syslog.syslog(syslog.LOG_ERR, err)
print err
def get_config():
base = "cn=%s,cn=masters,cn=ipa,cn=etc,%s" % (socket.gethostname(),
api.env.basedn)
srcfilter = '(ipaConfigString=enabledService)'
attrs = ['cn', 'ipaConfigString']
try:
con = ldap.initialize(api.env.ldap_uri)
con.simple_bind()
res = con.search_st(base,
ldap.SCOPE_SUBTREE,
filterstr=srcfilter,
attrlist=attrs,
timeout=10)
except e:
print "Error retrieving list of services %s" % e
print "Is IPA installed ?"
return
svc_list = []
for entry in res:
name = entry[1]['cn'][0]
for p in entry[1]['ipaConfigString']:
if p.startswith('startOrder '):
order = p.split()[1]
svc_list.append((order, name))
return svc_list
def ipa_start():
try:
print "Starting Directory Service"
service.start('dirsrv')
except:
emit_err("Failed to start Directory Service")
return
svc_list = get_config()
for (order, svc) in sorted(svc_list):
svc_name = service.SERVICE_LIST[svc][0]
try:
print "Starting %s Service" % svc
service.start(svc_name)
except:
emit_err("Failed to start %s Service" % svc)
emit_err("Shutting down")
for (order, svc) in sorted(svc_list):
svc_name = service.SERVICE_LIST[svc][0]
try:
service.stop(svc_name)
except:
pass
try:
service.stop('dirsrv')
except:
pass
return
def ipa_stop():
svc_list = get_config()
for (order, svc) in sorted(svc_list, reverse=True):
svc_name = service.SERVICE_LIST[svc][0]
try:
print "Stopping %s Service" % svc
service.stop(svc_name)
except:
emit_err("Failed to stop %s Service" % svc)
try:
print "Stopping Directory Service"
service.stop('dirsrv')
except:
emit_err("Failed to stop Directory Service")
return
def ipa_restart():
try:
print "Restarting Directory Service"
service.restart('dirsrv')
except:
emit_err("Failed to restart Directory Service")
return
svc_list = get_config()
for (order, svc) in sorted(svc_list):
svc_name = service.SERVICE_LIST[svc][0]
try:
print "Restarting %s Service" % svc
service.restart(svc_name)
except:
emit_err("Failed to restart %s Service" % svc)
emit_err("Shutting down")
for (order, svc) in sorted(svc_list):
svc_name = service.SERVICE_LIST[svc][0]
try:
service.stop(svc_name)
except:
pass
try:
service.stop('dirsrv')
except:
pass
return
def ipa_status():
try:
if service.is_running('dirsrv'):
print "Directory Service: RUNNING"
else:
print "Directory Service: STOPPED"
except:
print "Failed to get Directory Service status"
return
svc_list = get_config()
for (order, svc) in sorted(svc_list):
svc_name = service.SERVICE_LIST[svc][0]
try:
if service.is_running(svc_name):
print "%s Service: RUNNING" % svc
else:
print "%s Service: STOPPED" % svc
except:
print "Failed to get %s Service status" % svc
def main():
safe_options, options, args = parse_options()
if len(args) != 1:
sys.exit("You must specify one action")
elif args[0] != "start" and args[0] != "stop" and args[0] != "restart" and args[0] != "status":
sys.exit("Unrecognized action [" + args[0] + "]")
api.bootstrap(context='cli', debug=options.debug)
api.finalize()
syslog.openlog('ipa', syslog.LOG_NDELAY, syslog.LOG_DAEMON)
if args[0].lower() == "start":
ipa_start()
elif args[0].lower() == "stop":
ipa_stop()
elif args[0].lower() == "restart":
ipa_restart()
elif args[0].lower() == "status":
ipa_status()
syslog.closelog()
try:
if __name__ == "__main__":
sys.exit(main())
except RuntimeError, e:
print "%s" % e
sys.exit(1)
except SystemExit, e:
sys.exit(e)
except KeyboardInterrupt, e:
sys.exit(1)