Riassumo brevemente ciò che ho fatto con MRTG anche con l'aiuto di Guido per gli script. Per chi non lo sapesse MRTG è un prodottino che permette di fare dei grafici sull'utilizzo di apparati di rete, ma non solo. Di default lavora con il protocollo SNMP. Io invece volevo monitorare il traffico del mio modem ISDN interno. Dopo aver letto un po' di documentazione ho trovato che MRTG oltre al protocollo SNMP accetta anche in input dati in questo formato: 4 righe con su ogni riga: byte in input, byte in output, uptime e nome del sistema. Insieme al prodotto c'è una directory chiamata contrib piena di script per acquisire dati da dispositivi che non utilizzano SNMP. Cercando in questa directory ho trovato uno script che prende in input i byte conteggiati da una qualche regola di iptables o di ipchain, ma lo script fornito come esempio conteneva degli errori, almeno facendolo girare nella mia Red Hat. Con un po' di prove e l'aiuto di Guido ho sistemato lo script, ma la soluzione non mi piaceva per il fatto che per ogni interfaccia che si vuole monitorare è necessario creare due chain una per l'input e l'altra per l'output. Poi vanno inserite delle chiamate a queste chain in tutte le chain di default (INPUT, FORWARD e OUTPUT). Tutto questo allunga di molto l'output di iptables e lo rende molto meno leggibile. Quindi non mi è sembrata una buona soluzione dato che il Firewall è già una cosa complessa per conto suo, e renderlo meno leggibile solo per contare i byte in transito sulle interfacce proprio non mi sembra il caso. Con l'aiuto di Guido ho modificato lo script per leggere l'output di iptables e ne ho creato uno per leggere /proc/net/dev. Ora finalmente ho uno script in grado di monitorare via MRTG qualsiasi interfaccia presente sul PC. Ho proposto a Guido di inviare lo script a quelli di MRTG per farlo inserire in contrib, dato che nella versione che ho (l'ultima distribuita da Red Hat via rpm) uno script come questo non c'è. Allego qui sotto lo script. ---------------------------------------------------------------------------- -------------- #!/usr/bin/perl use strict; my (%interface_acc, $interface, $upTime, $host); $host=`/bin/hostname --fqdn`; # local hostname (for information only) ($interface) = @ARGV; $interface = "eth0" if !defined $interface; open DEV, "</proc/net/dev"; <DEV>;<DEV>; #skip header while(<DEV>){ chop; my($name, $str_bytes) = split /:/, $_, 2; $name =~ s/\s+//; $str_bytes =~ s/\s+// if($str_bytes =~ m/^\s/); my @bytes = split /\s+/, $str_bytes, 16; $interface_acc{$name} = \@bytes; } close DEV; # uptime of the machine open(UPTIME, "uptime |cut -b 14-27|"); $upTime=<UPTIME>; close(UPTIME); chop $upTime; # 4 lines of output only. print "$interface_acc{$interface}->[0]\n", "$interface_acc{$interface}->[8]\n", "$upTime\n", "$host"; ---------------------------------------------------------------------------- ---------------- -- Gelpi ing. Andrea -------------------------------------------------------------- It took the computing power of three C-64s to fly to the Moon. It takes a 486 to run Windows 95. Something is wrong here. -------------------------------------------------------------- -- Per iscriversi (o disiscriversi), basta spedire un messaggio con SOGGETTO "subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxxxxxx