redback+tray_agent+ip_auth

по сравнению с
Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (131)

просмотр истории страницы
{code}
gcount=$RANDOM
event_inc.sh

Главное отличие это создание универсальной функций do_policy, которая вызывается в важных событиях, и уже по состоянию переменных

logged, enabled, over_limit, deleted   передает на оборудование нужную команду.

Таким образом код получается проще и без дублирований.

Также в примере есть блокировка, для последовательного выполнения telnet.

Также в примере реализована интеграции tray_srv  с оборудованием. И авторизации по Ip тоже.

gcount=$RANDOM
do_session=0

function
unlock_telnet(){
function unlock_telnet(){

    flock -u -w 30 11 && LOG INFO "UnLock $lock Success"
"UnLock $lock Success"

}

function
lock_telnet(){
function lock_telnet(){

    #открываем файл блокировки

    lock="$gcount id=$id ip=$ip $RANDOM"
$RANDOM"

    exec 11>&-

    exec 11>/tmp/telnet.lock
11>/tmp/telnet.lock

    # попытка блокировать ждем 30 секунд пока другие все закончат
блокировать ждем 30 секунд пока другие все закончат

    LOG INFO "Try Lock $lock 30sec...   "
        else

            LOG INFO "Lock $lock failed. Create New Lock;"
Create New Lock;"

            rm -f /tmp/telnet.lock; #rm -f защита от повисших скриптов
повисших скриптов

            exec 11>&-
 

#if ! selflock 10; then
selflock 10; then

#    LOG WARN "reached time limit $$"
 

SENDER=$1;
shift
SENDER=$1; shift

EVENT=$1;
shift
EVENT=$1; shift

DATA=$@
 

for VAR in $DATA; do
$DATA; do

      [[ "$VAR" = *"="* ]] && eval ${VAR%%=*}=\'${VAR#*=}\'
&& eval ${VAR%%=*}=\'${VAR#*=}\'

done

LOG INFO ""
""

LOG INFO " $gcount ***$EVENT*** $DATA"
" $gcount ***$EVENT*** $DATA"

 

function
do_reconnect(){
function do_reconnect(){

            lock_telnet

            /usr/local/bin/expect /var/lib/event/reconnect_user.tcl $nas_ip $ip $id | grep -i 'Connection refused'
/var/lib/event/reconnect_user.tcl $nas_ip $ip $id | grep -i 'Connection
refused'

            sleep 4

            [ "$?" = 0 ] && { echo "Connection refused sleep 20" ; sleep 20; }
echo "Connection refused sleep 20" ; sleep 20; }

            unlock_telnet
}

function
do_policy(){
function do_policy(){

 
            do_inet=1

            # выключаем инет кому запрещен
выключаем инет кому запрещен

            [ "$auth_type" = "6" -a "$tray_logged" = "0" ] && do_inet=0
"6" -a "$tray_logged" = "0" ] &&
do_inet=0

            [ "$logged" = -1 ] && do_inet=0
&& do_inet=0

            [ "$enabled" = "0" -o \
"0" -o \

                    "$over_limit" = "1" -o "$deleted" = "1" ] && do_inet=0
"1" -o "$deleted" = "1" ] && do_inet=0

            if [ $do_inet = "1" ]; then
then

                        LOG INFO "$gcount Enable Internet for id=$id ip=$ip"
Enable Internet for id=$id ip=$ip"

                        echo "Acct-Session-Id=\"$acct_session_id\",Forward-Policy=\"in:\""\
"Acct-Session-Id=\"$acct_session_id\",Forward-Policy=\"in:\""\

                            | radclient -x $nas_ip:$coa_port coa $nas_pass  2>&1 \
$nas_ip:$coa_port coa $nas_pass  2>&1
\

                            | grep -i "Session-Context-Not-Found"
"Session-Context-Not-Found"

                        [ $? -eq 0  ] && do_session=1
            else

                        LOG INFO "$gcount Disable Internet for id=$id ip=$ip  enabled=$enabled over_limit=$over_limit deleted=$deleted"
Disable Internet for id=$id ip=$ip 
enabled=$enabled over_limit=$over_limit deleted=$deleted"

                        echo "Acct-Session-Id=\"$acct_session_id\",Forward-Policy=\"in:\",Forward-Policy=\"in:HTTP-REDIRECT\",HTTP-Redirect-URL=\"http://10.0.0.1/noauth\""| radclient -x $nas_ip:$coa_port coa $nas_pass \
"Acct-Session-Id=\"$acct_session_id\",Forward-Policy=\"in:\",Forward-Policy=\"in:HTTP-REDIRECT\",HTTP-Redirect-URL=\"http://10.0.0.1/noauth\""|
radclient -x $nas_ip:$coa_port coa $nas_pass \

                        | grep -i "Session-Context-Not-Found"
"Session-Context-Not-Found"

                        [ $? -eq 0  ] && do_session=1
 

                        if [ $over_limit = 1 ]; then
then

                            echo "Acct-Session-Id=\"$acct_session_id\",Forward-Policy=\"in:HTTP-REDIRECT\",HTTP-Redirect-URL=\"http://10.0.0.1/nomoney\""\
"Acct-Session-Id=\"$acct_session_id\",Forward-Policy=\"in:HTTP-REDIRECT\",HTTP-Redirect-URL=\"http://10.0.0.1/nomoney\""\

                                | radclient -x $nas_ip:$coa_port coa $nas_pass \
$nas_ip:$coa_port coa $nas_pass \

                                | grep -i "Session-Context-Not-Found"
"Session-Context-Not-Found"

                                [ $? -eq 0  ] && do_session=1
 

case
case "$EVENT" in

    login | tray_view_login | balance_negative | balance_positive)
| balance_positive)

        if [ "$nas_ip" = '10.0.0.3' ]; then
]; then

            if [ "$acct_session_id" != "" ]; then
!= "" ]; then

                do_policy ## and set do_session
            fi

            if [ "$acct_session_id" = "" -o "$do_session" = "1" ]; then
"" -o "$do_session" = "1" ]; then

                do_reconnect # не гарантированно будет новый логин поэтому политику вешаем
гарантированно будет новый логин поэтому политику вешаем

                do_policy
    rad_acc_start)

        [ "$auth_type" = "1" ] &&  do_policy
"1" ] &&  do_policy

    ;;
    try_double_login)

        if [ "$nas_ip" = '10.0.0.3' ]; then
]; then

                sleep 30
    ;;

   
    tray_view_mustlogon|user_data_changed|user_disconnect)

            if [ "$nas_ip" = '10.0.0.3' ]; then
'10.0.0.3' ]; then

                sleep 10

               
do_reconnect
                do_reconnect

                do_policy
        lock_telnet

        /usr/local/bin/expect /var/lib/event/del_user_ip.tcl 10.0.0.3  $ip $id \
/var/lib/event/del_user_ip.tcl 10.0.0.3 
$ip $id \

            && LOG INFO "$gcount deleted user "$ip $id \
user "$ip $id \

            || LOG INFO "$gcount NOT deleted user "$ip $id
deleted user "$ip $id

        unlock_telnet

        [ "$EVENT" = "user_del" ] &&  sqlexec "update users set nas_ip=null where id=$id and deleted=1"
"user_del" ] && 
sqlexec "update users set nas_ip=null where id=$id and
deleted=1"

    ;;
    "rate_set")

    [ "$nas_ip" = '10.0.0.3' ] && \
&& \

    if  [  $ceil_in -ne -1  ]
[  $ceil_in -ne -1  ]

        then

            let "burst_in = ceil_in * 1000 / 8"
/ 8"

            let "excess_burst_in = ceil_in * 1500 / 8"
* 1500 / 8"

            let "burst_out = ceil_out * 1000 / 8"
1000 / 8"

            let "excess_burst_out = ceil_out * 1500 / 8"
ceil_out * 1500 / 8"

            echo "Acct-Session-Id=\"$acct_session_id\",Dynamic-QoS-Param += \"police-class-rate cls-all rate-absolute $ceil_in\",Dynamic-QoS-Param += \"polic
"Acct-Session-Id=\"$acct_session_id\",Dynamic-QoS-Param +=
\"police-class-rate cls-all rate-absolute
$ceil_in\",Dynamic-QoS-Param += \"polic

        else

            LOG INFO " NOT changed ceil_in=$ceil_in and ceil_out=$ceil_out " $ip $id
ceil_in=$ceil_in and ceil_out=$ceil_out " $ip $id

    fi
esac

<!--  
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Обычная таблица";
mso-tstyle-rowband-size:0;  
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;  
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"Times New Roman";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
-->
{code}