diff --git a/soscollector/sosnode.py b/soscollector/sosnode.py index 44d21c4..7fdb524 100644 --- a/soscollector/sosnode.py +++ b/soscollector/sosnode.py @@ -26,7 +26,6 @@ import six from distutils.version import LooseVersion from pipes import quote from soscollector.exceptions import * -from subprocess import Popen, PIPE class SosNode(): @@ -308,7 +307,7 @@ class SosNode(): sudo or su - as appropriate and to input the password force_local - force a command to run locally. Mainly used for scp. ''' - if not self.control_socket_exists: + if not self.control_socket_exists and not self.local: self.log_debug('Control socket does not exist, attempting to ' 're-create') try: @@ -333,42 +332,21 @@ class SosNode(): get_pty = True if not self.local and not force_local: cmd = "%s %s" % (self.ssh_cmd, quote(cmd)) - res = pexpect.spawn(cmd, encoding='utf-8') - if need_root: - if self.config['need_sudo']: - res.sendline(self.config['sudo_pw']) - if self.config['become_root']: - res.sendline(self.config['root_password']) - output = res.expect([pexpect.EOF, pexpect.TIMEOUT], - timeout=timeout) - if output == 0: - out = res.before - res.close() - rc = res.exitstatus - return {'status': rc, 'stdout': out} - elif output == 1: - raise CommandTimeoutException(cmd) - else: - try: - proc = Popen(shlex.split(cmd), shell=get_pty, stdin=PIPE, - stdout=PIPE, stderr=PIPE) - if self.config['become_root'] and need_root: - stdout, stderr = proc.communicate( - input=self.config['root_password'] + '\n' - ) - elif self.config['need_sudo'] and need_root: - stdout, stderr = proc.communicate( - input=self.config['sudo_pw'] + '\n' - ) - else: - stdout, stderr = proc.communicate() - proc.wait() - rc = proc.returncode - return {'status': rc, 'stdout': stdout or stderr} - except Exception as err: - self.log_error("Exception while running command %s: %s" - % (cmd, err)) - raise + res = pexpect.spawn(cmd, encoding='utf-8') + if need_root: + if self.config['need_sudo']: + res.sendline(self.config['sudo_pw']) + if self.config['become_root']: + res.sendline(self.config['root_password']) + output = res.expect([pexpect.EOF, pexpect.TIMEOUT], + timeout=timeout) + if output == 0: + out = res.before + res.close() + rc = res.exitstatus + return {'status': rc, 'stdout': out} + elif output == 1: + raise CommandTimeoutException(cmd) def sosreport(self): '''Run a sosreport on the node, then collect it'''