Показаны сообщения с ярлыком bash. Показать все сообщения
Показаны сообщения с ярлыком bash. Показать все сообщения

четверг, 30 июля 2009 г.

Удаленно дропаем сессии на CISCO

Задача следующая, есть некий билинг, у нас стоит всеми любимый UTM5 от компании NetUP, необходимо чтобы по команде билинга дропались сессии например когда у абонента кончается бабло на счету.
Тоесть нада вывести пользователя и определить его id
show vpdn session stat
потом дропнуть ему сессию
clear vpdn tunnel pptp id <ид_сессии>

По действиям, первое, что нам необходимо, это включить rsh на VPN сервере и дать разрешение на дроп сессии.
Заходим на CISCO в режим глобального конфигурирования, команды следующие:
rlogin trusted-remoteuser-source local - включает аунтификацию по локальному логину
rlogin trusted-localuser-source local - тоже самое
no ip rcmd domain-lookup - дабы не резолвил имя домена
ip rcmd rsh-enable - включили rsh
ip rcmd remote-host utm 192.168.1.1 root enable 8 - локальное имя utm, ip откуда - 192.168.1.1, удаленное имя root(это пользователь под которым будет запущен rsh, если не root то пишем под кем запускаем), enable 8 - права
privilege exec level 8 show vpdn session state - разрешаем для уровня 8 сделать команду show vpdn session state
privilege exec level 8 clear vpdn tunnel pptp id - разрешаем для уровня 8 сделать команду clear vpdn tunnel pptp id

Сохраняем конфигурацию и проверяем, на компьютере ip адрес которой мы указали в настройках.
должно получится что то типа такого:
[root@server odmin]# rsh 192.168.1.2 -l utm sh vpdn session stat
connect to address 192.168.1.2 port 544: Connection refused
Trying krb4 rsh...
connect to address 192.168.1.2 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)


%No active L2F tunnels

L2TP Session Information Total tunnels 1 sessions 1

LocID RemID TunID Username, Intf/ State Last Chg Uniq ID
Vcid, Circuit
365 1027 3280 abonlogin1, Vi359 est 16:48:53 476

PPTP Session Information Total tunnels 173 sessions 173

LocID RemID TunID Intf Username State Last Chg Uniq I
39421 49152 40317 Vi332 abonlogin2 estabd 12:19:32 254

если увидели, значит все в порядке, VPN сервер пускает
выбираем TunID который равен 40317
и проверяем такимже методом команду clear
rsh 192.168.1.2 -l utm clear vpdn tunnel pptp id 40317
VPN сессия должна дропнутся.

Азы понятны, далее элементарный скриптик на баше, типа этого куска из моего скрипта:

TUN_PID=`rsh $CISCO_IP -l utm sh vpdn session stat | grep $USERLOGIN | awk '{print $3}'`
if [ "$TUN_PID" ]; then
rsh $CISCO_IP -l utm clear vpdn tunnel pptp id $TUN_PID > /dev/null
echo "$DATE $USERLOGIN EMERGENCY tunnel $TUN_PID closed in $CISCO_IP!" >> /var/log/utm5/close-vpn.log
fi

При заканчивании бабла срабатывает тригер на блокировку абонента, билинг отдает скриптику логин, вычисляется PID тунеля и происходит дропанье. Все счастливы и довольны. Особенно дропнутый абонент.

Читать далее

пятница, 24 июля 2009 г.

Дока по написанию Bash скриптов

Постоянно забываю адрес адекватной доки по BASH, в закладках она у меня есть, но иной раз бывает приходится быстро написать какойнить скриптик не со своего компа, приходится лопатить гугель на тему адекватной доки. Собсно сцылка на тру доку:Advanced Bash-Scripting Guide

Читать далее

вторник, 21 июля 2009 г.

Из серии, не просто, а очень просто

Бывает, что надо выполнять какое либо действие в том же линуксе в последний день месяца, но так как в месяце у нас не одинаковое количество дней, гдето 30, гдето 31, а гдето вообще 28, народ начинает извращаться, придумывая адские формулы расчета високосных годов, перекапывая гугель в поисках функций гадания на кофейной гуще. Немного творческого подхода и все оказывается гораздо проще.
Логика следующая, определяем сегодняшнюю дату, прибавляем к ней 1 день(86401 секунду), потом смотрим какой день получается, если он равна 1(еденице) то значит новый месяц наступил и текущий день является последним в текущем месяце.
Элементарный пример на томже баше:

#!/bin/bash

DATENOW=`date +%d --date="+1day"`

if [ $DATENOW -eq 1 ]
then
/home/odmin/nash_skript.sh
fi

Запихиваем это дело в крон с любой переодичностью и радуемся.
Читать далее

понедельник, 20 июля 2009 г.

Балансировка нагрузки

До некоторого времени использовали Round-robin но иногда перекосы всетаки упирали какую нибуть циску в потолок, для проверки перекосов за 10 минут с перекуром был скреативен след скриптик. Запихиваем в cron с необходимой переодичностью и получаем щастье.

#!/bin/bash

#date
DATE=`date "+%d.%m.%Y %H:%M:%S"`

#IP adress pool cisco
CISCO_IP1=192.168.1.1
CISCO_IP2=192.168.1.2


#max count VPN session
MAXVPN_C1=1500
MAXVPN_C2=1500

#path to snmpwalk
PTSNMPW=/usr/local/bin/snmpwalk

#path to bind
PTBIND=/etc/init.d/bind

#path to zone file
PTZONEF=/var/lib/bind/zone/pptp.example.ru.db

#snmp community
COMMUN=public

#MIB
MIB=1.3.6.1.4.1.9.10.24.1.1.4.1.2.3

#main zone
MAINZONE=/var/lib/bind/zone/example.ru.named

#cisco zone file name
CZONE=pptp.exampe.ru.db

#log
LOG=/var/log/cisco_reload.log

#main
COUNT=`$PTSNMPW -v 2c $CISCO_IP1 -c $COMMUN $MIB | cut -d ' ' -f4`

if [ "$COUNT" -le "$MAXVPN_C1" ]
then
echo "login IN A $CISCO_IP1" > $PTZONEF
else
echo "$DATE - reloading CISCO 1 complited" >> $LOG
echo ";CISCO1 reloading" > $PTZONEF
fi

COUNT=`$PTSNMPW -v 2c $CISCO_IP2 -c $COMMUN $MIB | cut -d ' ' -f4`

if [ "$COUNT" -le "$MAXVPN_C2" ]
then
echo "login IN A $CISCO_IP2" >> $PTZONEF
else
echo "$DATE - reloading CISCO 2 complited" >> $LOG
fi

INCLTEST=`cat $MAINZONE | grep -c $CZONE`
if [ "$INCLTEST" -eq 0 ]
then echo "\$include \"$CZONE\"" >> $MAINZONE
fi

$PTBIND reload
echo "$DATE - work complited!" >> $LOG

Читать далее