summaryrefslogtreecommitdiffstats
path: root/install/tools/ipactl
diff options
context:
space:
mode:
Diffstat (limited to 'install/tools/ipactl')
-rwxr-xr-xinstall/tools/ipactl173
1 files changed, 135 insertions, 38 deletions
diff --git a/install/tools/ipactl b/install/tools/ipactl
index d4b2c0878..39ccc346c 100755
--- a/install/tools/ipactl
+++ b/install/tools/ipactl
@@ -34,6 +34,7 @@ try:
import ldap.sasl
import ldapurl
import socket
+ import json
except ImportError:
print >> sys.stderr, """\
There was a problem importing one of the required Python modules. The
@@ -44,6 +45,7 @@ error was:
sys.exit(1)
SASL_EXTERNAL = ldap.sasl.sasl({}, 'EXTERNAL')
+SVC_LIST_FILE = "/var/run/ipa/services.list"
class IpactlError(ScriptError):
pass
@@ -162,10 +164,32 @@ def get_config(dirsrv):
for p in entry[1]['ipaConfigString']:
if p.startswith('startOrder '):
order = p.split()[1]
- svc_list.append((order, name))
+ svc_list.append([order, name])
return svc_list
+def get_config_from_file():
+
+ svc_list = []
+
+ try:
+ f = open(SVC_LIST_FILE, 'r')
+ svc_list = json.load(f)
+ except Exception, e:
+ raise IpactlError("Unknown error when retrieving list of services from file: " + str(e))
+
+ return svc_list
+
+def dump_config_to_file(svc_list):
+
+ try:
+ f = open(SVC_LIST_FILE, 'w')
+ json.dump(svc_list, f)
+ f.flush()
+ f.close()
+ except Exception, e:
+ raise IpactlError("Unknown error when saving list of services to file: " + str(e))
+
def ipa_start(options):
dirsrv = ipaservices.knownservices.dirsrv
try:
@@ -194,6 +218,8 @@ def ipa_start(options):
# no service to stop
return
+ dump_config_to_file(svc_list)
+
for (order, svc) in sorted(svc_list):
svc_name = service.SERVICE_LIST[svc][0]
svchandle = ipaservices.service(svc_name)
@@ -220,11 +246,10 @@ def ipa_stop(options):
dirsrv = ipaservices.knownservices.dirsrv
svc_list = []
try:
- svc_list = get_config(dirsrv)
+ svc_list = get_config_from_file()
except Exception, e:
- # ok if dirsrv died this may fail, so let's try to quickly restart it
- # and see if we can get anything. If not throw our hands up and just
- # exit
+ # Issue reading the file ? Let's try to get data from LDAP as a
+ # fallback
try:
dirsrv.start(capture_output=False)
svc_list = get_config(dirsrv)
@@ -259,15 +284,9 @@ def ipa_stop(options):
def ipa_restart(options):
dirsrv = ipaservices.knownservices.dirsrv
+ new_svc_list = []
try:
- print "Restarting Directory Service"
- dirsrv.restart(capture_output=get_capture_output('dirsrv', options.debug))
- except Exception, e:
- raise IpactlError("Failed to restart Directory Service: " + str(e))
-
- svc_list = []
- try:
- svc_list = get_config(dirsrv)
+ new_svc_list = get_config(dirsrv)
except Exception, e:
emit_err("Failed to read data from Directory Service: " + str(e))
emit_err("Shutting down")
@@ -281,33 +300,119 @@ def ipa_restart(options):
else:
raise IpactlError()
- if len(svc_list) == 0:
- # no service to stop
- return
+ old_svc_list = []
+ try:
+ old_svc_list = get_config_from_file()
+ except Exception, e:
+ emit_err("Failed to get service list from file: " + str(e))
+ # fallback to what's in LDAP
+ old_svc_list = new_svc_list
- for (order, svc) in sorted(svc_list):
- svc_name = service.SERVICE_LIST[svc][0]
- svchandle = ipaservices.service(svc_name)
+ if len(new_svc_list) != 0:
+ dump_config_to_file(new_svc_list)
+
+ # match service to start/stop
+ svc_list = []
+ for s in new_svc_list:
+ if s in old_svc_list:
+ svc_list.append(s)
+
+ #remove commons
+ for s in svc_list:
+ if s in old_svc_list:
+ old_svc_list.remove(s)
+ for s in svc_list:
+ if s in new_svc_list:
+ new_svc_list.remove(s)
+
+ if len(old_svc_list) != 0:
+ # we need to definitely stop some services
+ for (order, svc) in sorted(old_svc_list, reverse=True):
+ svc_name = service.SERVICE_LIST[svc][0]
+ svchandle = ipaservices.service(svc_name)
+ try:
+ print "Stopping %s Service" % svc
+ svchandle.stop(capture_output=False)
+ except:
+ emit_err("Failed to stop %s Service" % svc)
+
+ try:
+ print "Restarting Directory Service"
+ dirsrv.restart(capture_output=get_capture_output('dirsrv', options.debug))
+ except Exception, e:
+ emit_err("Failed to restart Directory Service: " + str(e))
+ emit_err("Shutting down")
+ for (order, svc) in sorted(svc_list):
+ svc_name = service.SERVICE_LIST[svc][0]
+ svc_off = ipaservices.service(svc_name)
+ try:
+ svc_off.stop(capture_output=False)
+ except:
+ pass
try:
- print "Restarting %s Service" % svc
- svchandle.restart(capture_output=get_capture_output(svc_name, options.debug))
+ dirsrv.stop(capture_output=False)
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]
- svc_off = ipaservices.service(svc_name)
+ pass
+ raise IpactlError("Aborting ipactl")
+
+ if len(svc_list) != 0:
+ # there are services to restart
+
+ for (order, svc) in sorted(svc_list):
+ svc_name = service.SERVICE_LIST[svc][0]
+ svchandle = ipaservices.service(svc_name)
+ try:
+ print "Restarting %s Service" % svc
+ svchandle.restart(capture_output=get_capture_output(svc_name, options.debug))
+ 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]
+ svc_off = ipaservices.service(svc_name)
+ try:
+ svc_off.stop(capture_output=False)
+ except:
+ pass
try:
- svc_off.stop(capture_output=False)
+ dirsrv.stop(capture_output=False)
except:
pass
+ raise IpactlError("Aborting ipactl")
+
+ if len(new_svc_list) != 0:
+ # we still need to start some services
+ for (order, svc) in sorted(new_svc_list):
+ svc_name = service.SERVICE_LIST[svc][0]
+ svchandle = ipaservices.service(svc_name)
try:
- dirsrv.stop(capture_output=False)
+ print "Starting %s Service" % svc
+ svchandle.start(capture_output=get_capture_output(svc_name, options.debug))
except:
- pass
- raise IpactlError("Aborting ipactl")
+ 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]
+ svc_off = ipaservices.service(svc_name)
+ try:
+ svc_off.stop(capture_output=False)
+ except:
+ pass
+ try:
+ dirsrv.stop(capture_output=False)
+ except:
+ pass
+ raise IpactlError("Aborting ipactl")
def ipa_status(options):
+
+ try:
+ svc_list = get_config_from_file()
+ except IpactlError, e:
+ raise e
+ except Exception, e:
+ raise IpactlError("Failed to get list of services to probe status: " + str(e))
+
dirsrv = ipaservices.knownservices.dirsrv
try:
if dirsrv.is_running():
@@ -317,14 +422,6 @@ def ipa_status(options):
except:
raise IpactlError("Failed to get Directory Service status")
- svc_list = []
- try:
- svc_list = get_config(dirsrv)
- except IpactlError, e:
- raise e
- except Exception, e:
- raise IpactlError("Failed to get list of services to probe status: " + str(e))
-
if len(svc_list) == 0:
return