Skip to content

Instantly share code, notes, and snippets.

@philipp-classen
Last active July 21, 2023 10:25
Show Gist options
  • Save philipp-classen/8299e240a6aa91e7c70bb1ddaefe86c8 to your computer and use it in GitHub Desktop.
Save philipp-classen/8299e240a6aa91e7c70bb1ddaefe86c8 to your computer and use it in GitHub Desktop.
Simulate lacking internet connections
#!/bin/bash
#
# Needs to be run as root!
# between 0 (never flakey) and 100 (regularly flaky)
flakiness=20
# max delay in seconds
max_delay_normal=8
max_delay_flakey=300
device="wlp0s20f3"
set -x
logfile="/tmp/simulate-connectivity-issues.log"
echo "Log file: $logfile"
: > "$logfile"
init() {
{ nodelay > /dev/null 2> /dev/null ; tc qdisc add dev "$device" root netem delay 0s ; } && (echo "Init complete" >> "$logfile")
}
random_delay() {
time=$(( RANDOM % $max_delay_flakey ))
echo "Adding delay of $time seconds..." >> "$logfile"
tc qdisc change dev "$device" root netem delay ${time}s && (echo "Adding delay of $time seconds...DONE" >> "$logfile")
printf "\rDelay: ${time} seconds \r"
}
random_sleep() {
time=$(( RANDOM % 20 ))
echo "Sleeping for $time seconds..." >> "$logfile"
sleep $time
echo "Sleeping for $time seconds...done" >> "$logfile"
}
nodelay() {
time=$(( RANDOM % $max_delay_normal ))
echo "Changing to no delay..." >> "$logfile"
tc qdisc change dev "$device" root netem delay ${time}s && (echo "Changing to no delay...DONE" >> "$logfile")
printf "\rDelay: $time seconds \r"
}
cleanup() {
status=$?
echo "cleanup..."
tc qdisc delete dev "$device" root netem || echo 'Failed to undo settings'
echo "cleanup...done"
exit $status
}
trap "cleanup" INT TERM EXIT
init
nodelay
while :; do
if [[ $(( RANDOM % 100 < $flakiness )) -eq 1 ]]; then
random_delay
random_sleep
fi
nodelay
random_sleep
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment