blob: 8bba72f92744d92ccb022beee3f54aab674576af [file] [log] [blame]
Harald Weltee0571462018-02-14 15:42:14 +01001#!/bin/sh
2
Pau Espin Pedrolad931f22019-10-02 13:00:51 +02003PIDFILE_PCAP=/tmp/pcap.pid
Oliver Smithfbf33452021-12-16 12:44:42 +01004TCPDUMP=$(command -v tcpdump)
5DUMPCAP=$(command -v dumpcap)
Pau Espin Pedrolad931f22019-10-02 13:00:51 +02006
7PIDFILE_NETCAT=/tmp/netcat.pid
Oliver Smithfbf33452021-12-16 12:44:42 +01008NETCAT=$(command -v nc)
Pau Espin Pedrolad931f22019-10-02 13:00:51 +02009GSMTAP_PORT=4729
10
Harald Weltee0571462018-02-14 15:42:14 +010011TESTCASE=$1
12
arehbeincf8c4502022-11-13 17:52:48 +010013
14SUDOSTR=""
15if ! [ "$(id -u)" = "0" ]; then
16 SUDOSTR="sudo -n"
17 # Otherwise, if sudo /usr/bin/kill, sudo /usr/bin/tcpdump cannot be run without a password prompt,
18 # and this script will hang indefinitely
19fi
20
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020021kill_rm_pidfile() {
arehbeincf8c4502022-11-13 17:52:48 +010022 # NOTE: This requires you to be root or something like
23 # "laforge ALL=NOPASSWD: /usr/sbin/tcpdump, /bin/kill" in your sudoers file
24 if ! [ -e "$1" ] && [ -s "$1" ]; then
25 $SUDOSTR kill "$(cat "$1")" 2>&1 | grep -v "No such process"
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020026 rm $1
27 fi
28}
29
Neels Hofmeyrced8acf2019-02-26 05:03:22 +010030echo "------ $TESTCASE ------"
31date
32
Harald Weltee0571462018-02-14 15:42:14 +010033if [ "z$TTCN3_PCAP_PATH" = "z" ]; then
34 TTCN3_PCAP_PATH=/tmp
35fi
36
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020037kill_rm_pidfile $PIDFILE_NETCAT
38kill_rm_pidfile $PIDFILE_PCAP
Harald Weltee0571462018-02-14 15:42:14 +010039
arehbeincf8c4502022-11-13 17:52:48 +010040CMD="$SUDOSTR $TCPDUMP -U"
Max81487c82019-03-18 14:18:31 +010041
arehbeina084fbe2022-11-02 00:48:32 +010042if [ -x "$DUMPCAP" ]; then
Max81487c82019-03-18 14:18:31 +010043 CAP_ERR="1"
44 if [ -x /sbin/setcap ]; then
45 # N. B: this check requires libcap2-bin package
Harald Welte5b11d912020-12-11 15:33:48 +010046 /sbin/setcap -q -v 'cap_net_admin,cap_net_raw=pie' $DUMPCAP
Max81487c82019-03-18 14:18:31 +010047 CAP_ERR="$?"
48 fi
Eric Wildc01eada2022-03-30 01:43:26 +020049
50 # did we implicitly inherit all those caps because we're root in a netns?
51 if [ -u $DUMPCAP -o "$CAP_ERR" = "1" ]; then
52 getpcaps 0 2>&1 | grep -e cap_net_admin | grep -q -e cap_net_raw
53 CAP_ERR="$?"
54 fi
55
56 # did we implicitly inherit all those caps because we're root in a netns?
57 if [ -u $DUMPCAP -o "$CAP_ERR" = "1" ]; then
58 getpcaps 0 2>&1 | grep -q -e " =ep" # all perms
59 CAP_ERR="$?"
60 fi
61
Max81487c82019-03-18 14:18:31 +010062 if [ -u $DUMPCAP -o "$CAP_ERR" = "0" ]; then
63 CMD="$DUMPCAP -q"
64 else
65 echo "NOTE: unable to use dumpcap due to missing capabilities or suid bit"
66 fi
67fi
68
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020069# Create a dummy sink for GSMTAP packets
70$NETCAT -l -u -k -p $GSMTAP_PORT >/dev/null 2>$TESTCASE.netcat.stderr &
71PID=$!
72echo $PID > $PIDFILE_NETCAT
73
Maxe5214452019-03-14 18:15:27 +010074$CMD -s 1500 -n -i any -w "$TTCN3_PCAP_PATH/$TESTCASE.pcap" >$TTCN3_PCAP_PATH/$TESTCASE.pcap.stdout 2>&1 &
Harald Weltee0571462018-02-14 15:42:14 +010075PID=$!
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020076echo $PID > $PIDFILE_PCAP
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +010077
Maxe5214452019-03-14 18:15:27 +010078# Wait until packet dumper creates the pcap file and starts recording.
79# We generate some traffic until we see packet dumper catches it.
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +010080# Timeout is 10 seconds.
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +010081ping 127.0.0.1 >/dev/null 2>&1 &
82PID=$!
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +010083i=0
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +010084while [ ! -f "$TTCN3_PCAP_PATH/$TESTCASE.pcap" ] ||
Alexander Couzensd1f40952018-05-12 16:52:59 +020085 [ "$(stat -c '%s' "$TTCN3_PCAP_PATH/$TESTCASE.pcap")" -eq 32 ]
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +010086do
Maxe5214452019-03-14 18:15:27 +010087 echo "Waiting for packet dumper to start... $i"
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +010088 sleep 1
89 i=$((i+1))
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +010090 if [ $i -eq 10 ]; then
91 break
92 fi
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +010093done
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +010094kill $PID