blob: 4068b261f6a55a7b617e49bbf1fff1ce6ac25eb8 [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
arehbeine66c1f82022-11-28 22:39:21 +010024 if [ -e "$1" ]; then
25 if [ -s "$1" ]; then
26 $SUDOSTR kill "$(cat "$1")" 2>&1 | grep -v "No such process"
27 fi
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020028 rm $1
29 fi
30}
31
Neels Hofmeyrced8acf2019-02-26 05:03:22 +010032echo "------ $TESTCASE ------"
33date
34
Harald Weltee0571462018-02-14 15:42:14 +010035if [ "z$TTCN3_PCAP_PATH" = "z" ]; then
36 TTCN3_PCAP_PATH=/tmp
37fi
38
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020039kill_rm_pidfile $PIDFILE_NETCAT
40kill_rm_pidfile $PIDFILE_PCAP
Harald Weltee0571462018-02-14 15:42:14 +010041
arehbeincf8c4502022-11-13 17:52:48 +010042CMD="$SUDOSTR $TCPDUMP -U"
Max81487c82019-03-18 14:18:31 +010043
arehbeina084fbe2022-11-02 00:48:32 +010044if [ -x "$DUMPCAP" ]; then
Max81487c82019-03-18 14:18:31 +010045 CAP_ERR="1"
46 if [ -x /sbin/setcap ]; then
47 # N. B: this check requires libcap2-bin package
Harald Welte5b11d912020-12-11 15:33:48 +010048 /sbin/setcap -q -v 'cap_net_admin,cap_net_raw=pie' $DUMPCAP
Max81487c82019-03-18 14:18:31 +010049 CAP_ERR="$?"
50 fi
Eric Wildc01eada2022-03-30 01:43:26 +020051
52 # did we implicitly inherit all those caps because we're root in a netns?
53 if [ -u $DUMPCAP -o "$CAP_ERR" = "1" ]; then
54 getpcaps 0 2>&1 | grep -e cap_net_admin | grep -q -e cap_net_raw
55 CAP_ERR="$?"
56 fi
57
58 # did we implicitly inherit all those caps because we're root in a netns?
59 if [ -u $DUMPCAP -o "$CAP_ERR" = "1" ]; then
60 getpcaps 0 2>&1 | grep -q -e " =ep" # all perms
61 CAP_ERR="$?"
62 fi
63
Max81487c82019-03-18 14:18:31 +010064 if [ -u $DUMPCAP -o "$CAP_ERR" = "0" ]; then
Pau Espin Pedrol9ae82de2024-05-17 17:42:33 +020065 # dumpcap, *after dropping permissions*, needs to be able to write to the directory to create the pcap file:
66 if [ "$(stat -L -c "%u" "$TTCN3_PCAP_PATH")" = "$(id -u)" ] && [ "$(stat -L -c "%A" "$TTCN3_PCAP_PATH" | head -c 4)" = "drwx" ]; then
67 CMD="$DUMPCAP -q"
68 else
69 echo "NOTE: unable to use dumpcap due to missing permissions in $TTCN3_PCAP_PATH"
70 fi
Max81487c82019-03-18 14:18:31 +010071 else
72 echo "NOTE: unable to use dumpcap due to missing capabilities or suid bit"
73 fi
74fi
75
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020076# Create a dummy sink for GSMTAP packets
77$NETCAT -l -u -k -p $GSMTAP_PORT >/dev/null 2>$TESTCASE.netcat.stderr &
78PID=$!
79echo $PID > $PIDFILE_NETCAT
80
arehbeinbc85a322022-11-13 18:46:32 +010081CMD_OUTFILE=$TTCN3_PCAP_PATH/$TESTCASE.pcap.stdout
82CMD_OUTFILE_ERR=$TTCN3_PCAP_PATH/$TESTCASE.pcap.stderr
83FIFO=/tmp/cmderr
84if ! [ -e $FIFO ]; then
85 mkfifo $FIFO
86else
87 echo "Warning: Named pipe already exists: $FIFO"
88fi
89
90# Log stderr to CMD_OUTFILE and a dedicated error log file
91tee $CMD_OUTFILE < $FIFO > $CMD_OUTFILE_ERR &
Pau Espin Pedrol7ae55ea2024-02-27 18:35:07 +010092CMD_STR="$CMD -s 1520 -n -i any -w \"$TTCN3_PCAP_PATH/$TESTCASE.pcap\" >$CMD_OUTFILE 2>$FIFO &"
Pau Espin Pedrolc9bed002024-05-17 16:52:37 +020093echo "$CMD_STR"
arehbeinbc85a322022-11-13 18:46:32 +010094eval $CMD_STR
Pau Espin Pedrol7ae55ea2024-02-27 18:35:07 +010095# $CMD -s 1520 -n -i any -w \"$TTCN3_PCAP_PATH/$TESTCASE.pcap\" >$CMD_OUTFILE &
Harald Weltee0571462018-02-14 15:42:14 +010096PID=$!
Pau Espin Pedrolad931f22019-10-02 13:00:51 +020097echo $PID > $PIDFILE_PCAP
arehbeinbc85a322022-11-13 18:46:32 +010098if [ -f $CMD_OUTFILE_ERR ] && [ $(wc -l $CMD_OUTFILE_ERR | awk '{print $1}') -ne 0 ]; then
99 echo "Warnings or error messages from command:" >&2
100 echo " $CMD_STR" >&2
101 echo "Message:" >&2
102 echo "$(cat $CMD_OUTFILE_ERR)" | sed 's/^/\t/' >&2
103fi
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +0100104
Maxe5214452019-03-14 18:15:27 +0100105# Wait until packet dumper creates the pcap file and starts recording.
106# We generate some traffic until we see packet dumper catches it.
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +0100107# Timeout is 10 seconds.
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +0100108ping 127.0.0.1 >/dev/null 2>&1 &
109PID=$!
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +0100110i=0
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +0100111while [ ! -f "$TTCN3_PCAP_PATH/$TESTCASE.pcap" ] ||
Alexander Couzensd1f40952018-05-12 16:52:59 +0200112 [ "$(stat -c '%s' "$TTCN3_PCAP_PATH/$TESTCASE.pcap")" -eq 32 ]
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +0100113do
Maxe5214452019-03-14 18:15:27 +0100114 echo "Waiting for packet dumper to start... $i"
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +0100115 sleep 1
116 i=$((i+1))
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +0100117 if [ $i -eq 10 ]; then
Pau Espin Pedrol5d800742024-05-15 18:25:22 +0200118 echo "Packet dumper didn't start filling pcap file after $i seconds!!!"
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +0100119 break
120 fi
Pau Espin Pedrolb01d3132018-02-15 14:43:58 +0100121done
Pau Espin Pedrol8fdd3132018-02-15 16:01:50 +0100122kill $PID