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

seaman

  • Напреднали
  • *****
  • Публикации: 65
    • Профил
Simple traffic counter script or plasmoid
« -: Dec 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 -: Jan 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.  

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

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

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

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Simple traffic counter script or plasmoid
« Отговор #2 -: Jan 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 осигурява зануляването на броячите непосредствено след взимането на стойността им.
« Последна редакция: Jan 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 -: Jan 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 -: Jan 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/

ЧНГ :)

« Последна редакция: Jan 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 -: Jan 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.  

« Последна редакция: Jan 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.

Acho

  • Напреднали
  • *****
  • Публикации: 5255
  • Distribution: Slackware, MikroTik - сървърно
  • Window Manager: console only
    • Профил
    • WWW
Re: Simple traffic counter script or plasmoid
« Отговор #6 -: Feb 17, 2023, 07:54 »
Мама ви спамерска.
Активен

CPU - Intel Quad-Core Q8400, 2.66 GHz; Fan - Intel Box; MB - Intel G41M-T2; RAM - DDR2-800, Kingston HyperX, 2X2048 MB; VC - onboard, Intel G41 Express Chipset; HDD - Toshiba, 500 GB, SATAII; SB - Realtek HD Audio; DVD-RW - TSSTcorp DVD-RW; LAN - Realtek PCI-E GBE Controller; PSU - Fortron 350 Watt.

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Network Traffic Counter
Общ форум
pyryndyryty 0 5723 Последна публикация May 24, 2004, 14:00
от pyryndyryty
Traffic Counter (iptables) po ToS
Хардуерни и софтуерни проблеми
Ironman 1 9633 Последна публикация Oct 31, 2005, 12:56
от VladSun
Traffic counter
Настройка на програми
Igor 1 8923 Последна публикация May 05, 2008, 17:53
от runtime
Проблем със simple compiz под ubuntu 10.4
Настройка на програми
azaden 2 9376 Последна публикация Aug 31, 2010, 23:46
от bazu
Въпрос за Plasmoid: Event Calendar
Настройка на програми
4i4obengy 6 4546 Последна публикация Jun 16, 2019, 21:33
от 4i4obengy