aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/osmo_gsm_tester/process.py5
-rwxr-xr-xutils/osmo-gsm-tester_netns_exec.sh38
2 files changed, 42 insertions, 1 deletions
diff --git a/src/osmo_gsm_tester/process.py b/src/osmo_gsm_tester/process.py
index 7ecb67e..441d4ea 100644
--- a/src/osmo_gsm_tester/process.py
+++ b/src/osmo_gsm_tester/process.py
@@ -363,6 +363,11 @@ class NetNSProcess(Process):
# HACK: Since we run under sudo, only way to kill root-owned process is to kill as root...
# This function is overwritten from Process.
def send_signal(self, sig):
+ if sig == signal.SIGKILL:
+ # if we kill sudo, its children (bash running NETNS_EXEC_BIN +
+ # tcpdump under it) are kept alive. Let's instead tell the script to
+ # kill tcpdump:
+ sig = signal.SIGUSR1
kill_cmd = ('kill', '-%d' % int(sig), str(self.process_obj.pid))
run_local_netns_sync(self.run_dir, self.name()+"-kill"+str(sig), self.netns, kill_cmd)
diff --git a/utils/osmo-gsm-tester_netns_exec.sh b/utils/osmo-gsm-tester_netns_exec.sh
index 336b746..182ebff 100755
--- a/utils/osmo-gsm-tester_netns_exec.sh
+++ b/utils/osmo-gsm-tester_netns_exec.sh
@@ -1,5 +1,41 @@
#!/bin/bash
netns="$1"
shift
+
+child_ps=0
+forward_kill() {
+ sig="$1"
+ echo "Caught signal SIG$sig!"
+ if [ "$child_ps" != "0" ]; then
+ echo "Killing $child_ps with SIG$sig!"
+ kill -SIG${sig} $child_ps
+ else
+ exit 0
+ fi
+}
+forward_kill_int() {
+ forward_kill "INT"
+}
+forward_kill_term() {
+ forward_kill "TERM"
+}
+forward_kill_usr1() {
+ # Special signal received from osmo-gsm-tester to tell child to SIGKILL
+ echo "Converting SIGUSR1->SIGKILL"
+ forward_kill "KILL"
+}
+# Don't use 'set -e', otherwise traps are not triggered!
+trap forward_kill_int INT
+trap forward_kill_term TERM
+trap forward_kill_usr1 USR1
+
#TODO: Later on I may want to call myself with specific ENV and calling sudo in order to run inside the netns but with dropped privileges
-ip netns exec $netns "$@"
+ip netns exec $netns "$@" &
+child_ps=$!
+
+echo "$$: waiting for $child_ps"
+wait "$child_ps"
+child_exit_code="$?"
+echo "child exited with $child_exit_code"
+
+exit $child_exit_code