Cisco Linux snmp Reset ppp: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поиску| Строка 1: | Строка 1: | ||
| + | [[Категория:Linux]] |
||
=Сброс с линии по snmp= |
=Сброс с линии по snmp= |
||
Версия 14:02, 19 августа 2010
Сброс с линии по snmp
Задача: настроить linuxbox так что бы он мог "прикинуться циской" для биллинга. Все скрипты помещаю в /etc/snmp/vpn/ Эти скрипты требуют оптимизации, но какое-то время они вполне удачно прикидывались циской, думаю серьезных багов в них нет.
smmpd.conf
Добавляю выполненение скриптов для соответвующих OID.
pass 1.3.6.1.4.1.9.9.150.1.1.3.1.5 /etc/snmp/vpn/vpn3.sh pass 1.3.6.1.4.1.9.9.150.1.1.3.1.2 /etc/snmp/vpn/vpn2.sh pass 1.3.6.1.4.1.9.10.24.1.1.4.1.2.3 /etc/snmp/vpn/ppp_count.sh
Скрипты
ppp_count.sh
#!/bin/bash
LANG=C
export $LANG
OID=$2
F=`echo $OID | cut -b 1`
if [ "$F" != "." ]
then
OID=`echo "."$OID`
fi
function get(){
COUNT=`/sbin/ip link show | grep "link/ppp" | wc -l`
echo ${OID}
echo integer
echo $COUNT
exit
}
case "$1" in
"-g")
#получить значение OID
get $OID
;;
"-n")
#получить OID и значение следующего за OID обьекта
get $OID
;;
"-s")
# установить значение OID
# не нужно
;;
*)
#exit 1
;;
esac
exit
vpn2.sh
#!/bin/bash
LANG=C
export $LANG
#базовый OID
MIBOID=.1.3.6.1.4.1.9.9.150.1.1.3.1.2
OID=$2
F=`echo $OID | cut -b 1`
if [ "$F" != "." ]
then
OID=`echo "."$OID`
fi
WHO='/usr/bin/who'
AWK='/usr/bin/awk'
PS='/bin/ps'
LOGGER='/usr/bin/logger -t snmp-vpn'
echo $1"--"$2"--"$3"--"$4 | $LOGGER
function get(){
# Если OID=MIBOID - то это walk с начала ветви и нужно отдать первый PID
if [ $OID = $MIBOID ]
then
echo ${MIBOID}
echo string
echo ""
exit
fi
#echo $OID $MIBOID
PID=`echo $OID| awk -F"$MIBOID." '{ print $2 }' `
PID=`printf %x $PID`
# отрезать 2 последних символа у строки произвольной длинны
L=`echo ${#PID}-2 | bc`
#echo $L
PID=`printf $PID | cut -c 1-$L`
#echo $PID
PID=`printf %d"\n" 0x$PID`
#echo $PID
PID=`cat /var/run/ppp*\.pid | sort -n | egrep ^"$PID"$`
#echo $PID
if test -n "${PID}"
then
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} "| $AWK '{print $1}'`
echo ${OID}
echo string
echo $USERNAME
exit
fi
}
function getnext(){
D=`date +%s`
#IFINDEX=`echo "$OID" | awk -F"$MIBOID." '{print $2}'`
TMP_FILE='/tmp/vpm.tmp.$D'
#cat /var/run/ppp*\.pid
# Если OID=MIBOID - то это walk с начала ветви и нужно отдать первый PID
if [ $OID = $MIBOID ]
then
NEXT_PID=`cat /var/run/ppp*\.pid | sort -n | head -1`
# Если результат пустой то знасит нет ни одного ppp процесса
if test -z "$NEXT_PID"
then
exit
fi
# Вычислить следующий OID
NEXT_OID=`printf %x $NEXT_PID`
NEXT_OID=`printf %d"\n" 0x$NEXT_OID"00"`
# echo $NEXT_OID
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$NEXT_PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} "| $AWK '{print $1}'`
echo ${MIBOID}.${NEXT_OID}
echo string
echo $USERNAME
exit
fi
# Если запрошен не перый OID, то
# Проверить существует ли такой процесс.
# AcctSessionID в радиусе храниться в виде 16-ричного числа
# 4B0501CE536E00
# при этом при этом
# 4B0501CE - не знаю назначение этой части
# 536E - PID процесса (21358)
# 00 (может быть 01 или отсутвовать)
#
# Соответвенно, нужно обрабатывать 4 возможных OID
# .1.3.6.1.4.1.9.9.150.1.1.3.1.2.{printf %d 0x4B0501CE536E00 }
# .1.3.6.1.4.1.9.9.150.1.1.3.1.2.{printf %d 0x4B0501CE536E }
# .1.3.6.1.4.1.9.9.150.1.1.3.1.2.{printf %d 0x536E }
# .1.3.6.1.4.1.9.9.150.1.1.3.1.2.{printf %d 0x536E00 } (не уверен)
PID=`echo $OID| awk -F"$MIBOID." '{ print $2 }' `
PID=`printf %x $PID`
# отрезать 2 последних символа у строки произвольной длинны
L=`echo ${#PID}-2 | bc`
PID=`printf $PID | cut -c 1-$L`
PID=`printf %d"\n" 0x$PID`
NEXT_PID=`cat /var/run/ppp*\.pid | sort -n | grep -A1 ^"$PID"$ | grep -v ^"$PID"$`
if test -n "${NEXT_PID}"
then
NEXT_OID=`printf %x $NEXT_PID`
NEXT_OID=`printf %d"\n" 0x$NEXT_OID"00"`
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$NEXT_PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} "| $AWK '{print $1}'`
echo ${MIBOID}.${NEXT_OID}
echo string
echo $USERNAME
exit
fi
NEXT_PID=`cat /var/run/ppp*\.pid | sort -n | grep -A1 ^"$PID"$ | grep -v ^"$PID"$`
if test -n "${NEXT_PID}"
then
NEXT_OID=`printf %x $NEXT_PID`
NEXT_OID=`printf %d"\n" 0x$NEXT_OID"00"`
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$NEXT_PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} "| $AWK '{print $1}'`
echo ${MIBOID}.${NEXT_OID}
echo string
echo $USERNAME
exit
fi
PID=`printf %x $PID | cut -c 9,10,11,12`
if test -z "${PID}"
then
exit
fi
PID=`printf %d"\n" 0x$PID`
NEXT_PID=`cat /var/run/ppp*\.pid | sort -n | grep -A1 ^"$PID"$ | grep -v ^"$PID"$`
if test -n "${NEXT_PID}"
then
NEXT_OID=`printf %x $NEXT_PID`
NEXT_OID=`printf %d"\n" 0x$NEXT_OID"00"`
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$NEXT_PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} "| $AWK '{print $1}'`
echo ${MIBOID}.${NEXT_OID}
echo string
echo $USERNAME
exit
fi
exit
}
function setoid()
{
IFINDEX=`echo "$OID" | awk -F"$MIBOID." '{print $2}'`
TMP_FILE='/tmp/vpm.tmp.$D'
# Если OID=MIBOID - то это нахуй в него писать?
if [ $OID = $MIBOID ]
then
echo "set:"$OID = $MIBOID | $LOGGER
exit
fi
#echo 1=$OID 2=$MIBOID
PID=`echo $OID| awk -F"$MIBOID." '{ print $2 }' `
PID=`printf %x $PID`
#echo $PID
# отрезать 2 последних символа у строки произвольной длинны
L=`echo ${#PID}-2 | bc`
#echo $L
PID=`printf $PID | cut -c 1-$L`
#echo $PID
PID=`printf %d"\n" 0x$PID`
#echo $PID
PID=`cat /var/run/ppp*\.pid | sort -n | egrep ^"$PID"$`
#echo $PID
if test -n "${PID}"
then
echo "/bin/kill -1 $PID" | $LOGGER
/bin/kill -1 $PID | $LOGGER
echo ${OID}
echo string
echo "1"
exit
fi
}
case "$1" in
"-g")
#получить значение OID
get $OID
;;
"-n")
#получить OID и значение следующего за OID обьекта
getnext $OID
;;
"-s")
#установить значение OID
#echo "--!"$1"--"$2"--"$3"--"$4 | $LOGGER
setoid $OID
;;
*)
#exit 1
;;
esac
exit
vpn3.sh
#!/bin/bash
LANG=C
export $LANG
#базовый OID
MIBOID=.1.3.6.1.4.1.9.9.150.1.1.3.1.5
OID=$2
F=`echo $OID | cut -b 1`
if [ "$F" != "." ]
then
OID=`echo "."$OID`
fi
WHO='/usr/bin/who'
AWK='/usr/bin/awk'
PS='/bin/ps'
LOGGER='/usr/bin/logger -t snmp-vpn3'
echo $1"--"$2"--"$3"--"$4 | $LOGGER
function get(){
# Если OID=MIBOID - то это walk с начала ветви и нужно отдать первый PID
if [ $OID = $MIBOID ]
then
echo ${MIBOID}
echo string
echo ""
exit
fi
#echo $OID $MIBOID
PID=`echo $OID| awk -F"$MIBOID." '{ print $2 }' `
PID=`printf %x $PID`
#echo $PID
# отрезать 2 последних символа у строки произвольной длинны
L=`echo ${#PID}-2 | bc`
#echo $L
PID=`printf $PID | cut -c 1-$L`
#echo $PID
PID=`printf %d"\n" 0x$PID`
#echo $PID
PID=`cat /var/run/ppp*\.pid | sort -n | egrep ^"$PID"$`
#echo $PID
if test -n "${PID}"
then
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} " | $AWK '{print $1}'`
echo ${OID}
echo string
echo $USERNAME
exit
fi
}
function getnext(){
D=`date +%s`
#IFINDEX=`echo "$OID" | awk -F"$MIBOID." '{print $2}'`
TMP_FILE='/tmp/vpm.tmp.$D'
#cat /var/run/ppp*\.pid
# Если OID=MIBOID - то это walk с начала ветви и нужно отдать первый PID
if [ $OID = $MIBOID ]
then
NEXT_PID=`cat /var/run/ppp*\.pid | sort -n | head -1`
# Если результат пустой то знасит нет ни одного ppp процесса
if test -z "$NEXT_PID"
then
exit
fi
# Вычислить следующий OID
NEXT_OID=`printf %x $NEXT_PID`
NEXT_OID=`printf %d"\n" 0x$NEXT_OID"00"`
# echo $NEXT_OID
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$NEXT_PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} "| $AWK '{print $1}'`
echo ${MIBOID}.${NEXT_OID}
echo string
echo $USERNAME
exit
fi
# Если запрошен не перый OID, то
# Проверить существует ли такой процесс.
# AcctSessionID в радиусе храниться в виде 16-ричного числа
# 4B0501CE536E00
# при этом при этом
# 4B0501CE - не знаю назначение этой части
# 536E - PID процесса (21358)
# 00 (может быть 01 или отсутвовать)
#
# Соответвенно, нужно обрабатывать 4 возможных OID
# .1.3.6.1.4.1.9.9.150.1.1.3.1.2.{printf %d 0x4B0501CE536E00 }
# .1.3.6.1.4.1.9.9.150.1.1.3.1.2.{printf %d 0x4B0501CE536E }
# .1.3.6.1.4.1.9.9.150.1.1.3.1.2.{printf %d 0x536E }
# .1.3.6.1.4.1.9.9.150.1.1.3.1.2.{printf %d 0x536E00 } (не уверен)
PID=`echo $OID| awk -F"$MIBOID." '{ print $2 }' `
PID=`printf %x $PID`
# отрезать 2 последних символа у строки произвольной длинны
L=`echo ${#PID}-2 | bc`
PID=`printf $PID | cut -c 1-$L`
PID=`printf %d"\n" 0x$PID`
NEXT_PID=`cat /var/run/ppp*\.pid | sort -n | grep -A1 ^"$PID"$ | grep -v ^"$PID"$`
if test -n "${NEXT_PID}"
then
NEXT_OID=`printf %x $NEXT_PID`
NEXT_OID=`printf %d"\n" 0x$NEXT_OID"00"`
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$NEXT_PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} " | $AWK '{print $1}'`
echo ${MIBOID}.${NEXT_OID}
echo string
echo $USERNAME
exit
fi
NEXT_PID=`cat /var/run/ppp*\.pid | sort -n | grep -A1 ^"$PID"$ | grep -v ^"$PID"$`
if test -n "${NEXT_PID}"
then
NEXT_OID=`printf %x $NEXT_PID`
NEXT_OID=`printf %d"\n" 0x$NEXT_OID"00"`
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$NEXT_PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} "| $AWK '{print $1}'`
echo ${MIBOID}.${NEXT_OID}
echo string
echo $USERNAME
exit
fi
PID=`printf %x $PID | cut -c 9,10,11,12`
if test -z "${PID}"
then
exit
fi
PID=`printf %d"\n" 0x$PID`
NEXT_PID=`cat /var/run/ppp*\.pid | sort -n | grep -A1 ^"$PID"$ | grep -v ^"$PID"$`
if test -n "${NEXT_PID}"
then
NEXT_OID=`printf %x $NEXT_PID`
NEXT_OID=`printf %d"\n" 0x$NEXT_OID"00"`
# Определить номер интерфейса по PIDу
IFINDEX=`grep "$NEXT_PID"$ /var/run/ppp*pid | awk -F"/var/run/ppp" '{ print $2 }' | awk -F"." '{ print $1 }'`
# Определить пользователя по номеру интерфейса
USERNAME=`$WHO | grep "ppp${IFINDEX} "| $AWK '{print $1}'`
echo ${MIBOID}.${NEXT_OID}
echo string
echo $USERNAME
exit
fi
exit
}
function setoid()
{
#echo SET | $LOGGER
IFINDEX=`echo "$OID" | awk -F"$MIBOID." '{print $2}'`
TMP_FILE='/tmp/vpm.tmp.$D'
# Если OID=MIBOID - то это нахуй в него писать?
if [ $OID = $MIBOID ]
then
echo "set:"$OID = $MIBOID | $LOGGER
exit
fi
#echo 1=$OID 2=$MIBOID
PID=`echo $OID| awk -F"$MIBOID." '{ print $2 }' `
PID=`printf %x $PID`
#echo $PID
# отрезать 2 последних символа у строки произвольной длинны
L=`echo ${#PID}-2 | bc`
#echo $L
PID=`printf $PID | cut -c 1-$L`
#echo $PID
PID=`printf %d"\n" 0x$PID`
#echo $PID
PID=`cat /var/run/ppp*\.pid | sort -n | egrep ^"$PID"$`
#echo $PID
if test -n "${PID}"
then
echo "/bin/kill -1 $PID" | $LOGGER
/bin/kill -1 $PID | $LOGGER
echo ${OID}
echo string
echo "1"
exit
fi
}
case "$1" in
"-g")
#получить значение OID
get $OID
;;
"-n")
#получить OID и значение следующего за OID обьекта
getnext $OID
;;
"-s")
#установить значение OID
#echo "--!"$1"--"$2"--"$3"--"$4 | $LOGGER
setoid $OID
;;
*)
#exit 1
;;
esac
#exit
exit