может быть велосипед, жду критики и предложений - но я делаю вот так (далее почему именно так):
цель: отдавать по снмп данные по трафику со всем интерфейсов (более 100 вланов)1) выбираем данные по трафику
после работы с снмп пришел к выводу что заставить его не менять индекс интерфейса проблемматично - далее снимал данные с фаервола (минус - много ненужных правил)
теперь собираю из /proc/net/dev. Сразу оговарюсь почему программа спит и выбор идет 2 раза - все дело в том что трафик считается покругу (32 бита), и при превышении предела 4294967296 байт секунду на конец минуты счетчик уже пойдет 2й круг
ну и пускаем по крону с интервалом в 1 минуту
#!/bin/bash
sleep 28
IFS="
"
i=0
statfile=(`cat /proc/net/dev | grep "[0-9]:"`)
while true
do
if [ ${statfile[$i]} ]
then
line=`echo ${statfile[$i]}| sed 's/:/ /g'`
interface=`echo $line | awk {'print $1'}`
indata1=`echo $line | awk {'print $2'}`
outdata1=`echo $line | awk {'print $10'}`
# if [ ! -f /etc/snmp/scr/db/$interface ]
# then echo "0 0 0 0" > /etc/snmp/scr/db/$interface
# fi
intline=`cat /etc/snmp/scr/db/$interface`
indata0=`echo $intline | awk {'print $2'}`
outdata0=`echo $intline | awk {'print $4'}`
if [ $indata0 -le $indata1 ]
then indata=`expr $indata1 - $indata0`
else indata=`expr 4294967296 - $indata0 + $indata1`
fi
if [ $outdata0 -le $outdata1 ]
then outdata=`expr $outdata1 - $outdata0`
else outdata=`expr 4294967296 - $outdata0 + $outdata1`
fi
outline[$i]=`echo "$indata $indata1 $outdata $outdata1"`
i=`expr $i + 1`
else
break
fi
done
sleep 30
i=0
statfile=(`cat /proc/net/dev | grep "[0-9]:"`)
while true
do
if [ ${statfile[$i]} ]
then
line=`echo ${statfile[$i]}| sed 's/:/ /g'`
interface=`echo $line | awk {'print $1'}`
indata1=`echo $line | awk {'print $2'}`
outdata1=`echo $line | awk {'print $10'}`
indata=`echo ${outline[$i]}| awk {'print $1'} `
indata0=`echo ${outline[$i]}| awk {'print $2'} `
outdata=`echo ${outline[$i]}| awk {'print $3'} `
outdata0=`echo ${outline[$i]}| awk {'print $4'} `
if [ $indata0 -le $indata1 ]
then indata=`expr $indata + $indata1 - $indata0`
else indata=`expr 4294967296 - $indata0 + $indata1 + $indata`
fi
if [ $outdata0 -le $outdata1 ]
then outdata=`expr $outdata + $outdata1 - $outdata0`
else outdata=`expr 4294967296 - $outdata0 + $outdata1 + $outdata`
fi
echo "$indata $indata1 $outdata $outdata1" > /etc/snmp/scr/db/$interface
i=`expr $i + 1`
else
break
fi
done
exit 0
2) бросаем данные в снмп
- в качестве параметра быдем отдовать название интерфейсы
#!/bin/bash
ARGS=1;
intline=`cat /etc/snmp/scr/db/$1`
indata=`echo $intline | awk {'print $1'}`
outdata=`echo $intline | awk {'print $3'}`
echo "$indata $outdata"
exit 0
3) описываем интерфейсы в снмп
для етого в snmpd.conf придется описать нужные интерфейсы
exec eth0 /etc/snmp/scr/net_stat_cat eth0 # 1
exec eth1 /etc/snmp/scr/net_stat_cat eth1 # 2
exec eth2 /etc/snmp/scr/net_stat_cat eth2 # 3
и т.д
4) и в удаленном месте дергаем
разбираем кладем в rrd - вобщем что кому надо
/usr/local/bin/snmpget -v1 -c public IP extOutput.1
/usr/local/bin/snmpget -v1 -c public IP extOutput.2
/usr/local/bin/snmpget -v1 -c public IP extOutput.3