|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# ========================================== |
| 4 | +# CONFIGURATION |
| 5 | +# ========================================== |
| 6 | + |
| 7 | +# 1. Require Port Range (Argument 1) |
| 8 | +TARGET_PORTS=$1 |
| 9 | + |
| 10 | +if [ -z "$TARGET_PORTS" ]; then |
| 11 | + echo "Error: No port range provided." |
| 12 | + echo "Usage: ./chaos-runner.sh <PORT-RANGE> <COMMAND>" |
| 13 | + echo "Example: ./chaotic-network-runner.sh 5000-5003 ./devnet.sh" |
| 14 | + exit 1 |
| 15 | +fi |
| 16 | + |
| 17 | +# Shift arguments so "$@" now only contains the command to run |
| 18 | +shift |
| 19 | + |
| 20 | +# Check if there is a command to run left |
| 21 | +if [ $# -eq 0 ]; then |
| 22 | + echo "Error: No test command provided." |
| 23 | + exit 1 |
| 24 | +fi |
| 25 | + |
| 26 | +# Chaos Timing (in seconds) |
| 27 | +MIN_WAIT=10 |
| 28 | +MAX_WAIT=30 |
| 29 | +MIN_DURATION=15 |
| 30 | +MAX_DURATION=30 |
| 31 | + |
| 32 | +# Presets from delay-network.sh |
| 33 | +PRESETS=("lan" "wan" "spikes") # "bad-wifi" might be too volatile for a generic test |
| 34 | +NETWORK_SCRIPT="./scripts/delay-network.sh" |
| 35 | + |
| 36 | +# ========================================== |
| 37 | +# CHAOS LOGIC |
| 38 | +# ========================================== |
| 39 | + |
| 40 | +reset_network() { |
| 41 | + echo "[Chaos Runner] 🧹 Clearing network rules..." |
| 42 | + sudo $NETWORK_SCRIPT clear > /dev/null |
| 43 | +} |
| 44 | + |
| 45 | +trap reset_network EXIT |
| 46 | + |
| 47 | +chaos_loop() { |
| 48 | + echo "[Chaotic Network Runner] 🎲 Background chaos loop started on ports $TARGET_PORTS." |
| 49 | + |
| 50 | + while true; do |
| 51 | + # 1. Stay Clean |
| 52 | + WAIT_TIME=$(shuf -i $MIN_WAIT-$MAX_WAIT -n 1) |
| 53 | + echo "[Chaos Runner] 🟢 Network healthy for ${WAIT_TIME}s..." |
| 54 | + sleep $WAIT_TIME |
| 55 | + |
| 56 | + # 2. Select Random Preset |
| 57 | + RANDOM_PRESET=${PRESETS[$RANDOM % ${#PRESETS[@]}]} |
| 58 | + |
| 59 | + # 3. Apply Chaos |
| 60 | + CHAOS_DURATION=$(shuf -i $MIN_DURATION-$MAX_DURATION -n 1) |
| 61 | + echo "[Chaos Runner] 💥 Applying '$RANDOM_PRESET' on ports $TARGET_PORTS for ${CHAOS_DURATION}s..." |
| 62 | + |
| 63 | + sudo $NETWORK_SCRIPT $RANDOM_PRESET $TARGET_PORTS |
| 64 | + |
| 65 | + sleep $CHAOS_DURATION |
| 66 | + |
| 67 | + # 4. Reset |
| 68 | + reset_network |
| 69 | + done |
| 70 | +} |
| 71 | + |
| 72 | +# ========================================== |
| 73 | +# MAIN EXECUTION |
| 74 | +# ========================================== |
| 75 | + |
| 76 | +# Start chaos in background |
| 77 | +chaos_loop & |
| 78 | +CHAOS_PID=$! |
| 79 | + |
| 80 | +# Run the actual test command (passed as arguments) |
| 81 | +echo "[Chaos Runner] 🚀 Starting main test command: $@" |
| 82 | +"$@" |
| 83 | +EXIT_CODE=$? |
| 84 | + |
| 85 | +# Cleanup |
| 86 | +echo "[Chaos Runner] 🏁 Main command finished with exit code $EXIT_CODE." |
| 87 | +kill $CHAOS_PID 2>/dev/null |
| 88 | +wait $CHAOS_PID 2>/dev/null |
| 89 | + |
| 90 | +exit $EXIT_CODE |
0 commit comments