Harald Welte | e057146 | 2018-02-14 15:42:14 +0100 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
Pau Espin Pedrol | ad931f2 | 2019-10-02 13:00:51 +0200 | [diff] [blame] | 3 | PIDFILE_PCAP=/tmp/pcap.pid |
Oliver Smith | fbf3345 | 2021-12-16 12:44:42 +0100 | [diff] [blame] | 4 | TCPDUMP=$(command -v tcpdump) |
| 5 | DUMPCAP=$(command -v dumpcap) |
Pau Espin Pedrol | ad931f2 | 2019-10-02 13:00:51 +0200 | [diff] [blame] | 6 | |
| 7 | PIDFILE_NETCAT=/tmp/netcat.pid |
Oliver Smith | fbf3345 | 2021-12-16 12:44:42 +0100 | [diff] [blame] | 8 | NETCAT=$(command -v nc) |
Pau Espin Pedrol | ad931f2 | 2019-10-02 13:00:51 +0200 | [diff] [blame] | 9 | GSMTAP_PORT=4729 |
| 10 | |
Harald Welte | e057146 | 2018-02-14 15:42:14 +0100 | [diff] [blame] | 11 | TESTCASE=$1 |
| 12 | |
arehbein | cf8c450 | 2022-11-13 17:52:48 +0100 | [diff] [blame] | 13 | |
| 14 | SUDOSTR="" |
| 15 | if ! [ "$(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 |
| 19 | fi |
| 20 | |
Pau Espin Pedrol | ad931f2 | 2019-10-02 13:00:51 +0200 | [diff] [blame] | 21 | kill_rm_pidfile() { |
arehbein | cf8c450 | 2022-11-13 17:52:48 +0100 | [diff] [blame] | 22 | # NOTE: This requires you to be root or something like |
| 23 | # "laforge ALL=NOPASSWD: /usr/sbin/tcpdump, /bin/kill" in your sudoers file |
arehbein | e66c1f8 | 2022-11-28 22:39:21 +0100 | [diff] [blame] | 24 | 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 Pedrol | ad931f2 | 2019-10-02 13:00:51 +0200 | [diff] [blame] | 28 | rm $1 |
| 29 | fi |
| 30 | } |
| 31 | |
Neels Hofmeyr | ced8acf | 2019-02-26 05:03:22 +0100 | [diff] [blame] | 32 | echo "------ $TESTCASE ------" |
| 33 | date |
| 34 | |
Harald Welte | e057146 | 2018-02-14 15:42:14 +0100 | [diff] [blame] | 35 | if [ "z$TTCN3_PCAP_PATH" = "z" ]; then |
| 36 | TTCN3_PCAP_PATH=/tmp |
| 37 | fi |
| 38 | |
Pau Espin Pedrol | ad931f2 | 2019-10-02 13:00:51 +0200 | [diff] [blame] | 39 | kill_rm_pidfile $PIDFILE_NETCAT |
| 40 | kill_rm_pidfile $PIDFILE_PCAP |
Harald Welte | e057146 | 2018-02-14 15:42:14 +0100 | [diff] [blame] | 41 | |
arehbein | cf8c450 | 2022-11-13 17:52:48 +0100 | [diff] [blame] | 42 | CMD="$SUDOSTR $TCPDUMP -U" |
Max | 81487c8 | 2019-03-18 14:18:31 +0100 | [diff] [blame] | 43 | |
arehbein | a084fbe | 2022-11-02 00:48:32 +0100 | [diff] [blame] | 44 | if [ -x "$DUMPCAP" ]; then |
Max | 81487c8 | 2019-03-18 14:18:31 +0100 | [diff] [blame] | 45 | CAP_ERR="1" |
| 46 | if [ -x /sbin/setcap ]; then |
| 47 | # N. B: this check requires libcap2-bin package |
Harald Welte | 5b11d91 | 2020-12-11 15:33:48 +0100 | [diff] [blame] | 48 | /sbin/setcap -q -v 'cap_net_admin,cap_net_raw=pie' $DUMPCAP |
Max | 81487c8 | 2019-03-18 14:18:31 +0100 | [diff] [blame] | 49 | CAP_ERR="$?" |
| 50 | fi |
Eric Wild | c01eada | 2022-03-30 01:43:26 +0200 | [diff] [blame] | 51 | |
| 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 | |
Max | 81487c8 | 2019-03-18 14:18:31 +0100 | [diff] [blame] | 64 | if [ -u $DUMPCAP -o "$CAP_ERR" = "0" ]; then |
| 65 | CMD="$DUMPCAP -q" |
| 66 | else |
| 67 | echo "NOTE: unable to use dumpcap due to missing capabilities or suid bit" |
| 68 | fi |
| 69 | fi |
| 70 | |
Pau Espin Pedrol | ad931f2 | 2019-10-02 13:00:51 +0200 | [diff] [blame] | 71 | # Create a dummy sink for GSMTAP packets |
| 72 | $NETCAT -l -u -k -p $GSMTAP_PORT >/dev/null 2>$TESTCASE.netcat.stderr & |
| 73 | PID=$! |
| 74 | echo $PID > $PIDFILE_NETCAT |
| 75 | |
arehbein | bc85a32 | 2022-11-13 18:46:32 +0100 | [diff] [blame] | 76 | CMD_OUTFILE=$TTCN3_PCAP_PATH/$TESTCASE.pcap.stdout |
| 77 | CMD_OUTFILE_ERR=$TTCN3_PCAP_PATH/$TESTCASE.pcap.stderr |
| 78 | FIFO=/tmp/cmderr |
| 79 | if ! [ -e $FIFO ]; then |
| 80 | mkfifo $FIFO |
| 81 | else |
| 82 | echo "Warning: Named pipe already exists: $FIFO" |
| 83 | fi |
| 84 | |
| 85 | # Log stderr to CMD_OUTFILE and a dedicated error log file |
| 86 | tee $CMD_OUTFILE < $FIFO > $CMD_OUTFILE_ERR & |
| 87 | CMD_STR="$CMD -s 1500 -n -i any -w \"$TTCN3_PCAP_PATH/$TESTCASE.pcap\" >$CMD_OUTFILE 2>$FIFO &" |
| 88 | eval $CMD_STR |
| 89 | # $CMD -s 1500 -n -i any -w \"$TTCN3_PCAP_PATH/$TESTCASE.pcap\" >$CMD_OUTFILE & |
Harald Welte | e057146 | 2018-02-14 15:42:14 +0100 | [diff] [blame] | 90 | PID=$! |
Pau Espin Pedrol | ad931f2 | 2019-10-02 13:00:51 +0200 | [diff] [blame] | 91 | echo $PID > $PIDFILE_PCAP |
arehbein | bc85a32 | 2022-11-13 18:46:32 +0100 | [diff] [blame] | 92 | if [ -f $CMD_OUTFILE_ERR ] && [ $(wc -l $CMD_OUTFILE_ERR | awk '{print $1}') -ne 0 ]; then |
| 93 | echo "Warnings or error messages from command:" >&2 |
| 94 | echo " $CMD_STR" >&2 |
| 95 | echo "Message:" >&2 |
| 96 | echo "$(cat $CMD_OUTFILE_ERR)" | sed 's/^/\t/' >&2 |
| 97 | fi |
Pau Espin Pedrol | b01d313 | 2018-02-15 14:43:58 +0100 | [diff] [blame] | 98 | |
Max | e521445 | 2019-03-14 18:15:27 +0100 | [diff] [blame] | 99 | # Wait until packet dumper creates the pcap file and starts recording. |
| 100 | # We generate some traffic until we see packet dumper catches it. |
Pau Espin Pedrol | b01d313 | 2018-02-15 14:43:58 +0100 | [diff] [blame] | 101 | # Timeout is 10 seconds. |
Pau Espin Pedrol | 8fdd313 | 2018-02-15 16:01:50 +0100 | [diff] [blame] | 102 | ping 127.0.0.1 >/dev/null 2>&1 & |
| 103 | PID=$! |
Pau Espin Pedrol | b01d313 | 2018-02-15 14:43:58 +0100 | [diff] [blame] | 104 | i=0 |
Pau Espin Pedrol | 8fdd313 | 2018-02-15 16:01:50 +0100 | [diff] [blame] | 105 | while [ ! -f "$TTCN3_PCAP_PATH/$TESTCASE.pcap" ] || |
Alexander Couzens | d1f4095 | 2018-05-12 16:52:59 +0200 | [diff] [blame] | 106 | [ "$(stat -c '%s' "$TTCN3_PCAP_PATH/$TESTCASE.pcap")" -eq 32 ] |
Pau Espin Pedrol | b01d313 | 2018-02-15 14:43:58 +0100 | [diff] [blame] | 107 | do |
Max | e521445 | 2019-03-14 18:15:27 +0100 | [diff] [blame] | 108 | echo "Waiting for packet dumper to start... $i" |
Pau Espin Pedrol | b01d313 | 2018-02-15 14:43:58 +0100 | [diff] [blame] | 109 | sleep 1 |
| 110 | i=$((i+1)) |
Pau Espin Pedrol | 8fdd313 | 2018-02-15 16:01:50 +0100 | [diff] [blame] | 111 | if [ $i -eq 10 ]; then |
| 112 | break |
| 113 | fi |
Pau Espin Pedrol | b01d313 | 2018-02-15 14:43:58 +0100 | [diff] [blame] | 114 | done |
Pau Espin Pedrol | 8fdd313 | 2018-02-15 16:01:50 +0100 | [diff] [blame] | 115 | kill $PID |