tests: remotehost add execute_stop()

Before we have to kill an application we start in the thread - in most
cases using killall and sometimes kill other applicantions, e.g., tcpdump,
iper, iperf3, tshark.

With this patch we are able to stop/kill a single application/thread
instead, based on the pid file.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@gmail.com>
This commit is contained in:
Janusz Dziedzic 2020-09-26 13:26:54 +02:00 committed by Jouni Malinen
parent fed855d5dd
commit 14d28a655a

View file

@ -8,6 +8,7 @@ import logging
import subprocess import subprocess
import threading import threading
import tempfile import tempfile
import os
logger = logging.getLogger() logger = logging.getLogger()
@ -34,6 +35,17 @@ def execute_thread(command, reply):
reply.append(status) reply.append(status)
reply.append(buf) reply.append(buf)
def gen_reaper_file(conf):
fd, filename = tempfile.mkstemp(dir='/tmp', prefix=conf + '-')
f = os.fdopen(fd, 'w')
f.write("#!/bin/sh\n")
f.write("name=\"$(basename $0)\"\n")
f.write("echo $$ > /tmp/$name.pid\n")
f.write("exec \"$@\"\n");
return filename;
class Host(): class Host():
def __init__(self, host=None, ifname=None, port=None, name="", user="root"): def __init__(self, host=None, ifname=None, port=None, name="", user="root"):
self.host = host self.host = host
@ -86,17 +98,55 @@ class Host():
return status, buf.decode() return status, buf.decode()
# async execute # async execute
def execute_run(self, command, res): def execute_run(self, command, res, use_reaper=True):
if self.host is None: if use_reaper:
cmd = command filename = gen_reaper_file("reaper")
self.send_file(filename, filename)
self.execute(["chmod", "755", filename])
_command = [filename] + command
else: else:
cmd = ["ssh", self.user + "@" + self.host, ' '.join(command)] filename = ""
_command = command
if self.host is None:
cmd = _command
else:
cmd = ["ssh", self.user + "@" + self.host, ' '.join(_command)]
_cmd = self.name + " execute_run: " + ' '.join(cmd) _cmd = self.name + " execute_run: " + ' '.join(cmd)
logger.debug(_cmd) logger.debug(_cmd)
t = threading.Thread(target=execute_thread, args=(cmd, res)) t = threading.Thread(target=execute_thread, name=filename, args=(cmd, res))
t.start() t.start()
return t return t
def execute_stop(self, t):
if t.name.find("reaper") == -1:
raise Exception("use_reaper required")
pid_file = t.name + ".pid"
if t.isAlive():
cmd = ["kill `cat " + pid_file + "`"]
self.execute(cmd)
# try again
self.wait_execute_complete(t, 5)
if t.isAlive():
cmd = ["kill `cat " + pid_file + "`"]
self.execute(cmd)
# try with -9
self.wait_execute_complete(t, 5)
if t.isAlive():
cmd = ["kill -9 `cat " + pid_file + "`"]
self.execute(cmd)
self.wait_execute_complete(t, 5)
if t.isAlive():
raise Exception("thread still alive")
self.execute(["rm", pid_file])
self.execute(["rm", t.name])
def wait_execute_complete(self, t, wait=None): def wait_execute_complete(self, t, wait=None):
if wait == None: if wait == None:
wait_str = "infinite" wait_str = "infinite"