Salut,
Voici mon premier "vrai" script, réalisé pour mon stage en réseau.
Mon objectif est d'améliorer la qualité du réseau, dispersé sur plusieurs sites, concernant quelques points précis. Il est donc crée d'aprés mes quelques bases, des sources internet et un peu d'aide extérieur. Mon but est de tester les performances (bande passante) d'un réseau pour en détecter les faiblesses concernant :
- le D/L FTP
- le D/L HTML
- le D/L HTML avec proxy
J'ai donc réalisé une série de "logs", auxquels j'ai ajouté de quoi mesurer les performances brutes :
- une liste de "ping(s)" simples
- le résultat d'un benchmark réseau,
iperf.
Il faut d'abord créer une machine qui fera serveur FTP (compte anonymous), HTML et Iperf (en mode serveur), puis déposer un fichier nommé "fake" de plusieurs mégas (50 Mo pour mes tests), avant de placer la machine au plus proche du coeur de réseau. Sur la machine client, installer
iperf sous linux (le reste des outils étant standard).
Pour les mesures de référence, lancer le script sur le client linux, elle aussi proche du coeur de réseau. Ensuite, déplacer le client linux en divers endroits du réseau et lancer le script, comparer les logs une fois les tests achevés, afin d'en tirer les conclusions.
Voilà, j'ai expliqué ce que j'ai voulu faire, et je met le tout ici avec l'espoir de retours de pros connaissant mieux le Bash que moi, afin de :
1- optimiser le script (ou au moins me donner des pistes)
2- apporter des modifications/retouches (pour les plus gentils)
3- améliorer les tests (utilisation des outils, nouveaux outils ?)
4- évaluer la pertinence des tests réseaux (résultats en retour)
J'espère déjà avoir un feedback ici, je ne pense pas trouver meilleur endroit qu'un forum traîtant de Linux en général, Fedora en particulier. M'enfin, si vous avez des adresses, n'hésitez pas.
🙂
#! /bin/bash
# bash script - Fedora Core 5
clear
# Déclaration de variables
ip=$1
min_ip=1
max_ip=254
# Message d'indication si aucun paramètre
if [ $# -ne 1 ];
then
clear
echo "Veuillez entrer un paramètre."
echo "Utilisation : `basename $0` [IP du serveur]"
echo "-----------------------------------"
exit 0
fi
# Test pour savoir si les octets sont des caractères numériques
function isNum
{
if [ $# = 1 ];
then
tmp=`expr "$1" : '([0-9]{1,})'`
if [ "$1" = "$tmp" ];
then
echo 0
else
echo 1
fi
else
echo 2
fi
}
# Test pour savoir si les octets sont compris entre 0 et 255
function minMax
{
if [ $# = 3 ];
then
nbr=$1
min=$2
max=$3
if [ "$nbr" -ge "$min" -a "$nbr" -le "$max" ];
then
echo 0
else
echo 1
fi
else
echo 2
fi
}
# Routine de test pour la validité de l'adresse IP
for i in 1 2 3 4;
do
octet=`echo $ip | cut -d "." -f$i`
if [ `isNum $octet` -eq 0 ];
then
if [ `minMax $octet $min_ip $max_ip` -eq 0 ];
then
echo "l'octet $i [$octet] est valide."
else
echo "l'octet $i [$octet] est incorrect."
echo "Notation décimale IPv4 requise, sans adresse de réseau ni broadcast."
exit 1
fi
else
echo "L'octet $i [$octet] est incorrect."
echo "Notation décimale IPv4 requise."
exit 1
fi
done
# Récupération ip/masque/broadcast de l'hôte (ici l'IP seul)
function hostip (){
way=$1 #chemin de ifconfig ('sbin/ifconfig')
eth=$2 #numéro d'interface ('eth0')
mask1=`$way $eth|grep Masque|cut -d ':' -f4|cut -d '.' -f1`
mask2=`$way $eth|grep Masque|cut -d ':' -f4|cut -d '.' -f2`
mask3=`$way $eth|grep Masque|cut -d ':' -f4|cut -d '.' -f3`
mask4=`$way $eth|grep Masque|cut -d ':' -f4|cut -d '.' -f4`
ip1=`$way $eth|grep Masque|cut -d ':' -f2|cut -d '.' -f1`
ip2=`$way $eth|grep Masque|cut -d ':' -f2|cut -d '.' -f2`
ip3=`$way $eth|grep Masque|cut -d ':' -f2|cut -d '.' -f3`
ip4=`$way $eth|grep Masque|cut -d ':' -f2|cut -d '.' -f4|cut -d ' ' -f1`
mask=`$way $eth|grep Masque|cut -d ':' -f4`
#echo $mask
ethip=`$way $eth|grep Masque|cut -d ':' -f2|cut -d ' ' -f1`
echo $ethip
ip_res=$[${mask1} & ${ip1}]"."$[${mask2} & ${ip2}]"."$[${mask3} & ${ip3}]"."$[${mask4} & ${ip4}]
#echo $ip_res
}
# Mesures basiques via ping
function Mping(){
ping -c 30 $ip >> $log
}
# Mesures d'un téléchargement FTP
function Mftp(){
wget -r -4 -a $log --progress=dot:mega --proxy=off --no-cache --no-proxy --no-passive-ftp --user anonymous --password anonymous ftp://$ip/fake
rm -r $ip
}
# Mesures d'un téléchargement HTTP
function Mhttp(){
wget -r -4 -a $log --progress=dot:mega --proxy=off --cache=off --no-dns --user anonymous --password anonymous http://$ip/fake
rm -r $ip
}
# Mesures d'un téléchargement HTTP via un proxy
function Mhttpp(){
export http_proxy="http://10.1.1.3:8080" #Utilisation de la variable d'environnement
wget -r -4 -a $log --progress=dot:mega --proxy=on --cache=off --no-dns --user anonymous --password anonymous http://$ip/fake
rm -r $ip
}
# Mesures en client/serveur iperf
function Miperf(){
iperf -c $ip -P 0 -i 5 -f M -t 60 >> $log # sur 60 sec en TCP, 1 mesure/5 sec.
}
function Mcomplet(){
echo "" >> $log
echo "Mesure 1 : ping"
echo "-------------------------------------------------------------" >> $log
echo "Mesure 1 : ping" >> $log
echo "-------------------------------------------------------------" >> $log
Mping $log
echo "" >> $log
echo "Mesure 2 : wget FTP"
echo "-------------------------------------------------------------" >> $log
echo "Mesure 2 : wget FTP" >> $log
echo "-------------------------------------------------------------" >> $log
Mftp $log
echo "" >> $log
echo "Mesure 3 : wget HTTP"
echo "-------------------------------------------------------------" >> $log
echo "Mesure 3 : wget HTTP" >> $log
echo "-------------------------------------------------------------" >> $log
Mhttp $log
echo "" >> $log
echo "Mesure 4 : wget HTTP + Proxy"
echo "-------------------------------------------------------------" >> $log
echo "Mesure 4 : wget HTTP + Proxy" >> $log
echo "-------------------------------------------------------------" >> $log
Mhttpp $log
echo "" >> $log
echo "Mesure 5 : iperf"
echo "-------------------------------------------------------------" >> $log
echo "Mesure 5 : iperf" >> $log
echo "-------------------------------------------------------------" >> $log
Miperf $log
}
# Création du log et aiguillage vers le type de mesure adéquat.
function mesure () {
# Indication à l'écran pour patienter
echo "Veuillez patienter svp..."
# Création du nom de fichier log
log=$1
# Liste la date et l'heure
echo "------------------------------" > $log
echo `date` >> $log
echo "------------------------------" >> $log
echo "" >> $log
# Ajoute le nom d'hôte et l'adresse IP de l'interface 0
echo `hostname` >> $log
hostip '/sbin/ifconfig' 'eth0' >> $log
echo "" >> $log
# Ligne de séparation avant mesures
echo "-------------------------------------------------------------" >> $log
echo "" >> $log
# Test sur le type de fichier log pour lancer le test approprié
case $log in
logping) Mping $log;;
logftp) Mftp $log;;
loghtml) Mhttp $log;;
loghtmlp) Mhttpp $log;;
logiperf) Miperf $log;;
logcomplet) Mcomplet $log;;
esac
}
# Gestion du menu de choix pour le type de mesures à effectuer
function bye(){
echo "Mesures terminées. Bonne journée !"
echo "Les résultats sont dans le fichier '$log'"
echo ":)"
}
function menu(){
clear
echo "-----------------------------------------------------"
echo "| Choix du protocole de test |"
echo "-----------------------------------------------------"
echo "Appuyez sur une touche, puis validez. [7] pour quitter."
echo ""
select j in 'PING' 'FTP' 'HTTP' 'HTTP+PROXY' 'IPERF' 'TOUS' 'QUIT'
do
case $j in
PING)
mesure logping
bye
exit 0;;
FTP)
mesure logftp
bye
exit 0;;
HTTP)
mesure loghttp
bye
exit 0;;
HTTP+PROXY)
mesure loghttpp
bye
exit 0;;
IPERF)
mesure logiperf
bye
exit 0;;
TOUS)
mesure logcomplet
bye
exit 0;;
QUIT)
clear
echo "Script terminé. Bonne journée."
exit 0;;
*)
echo "Veuillez entrer un chiffre entre 1 et 6. Merci."
echo "Touche '7' pour quitter, 'ctrl+d' pour interrompre";;
esac
done
}
menu