Автор Тема: Simple traffic counter script or plasmoid  (Прочетена 21444 пъти)

seaman

  • Участник
  • *****
  • Публикации: 65
    • Профил
Simple traffic counter script or plasmoid
« -: Дек 27, 2008, 12:39 »
Привет
От скоро притежавам 3G data modem и вече се появи първия проблем :-)
Както знаете всички GSM оператори в БГ предлагат тази екстра НО ограничена по трафик.
В този ред на мисли ми затрябва програмка за отчитане на трафика през 3G-то за да няма неприятни изненади. Софтуер по принцип не липсва - cacti, nagios, iptraf, iftop, vnstat, dstat, darkstat, ntop, etc -
ама сега да си товаря машинката с Apache и PHP за да си пусна cacti примерно не става, а и останалите нямат простата функционалност, която се търси.
Аз не съм програмист и от Regular Expression свят ми се завива :-), но алгоритъма ми е горе долу ясен.

1. #sudo wvdial --config /etc/wvdial.conf
Закачаме модема и се вързваме за нета - появява се интерфейс ppp0. (да ама може и да не е ppp0)
Значи скрипта\програмката първо трябва да прави проверка за ppp0 or die :-). Добра идея е потребителя да може да избира интерфейса.

2.   #ifconfig ppp0 |grep bytes|cut -d":" -f2|cut -d" " -f1     //входящ трафик
2а. #ifconfig ppp0 |grep bytes|cut -d":" -f3|cut -d" " -f1   //изходящ трафик
ifconfig си има брояч на трафика. Обаче тук проблема е, че този брояч се нулира при рестарт на машината или когато се извади модема. Скрипта/програмката трябва да записва(презаписва) тези стойности във временен фаил (temp.txt) докато е активна сесията.
 
3. След като се прекъсне връзката (прекрати изпълнението на 1. или инцидентно се извади модема) последните записани стойности в temp.txt трябва да се запишат в нов фаил total.txt.

4.При последваща сесия на 3G-то трябва да се нулира брояча на ifconfig и стоиностите в temp.txt трябва да са сбор от текущите стоиности от 2. и 2а. и стоиностите записани в total.txt (3) от предходната сесия.

5. Би било добре да се добавя и сбор от входящ и изходящ трафик, както и да се преобразува от bytes >Kbytes. Също така потребителя да може да задава максимален трафик при достигането на който да вади съобщение за надвишаване на лимита.

6.Скрипта/програмката трябва да е real time или да се изпълнява в cron

7. Да изкарва резултата от total.txt в реално време.


Това може би не е най-интелигентното решение, но идеята е потребителя да следи месечния си трафик през 3G-то (а и не само ) и по възможност в реално време.Предполагам такава програмка ще е от полза на много от нас. Идеалния вариант е да се направи като plasmoid за KDE4 :-)
Та така - дано да се намерят програмисти дето си нямат друга работа по празниците ;-)

Весели празници на всички!!!



Активен

seaman

  • Участник
  • *****
  • Публикации: 65
    • Профил
Re: Simple traffic counter script or plasmoid
« Отговор #1 -: Яну 04, 2009, 22:36 »
Благодаря ти zeridon, че си преместил темата.

След няколко опита тип направи си сам – изкочиха няколко проблема:

1.Идеята да се пише постоянно във файл не е добра – в смисъл, че при интензивен трафик диска луд ще стане ;-). Може би само в края на сесията.
2.Ресетването на брояча на ifconfig е кофти работа. Оказва се, че при 32 битов драйвер брояча сам се ресетва на 4GB (2^32). ако искаме принудително да го направим – единственото решение е: #modprobe -r drivername && modprobe drivername ,  което не е особено интелигентно. И както се досещате, ако драйвера е компилиран в ядрото – само рестарт на машината.
3.Perl не става за тази работа. И за да се обоснова – следния глупав скрипт вдига load average: 3.51  и нагоре :-(

Код
GeSHi (Perl):
  1. #!/usr/bin/perl
  2. my $nic = eth1; #tuk moje da se sloji nqkakvo uslovie za proverka
  3. while ($nic eq eth1)
  4. {
  5.  my $in = `ifconfig $nic |grep bytes|cut -d":" -f2|cut -d" " -f1`; #vhodqsht trafik
  6.  my $out = `ifconfig $nic |grep bytes|cut -d":" -f3|cut -d" " -f1`; #izhodqsh trafik
  7.    if ($in<2**32 | $out<2**32)
  8. #proverka za stoinosta na broqchite poneje pri 32bit kernel driver
  9. #se resetvat na 4GB trafik. Tuk moje da se prodylji s "else" eventualno
  10.    {
  11.  print "in:",($in/1024),"KB, out:",($out/1024),"KB, both:",(($in+$out)/1024),"KB\n";  
  12.  
  13. #za po choveshki izgled delim na 1024 za da preobrazuvame bytes/Kbytes, no tryabva da se pooprawqt
  14. #zakrygleniqta a i izhoda e smotan ;-)
  15.    }
  16. }
  17.  
  18.  

Еми това е – очевидно само идеята ще си остане.

Честита нова година!

« Последна редакция: Яну 05, 2009, 14:18 от VladSun »
Активен

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: Simple traffic counter script or plasmoid
« Отговор #2 -: Яну 05, 2009, 13:26 »
За да избегнеш много от посочените от теб проблеми можеш да ползваш iptables:

в иницализационния скрипт на iptables (rc.forewall в Slackware):
Код
GeSHi (Bash):
  1. iptables -t mangle -N PPP_UPLOAD
  2. iptables -t mangle -N PPP_DOWNLOAD
  3. iptables -t mangle -N PPP_TOTAL
  4. iptables -t mangle -A PPP_UPLOAD -j PPP_TOTAL
  5. iptables -t mangle -A PPP_DOWNLOAD -j PPP_TOTAL
  6. iptables -t mangle -A PPP_TOTAL -j RETURN
  7. iptables -t mangle -I PREROUTING -i ppp0 -j PPP_DOWNLOAD
  8. iptables -t mangle -I PREROUTING -o ppp0 -j PPP_UPLOAD

След това един скрипт, който се пуска на всеки 10 сек. да кажем и взима изхода от:
Код
GeSHi (Bash):
  1. iptables -t mangle -nxvL -Z PPP_TOTAL | grep RETURN | awk '{print $2}'
  2. iptables -t mangle -nxvL -Z PPP_UPLOAD | grep PPP_TOTAL | awk '{print $2}'
  3. iptables -t mangle -nxvL -Z PPP_DOWNLOAD | grep PPP_TOTAL | awk '{print $2}'

Може и само PPP_TOTAL верига да има.

-Z осигурява зануляването на броячите непосредствено след взимането на стойността им.
« Последна редакция: Яну 05, 2009, 13:30 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: Simple traffic counter script or plasmoid
« Отговор #3 -: Яну 05, 2009, 14:19 »
3.Perl не става за тази работа. И за да се обоснова – следния глупав скрипт вдига load average: 3.51  и нагоре :-(
Нещо не го разбирам цикъла ти ;)
Сложи някъде в него един sleep и ще заспят нещата с load-a ;)
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: Simple traffic counter script or plasmoid
« Отговор #4 -: Яну 05, 2009, 17:14 »
Perl решение ;)
Код
GeSHi (Perl):
  1. #!/usr/bin/perl
  2. use POSIX;
  3. use Getopt::Std;
  4.  
  5.  
  6. my $delay = 2; # in seconds
  7.  
  8. my $ipt_traffic_rule = "iptables -t mangle -nxvL -Z TOTAL_TRAFFIC | grep RETURN | awk '{print \$2}'";
  9. my $accounting_directory = "/var/log/traffaccount/";
  10. my $accounting_file = "traffic.txt";
  11. my $log_file = "messages.log";
  12.  
  13. my $current_traffic = 0;
  14. my $initial_traffic = 0;
  15. my $bytes = 0;
  16.  
  17. my %options=();
  18.  
  19. getopts("ia:s",\%options);
  20.  
  21. if (defined $options{s})
  22. {
  23. $current_traffic = `cat $accounting_directory$accounting_file`;
  24. chomp($current_traffic);
  25. printf STDOUT "Current traffic is %d MB.\n", floor($current_traffic/(1024*1024));
  26. exit(0);
  27. }
  28.  
  29. if (defined $options{i})
  30. {
  31. `echo $current_traffic > $accounting_directory$accounting_file`;
  32. print STDOUT "Counter has been reseted. \n";
  33. }
  34.  
  35. if (defined $options{a})
  36. {
  37. $initial_traffic = int($options{a});
  38. print STDOUT "Counter initialized with $initial_traffic bytes. \n";
  39. }
  40.  
  41. sub demonize
  42. {
  43.   defined (my $tpid = fork) or die "Could not demonize. \n";
  44.   if ($tpid)
  45.   {
  46.       exit;
  47.   }
  48.   else
  49.   {
  50.       POSIX::setsid() or die "Could not demonize";
  51.       open STDOUT, ">> $accounting_directory$log_file" or die "Could not demonize. \n";
  52.       open STDIN, ">> $accounting_directory$log_file" or die "Could not demonize. \n";
  53.       open STDERR, ">> $accounting_directory$log_file" or die "Could not demonize. \n";
  54.   }
  55. }
  56.  
  57. $current_traffic = `cat $accounting_directory$accounting_file`;
  58. chomp($current_traffic);
  59.  
  60. $current_traffic = int($current_traffic) + $initial_traffic;
  61.  
  62. print "\n[+] Going in background\n\n";
  63. &demonize();
  64.  
  65. while (1)
  66. {
  67. $bytes = `$ipt_traffic_rule`;
  68. chomp($bytes);
  69. $current_traffic += int($bytes);
  70.  
  71. `echo $current_traffic > $accounting_directory$accounting_file`;
  72.  
  73. sleep($delay);
  74. }

Преди да се пусне скрипта трябва да се изпълни еднократно следният скрипт:
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. iptables -t mangle -N TOTAL_TRAFFIC
  4. iptables -t mangle -A TOTAL_TRAFFIC -j RETURN
  5. iptables -t mangle -I PREROUTING -i ppp0 -j TOTAL_TRAFFIC
  6. iptables -t mangle -I PREROUTING -o ppp0 -j TOTAL_TRAFFIC

и да се създаде директорията /var/log/traffaccount/

ЧНГ :)

« Последна редакция: Яну 05, 2009, 17:24 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

shadowx

  • Участник
  • *****
  • Публикации: 99
  • Distribution: Slackware
  • Window Manager: Gnome
    • Профил
Re: Simple traffic counter script or plasmoid
« Отговор #5 -: Яну 19, 2009, 02:18 »
Без каквито и да е iptables правила :)
Статистиката се взима от /proc/net/dev
В случей, че новата стойност е по-малка от последната в temp.txt , датата, часа и последния резултат се добавят в total.txt
Проверките са на 60 секунди.

link -> http://gh0st.darknet.co.nz/traffic_counter.py

Код
GeSHi (Python):
  1. #!/usr/bin/env python
  2.  
  3. import sys, string, os, time
  4.  
  5. log_file = './temp.txt'
  6. total_log = './total.txt'
  7. _d = '/proc/net/dev'
  8.  
  9. class NullDevice:
  10.    def write(self, s):
  11. pass
  12.  
  13. def other_file(_rx, _tx):
  14.    _z = open(total_log, 'w')
  15.    for l1ne in _z:
  16. _t_text = '%s\n' % l1ne
  17.    cur_time = time.ctime()
  18.    _t_text = '%s\n %s > rx: %s tx: %s' % (_t_text, cur_time, _rx, _tx)
  19.    _z.write(_text)
  20.    _w.close()
  21.  
  22. def write_to_file(_rx, _tx):
  23.    for _y in file(log_file):
  24. if _y[:2] == 'rx':
  25.    _tt = _y[:-3]
  26.    _tt = _tt[3:]
  27.    if int(_tt) > int(_rx):
  28. other_file(_rx, _tx)
  29.    _f = open(log_file, 'w')
  30.    if int(int(_rx) / 1024) >= 1:
  31. _rx = '%s kb' % int(int(_rx) / 1024)
  32. if int(int(_rx[:-3]) / 1024) >= 1:
  33.    _rx = _rx[:-3]
  34.    _rx = '%s mb' % int(int(_rx) / 1024)
  35.    if int(int(_rx[:-3]) / 1024) >= 1:
  36.     _rx = _rx[:-3]
  37.     _rx = '%s gb' % int(int(_rx) / 1024)
  38.    if int(int(_tx) / 1024) >= 1:
  39. _tx = '%s kb' % int(int(_tx) / 1024)
  40. if int(int(_tx[:-3]) / 1024) >= 1:
  41.    _tx = _tx[:-3]
  42.    _tx = '%s mb' % int(int(_tx) / 1024)
  43.    if int(int(_tx[:-3]) / 1024) >= 1:
  44. _tx = _tx[:-3]
  45.     _tx = '%s gb' % int(int(_tx) / 1024)
  46.    _text = 'rx %s\ntx %s\n' % (_rx, _tx)
  47.    _f.write(_text)
  48.    _f.close()
  49.  
  50. try:
  51.    _file = open(_d, 'r')
  52. except IOError:
  53.    print 'Unable to open: %s' % _d
  54.    sys.exit(0)
  55. _file.close()
  56.  
  57.  
  58. os.setpgrp()    
  59. os.umask(0)
  60. sys.stdin.close()
  61. sys.stdout = NullDevice()
  62. sys.stderr = NullDevice()
  63. pid = os.fork()
  64. if pid:
  65.    os._exit(0)
  66.  
  67. while 0 == 0:
  68.    for line in file(_d):
  69. line = line.strip()
  70.        if line[:3] == 'ppp':
  71.    line = line.split(':')
  72.    line = '%s %s' % (line[0], line[1])
  73.    line = line.split()
  74.    _rx = line[1]
  75.    _tx = line[10]
  76.    write_to_file(_rx, _tx)
  77. else:
  78.    pass
  79.    time.sleep(60)
  80.  
  81. #e0f
  82.  

« Последна редакция: Яну 21, 2009, 01:29 от VladSun »
Активен

There he goes. One of God's own prototypes. A high-powered mutant of some kind never even considered for mass production. Too weird to live, and too rare to die.

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Network Traffic Counter
Общ форум
pyryndyryty 0 3102 Последна публикация Май 24, 2004, 14:00
от pyryndyryty
Traffic Counter (iptables) po ToS
Хардуерни и софтуерни проблеми
Ironman 1 5234 Последна публикация Окт 31, 2005, 12:56
от VladSun
Traffic counter
Настройка на програми
Igor 1 4780 Последна публикация Май 05, 2008, 17:53
от runtime
Проблем със simple compiz под ubuntu 10.4
Настройка на програми
azaden 2 4420 Последна публикация Авг 31, 2010, 23:46
от bazu
Проблем с simple-ccsm на Ubuntu 11.04
Настройка на програми
m_veskov 2 4343 Последна публикация Юли 25, 2011, 23:41
от m_veskov