]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: remotehost add execute_stop()
authorJanusz Dziedzic <janusz.dziedzic@gmail.com>
Sat, 26 Sep 2020 11:26:54 +0000 (13:26 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 9 Oct 2020 08:15:42 +0000 (11:15 +0300)
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>
tests/hwsim/remotehost.py

index b87b58936f036e521f24d6ec62ece2c61396590d..a1ef1f34bd9dbc357d7115eb0d1124d6c9692ed8 100644 (file)
@@ -8,6 +8,7 @@ import logging
 import subprocess
 import threading
 import tempfile
+import os
 
 logger = logging.getLogger()
 
@@ -34,6 +35,17 @@ def execute_thread(command, reply):
     reply.append(status)
     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():
     def __init__(self, host=None, ifname=None, port=None, name="", user="root"):
         self.host = host
@@ -86,17 +98,55 @@ class Host():
         return status, buf.decode()
 
     # async execute
-    def execute_run(self, command, res):
+    def execute_run(self, command, res, use_reaper=True):
+        if use_reaper:
+            filename = gen_reaper_file("reaper")
+            self.send_file(filename, filename)
+            self.execute(["chmod", "755", filename])
+            _command = [filename] + command
+        else:
+            filename = ""
+            _command = command
+
         if self.host is None:
-            cmd = command
+            cmd = _command
         else:
-            cmd = ["ssh", self.user + "@" + self.host, ' '.join(command)]
+            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 = threading.Thread(target=execute_thread, name=filename, args=(cmd, res))
         t.start()
         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):
         if wait == None:
             wait_str = "infinite"