From 4a5fe76c3ba32f1232ef81d83e7f7abb89ea8537 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Fri, 13 May 2022 22:28:21 -0700 Subject: [PATCH] Random ping utility, to be used by a Generic Endpoint Signed-off-by: Jed Reynolds --- rping.bash | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100755 rping.bash diff --git a/rping.bash b/rping.bash new file mode 100755 index 00000000..fa994b80 --- /dev/null +++ b/rping.bash @@ -0,0 +1,114 @@ +#!/bin/bash + +## ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ## +## Ping a random ip every second, indefinitely. The ping command +## has a deadline of *count* seconds and wait time of 1 second. +## This script is aware of vrf_exec.bash and LF_NO_USE_VRF. +## +## Example Usage: +## +## Ping a random ip once from port br0 every second: +## ./rping.bash -p br0 -c 1 +## +## Default to eth1, ping 4 random IPs, ping each ip 10 times +## ./rping.bash -r 4 -c 10 +## +## Ping 4 random IPs, ping each ip 10 times, from port br1 +## ./rping.bash -r 4 -c 10 -pbr1 +## +## ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ## +# set -vux + +HL="/home/lanforge" +HL_VX="$HL/vrf_exec.bash" +UV=1 +if [ -f $HL/LF_NO_USE_VRF ]; then + UV=0 +fi +if [ ! -x $HL_VX ]; then + UV=0 +fi + +usage() { + echo "Usage: $0 [-p port] [-c count of pings per ip] [-r number random ips] [-d seconds duration]" +} + +PORT=eth1 +COUNT=1 +NUM_IP=0 +DURATION=0 + +while getopts "hi:c:d:p:" OPT; do + case "${OPT}" in + c) COUNT="${OPTARG}" + ;; + d) DURATION="${OPTARG}" + if (( $DURATION < 0 )); then + echo "$0: duration cannot be negative" + exit 1 + fi + ;; + h) usage + exit 0 + ;; + i) NUM_IP="${OPTARG}" + ;; + p) PORT="${OPTARG}" + ;; + *) echo "Unknown option $OPT"; + usage + exit 1 + ;; + esac +done + +if [[ x$PORT == x ]]; then + echo "$0: no port" >&2 + return 1 +fi + +# this is unfiltered and will ping network numbers, broadcast numbers and +# multicast addresses, if you need a specific range, you should add that +# logic near here +rand_ip() { + printf "%d.%d.%d.%d" \ + "$((RANDOM % 256))" \ + "$((RANDOM % 256))" \ + "$((RANDOM % 256))" \ + "$((RANDOM % 256))" +} + +my_ping() { + if [[ x$1 == x ]]; then + echo "$0: my_ping: cannot ping empty ip" >&2 + return 1 + fi + + if (($UV == 1)); then + $HL_VX $PORT ping -c $COUNT -D -i1 -n -w$COUNT -W1 "$1" + else + ping -I$PORT -c $COUNT -D -i1 -n -w$COUNT -W1 "$1" + fi +} + +IP_LIST=() +if (( NUM_IP != 0 )); then + for n in `seq 1 $NUM_IP`; do + IP_LIST+=($(rand_ip)) + done +fi + +counter=0; +mod=$NUM_IP +while true; do + if (( $NUM_IP > 0 )); then + i=$(($counter % $NUM_IP)) + randi="${IP_LIST[$i]}" + counter=$((counter++)) + else + randi=$(rand_ip) + fi + my_ping "$randi" + sleep 1 +done +#