Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / router / freebox @ b43ec018

Historique | Voir | Annoter | Télécharger (15,2 ko)

1
#!/bin/bash -u
2
# -*- sh -*-
3

    
4
: << =cut
5

    
6
=head1 NAME
7

    
8
freebox - Plugin to monitor stats of a Freebox (Free.fr's custom series of routers)
9

    
10
=head1 MAGIC MARKERS
11

    
12
  #%# family=auto
13
  #%# capabilities=autoconf
14

    
15
=head1 CAVEAT
16

    
17
Only tested on a Freebox v5 with an ADSL uplink.
18

    
19
=head1 AUTHOR
20

    
21
Olivier Mehani
22

    
23
Copyright (C) 2019 Olivier Mehani <shtrom+munin@ssji.net>
24

    
25
=head1 LICENSE
26

    
27
SPDX-License-Identifier: GPL-3.0-or-later
28

    
29
=cut
30

    
31
# shellcheck disable=SC1090
32
. "${MUNIN_LIBDIR}/plugins/plugin.sh"
33

    
34
if [ "${MUNIN_DEBUG:-0}" = 1 ]; then
35
    set -x
36
fi
37

    
38
fbx_info_url="http://mafreebox.free.fr/pub/fbx_info.txt"
39
#
40
# Example output (including stray whitespaces):
41
#
42

    
43
# ______________________________________________________________________
44
# 
45
#                       Etat de la Freebox                           
46
# ______________________________________________________________________
47
# 
48
# 
49
# Informations générales :
50
# ========================
51
# 
52
#   Modèle                         Freebox ADSL            
53
#   Version du firmware            1.5.26                  
54
#   Mode de connection             Dégroupé                
55
#   Temps depuis la mise en route  9 jours, 23 heures, 4 minutes
56
# 
57
# 
58
# Téléphone :
59
# ===========
60
# 
61
#   Etat                           Ok                      
62
#   Etat du combiné                Raccroché               
63
#   Sonnerie                       Inactive                
64
# 
65
# 
66
# Adsl :
67
# ======
68
# 
69
#   Etat                           Showtime                
70
#   Protocole                      ADSL2+                  
71
#   Mode                           Interleaved             
72
# 
73
#                          Descendant         Montant           
74
#                          --                 --                
75
#   Débit ATM              1913 kb/s          945 kb/s          
76
#   Marge de bruit         5.10 dB            5.60 dB           
77
#   Atténuation            50.00 dB           23.30 dB          
78
#   FEC                    425249             15503719          
79
#   CRC                    5489               0                 
80
#   HEC                    705                4296208           
81
# 
82
#  Journal de connexion adsl :
83
#  ---------------------------
84
# 
85
#   Date                         Etat             Débit (kb/s)    
86
#   --                           --               --              
87
#   21/05/2019 à 08:35:49        Connexion        1913 / 988      
88
#   21/05/2019 à 08:34:38        Déconnexion                      
89
#   20/05/2019 à 21:39:30        Connexion        1156 / 988      
90
#   20/05/2019 à 21:38:43        Déconnexion                      
91
#   20/05/2019 à 14:50:52        Connexion        1925 / 985      
92
#   20/05/2019 à 14:50:05        Déconnexion                      
93
#   20/05/2019 à 07:14:38        Connexion        206 / 833       
94
#   20/05/2019 à 07:14:10        Déconnexion                      
95
#   20/05/2019 à 07:13:50        Connexion        983 / 587       
96
#   20/05/2019 à 07:12:49        Déconnexion                      
97
#   20/05/2019 à 07:09:32        Connexion        1113 / 864      
98
#   20/05/2019 à 07:08:45        Déconnexion                      
99
#   20/05/2019 à 07:07:22        Connexion        1195 / 826      
100
#   20/05/2019 à 07:06:59        Déconnexion                      
101
#   20/05/2019 à 07:06:39        Connexion        1832 / 923      
102
#   20/05/2019 à 07:05:51        Déconnexion                      
103
#   20/05/2019 à 06:58:10        Connexion        1238 / 887      
104
#   20/05/2019 à 06:57:23        Déconnexion                      
105
#   20/05/2019 à 06:56:46        Connexion        1375 / 935      
106
#   20/05/2019 à 06:55:58        Déconnexion                      
107
#   20/05/2019 à 06:55:32        Connexion        1353 / 904      
108
#   20/05/2019 à 06:54:45        Déconnexion                      
109
#   20/05/2019 à 06:50:37        Connexion        1380 / 923      
110
#   20/05/2019 à 06:49:32        Déconnexion                      
111
# 
112
# 
113
# Wifi :
114
# ======
115
# 
116
#   Etat                           Ok                      
117
#   Modèle                         Ralink RT2880           
118
#   Canal                          1                       
119
#   État du réseau                 Activé                  
120
#   Ssid                           NetSSID 
121
#   Type de clé                    WPA (TKIP+AES)          
122
#   FreeWifi                       Désactivé               
123
#   FreeWifi Secure                Actif                   
124
# 
125
# 
126
# Réseau :
127
# ========
128
# 
129
#   Adresse MAC Freebox            XX:XX:XX:XX:XX:XX
130
#   Adresse IP                     203.0.113.60            
131
#   IPv6                           Activé                  
132
#   Mode routeur                   Activé                  
133
#   Adresse IP privée              192.0.2.1             
134
#   Adresse IP DMZ                 192.0.2.2             
135
#   Adresse IP Freeplayer          192.0.2.0             
136
#   Réponse au ping                Activé                  
137
#   Proxy Wake On Lan              Désactivé               
138
#   Serveur DHCP                   Activé                  
139
#   Plage d'adresses dynamique     192.0.2.100 - 192.0.2.254
140
# 
141
#  Attributions dhcp :
142
#  -------------------
143
# 
144
#   Adresse MAC            Adresse IP                  
145
#   --                     --                          
146
#   XX:XX:XX:XX:XX:XX      192.0.2.101               
147
#   XX:XX:XX:XX:XX:XX      192.0.2.102               
148
#   XX:XX:XX:XX:XX:XX      192.0.2.103               
149
#   XX:XX:XX:XX:XX:XX      192.0.2.104               
150
#   XX:XX:XX:XX:XX:XX      192.0.2.105               
151
#   XX:XX:XX:XX:XX:XX      192.0.2.100               
152
#   XX:XX:XX:XX:XX:XX      192.0.2.3                 
153
# 
154
#  Redirections de ports :
155
#  -----------------------
156
# 
157
#   Protocole              Port source    Destination    Port destination
158
#   --                     --             --             --            
159
#   TCP                    22             192.0.2.3      22            
160
#   TCP                    2222           192.0.2.100    22            
161
#   TCP                    1194           192.0.2.3      1194          
162
#   UDP                    1194           192.0.2.3      1194          
163
#   TCP                    80             192.0.2.3      80            
164
# 
165
#  Interfaces réseau :
166
#  -------------------
167
# 
168
#                          Lien           Débit entrant  Débit sortant 
169
#                          --             --             --            
170
#   WAN                    Ok             1 ko/s         1 ko/s        
171
#   Ethernet                              0 ko/s         0 ko/s        
172
#   USB                    Non connecté                                
173
#   Switch                 100baseTX-FD   1 ko/s         1 ko/s        
174

    
175
fetch() {
176
	# shellcheck disable=SC2154
177
	curl -s "$@"
178
}
179

    
180
get_line_column() {
181
	local key="$1"
182
	local field_index="$2"
183
	awk '/'"$key"'/ {
184
		if ($('"$field_index"') ~ /^[.0-9]+$/) {
185
			print $('"$field_index"')
186
		}
187
	}'
188
}
189

    
190
get_data() {
191
	INFO="$(fetch "${fbx_info_url}" | iconv -f latin1 -t utf8)"
192

    
193
	UPTIME_DAYS=$(get_line_column "Temps depuis la mise en route" "NF-5" <<< "${INFO}")
194
	UPTIME_HOURS=$(get_line_column "Temps depuis la mise en route" "NF-3" <<< "${INFO}")
195
	UPTIME_MINUTES=$(get_line_column "Temps depuis la mise en route" "NF-1" <<< "${INFO}")
196

    
197
	ATM_DOWN=$(get_line_column "ATM" "NF-3" <<< "${INFO}")
198
	ATM_UP=$(get_line_column "ATM" "NF-1" <<< "${INFO}")
199

    
200
	NOISE_DOWN=$(get_line_column "bruit" "NF-3" <<< "${INFO}")
201
	NOISE_UP=$(get_line_column "bruit" "NF-1" <<< "${INFO}")
202

    
203
	ATTENUATION_DOWN=$(get_line_column "Atténuation" "NF-3" <<< "${INFO}")
204
	ATTENUATION_UP=$(get_line_column "Atténuation" "NF-1" <<< "${INFO}")
205

    
206
	FEC_DOWN=$(get_line_column "FEC" "NF-1" <<< "${INFO}")
207
	FEC_UP=$(get_line_column "FEC" "NF" <<< "${INFO}")
208
	CRC_DOWN=$(get_line_column "CRC" "NF-1" <<< "${INFO}")
209
	CRC_UP=$(get_line_column "CRC" "NF" <<< "${INFO}")
210
	HEC_DOWN=$(get_line_column "HEC" "NF-1" <<< "${INFO}")
211
	HEC_UP=$(get_line_column "HEC" "NF" <<< "${INFO}")
212

    
213
	WAN_DOWN=$(get_line_column "WAN" "NF-3" <<< "${INFO}")
214
	WAN_UP=$(get_line_column "WAN" "NF-1" <<< "${INFO}")
215
	ETH_DOWN=$(get_line_column "Ethernet" "NF-3" <<< "${INFO}")
216
	ETH_UP=$(get_line_column "Ethernet" "NF-1" <<< "${INFO}")
217
	USB_DOWN=$(get_line_column "USB" "NF-3" <<< "${INFO}")
218
	USB_UP=$(get_line_column "USB" "NF-1" <<< "${INFO}")
219
	SWITCH_DOWN=$(get_line_column "Switch" "NF-3" <<< "${INFO}")
220
	SWITCH_UP=$(get_line_column "Switch" "NF-1" <<< "${INFO}")
221

    
222
	DHCP_CLIENTS=$(sed -nE '/Attributions dhcp/,/Redirections de ports/{s/^\s*([0-9A-F:]{17}).*$/\1/p}' <<< "${INFO}" | wc -l)
223
	REDIRECT_TCP=$(sed -nE '/Redirections de ports/,/Interfaces réseau/{s/^\s*(TCP).*$/\1/p}' <<< "${INFO}" | wc -l)
224
	REDIRECT_UDP=$(sed -nE '/Redirections de ports/,/Interfaces réseau/{s/^\s*(UDP).*$/\1/p}' <<< "${INFO}" | wc -l)
225

    
226
	if [ -z "${UPTIME_DAYS:-}" ]; then
227
		UPTIME_DAYS=0
228
	fi
229
	if [ -z "${UPTIME_HOURS:-}" ]; then
230
		UPTIME_HOURS=0
231
	fi
232
	if [ -z "${UPTIME_MINUTES:-}" ]; then
233
		UPTIME_MINUTES=0
234
	fi
235
	FREEBOX_UPTIME=$((UPTIME_DAYS*86400+UPTIME_HOURS*3600+UPTIME_MINUTES*60))
236

    
237
	LAST_CONNECT=$(sed -nE '/Journal de connexion adsl/,+5{s#^\s*([0-9]{2})/([0-9]{2})/([0-9]{4})[^0-9]*([0-9]+):([0-9]+):([0-9]+)\s+Connexion.*#\3-\2-\1T\4:\5:\6#p}' <<< "${INFO}")
238
	CONNECTION_UPTIME=U
239
	if [ -n "${LAST_CONNECT}" ]; then
240
		CONNECTION_UPTIME="$(($(date +%s)-$(date -d "${LAST_CONNECT}" +%s)))"
241

    
242
	fi
243
}
244

    
245
graph_config() {
246
	graph=""
247
	if [ -n "${1:-}" ]; then
248
		graph=".$1"
249
	fi
250

    
251
	echo "multigraph freebox${graph}"
252

    
253
	case "$graph" in
254
		.adsl)
255
			echo "graph_title ADSL characteristics"
256
			echo 'graph_category network'
257
			echo 'graph_vlabel dB in (-) / out (+)'
258
			echo 'graph_order noise_down noise attenuation_down attenuation'
259

    
260
			echo 'noise_down.label Noise down'
261
			echo 'noise_down.graph no'
262
			echo 'noise.label Noise'
263
			echo 'noise.negative noise_down'
264

    
265
			echo 'attenuation_down.label Attenuation down'
266
			echo 'attenuation_down.graph no'
267
			echo 'attenuation.label Attenuation'
268
			echo 'attenuation.negative attenuation_down'
269
			;;
270
		.adsl_errors)
271
			echo 'graph_title ADSL error correction'
272
			echo 'graph_category network'
273
			echo 'graph_vlabel errors in (-) / out (+)'
274
			echo 'graph_order fec_down fec crc_down crc hec_down hec'
275

    
276
			echo 'fec_down.label FEC down'
277
			echo 'fec_down.type DERIVE'
278
			echo 'fec_down.min 0'
279
			echo 'fec_down.graph no'
280
			echo 'fec.label FEC'
281
			echo 'fec.type DERIVE'
282
			echo 'fec.min 0'
283
			echo 'fec.negative fec_down'
284

    
285
			echo 'crc_down.label CRC down'
286
			echo 'crc_down.type DERIVE'
287
			echo 'crc_down.min 0'
288
			echo 'crc_down.graph no'
289
			echo 'crc.label CRC'
290
			echo 'crc.type DERIVE'
291
			echo 'crc.min 0'
292
			echo 'crc.negative crc_down'
293

    
294
			echo 'hec_down.label HEC down'
295
			echo 'hec_down.type DERIVE'
296
			echo 'hec_down.min 0'
297
			echo 'hec_down.graph no'
298
			echo 'hec.label HEC'
299
			echo 'hec.type DERIVE'
300
			echo 'hec.min 0'
301
			echo 'hec.negative hec_down'
302
			;;
303
		.traffic)
304
			echo 'graph_title Traffic'
305
			echo 'graph_category network'
306
			echo 'graph_vlabel bits per second in (-) / out (+)'
307
			echo 'graph_order atm_down atm wan_down wan eth_down eth usb_down usb switch_down switch'
308

    
309
			echo 'atm_down.label ATM down'
310
			echo 'atm_down.graph no'
311
			echo 'atm_down.cdef atm_down,1000,*'
312
			echo 'atm.label ATM sync'
313
			echo 'atm.negative atm_down'
314
			echo 'atm.cdef atm,1000,*'
315

    
316
			echo 'wan_down.label WAN down'
317
			echo 'wan_down.graph no'
318
			echo 'wan_down.cdef wan_down,8000,*'
319
			echo 'wan.label WAN'
320
			echo 'wan.negative wan_down'
321
			echo 'wan.cdef wan,8000,*'
322

    
323
			echo 'eth_down.label ETH down'
324
			echo 'eth_down.graph no'
325
			echo 'eth_down.cdef eth_down,8000,*'
326
			echo 'eth.label Ethernet'
327
			echo 'eth.negative eth_down'
328
			echo 'eth.cdef eth,8000,*'
329

    
330
			echo 'usb_down.label USB down'
331
			echo 'usb.label USB'
332
			echo 'usb_down.graph no'
333
			echo 'usb_down.cdef usb_down,8000,*'
334
			echo 'usb.negative usb_down'
335
			echo 'usb.cdef usb,8000,*'
336

    
337
			echo 'switch_down.label Switch down'
338
			echo 'switch_down.graph no'
339
			echo 'switch_down.cdef switch_down,8000,*'
340
			echo 'switch.label Switch'
341
			echo 'switch.cdef switch,8000,*'
342
			echo 'switch.negative switch_down'
343
			;;
344
		.uptime)
345
			echo 'graph_title Uptimes'
346
			echo 'graph_category network'
347
			echo 'graph_vlabel days'
348
			echo 'graph_args --logarithmic'
349

    
350
			echo 'freebox.label Freebox'
351
			echo 'freebox.draw AREA'
352
			echo 'freebox.cdef freebox,86400,/'
353

    
354
			echo 'connection.label Connection'
355
			echo 'connection.cdef connection,86400,/'
356
			;;
357
		.users)
358
			echo 'graph_title Network users'
359
			echo 'graph_category network'
360
			echo 'graph_vlabel count'
361

    
362
			echo 'dhcp.label DHCP leases'
363
			echo 'redirect_tcp.label TCP redirections'
364
			echo 'redirect_udp.label UDP redirections'
365
			;;
366
		*)
367
			echo 'graph_title Uplink traffic'
368
			echo 'graph_category network'
369
			echo 'graph_vlabel bits per second in (-) / out (+)'
370
			echo 'graph_order main_atm_down main_atm main_wan_down main_wan'
371

    
372
			# XXX: summary data similar to (more detailed) traffic
373
			echo 'main_wan_down.label WAN down'
374
			echo 'main_wan_down.graph no'
375
			echo 'main_wan_down.cdef main_wan_down,8000,*'
376
			echo 'main_wan.label bps'
377
			echo 'main_wan.negative main_wan_down'
378
			echo 'main_wan.cdef main_wan,8000,*'
379

    
380
			echo 'main_atm_down.label ATM down'
381
			echo 'main_atm_down.graph no'
382
			echo 'main_atm_down.cdef main_atm_down,1000,*'
383
			echo 'main_atm.label bps (max)'
384
			echo 'main_atm.negative main_atm_down'
385
			echo 'main_atm.cdef main_atm,1000,*'
386
			;;
387

    
388
	esac
389
	echo
390
}
391

    
392
graph_data() {
393
	graph=""
394
	if [ -n "${1:-}" ]; then
395
		graph=".$1"
396
	fi
397

    
398
	echo "multigraph freebox${graph}"
399
	case "$graph" in
400
		.adsl)
401
			echo "noise.value ${NOISE_UP:-U}"
402
			echo "noise_down.value ${NOISE_DOWN:-U}"
403

    
404
			echo "attenuation.value ${ATTENUATION_UP:-U}"
405
			echo "attenuation_down.value ${ATTENUATION_DOWN:-U}"
406
			;;
407
		.adsl_errors)
408
			echo "fec.value ${FEC_UP:-U}"
409
			echo "fec_down.value ${FEC_DOWN:-U}"
410

    
411
			echo "crc.value ${CRC_UP:-U}"
412
			echo "crc_down.value ${CRC_DOWN:-U}"
413

    
414
			echo "hec.value ${HEC_UP:-U}"
415
			echo "hec_down.value ${HEC_DOWN:-U}"
416
			;;
417
		.traffic)
418
			echo "atm.value ${ATM_UP:-U}"
419
			echo "atm_down.value ${ATM_DOWN:-U}"
420

    
421
			echo "wan.value ${WAN_UP:-U}"
422
			echo "wan_down.value ${WAN_DOWN:-U}"
423

    
424
			echo "eth.value ${ETH_UP:-U}"
425
			echo "eth_down.value ${ETH_DOWN:-U}"
426

    
427
			echo "usb.value ${USB_UP:-U}"
428
			echo "usb_down.value ${USB_DOWN:-U}"
429

    
430
			echo "switch.value ${SWITCH_UP:-U}"
431
			echo "switch_down.value ${SWITCH_DOWN:-U}"
432
			;;
433
		.uptime)
434
			echo "freebox.value ${FREEBOX_UPTIME:-U}"
435
			echo "connection.value ${CONNECTION_UPTIME:-U}"
436
			;;
437
		.users)
438
			echo "dhcp.value ${DHCP_CLIENTS:-U}"
439
			echo "redirect_tcp.value ${REDIRECT_TCP:-U}"
440
			echo "redirect_udp.value ${REDIRECT_UDP:-U}"
441
			;;
442
		*)
443
			echo "main_wan.value ${WAN_UP:-U}"
444
			echo "main_wan_down.value ${WAN_DOWN:-U}"
445

    
446
			echo "main_atm.value ${ATM_UP:-U}"
447
			echo "main_atm_down.value ${ATM_DOWN:-U}"
448

    
449
	esac
450
	echo
451
}
452

    
453
main() {
454
	case ${1:-} in
455
		autoconf)
456
			for CMD in curl iconv; do
457
				if ! command -v "${CMD}" >/dev/null; then
458
					echo "no (${CMD} not found)"
459
				fi
460
			done
461

    
462
			if curl --connect-timeout 1 -qso /dev/null "${fbx_info_url}"; then
463
				echo 'yes'
464
			else
465
				echo "no (failed to retrieve ${fbx_info_url})"
466
			fi
467
			;;
468
		config)
469
			graph_config
470
			graph_config adsl
471
			graph_config adsl_errors
472
			graph_config traffic
473
			graph_config uptime
474
			graph_config users
475
			if [ "${MUNIN_CAP_DIRTYCONFIG:-0}" = "1" ]; then
476
				main
477
			fi
478
			;;
479
		*)
480
			get_data
481
			graph_data
482
			graph_data adsl
483
			graph_data adsl_errors
484
			graph_data traffic
485
			graph_data uptime
486
			graph_data users
487
			;;
488
	esac
489
}
490

    
491
main "${1:-}"