подсчет и контроль трафика

Обсуждение программ nnCron и nnCron LITE

подсчет и контроль трафика

Postby AlikasS » Fri, 16 Apr 2010, 16:44

предлагаю решение такое (глючит однако иногда, причины неопределялись)
применялось на модеме MTS-GPRS
в табе задача ( что бы запустить скрипт отдельным процессом, что бы ничего не мешало, в т.ч. и падение крона)
Code: Select all
#( CLASSIC-TASK-#-CONNECT
\ NoActive
WatchConnect
AsLoggedUser
HyperActive
SingleInstance
NoLog
Action:
S" C:\Program Files\nnCron\temp\inet-start.flg" EXIST?
IF
   FT-CUR S" C:\Program Files\nnCron\temp\inet-start.flg" FILE-WTIME  FTIME- 2 >
   IF
   ELSE
   TMSG: "скрипт подчета времени в инете уже работает!!" 15
   EXIT
   THEN
ELSE
S" C:\Program Files\nnCron\temp\inet-start.flg" FCREATE
THEN
100 PAUSE
SWHide
StartIn: "C:\Program Files\nnCron"
START-APP: %COMSPEC% /c start/wait nncron.exe -runfile count_time_inet.nnscript BYE
)#

далее текст самого скрипта
обратите внимание на
3145728 CONSTANT принято_байт_за_минуту_макс

Code: Select all
: TERMINATE ( -- )
  \ остановить текущий поток (удалить)
  DESTROY-HEAP
  -1 ExitThread
;

REQUIRE init_mib_table plugins\other\iphlpfun.f
0 VALUE принято_байт
0 VALUE принято_байт_за_минуту
3145728 CONSTANT принято_байт_за_минуту_макс
0 VALUE отправлено_байт
0 VALUE всего_получено_байт
0 VALUE скорость_подключения


2VARIABLE datastart
0 VALUE sum_min
VARIABLE ConnectTime
VARIABLE DisconnTime
: raslogname S" C:\Program Files\nnCron\logs\loginet\%YYYY%\%MMM%\%DD%.txt" EVAL-SUBST ;
: ConnTimeInSec DisconnTime @ ConnectTime @ - 1000 / ;
: ConnTimeInMin ConnTimeInSec 60 /MOD SWAP IF 1+ THEN ;
VARIABLE list-fileforip
USER-VALUE list-contentsforip
USER-VALUE ip-string

: считать_инет
init_mib_table
S" WAN (PPP/SLIP) Interface"
find-mib-desc
   DUP mib_iftable @ <>
   IF
   >R
   R@ mib_ifrow_field bDescr  ASCIIZ> CR TYPE
       update_mib_table   \ Обновляем данные в таблице. Нужно для получения актуальных данных !
   R@ mib_ifrow_field  dwInOctets @ TO принято_байт \ Кол-во принятых байт
   R@ mib_ifrow_field  dwOutOctets @ TO отправлено_байт \ Кол-во отправленных байт
   R> mib_ifrow_field  dwSpeed @ TO скорость_подключения \ Скорость интерфейса
принято_байт отправлено_байт + TO всего_получено_байт
   ELSE
   DROP \ CR ." Out of index!"
   THEN
free_mib_table
;

: main
ONLINE?
IF

   S" C:\Program Files\nnCron\temp\inet-start.flg" EXIST?
   IF

      FT-CUR S" C:\Program Files\nnCron\temp\inet-start.flg" FILE-WTIME  FTIME- 2 >
      IF
      S" " S" C:\Program Files\nnCron\temp\inet-start.flg" FWRITE
      ELSE
      TMSG: "скрипт подчета времени в инете уже работает!!" 15
      EXIT BYE
      THEN

   ELSE
   S" C:\Program Files\nnCron\temp\inet-start.flg" FCREATE
   THEN

ELSE
TMSG: "скрипт запущен во время отсутствия инета" 15 EXIT BYE
THEN

0 TO sum_min
258 ALLOCATE THROW TO list-contentsforip
64 ALLOCATE THROW TO ip-string
GetTickCount ConnectTime !
GET-CUR-TIME
FT-CUR datastart 2! \ FT>DD.MM.YYYY/hh:mm:ss

SWHide
START-APPW: "%COMSPEC% /c ipconfig > temp\file1.log"

S" temp\file1.log" R/O OPEN-FILE-SHARED THROW list-fileforip !
BEGIN list-contentsforip 1+ 255 list-fileforip @ READ-LINE THROW WHILE

list-contentsforip C!
list-contentsforip COUNT S" *IP*" WC-COMPARE
list-contentsforip COUNT S" 192.168.0*" WC-COMPARE 0= AND
list-contentsforip COUNT S" 000*" WC-COMPARE 0= AND
IF
list-contentsforip COUNT 37 /STRING ip-string PLACE
THEN
REPEAT
DROP
list-fileforip @ CLOSE-FILE DROP
list-fileforip @ FREE DROP
FILE-APPEND: "%raslogname%" "%WW% %DD% %hh%:%mm%:%ss% connect %CONNECTION% IP-%ip-string COUNT%%crlf%"
list-contentsforip FREE DROP
ip-string FREE DROP

BEGIN
ONLINE?
\ ONLINE: "конкретное_имя_коннекта"
WHILE


считать_инет

sum_min 1 + TO sum_min

sum_min 60 /MOD DROP NOT
\ будет каждую 60 секунду(=1минуту) считать
IF
принято_байт принято_байт_за_минуту  - принято_байт_за_минуту_макс >
   IF
TQUERY: "за последнюю минуту Online принято %crlf%%принято_байт принято_байт_за_минуту  - 1024 / 1024 /% Мб%crlf% дисконнект?" 30 No
IF
HANGUP
THEN
\   50 30 HINT-POS
\   0x7E7E7E 0x000000 HINT-COLOR
\   HINT: "за последнюю минуту Online принято %принято_байт принято_байт_за_минуту  - 1024 / 1024 /% Мб"
\   \ здесь можно сделать дисконект и вывести текущее время
   THEN

принято_байт TO принято_байт_за_минуту

THEN

 sum_min 600 /MOD DROP NOT
IF
\ будет каждую 600 секунду(=10минуту) выводиться

   50 30 HINT-POS
   0x7E7E7E 0x000000 HINT-COLOR
   THINT: "OnLine %sum_min 60 / 60 /% час., %sum_min 60 / 60 /MOD DROP% мин.%crlf%start: %datastart 2@ FT>DD.MM.YYYY/hh:mm:ss%%crlf%принято %принято_байт% байт,%crlf%отправлено %отправлено_байт% байт, %crlf%всего %всего_получено_байт% байт, %crlf%скорость %скорость_подключения% бит/сек." 15
THEN
   S" " S" C:\Program Files\nnCron\temp\inet-start.flg" FWRITE
1000 PAUSE
REPEAT

FILE-DELETE: "C:\Program Files\nnCron\temp\inet-start.flg"
FILE-DELETE: "temp\file1.log"

GetTickCount DisconnTime !
GET-CUR-TIME
50 30 HINT-POS
0x7E7E7E 0x000000 HINT-COLOR
FILE-APPEND: "%raslogname%" "%WW% %DD% %hh%:%mm%:%ss% disconnect %LAST-CONNECTION% сек-%ConnTimeInSec% мин-%ConnTimeInMin% (%sum_min% секунд), принято %принято_байт% байт, отправлено %отправлено_байт% байт, всего %всего_получено_байт% байт, скорость %скорость_подключения% бит/сек.%crlf%"

HINT: "OnLine %sum_min 60 / 60 /% час., %sum_min 60 / 60 /MOD DROP% мин.%crlf%start: %datastart 2@ FT>DD.MM.YYYY/hh:mm:ss%%crlf%disconnekt: %GET-CUR-TIME FT-CUR FT>DD.MM.YYYY/hh:mm:ss%%crlf%принято %принято_байт% байт,%crlf%отправлено %отправлено_байт% байт,%crlf%всего %всего_получено_байт% байт,%crlf%скорость %скорость_подключения% бит/сек.%crlf%"
\ TMSG: "inet disconnect!!!" 45


0 TO принято_байт
0 TO отправлено_байт
0 TO скорость_подключения
;
как видно из скрипта, нужен плагин (от Ильи), и обратите внимание на путь расположения плагина, а то не подключится
Code: Select all
WINAPI: GetIfTable      Iphlpapi.dll

0 VALUE mib_iftable
VARIABLE mib_iftable_size
VECT mib-action
CREATE temp-mib-buf 256 ALLOT

122 CONSTANT ERROR_INSUFFICIENT_BUFFER

1   CONSTANT   MIB_IF_TYPE_OTHER
6   CONSTANT   MIB_IF_TYPE_ETHERNET
9   CONSTANT   MIB_IF_TYPE_TOKENRING
15   CONSTANT   MIB_IF_TYPE_FDDI
23   CONSTANT   MIB_IF_TYPE_PPP
24   CONSTANT   MIB_IF_TYPE_LOOPBACK
28   CONSTANT   MIB_IF_TYPE_SLIP

0   CONSTANT   MIB_IF_OPER_STATUS_NON_OPERATIONAL
1   CONSTANT   MIB_IF_OPER_STATUS_UNREACHABLE
2   CONSTANT   MIB_IF_OPER_STATUS_DISCONNECTED
3   CONSTANT   MIB_IF_OPER_STATUS_CONNECTING
4   CONSTANT   MIB_IF_OPER_STATUS_CONNECTED
5   CONSTANT   MIB_IF_OPER_STATUS_OPERATIONAL


0
256 2 * --  wszName
CELL -- dwIndex
CELL -- dwType
CELL -- dwMtu
CELL -- dwSpeed
CELL -- dwPhysAddrLen
8    -- bPhysAddr
CELL -- dwAdminStatus
CELL -- dwOperStatus
CELL -- dwLastChange
CELL -- dwInOctets
CELL -- dwInUcastPkts
CELL -- dwInNUcastPkts
CELL -- dwInDiscards
CELL -- dwInErrors
CELL -- dwInUnknownProtos
CELL -- dwOutOctets
CELL -- dwOutUcastPkts
CELL -- dwOutNUcastPkts
CELL -- dwOutDiscards
CELL -- dwOutErrors
CELL -- dwOutQLen
CELL -- dwDescrLen
256  -- bDescr
CONSTANT /MIB_IFROW

\ Инициализируем массив с данными
: init_mib_table
FALSE mib_iftable_size mib_iftable GetIfTable DUP
ERROR_INSUFFICIENT_BUFFER =
IF
   DROP
   mib_iftable_size @ ALLOCATE THROW TO mib_iftable
   FALSE mib_iftable_size mib_iftable GetIfTable THROW
ELSE
   THROW
THEN
;
\ Обновляем данные в таблице
: update_mib_table
FALSE mib_iftable_size mib_iftable GetIfTable THROW
;

\ Освобождаем ресурсы
: free_mib_table
   mib_iftable FREE THROW
   0 mib_iftable_size !
   0 TO mib_iftable
   temp-mib-buf 256 ERASE
;


\ Получаем смещение на начало структуры с номером n ( n = 0 ... n )
: mib_ifrow_field ( n -- adr )
/MIB_IFROW * mib_iftable CELL+ +
;

\ Цикл по интерфейсам с условием
: foreach-mib-interace?
TO mib-action
0
BEGIN
   DUP mib_ifrow_field mib-action
WHILE
   1+
REPEAT
;

: _find-mib-desc bDescr ASCIIZ> temp-mib-buf ASCIIZ> COMPARE ;

\ Находим интерфейс по описанию
\ Например: Realtek RTL8139 Family PCI Fast Ethernet NIC - Минипорт планировщика пакетов
: find-mib-desc ( adr n -- n )
temp-mib-buf SWAP CMOVE
['] _find-mib-desc foreach-mib-interace?
;

\EOF

init_mib_table
S" Realtek RTL8139 Family PCI Fast Ethernet NIC - Минипорт планировщика пакетов"
find-mib-desc
   DUP mib_iftable @ <>
   IF
   >R
   R@ mib_ifrow_field bDescr  ASCIIZ> CR TYPE
       update_mib_table   \ Обновляем данные в таблице. Нужно для получения актуальных данных !
   R@ mib_ifrow_field  dwInOctets @ CR ." dwInOctets=" . \ Кол-во принятых байт
   R@ mib_ifrow_field  dwOutOctets @ CR ." dwOutOctets=" . \ Кол-во отправленных байт
   R> mib_ifrow_field  dwSpeed @ CR ." dwSpeed=" . \ Скорость интерфейса
   ELSE
   DROP CR ." Out of index!"
   THEN
free_mib_table


: reinettype
init_mib_table
S" Realtek RTL8139 Family PCI Fast Ethernet NIC - Packet Scheduler Miniport"
find-mib-desc
   DUP mib_iftable @ <>
   IF
   >R
   R@ mib_ifrow_field bDescr  ASCIIZ> CR TYPE
       update_mib_table   \ Обновляем данные в таблице. Нужно для получения актуальных данных !
   R@ mib_ifrow_field  dwInOctets @ CR ." dwInOctets=" . \ Кол-во принятых байт
   R@ mib_ifrow_field  dwOutOctets @ CR ." dwOutOctets=" . \ Кол-во отправленных байт
   R> mib_ifrow_field  dwSpeed @ CR ." dwSpeed=" . \ Скорость интерфейса
   ELSE
   DROP CR ." Out of index!"
   THEN
free_mib_table
;

: reinettype2
init_mib_table
S" WAN (PPP/SLIP) Interface"
find-mib-desc
   DUP mib_iftable @ <>
   IF
   >R
   R@ mib_ifrow_field bDescr  ASCIIZ> CR TYPE
       update_mib_table   \ Обновляем данные в таблице. Нужно для получения актуальных данных !
   R@ mib_ifrow_field  dwInOctets @ CR ." dwInOctets=" . \ Кол-во принятых байт
   R@ mib_ifrow_field  dwOutOctets @ CR ." dwOutOctets=" . \ Кол-во отправленных байт
   R> mib_ifrow_field  dwSpeed @ CR ." dwSpeed=" . \ Скорость интерфейса
   ELSE
   DROP CR ." Out of index!"
   THEN
free_mib_table
;
: reinettype3
init_mib_table
S" MS TCP Loopback interface"
find-mib-desc
   DUP mib_iftable @ <>
   IF
   >R
   R@ mib_ifrow_field bDescr  ASCIIZ> CR TYPE
       update_mib_table   \ Обновляем данные в таблице. Нужно для получения актуальных данных !
   R@ mib_ifrow_field  dwInOctets @ CR ." dwInOctets=" . \ Кол-во принятых байт
   R@ mib_ifrow_field  dwOutOctets @ CR ." dwOutOctets=" . \ Кол-во отправленных байт
   R> mib_ifrow_field  dwSpeed @ CR ." dwSpeed=" . \ Скорость интерфейса
   ELSE
   DROP CR ." Out of index!"
   THEN
free_mib_table
;
: show-if-descriptions
init_mib_table
mib_iftable @ 0 DO I mib_ifrow_field bDescr ASCIIZ> TYPE CR LOOP
free_mib_table
;


ну вот, решение частное, но пригодное для экспериментов.
если где ошибки выскакивают, прошу писать, будем искать, потому как скопировано без особых исправлений
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Google [Bot] and 5 guests

cron