Cisco Linux snmp Reset ppp
Материал из noname.com.ua
Версия от 15:09, 5 мая 2020; Sirmax (обсуждение | вклад)
Сброс с линии по 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