#!/bin/bash
#
#
#################################
### Created by Pavel Savasin  ###
### Network Solutions, 2018   ###  
### savasin@lanbilling.ru     ###
### SKAT DPI                  ###
#################################
#
#

# Prerequisites:
# - freeradius-utils 
#   - yum install freeradius-utils
#   - apt-get install freeradius-utils


PARAMS="$*" # all parameters for ./handler from billing
LOG='/var/log/billing/srvctl.log' # no comments

# RADIUS params
COA_PORT='3799' # port is default
COA_SECRET='vasexperts' # coa secret key
RATE_PREFIX='rate_'
REDIRECT='my_redirect_profile'

RADCLIENT='/usr/bin/radclient -t1 -r1 -c1 -x' # use mega-special radius client that support CoA :)

# flushing variables
ACTION=''
REASON=''
SESSION=''
LOGIN=''
NAS=''
IPLIST=''
SHAPE=''
OLDSHAPE=''
BNGNAME=''
MAC=''
GUEST=''
PASSWORD=''
OLDBLOCKED=''
BLOCKED=''
nIP=''
nNET=''
USERNAME=''
VGLOGIN=''

log()
{
    echo "[`date +'%d-%m-%Y %H:%M:%S'`] (${LOGIN} ${IP}) - $1 -> ${NAS} [$PARAMS]" >> $LOG # log regular events
}

log_error()
{
    echo "[`date +'%d-%m-%Y %H:%M:%S'`] - $1 [$PARAMS]" >> $LOG # log error events
}

account_logoff()
{
    log "Logging off subscriber => ${REASON}"
    echo "Framed-IP-Address=\"${IP}\",Acct-Session-Id=\"${SESSION}\" " | ${RADCLIENT} ${NAS}:${COA_PORT} disconnect ${COA_SECRET} >> ${LOG}
}
activate_redirect()
{
    log "Activating service redirect ${SERVICENAME}" 
    echo "Framed-IP-Address=\"${IP}\",Acct-Session-Id=\"${SESSION}\",VasExperts-Restrict-User="1",VasExperts-Service-Profile=\"5:${REDIRECT}\" " | ${RADCLIENT} ${NAS}:${COA_PORT} coa ${COA_SECRET} >> ${LOG}
}
deactivate_redirect()
{
    PROFILENAME=${RATE_PREFIX}${SHAPE}
    log "Deactivating service redirect ${SERVICENAME}" 
    echo "Framed-IP-Address=\"${IP}\",Acct-Session-Id=\"${SESSION}\",VasExperts-Restrict-User="0",VasExperts-Enable-Service=\"5:off\",VasExperts-Policing-Profile=\"${PROFILENAME}\" " | ${RADCLIENT} ${NAS}:${COA_PORT} coa ${COA_SECRET} >> ${LOG}
}
change_speed()
{
    PROFILENAME=${RATE_PREFIX}${SHAPE}
    log "Activating Policing Profile ${PROFILENAME}" 
    echo "Framed-IP-Address=\"${IP}\",Acct-Session-Id=\"${SESSION}\",VasExperts-Policing-Profile=\"${PROFILENAME}\" " | ${RADCLIENT} ${NAS}:${COA_PORT} coa ${COA_SECRET} >> ${LOG}
}


    # for debug purposes
# log_error "DEBUG"

# parsing handler parameters
while [ -n "$1" ]
do
    case $1 in
    "--action")
        ACTION=$2
        ;;
    "--reason")
        REASON=$2
        ;;
    "--session")
        SESSION=$2
        ;;
    "--login")
        LOGIN=$2
        ;;
    "--nas")
        NAS=$2
        ;;
    "--ip" | "--net")
        IP=$2
        ;;
    "--shape")
        SHAPE=$2
        ;;
    "--oldshape")
        OLDSHAPE=$2
        ;;
    "--opt-bng-name")
        BNGNAME=$2
        ;;
    "--mac")
        MAC=$2
        ;;
    "--guest")
        GUEST=$2
        ;;
    "--password")
        PASSWORD=$2
        ;;
    "--oldblocked")
        OLDBLOCKED=$2
        ;;
    "--blocked")
        BLOCKED=$2
        ;;
    "--user-name")
        USERNAME=$2
        ;;
    "--vg-login")
        VGLOGIN=$2
        ;;
    *)
        log_error "Unknown parameters: $1, $2"
        ;;
    esac

    shift 2
done


case $ACTION in
    "stop") # STOP session
    if [ -z ${SESSION} ]
    then
        log_error "SESSION_ID is not defined"
        exit 1
    fi
    if [ -z ${NAS} ]
    then
        log_error "NAS is not defined"
        exit 1
    fi

    if [ -z ${IP} ]
    then
        log_error "IP is not defined"
        exit 1
    fi
    if [ ${REASON} = 'changed' ]
    then
        if [ -n ${SHAPE} -o -n ${OLDSHAPE} ] 
        then
            log "Changing speed ${OLDSHAPE} => ${SHAPE}"
            change_speed
        fi
    else
        account_logoff
    fi
    ;;
    # special action for ISG sessions and sub-sessions
    "isg-stop")
    if [ ${OLDBLOCKED} = '0' ]
        then
        activate_redirect
    else
        deactivate_redirect
    fi
        ;;
    "quota")
        ;;
    "start") #start client session
        ;;
    "edit") #edit client account
        ;;
    "off") # block client account
        ;;
    "on") #unblock client account
        ;;
    "create") #create client account
        ;;

     *)
        log_error "Unknown action $action"
        ;;
esac
