#!/bin/bash
#
#
######################################
### Created by Kovalenko Anton     ###
### Network Solutions, 2023        ###
### kovalenko@lanbilling.ru        ###
### LBucd-2.0-23+                  ###
### CentOS 5.x-8.x                 ###
### Debian 7.x-11.x                ###
######################################
#
# Requirements:
# - netmask util (Centos: rpm -ivh ftp://ftp.pbone.net/mirror/download.fedora.redhat.com/pub/fedora/epel/8/Everything/x86_64/Packages/n/netmask-2.4.4-7.el8.x86_64.rpm, Debian: apt install netmask)
# - freeradius-utils (Centos: yum install freeradius-utils, Debian: apt install freeradius-utils)

PARAMS="$*" # all parameters for ./handler from billing
LOG='/var/log/billing/handler_ucd.log' # no comments
NAS_IP="192.168.1.10"
NAS_SECRET="secret"

# flushing variables
ACTION=''
LOGIN=''
SHAPE=''
PASSWORD=''
IPLIST=()

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

# for debug purposes
# log_error "DEBUG"
# parsing handler parameters
while [ -n "$1" ]
do
    case $1 in
    "--action")
        ACTION=$2
        ;;

    "--login")
        LOGIN=$2
        ;;

    "--net")
        IPLIST+=($2)
        ;;

    "--shape")
        SHAPE=$2
        ;;

    "--password")
        PASSWORD=$2
        ;;
    *)
        log "Unknown parameters: $1, $2"
        ;;
    esac
    shift 2
done

for i in "${IPLIST[@]}"
do
    MASK=`echo $i|awk -F'/' '{print $2}'`
    SEGMENT=`echo $i|awk -F'/' '{print $1}'`

    case $ACTION in
        "create")
            log "Logging create account: $LOGIN, ip: $SEGMENT, mask: $MASK"

	    # -- Здесь обрабатываем создание УЗ --
	    # Как вариант вызываем старый скрипт vg.create.sh:
            /usr/local/billing/scripts/vg.create.sh $LOGIN $PASSWORD $SEGMENT $MASK $SHAPE >> $LOG

	    # Или описываем необходимую логику вместо вызова внешнего скрипта, например:
            rsh -l $NAS_SECRET $NAS_IP "access-template 107 list2 any host ${SEGMENT}" >> $LOG

            ;;
        "delete")
            log "Logging delete account: $LOGIN, ip: $SEGMENT, mask: $MASK"

	    # -- Здесь обрабатываем удаление УЗ --
            # Как вариант вызываем старый скрипт vg.delete.sh:
	    /usr/local/billing/scripts/vg.delete.sh $LOGIN $PASSWORD $SEGMENT $MASK $SHAPE >> $LOG

            # Или описываем необходимую логику вместо вызова внешнего скрипта, например:
            rsh -l $NAS_SECRET $NAS_IP "clear access-template 106 list1 host ${SEGMENT} any" >> $LOG

            ;;
        "edit")
            log "Logging edit account: $LOGIN, ip: $SEGMENT, mask: $MASK"

            # -- Здесь обрабатываем изменение УЗ --
            # Как вариант вызываем старый скрипт vg.edit.sh:
            /usr/local/billing/scripts/vg.edit.sh $LOGIN $PASSWORD $SEGMENT $MASK $SHAPE >> $LOG

            # Или описываем необходимую логику вместо вызова внешнего скрипта, например:
            rsh -l $NAS_SECRET $NAS_IP "clear access-template 106 list1 host ${SEGMENT} any" >> $LOG

            ;;
        "off")
            log "Logging off account: $LOGIN, ip: $SEGMENT, mask: $MASK"

            # -- Здесь обрабатываем блокировку УЗ --
            # Как вариант вызываем старый скрипт vg.off.sh:
            /usr/local/billing/scripts/vg.off.sh $LOGIN $PASSWORD $SEGMENT $MASK $SHAPE >> $LOG

            # Или описываем необходимую логику вместо вызова внешнего скрипта, например:
            rsh -l $NAS_SECRET $NAS_IP "clear access-template 107 list2 any host ${SEGMENT} " >> $LOG

        ;;
        "on")
            log "Logging on account: $LOGIN, ip: $SEGMENT, mask: $MASK"

            # -- Здесь обрабатываем включение/разблокировку УЗ --
            # Как вариант вызываем старый скрипт vg.on.sh:
            /usr/local/billing/scripts/vg.on.sh $LOGIN $PASSWORD $SEGMENT $MASK $SHAPE >> $LOG

            # Или описываем необходимую логику вместо вызова внешнего скрипта, например:
            rsh -l $NAS_SECRET $NAS_IP "access-template 107 list2 any host ${SEGMENT} " >> $LOG

            ;;
        "*")
            log "Unknown action $ACTION"
        ;;
    esac
done
