Цель: научить 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 в любом случае, что привеодит к некоторым погрешностям (до одного килобайта/мегабайта, гигабайтами еще не качаем)
Просьба довести скрипт до ума
и всем заранее огромное спасибо за помощь