summaryrefslogtreecommitdiffstats
path: root/vstf/vstf/agent/env/basic/commandline.py
diff options
context:
space:
mode:
Diffstat (limited to 'vstf/vstf/agent/env/basic/commandline.py')
-rwxr-xr-xvstf/vstf/agent/env/basic/commandline.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/vstf/vstf/agent/env/basic/commandline.py b/vstf/vstf/agent/env/basic/commandline.py
new file mode 100755
index 00000000..0df037d8
--- /dev/null
+++ b/vstf/vstf/agent/env/basic/commandline.py
@@ -0,0 +1,46 @@
+import subprocess
+import threading
+import logging
+from vstf.common import constants
+
+LOG = logging.getLogger(__name__)
+
+
+class CommandLine(object):
+ def __init__(self):
+ super(CommandLine, self).__init__()
+ self.proc = None
+ self.is_timeout = False
+
+ def __kill_proc(self):
+ self.is_timeout = True
+ self.proc.kill()
+
+ def execute(self, cmd, timeout=constants.TIMEOUT, shell=False):
+ """this func call subprocess.Popen(),
+ here setup a timer to deal with timeout.
+ :param cmd: cmd list like ['ls', 'home']
+ :param timeout: for timer count for timeout
+ :return: (ret, output) the output (stdout+'\n'+stderr)
+ """
+ # reset the timeout flag
+ self.is_timeout = False
+ self.proc = subprocess.Popen(cmd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ shell=shell)
+
+ timer = threading.Timer(timeout, self.__kill_proc, [])
+ timer.start()
+ stdout, stderr = self.proc.communicate()
+ timer.cancel()
+
+ if self.proc.returncode or self.is_timeout:
+ if self.is_timeout:
+ LOG.error("run cmd<%(cmd)s> timeout", {"cmd": cmd})
+ ret = False
+ output = "".join([stderr, stdout])
+ else:
+ ret = True
+ output = stdout
+ return ret, output