123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- # Host class
- # Copyright (c) 2016, Qualcomm Atheros, Inc.
- #
- # This software may be distributed under the terms of the BSD license.
- # See README for more details.
- import logging
- import subprocess
- import threading
- logger = logging.getLogger()
- def remote_compatible(func):
- func.remote_compatible = True
- return func
- def execute_thread(command, reply):
- cmd = ' '.join(command)
- logger.debug("thread run: " + cmd)
- try:
- status = 0
- buf = subprocess.check_output(command, stderr=subprocess.STDOUT)
- except subprocess.CalledProcessError as e:
- status = e.returncode
- buf = e.output
- logger.debug("thread cmd: " + cmd)
- logger.debug("thread exit status: " + str(status))
- logger.debug("thread exit buf: " + str(buf))
- reply.append(status)
- reply.append(buf)
- class Host():
- def __init__(self, host=None, ifname=None, port=None, name="", user="root"):
- self.host = host
- self.name = name
- self.user = user
- self.monitors = []
- self.monitor_thread = None
- self.logs = []
- self.ifname = ifname
- self.port = port
- self.dev = None
- if self.name == "" and host != None:
- self.name = host
- def local_execute(self, command):
- logger.debug("execute: " + str(command))
- try:
- status = 0
- buf = subprocess.check_output(command, stderr=subprocess.STDOUT)
- except subprocess.CalledProcessError as e:
- status = e.returncode
- buf = e.output
- logger.debug("status: " + str(status))
- logger.debug("buf: " + str(buf))
- return status, buf
- def execute(self, command):
- if self.host is None:
- return self.local_execute(command)
- cmd = ["ssh", self.user + "@" + self.host, ' '.join(command)]
- _cmd = self.name + " execute: " + ' '.join(cmd)
- logger.debug(_cmd)
- try:
- status = 0
- buf = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- except subprocess.CalledProcessError as e:
- status = e.returncode
- buf = e.output
- logger.debug(self.name + " status: " + str(status))
- logger.debug(self.name + " buf: " + str(buf))
- return status, buf
- # async execute
- def execute_run(self, command, res):
- if self.host is None:
- cmd = command
- else:
- cmd = ["ssh", self.user + "@" + self.host, ' '.join(command)]
- _cmd = self.name + " execute_run: " + ' '.join(cmd)
- logger.debug(_cmd)
- t = threading.Thread(target = execute_thread, args=(cmd, res))
- t.start()
- return t
- def wait_execute_complete(self, t, wait=None):
- if wait == None:
- wait_str = "infinite"
- else:
- wait_str = str(wait) + "s"
- logger.debug(self.name + " wait_execute_complete(" + wait_str + "): ")
- if t.isAlive():
- t.join(wait)
- def add_log(self, log_file):
- self.logs.append(log_file)
- def get_logs(self, local_log_dir=None):
- for log in self.logs:
- if local_log_dir:
- self.local_execute(["scp", self.user + "@[" + self.host + "]:" + log, local_log_dir])
- self.execute(["rm", log])
- del self.logs[:]
|