Cisco Linux snmp Reset ppp: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поискуSirmax (обсуждение | вклад) |
|||
| (не показано 11 промежуточных версий 2 участников) | |||
| Строка 1: | Строка 1: | ||
| + | [[Категория:Linux]] |
||
| + | [[Категория:Cisco]] |
||
| + | [[Категория:VPN]] |
||
| + | [[Категория:SNMP]] |
||
| + | |||
=Сброс с линии по snmp= |
=Сброс с линии по snmp= |
||
Задача: настроить linuxbox так что бы он мог "прикинуться циской" для биллинга. |
Задача: настроить linuxbox так что бы он мог "прикинуться циской" для биллинга. |
||
| + | Все скрипты помещаю в /etc/snmp/vpn/ |
||
| + | Эти скрипты требуют оптимизации, но какое-то время они вполне удачно прикидывались циской, думаю серьезных багов в них нет. |
||
| + | ==smmpd.conf== |
||
| − | #!/bin/bash |
||
| + | Добавляю выполненение скриптов для соответвующих OID. |
||
| − | |||
<PRE> |
<PRE> |
||
| + | 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 |
||
| + | </PRE> |
||
| + | ==Скрипты== |
||
| + | ===ppp_count.sh=== |
||
| + | <PRE> |
||
| + | #!/bin/bash |
||
LANG=C |
LANG=C |
||
export $LANG |
export $LANG |
||
| Строка 42: | Строка 57: | ||
;; |
;; |
||
esac |
esac |
||
| + | exit |
||
| + | </PRE> |
||
| + | |||
| + | ===vpn2.sh=== |
||
| + | <PRE> |
||
| + | #!/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 |
||
| + | </PRE> |
||
| + | |||
| + | |||
| + | ===vpn3.sh=== |
||
| + | <PRE> |
||
| + | #!/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 |
exit |
||
</PRE> |
</PRE> |
||
Текущая версия на 15:09, 5 мая 2020
Сброс с линии по 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