Cisco Linux snmp Reset ppp

Материал из Wiki
Перейти к: навигация, поиск

Сброс с линии по 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