Merci eupalynos de m'avoir mâché tout le travail. C'est exactement ce que je cherchais. Avec ton accord, je vais le mettre sur le site de l'Arcep et te mentionnant en co-auteur en haut du bash.
J'ai mis le bash en Français, car si j'ai fais un script pour simplement lancer un simple wget, c'est dans l'objectif de limiter les erreurs, wget prenant les données en multiple de 1024 (Mio/s) alors que le protocole est indique des débits en Mbit/s.
Le premier "Protocole de mesure de la consommation électrique des box" que j'ai écrit multipliait les risques d'erreurs (plusieurs PC avec des interfaces Ethernet différentes, plusieurs longueur de câbles pour connecter le PC à la box [un câble long peut forcer la box à émettre plus et donc à consommer plus] le tout mixé avec du trafic généré en IPv4, IPv6 [certaines vieux chips peuvent consommer plus en IPv6],...). Pour fiabiliser les données et limiter les risques d'erreur involontaires, j'ai rendu le protocole plus logique (ex: Un PC est toujours connecté à la box avec la même longueur de câble) et ce script s'inscrit dans cet objectif limiter les risques d'erreurs involontaires, les débits dans le protocole étant exprimés en kbit/s ou Mbit/s et non en Kio/s ou Mio/s.
J'ai supprimé le "printf 'Unknown option: %s\n' "$1" >&2" dans le premier case, car getopts affiche le message "option non permise -- 5" en cas d'erreur.
J'ai affiché la fonction "show_help" à chaque message d'erreur, car la personne qui va l'utiliser n'aura pas forcément l'idée de faire -h.
Ma proposition :
#!/bin/bash
# Script pour simuler un trafic https avec un débit moyen indiqué en argument
# dépendance : wget (déjà pré-installée avec Ubuntu)
# Version du 28 janvier 2022 créé par Vivien Guéant et eupalynos
# Ce script est un logiciel libre que vous pouvez redistribuer ou modifier suivant la GNU GPLv3
show_help() {
cat << EOF
Utilisation: ${0##*/} [-h|-4|-6] [débit]
Simule un trafic HTTPS avec un "débit" en bit/s (100 Kbit/s par défaut). Le débit, un nombre entier, peut être suffixé par les multiplicateurs "K", "M" ou "G" (non sensible à la casse), respectivement pour Kbit/s, Mbit/s ou Gbit/s. Exemple : 1M = 1 Mbit/s. Le débit minimum est de 100 kbit/s, le débit maximum est de 1 Gbit/s.
Par défaut, le protocole IPv6 est utilisé si disponible, sinon IPv4.
OPTIONS :
-h affiche cette aide et quitte (ignore les autres options ou paramètres)
-4 forcer le protocole IPv4
-6 forcer le protocole IPv6
EOF
}
# Initialisation des variables
url="https://ubuntu.lafibre.info/10G.iso"
val=100
unit=k
protocol=
min=$((100*1000))
max=$((1*1000*1000*1000))
# Vérification de la validité des arguments passés en paramètres
OPTIND=1
while getopts h46 opt; do
case $opt in
h) show_help ; exit 0 ;;
4) protocol="-4 " ;;
6) protocol="-6 " ;;
*) show_help ; exit 1 ;;
esac
done
shift "$((OPTIND-1))"
arg="$@"
if [ -n "$arg" ] ; then
regex="^([1-9][0-9]*)(k|K|m|M|g|G)?$"
if [[ $arg =~ $regex ]] ; then
val=${BASH_REMATCH[1]}
unit=${BASH_REMATCH[2]}
else
printf "Le débit '$arg' est invalide\n\n" >&2
show_help ; exit 1
fi
fi
case $unit in
k|K) mult=1000 ;;
m|M) mult=$((1000*1000)) ;;
g|G) mult=$((1000*1000*1000)) ;;
*) mult=1 ;;
esac
rate=$((val*mult))
if (( rate < min )) || (( rate > max )); then
printf "Le débit '$arg' est hors des limites (minimum de 100 kbit/s, maximum de 1 Gbit/s)\n\n" >&2
show_help ; exit 1
fi
# Calcul de débit en kbit/s et en octets par seconde
ratekb=$((rate / 1000))
ratebyte=$((rate / 8))
# Lancement de wget (boucle infinie)
printf "Simulation d'un trafic https de $ratekb kbit/s (soit $ratebyte octets par seconde).\n"
printf "Ctrl+C pour arrêter le transfert: maintenir la touche \"Ctrl\" enfoncée et appuyer sur la touche \"C\"\n\n"
while [ 1 ]
do
wget $protocol--limit-rate=$ratebyte -O /dev/null ${url}
done
exit 0