summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2011-01-17 09:17:08 -0500
committerSimo Sorce <ssorce@redhat.com>2011-01-18 10:04:19 -0500
commit373455026e37d93c699e4ced579c75e2af8042aa (patch)
tree4144361e332739fa4eb4cf3cb2e514ab736cf643
parente73efb9a9000c2efb73297340c6268d59a11b6fc (diff)
downloadfreeipa-373455026e37d93c699e4ced579c75e2af8042aa.tar.gz
freeipa-373455026e37d93c699e4ced579c75e2af8042aa.tar.xz
freeipa-373455026e37d93c699e4ced579c75e2af8042aa.zip
Add a way to print output from commands
Instead pof always capturing the output, make it possible to let it go to the standard output pipes. Use this in ipactl to let init scripts show their output. Fixes: https://fedorahosted.org/freeipa/ticket/765
-rwxr-xr-xinstall/tools/ipactl28
-rw-r--r--ipapython/ipautil.py27
-rw-r--r--ipaserver/install/service.py27
3 files changed, 48 insertions, 34 deletions
diff --git a/install/tools/ipactl b/install/tools/ipactl
index 059b86049..ee6783ed3 100755
--- a/install/tools/ipactl
+++ b/install/tools/ipactl
@@ -88,7 +88,7 @@ def ipa_start(serverid):
try:
print "Starting Directory Service"
- service.start('dirsrv', instance_name=serverid)
+ service.start('dirsrv', instance_name=serverid, capture_output=False)
except:
emit_err("Failed to start Directory Service")
return
@@ -99,7 +99,7 @@ def ipa_start(serverid):
except:
emit_err("Failed to read data from Directory Service")
emit_err("Shutting down")
- service.stop('dirsrv', instance_name=serverid)
+ service.stop('dirsrv', instance_name=serverid, capture_output=False)
if len(svc_list) == 0:
return
@@ -108,18 +108,18 @@ def ipa_start(serverid):
svc_name = service.SERVICE_LIST[svc][0]
try:
print "Starting %s Service" % svc
- service.start(svc_name)
+ service.start(svc_name, capture_output=False)
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)
+ service.stop(svc_name, capture_output=False)
except:
pass
try:
- service.stop('dirsrv', instance_name=serverid)
+ service.stop('dirsrv', instance_name=serverid, capture_output=False)
except:
pass
return
@@ -134,12 +134,12 @@ def ipa_stop(serverid):
# and see if we can get anything. If not throw our hands up and just
# exit
try:
- service.start('dirsrv', instance_name=serverid)
+ service.start('dirsrv', instance_name=serverid, capture_output=False)
svc_list = get_config()
except:
emit_err("Failed to read data from Directory Service")
emit_err("Shutting down")
- service.stop('dirsrv', instance_name=serverid)
+ service.stop('dirsrv', instance_name=serverid, capture_output=False)
if len(svc_list) == 0:
return
@@ -148,13 +148,13 @@ def ipa_stop(serverid):
svc_name = service.SERVICE_LIST[svc][0]
try:
print "Stopping %s Service" % svc
- service.stop(svc_name)
+ service.stop(svc_name, capture_output=False)
except:
emit_err("Failed to stop %s Service" % svc)
try:
print "Stopping Directory Service"
- service.stop('dirsrv', instance_name=serverid)
+ service.stop('dirsrv', instance_name=serverid, capture_output=False)
except:
emit_err("Failed to stop Directory Service")
return
@@ -163,7 +163,7 @@ def ipa_stop(serverid):
def ipa_restart(serverid):
try:
print "Restarting Directory Service"
- service.restart('dirsrv', instance_name=serverid)
+ service.restart('dirsrv', instance_name=serverid, capture_output=False)
except:
emit_err("Failed to restart Directory Service")
return
@@ -174,7 +174,7 @@ def ipa_restart(serverid):
except:
emit_err("Failed to read data from Directory Service")
emit_err("Shutting down")
- service.stop('dirsrv', instance_name=serverid)
+ service.stop('dirsrv', instance_name=serverid, capture_output=False)
if len(svc_list) == 0:
return
@@ -183,18 +183,18 @@ def ipa_restart(serverid):
svc_name = service.SERVICE_LIST[svc][0]
try:
print "Restarting %s Service" % svc
- service.restart(svc_name)
+ service.restart(svc_name, 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]
try:
- service.stop(svc_name)
+ service.stop(svc_name, capture_output=False)
except:
pass
try:
- service.stop('dirsrv', instance_name=serverid)
+ service.stop('dirsrv', instance_name=serverid, capture_output=False)
except:
pass
return
diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py
index 8ce8bb970..69a410f43 100644
--- a/ipapython/ipautil.py
+++ b/ipapython/ipautil.py
@@ -92,7 +92,8 @@ def write_tmp_file(txt):
return fd
-def run(args, stdin=None, raiseonerr=True, nolog=(), env=None):
+def run(args, stdin=None, raiseonerr=True,
+ nolog=(), env=None, capture_output=True):
"""
Execute a command and return stdin, stdout and the process return code.
@@ -116,14 +117,23 @@ def run(args, stdin=None, raiseonerr=True, nolog=(), env=None):
If an value isn't found in the list it is silently ignored.
"""
+ p_in = None
+ p_out = None
+ p_err = None
+
if env is None:
env={"PATH": "/bin:/sbin:/usr/kerberos/bin:/usr/kerberos/sbin:/usr/bin:/usr/sbin"}
if stdin:
- p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, env=env)
- stdout,stderr = p.communicate(stdin)
- else:
- p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, env=env)
- stdout,stderr = p.communicate()
+ p_in = subprocess.PIPE
+ if capture_output:
+ p_out = subprocess.PIPE
+ p_err = subprocess.PIPE
+ elif len(nolog):
+ raise RuntimeError("Can't use nolog if output is not captured")
+
+ p = subprocess.Popen(args, stdin=p_in, stdout=p_out, stderr=p_err,
+ close_fds=True, env=env)
+ stdout,stderr = p.communicate(stdin)
# The command and its output may include passwords that we don't want
# to log. Run through the nolog items.
@@ -137,8 +147,9 @@ def run(args, stdin=None, raiseonerr=True, nolog=(), env=None):
stdout = stdout.replace(quoted, 'XXXXXXXX')
stderr = stderr.replace(quoted, 'XXXXXXXX')
logging.info('args=%s' % args)
- logging.info('stdout=%s' % stdout)
- logging.info('stderr=%s' % stderr)
+ if capture_output:
+ logging.info('stdout=%s' % stdout)
+ logging.info('stderr=%s' % stderr)
if p.returncode != 0 and raiseonerr:
raise CalledProcessError(p.returncode, args)
diff --git a/ipaserver/install/service.py b/ipaserver/install/service.py
index ef3becdf3..1235eaffd 100644
--- a/ipaserver/install/service.py
+++ b/ipaserver/install/service.py
@@ -41,14 +41,17 @@ SERVICE_LIST = {
'CA':('pki-cad', 50)
}
-def stop(service_name, instance_name=""):
- ipautil.run(["/sbin/service", service_name, "stop", instance_name])
+def stop(service_name, instance_name="", capture_output=True):
+ ipautil.run(["/sbin/service", service_name, "stop", instance_name],
+ capture_output=capture_output)
-def start(service_name, instance_name=""):
- ipautil.run(["/sbin/service", service_name, "start", instance_name])
+def start(service_name, instance_name="", capture_output=True):
+ ipautil.run(["/sbin/service", service_name, "start", instance_name],
+ capture_output=capture_output)
-def restart(service_name, instance_name=""):
- ipautil.run(["/sbin/service", service_name, "restart", instance_name])
+def restart(service_name, instance_name="", capture_output=True):
+ ipautil.run(["/sbin/service", service_name, "restart", instance_name],
+ capture_output=capture_output)
def is_running(service_name, instance_name=""):
ret = True
@@ -217,14 +220,14 @@ class Service:
def set_output(self, fd):
self.output_fd = fd
- def stop(self, instance_name=""):
- stop(self.service_name, instance_name)
+ def stop(self, instance_name="", capture_output=True):
+ stop(self.service_name, instance_name, capture_output=capture_output)
- def start(self, instance_name=""):
- start(self.service_name, instance_name)
+ def start(self, instance_name="", capture_output=True):
+ start(self.service_name, instance_name, capture_output=capture_output)
- def restart(self, instance_name=""):
- restart(self.service_name, instance_name)
+ def restart(self, instance_name="", capture_output=True):
+ restart(self.service_name, instance_name, capture_output=capture_output)
def is_running(self):
return is_running(self.service_name)