From b5c6409f85f4ef80a31a407396d0239ccda1b36b Mon Sep 17 00:00:00 2001 From: malmert Date: Sat, 18 Apr 2026 11:45:15 +0200 Subject: [PATCH] add new example scripts --- .../chaos_delay_jitter-requirements.txt | 1 + backend/example_scripts/chaos_delay_jitter.py | 54 +++++++++++++++ .../packet_loss-requirements.txt | 1 + backend/example_scripts/packet_loss.py | 67 +++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 backend/example_scripts/chaos_delay_jitter-requirements.txt create mode 100644 backend/example_scripts/chaos_delay_jitter.py create mode 100644 backend/example_scripts/packet_loss-requirements.txt create mode 100644 backend/example_scripts/packet_loss.py diff --git a/backend/example_scripts/chaos_delay_jitter-requirements.txt b/backend/example_scripts/chaos_delay_jitter-requirements.txt new file mode 100644 index 0000000..d02e1df --- /dev/null +++ b/backend/example_scripts/chaos_delay_jitter-requirements.txt @@ -0,0 +1 @@ +netfilterqueue diff --git a/backend/example_scripts/chaos_delay_jitter.py b/backend/example_scripts/chaos_delay_jitter.py new file mode 100644 index 0000000..4406ec2 --- /dev/null +++ b/backend/example_scripts/chaos_delay_jitter.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Minimal NFQUEUE example: add random delay and jitter, but do not drop packets.""" + +import random +import signal +import sys +import time + +from netfilterqueue import NetfilterQueue + +# Demo tuning values. +BASE_DELAY_MS = 40 +JITTER_MS = 120 + +nfq = NetfilterQueue() + + +def _handle_packet(packet) -> None: + delay_ms = BASE_DELAY_MS + random.uniform(0, JITTER_MS) + time.sleep(delay_ms / 1000.0) + packet.accept() + + +def _stop(_sig, _frame) -> None: + raise SystemExit(0) + + +def main() -> int: + if len(sys.argv) != 2: + print("Usage: chaos_delay_jitter.py ", file=sys.stderr) + return 1 + + try: + qnum = int(sys.argv[1]) + except ValueError: + print("qnum must be an integer", file=sys.stderr) + return 1 + + signal.signal(signal.SIGINT, _stop) + signal.signal(signal.SIGTERM, _stop) + + nfq.bind(qnum, _handle_packet) + try: + nfq.run() + except KeyboardInterrupt: + pass + finally: + nfq.unbind() + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/backend/example_scripts/packet_loss-requirements.txt b/backend/example_scripts/packet_loss-requirements.txt new file mode 100644 index 0000000..d02e1df --- /dev/null +++ b/backend/example_scripts/packet_loss-requirements.txt @@ -0,0 +1 @@ +netfilterqueue diff --git a/backend/example_scripts/packet_loss.py b/backend/example_scripts/packet_loss.py new file mode 100644 index 0000000..c46947f --- /dev/null +++ b/backend/example_scripts/packet_loss.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Minimal NFQUEUE example: randomly drop packets by percentage.""" + +import random +import signal +import sys + +from netfilterqueue import NetfilterQueue + +DEFAULT_LOSS_PERCENT = 10.0 + +nfq = NetfilterQueue() +loss_percent = DEFAULT_LOSS_PERCENT + + +def _handle_packet(packet) -> None: + if random.random() < (loss_percent / 100.0): + packet.drop() + return + + packet.accept() + + +def _stop(_sig, _frame) -> None: + raise SystemExit(0) + + +def main() -> int: + global loss_percent + + if len(sys.argv) not in (2, 3): + print("Usage: packet_loss.py [loss_percent]", file=sys.stderr) + return 1 + + try: + qnum = int(sys.argv[1]) + except ValueError: + print("qnum must be an integer", file=sys.stderr) + return 1 + + if len(sys.argv) == 3: + try: + loss_percent = float(sys.argv[2]) + except ValueError: + print("loss_percent must be a number between 0 and 100", file=sys.stderr) + return 1 + + if not 0.0 <= loss_percent <= 100.0: + print("loss_percent must be between 0 and 100", file=sys.stderr) + return 1 + + signal.signal(signal.SIGINT, _stop) + signal.signal(signal.SIGTERM, _stop) + + nfq.bind(qnum, _handle_packet) + try: + nfq.run() + except KeyboardInterrupt: + pass + finally: + nfq.unbind() + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())