diff options
author | Simo Sorce <ssorce@redhat.com> | 2011-01-17 09:17:08 -0500 |
---|---|---|
committer | Simo Sorce <ssorce@redhat.com> | 2011-01-18 10:04:19 -0500 |
commit | 373455026e37d93c699e4ced579c75e2af8042aa (patch) | |
tree | 4144361e332739fa4eb4cf3cb2e514ab736cf643 | |
parent | e73efb9a9000c2efb73297340c6268d59a11b6fc (diff) | |
download | freeipa-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-x | install/tools/ipactl | 28 | ||||
-rw-r--r-- | ipapython/ipautil.py | 27 | ||||
-rw-r--r-- | ipaserver/install/service.py | 27 |
3 files changed, 48 insertions, 34 deletions
diff --git a/install/tools/ipactl b/install/tools/ipactl index 059b8604..ee6783ed 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 8ce8bb97..69a410f4 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 ef3becdf..1235eaff 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) |