Salut,

Premier post et premier script (champagne), réalisé pour mon stage en réseau.

L'objectif est d'améliorer la qualité de ce dernier, dispersé sur plusieurs sites, concernant quelques points précis. Il est donc crée d'aprés mes pauvres bases (je ne suis pas codeur, ça va se voir, lol), des sources internet et un peu d'aide extérieur. Mon but est de tester les performances (bande passante) du 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
2- apporter des modifications/retouches éventuelles
3- améliorer les tests (utilisation des outils, nouveaux outils ?)
4- évaluer la pertinence des tests réseaux (résultats en retour)

Tout feedback sera le bienvenu.
Merci.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
#! /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