Скрипты для привязки клиента на коммутатор и порт в биллинге UTM5

Условия должны быть такие что
1)в биллинге свитчи должны в наименовании иметь домен в виде что то типа
dlink-DES-3526-10.98.98.177.lan
dlink-DES-1100-10.98.98.155.lan
mikrotik-10.98.99.5.lan
huawei-10.98.98.71.lan
в это случае мы сможем идентифицировать фирму и модель коммутатора
2)в бинде необходимо чтобы эти домены резолвились
3)логи freeradius должны быть на этом же серваке где и эти скрипты

скрипт atar_puertos

#!/bin/bash
 
RES_ARCHIVO=/tmp/tomar_mac2
ARCHIVO_LOG=/var/log/atar_puertos.log
# переменная для автоизации в мускуле
mysql_auth="mysql -h 192.168.201.3 --user=utm5 --password=<password> -D UTM5 -e"
# формируем массив из установленых свитчей исключая те которые не установлены а также свитчи агрегации и те которые не имеют snmp
routers=(`$mysql_auth "SELECT id,router_ip FROM routers_info WHERE (router_ip LIKE '%10.98.%' AND router_comments NOT LIKE '%не установлен%' AND router_comments NOT LIKE '%агрегация%' AND router_ip NOT LIKE '%dlink-DES-1100%' AND router_ip NOT LIKE '%tplink%' AND router_ip NOT LIKE '%mikrotik%' AND is_deleted=0) OR (router_ip LIKE '%bdcom%') ORDER BY router_ip;" -N`)
# считаем количество элементов в массиве
count=${#routers[@]}
# перебираем элементы массива
for (( i = 0 ; i < $count ; i=$i+2 ))
do
  # определяем id свитча
  switch_id=${routers[$i]}
  # определяем домен свитча
  domen=${routers[$i+1]}
  # определяем фирму свитча
  empresa=`echo ${routers[$i+1]} | awk -F- {'print $1'}`
  echo domen=$domen
  # запускаем сторонний скрипт который формирует файлик со списком маков где есть номера портов маки и логины
  /usr/local/bin/tomar_mac $domen
  # если файл нарисовался
  if [ -e $RES_ARCHIVO ]; then
    # перебираем этот файлик построчно
    while read FILA
    do
      # определяем логин
      login=`echo $FILA | awk -F' '  {'print $3'}`
      # определяем порт
      puerto=`echo $FILA | awk -F' '  {'print $1'}`
      # если логин не пустой
      if [ ! -z $login ];then
        # запрашиваем user_id из базы по логину
        user_id=`$mysql_auth "SELECT id FROM users WHERE login='$login' AND is_deleted='0';" -N`
        # привязываем клиента на этот порт
        /usr/bin/ourfa_client -c /netup/utm5/utm5_urfaclient_bill.cfg -S rsa_cert -a rpcf_save_user_othersets -user_id $user_id -count 1 -type 1 -id $switch_id -port $puerto > /dev/null 2>&1
        echo `/bin/date "+%F %T"` $0 "$domen puerto $puerto ha atado $login" >> $ARCHIVO_LOG
      fi
    done < $RES_ARCHIVO
  else
    echo "Поиск не дал результатов"
  fi
done

скрипт tomar_mac

#!/bin/bash 
 
TMP_FILE=/tmp/tomar_mac
TMP_FILE2=/tmp/tomar_mac2
RADIUS_LOG=/var/log/freeradius/radius.log
#RADIUS_LOG=/srv/ftp_backup/tmp/radius.log
 
 
if [ -e $TMP_FILE ]; then 
  rm $TMP_FILE 
fi
 
if [ -e $TMP_FILE2 ]; then 
  rm $TMP_FILE2 
fi
 
if [ $1 == "--help" ]; then {
  echo "Usage: tomar_mac2 HOST [OPTIONS]"
  echo "Options:"
  echo "  -24      Показать мак-адреса на портах 1-24"
  echo "  -2526    Показать мак-адреса на портах 25-26"
  echo "  -all     Показать мак-адреса на всех портах"
  echo "  --help   Показать это сообщение"
  echo "Если не использовать ключи OPTIONS - по умолчанию будет использоваться ключ -24"
}
else {
case "$2" in
  -all)
    snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    ;;
  -2526)
    snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -e ": 25\|: 26" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    ;;
  *)
    if [ "`echo $1 | grep dlink-DES-3026`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 25" | grep -v ": 26" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep dlink-DES-3028`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 25" | grep -v ": 26" | grep -v ": 27" |  grep -v ": 28" |  awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep dlink-DES-3200`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 25" | grep -v ": 26" | grep -v ": 27" | grep -v ": 28" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep dlink-DES-352`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 25" | grep -v ": 26" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep dlink-DES-1210-52`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 49" | grep -v ": 50" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep dlink-DES-1210-48`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 47" | grep -v ": 48" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep dlink-DES-3052`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 49" | grep -v ": 50" | grep -v ": 51" | grep -v ": 52" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep dlink-DES-3550`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 49" | grep -v ": 50" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep alcatel`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 49" | grep -v ": 50" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep huawei`" != "" ];then    
      snmpwalk -Cc -v2c -c public $1 1.3.6.1.4.1.2011.5.25.42.2.1.3.1 | grep -v -e ": 29$\|: 30$\|: 0$\|: 1$\|: 2$\|: 3585$" | awk -F. {'print $16" "$17" "$18" "$19" "$20" "$21" "$24'} | sed 's/48 =/=/' | awk -F: '{print $1" "$2-4}' > $TMP_FILE
    fi
    if [ "`echo $1 | grep qtech`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 25" | grep -v ": 26" | grep -v ": 27" | grep -v ": 28" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep hp-2510`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.7.1.2.2.1.2 | grep -v ": 25" | grep -v ": 26" | awk -F. {'print $15" "$16" "$17" "$18" "$19" "$20'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep hp-v1905`" != "" ];then
      snmpwalk -v2c -c public $1 1.3.6.1.2.1.17.4.3.1.2 | grep -v ": 49" | grep -v ": 50" | awk -F. {'print $12" "$13" "$14" "$15" "$16" "$17'} > $TMP_FILE
    fi
    if [ "`echo $1 | grep bdcom-10.5.0.190.lan`" != "" ];then
    echo 1
      /usr/local/bin/bdcom_mac $1 235 | grep DYNAMIC | grep epon | awk {'print $2" "$4'} | sed 's/\.//g;s/epon0\///;s/://' | sed 's/^\(..\)/\1:/;s/^\(.....\)/\1:/;s/^\(........\)/\1:/;s/^\(...........\)/\1:/;s/^\(..............\)/\1:/' | sed 's/'"$(printf '\015')"'$//g' > $TMP_FILE
      /usr/local/bin/bdcom_mac $1 240 | grep DYNAMIC | grep epon | awk {'print $2" "$4'} | sed 's/\.//g;s/epon0\///;s/://' | sed 's/^\(..\)/\1:/;s/^\(.....\)/\1:/;s/^\(........\)/\1:/;s/^\(...........\)/\1:/;s/^\(..............\)/\1:/' | sed 's/'"$(printf '\015')"'$//g' >> $TMP_FILE
      /usr/local/bin/bdcom_mac $1 241 | grep DYNAMIC | grep epon | awk {'print $2" "$4'} | sed 's/\.//g;s/epon0\///;s/://' | sed 's/^\(..\)/\1:/;s/^\(.....\)/\1:/;s/^\(........\)/\1:/;s/^\(...........\)/\1:/;s/^\(..............\)/\1:/' | sed 's/'"$(printf '\015')"'$//g' >> $TMP_FILE
      /usr/local/bin/bdcom_mac $1 242 | grep DYNAMIC | grep epon | awk {'print $2" "$4'} | sed 's/\.//g;s/epon0\///;s/://' | sed 's/^\(..\)/\1:/;s/^\(.....\)/\1:/;s/^\(........\)/\1:/;s/^\(...........\)/\1:/;s/^\(..............\)/\1:/' | sed 's/'"$(printf '\015')"'$//g' >> $TMP_FILE
    echo 2
    fi
    if [ "`echo $1 | grep bdcom-10.5.0.180.lan`" != "" ];then
    echo 3
      /usr/local/bin/bdcom_mac $1 101 | grep DYNAMIC | grep epon | awk {'print $2" "$4'} | sed 's/\.//g;s/epon0\///;s/://' | sed 's/^\(..\)/\1:/;s/^\(.....\)/\1:/;s/^\(........\)/\1:/;s/^\(...........\)/\1:/;s/^\(..............\)/\1:/' | sed 's/'"$(printf '\015')"'$//g' > $TMP_FILE
      /usr/local/bin/bdcom_mac $1 102 | grep DYNAMIC | grep epon | awk {'print $2" "$4'} | sed 's/\.//g;s/epon0\///;s/://' | sed 's/^\(..\)/\1:/;s/^\(.....\)/\1:/;s/^\(........\)/\1:/;s/^\(...........\)/\1:/;s/^\(..............\)/\1:/' | sed 's/'"$(printf '\015')"'$//g' >> $TMP_FILE
      /usr/local/bin/bdcom_mac $1 103 | grep DYNAMIC | grep epon | awk {'print $2" "$4'} | sed 's/\.//g;s/epon0\///;s/://' | sed 's/^\(..\)/\1:/;s/^\(.....\)/\1:/;s/^\(........\)/\1:/;s/^\(...........\)/\1:/;s/^\(..............\)/\1:/' | sed 's/'"$(printf '\015')"'$//g' >> $TMP_FILE
      /usr/local/bin/bdcom_mac $1 104 | grep DYNAMIC | grep epon | awk {'print $2" "$4'} | sed 's/\.//g;s/epon0\///;s/://' | sed 's/^\(..\)/\1:/;s/^\(.....\)/\1:/;s/^\(........\)/\1:/;s/^\(...........\)/\1:/;s/^\(..............\)/\1:/' | sed 's/'"$(printf '\015')"'$//g' >> $TMP_FILE
    echo 4
    fi
    ;;
esac
if [ "`echo $1 | grep bdcom`" == "" ];then
 
while read LINE
do
  if [ `echo $LINE | awk {'print $9'}` -lt "10" ]; then
    echo -n "0`echo $LINE | awk {'print $9'}` " >> $TMP_FILE2
  else
    echo -n "`echo $LINE | awk {'print $9'}` " >> $TMP_FILE2
  fi
  if [ `echo $LINE | awk {'print $1'}` -lt "16" ]; then
    echo -n 0$(echo "obase=16; `echo $LINE | awk {'print $1'}`" | bc): >> $TMP_FILE2
  else
    echo -n $(echo "obase=16; `echo $LINE | awk {'print $1'}`" | bc): >> $TMP_FILE2
  fi
  if [ `echo $LINE | awk {'print $2'}` -lt "16" ]; then
    echo -n 0$(echo "obase=16; `echo $LINE | awk {'print $2'}`" | bc): >> $TMP_FILE2
  else
    echo -n $(echo "obase=16; `echo $LINE | awk {'print $2'}`" | bc): >> $TMP_FILE2
  fi
  if [ `echo $LINE | awk {'print $3'}` -lt "16" ]; then
    echo -n 0$(echo "obase=16; `echo $LINE | awk {'print $3'}`" | bc): >> $TMP_FILE2
  else
    echo -n $(echo "obase=16; `echo $LINE | awk {'print $3'}`" | bc): >> $TMP_FILE2
  fi
  if [ `echo $LINE | awk {'print $4'}` -lt "16" ]; then
    echo -n 0$(echo "obase=16; `echo $LINE | awk {'print $4'}`" | bc): >> $TMP_FILE2
  else
    echo -n $(echo "obase=16; `echo $LINE | awk {'print $4'}`" | bc): >> $TMP_FILE2
  fi
  if [ `echo $LINE | awk {'print $5'}` -lt "16" ]; then
    echo -n 0$(echo "obase=16; `echo $LINE | awk {'print $5'}`" | bc): >> $TMP_FILE2
  else
    echo -n $(echo "obase=16; `echo $LINE | awk {'print $5'}`" | bc): >> $TMP_FILE2
  fi
  if [ `echo $LINE | awk {'print $6'}` -lt "16" ]; then
    echo -n 0$(echo "obase=16; `echo $LINE | awk {'print $6'}`" | bc) >> $TMP_FILE2
  else
    echo -n $(echo "obase=16; `echo $LINE | awk {'print $6'}`" | bc) >> $TMP_FILE2
  fi
  echo " $(cat $RADIUS_LOG | grep -i ` tail $TMP_FILE2 -n 1 | awk {'print $2'}` | grep "Login OK" | tail -n 1 | sed 's/^.*\[/ /;s/\/.*/ /')" >> $TMP_FILE2
done < $TMP_FILE
 
else
while read LINE
do
  echo -n $(echo $LINE | awk {'print $2" "$1'}) >> $TMP_FILE2
  echo "$(cat $RADIUS_LOG | grep -i ` tail $TMP_FILE2 -n 1 | awk {'print $2'}` | grep "Login OK" | tail -n 1 | sed 's/^.*\[/ /;s/\/.*/ /')" >> $TMP_FILE2
done < $TMP_FILE
 
fi
 
}
fi