(решено) помогите довести до ума скрипт

Модератор: Модераторы разделов

Ответить
Аватара пользователя
MozG1986
Сообщения: 103
ОС: Mageia5, Mageia6

(решено) помогите довести до ума скрипт

Сообщение MozG1986 »

Значит так, имеется netams (биллинг), он управляется через telnet, для упрощения общения с ним имеется простенький telnet клиент, который все данные для подключения берет из конфига.

Цель: научить netams неизрасходованный траффик за какой-либо период времени (у меня - это сутки) прибавлять к квоте на следующий период. Например, квота в сутки 20 метров, израсходовано 15 метров, по хрону запускаем в 29.59 скрипт, который смотрит статус квоты (сработала/нестаботала), если квота неизрасходована, то считается остаток, прибавляется к текущей квоте и сохраняется соответствующей командой, если квота израсходована, то она сбрасывается на начальное состояние (у меня это 20 метров).

Команда для вывода состояния квоты и результат ее выполнения:

Код:

[root@serv admin]# netamsctl "show quota" host: localhost port: 20001 login: admin password: ******** cmd: show quota OID: 04CB70 (NETWORK) policy: www soft-treshold: 99% ACTIVE Notification: soft {owner} , hard {owner} , return {owner} DAY in: 196.682K, softquota 20.790M ratio 1% -> [+] DAY in: 196.682K, hardquota 21.000M ratio 1% -> [+] Total units: 9, enabled: 1, active: 1, blocked: 0, softblocked: 0 [root@serv admin]#


команда задания новой квоты и результат ее выполнения:

Код:

[root@serv admin]# netamsctl "service quota && set name NETWORK policy www active day 20M in && exit" host: localhost port: 20001 login: admin password: ******** cmd: service quota && set name NETWORK active day 20M in && exit parse: switching to service quota:0 for configuring quota:0parse: Configuring quota for unit NETWORK , policy www parse: unit 04CB70 quota is set to ACTIVE quota:0[root@serv admin]#


ключевые строки:

DAY in: 196.682K, hardquota 21.000M ratio 1% -> [+]

здесь мы видим сколько израсходовано (in: 196.682K) и текущая квота (hardquota 21.000M)

Total units: 9, enabled: 1, active: 1, blocked: 0, softblocked: 0

здесь мы видим, сработала квота или нет (blocked: 0 - лимит не исчерпан, blocked: 1 - лимит исчерпан)

Состояние квоты проверяется раз в n секунд, т.е. исрасходовано может быть больше квоты.

Данные об использованном траффике выводятся с сокращениями (килобайты: DAY in: 196.682K , мегабайты DAY in: 15.612M),
задаются они тоже с сокращениями, но 20 мегабайт к примеру можно задать как 20M и как 20480K, можно задавать дробные числа, например 20.6M

На данный момент скрипт имеет следующий вид (спасибо subj):

Код:

#!/bin/bash day=`netamsctl "show quota"|grep hardquota|grep -o "[^ ]*[KM]"` used=`echo "$day"|head -n1` quota=`echo "$day"|tail -n1` if [ `echo $used|grep M` ]; then used=`echo $used|sed "s/\..*$//"` let used=$used*1024 else used=`echo $used|sed "s/\..*$//"` fi if [ `echo $quota|grep M` ]; then quota=`echo $quota|sed "s/\..*$//"` let quota=$quota*1024 else quota=`echo $quota|sed "s/\..*$//"` fi let delta=$quota-$used let newquota=$quota+$delta netamsctl "service quota && set name NETWORK policy www active day `echo $newquota`K in && exit"


его недостатки:
1) не проверяет статус квоты (израсходована или нет) и соответственно не сбрасывает ее в 20M при ее исчерпании
2) в расчетах 16.xxxM округляется до 16M в любом случае, что привеодит к некоторым погрешностям (до одного килобайта/мегабайта, гигабайтами еще не качаем)

Просьба довести скрипт до ума
и всем заранее огромное спасибо за помощь
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: (решено) помогите довести до ума скрипт

Сообщение Subj »

Код: Выделить всё

#!/bin/bash
day=`netamsctl "show quota"|grep hardquota|grep -o "[^ ]*[KM]"`
used=`echo "$day"|head -n1`
quota=`echo "$day"|tail -n1`

function ifm()
{
   if [ `echo $1|grep M` ]; then
      a=`echo $1|sed "s/M//"`
      r=`echo "$a*1024"|bc`
   else
      r=`echo $1|sed "s/K//"`
   fi
   echo $r
}

used=`ifm $used`
quota=`ifm $quota`

delta=`echo "$quota-$used"|bc`

if [ $delta == 0 ] || [ `echo $delta|grep '-'` ]; then
   let newquota=20*1024
else
   newquota=`echo "$quota+$delta"|bc`
fi

netamsctl "service quota && set name NETWORK policy www active day `echo $newquota`K in && exit"

вот так, по идее, будет без погрешности. и, если квота и использованная квота будут равны или второе будет больше первого, то newquota станет 20480К
Building better software with Ada
Спасибо сказали:
Аватара пользователя
MozG1986
Сообщения: 103
ОС: Mageia5, Mageia6

Re: (решено) помогите довести до ума скрипт

Сообщение MozG1986 »

Спасибо Subj еще раз!!! Вопрос закрыт
Спасибо сказали:
Аватара пользователя
MozG1986
Сообщения: 103
ОС: Mageia5, Mageia6

Re: (решено) помогите довести до ума скрипт

Сообщение MozG1986 »

выкладываю исправленный скрипт, он неправильно считал квоту, если за день было израсходовано 0 траффика

Код:

#!/bin/bash day=`netamsctl "show quota"|grep hardquota` used=`echo "$day"|grep -o "[^in: ]*[,]"` quota=`echo "$day"|grep -o "[^hardquota ]*[M]"` used=${used:0:$((${#used}-1))} function ifm() { if [ `echo $1|grep M` ]; then a=`echo $1|sed "s/M//"` r=`echo "$a*1024"|bc` else r=`echo $1|sed "s/K//"` fi echo $r } used=`ifm $used` quota=`ifm $quota` delta=`echo "$quota-$used"|bc` if [[ $delta == 0 ]] || [[ `echo $delta|grep '-'` ]]; then let newquota=20*1024 else newquota=`echo "$quota+$delta"|bc` fi netamsctl "service quota && set name NETWORK policy www active day `echo $newquota`K in && exit"
Спасибо сказали:
Ответить