1# Mrtg-compatible any statistic loader
2#  /SET status_min_in - The minimum load to show
3#  /SET status_min_in - The minimum load to show
4#  /SET status_refresh - How often the loadavg is refreshed
5#
6#  takes output from mrtg compatible scripts,
7#  see the mrtg-contrib and mrtgutils package for scripts to load
8#
9#  this one requires /usr/bin/mrtg-ip-acct from mrtgutils package
10#
11#  TODO ; add support for more than one stat at the same time
12#  TODO : negative amounts?
13
14use Irssi 20011113;
15use Irssi::TextUI;
16
17use strict;
18use 5.6.0;
19
20use vars qw($VERSION %IRSSI);
21
22# header begins here
23
24$VERSION = "1.0";
25%IRSSI = (
26	authors     => "Riku Voipio",
27	contact     => "riku.voipio\@iki.fi",
28	name        => "bandwidth",
29	description => "shows bandwidth usage in statusbar",
30	sbitems     => "stats",
31        license     => "GPLv2",
32        url         => "http://nchip.ukkosenjyly.mine.nu/irssiscripts/",
33    );
34
35my ($refresh, $last_refresh, $refresh_tag) = (10);
36my ($last_in, $last_out) = (0.0,0.0);
37my ($min_in, $min_out) = (1.0,1.0);
38my ($cur_in, $cur_out, $first_run) = (0.0,0.0,1);
39my $command =  '/usr/bin/mrtg-ip-acct';
40
41
42sub get_stats
43{
44  my ($old_in, $old_out) = ($last_in, $last_out);
45
46  my @localstats;
47  if (open my $fh, q{-|}, $command)
48  {
49     @localstats = <$fh>;
50    close $fh;
51  } else {
52    Irssi::print("Failed to execute $command: $!", MSGLEVEL_CLIENTERROR);
53  }
54
55  for(@localstats[0..1]) {
56    return unless defined;
57    return unless /^\d+$/;
58  }
59  $last_in=$localstats[0];
60  $last_out=$localstats[1];
61
62  if ($old_out==0){return;}
63
64  $cur_out=($last_out-$old_out) / ($refresh*1024);
65  $cur_in=($last_in-$old_in) / ($refresh*1024);
66}
67
68sub stats {
69  my ($item, $get_size_only) = @_;
70  #get_stats();
71
72  $min_out = Irssi::settings_get_int('stats_min_out');
73  $min_in = Irssi::settings_get_int('stats_min_in');
74  $min_in = 0 if $min_in < 0;
75  $min_out = 0 if $min_out < 0;
76
77
78  if ($cur_in < $min_in and $cur_out <$min_out){
79	  #dont print
80    if ($get_size_only) {
81      $item->{min_size} = $item->{max_size} = 0;
82    }
83  } else {
84      $item->default_handler($get_size_only, undef, sprintf("i:%.2f o:%.2f",$cur_in, $cur_out ), 1 );
85  }
86}
87
88sub refresh_stats {
89  get_stats();
90  Irssi::statusbar_items_redraw('stats');
91}
92
93sub read_settings {
94  $refresh = Irssi::settings_get_int('stats_refresh');
95  $command = Irssi::settings_get_str('stats_commandline');
96  $refresh = 1 if $refresh < 1;
97  return if $refresh == $last_refresh;
98  $last_refresh = $refresh;
99
100  Irssi::timeout_remove($refresh_tag) if $refresh_tag;
101  $refresh_tag = Irssi::timeout_add($refresh*1000, 'refresh_stats', undef);
102}
103
104Irssi::settings_add_int('misc', 'stats_min_in', $min_in);
105Irssi::settings_add_int('misc', 'stats_min_out', $min_out);
106Irssi::settings_add_int('misc', 'stats_refresh', $refresh);
107Irssi::settings_add_str('misc', 'stats_commandline', $command);
108
109Irssi::statusbar_item_register('stats', '{sb S: $0-}', 'stats');
110Irssi::statusbars_recreate_items();
111
112read_settings();
113Irssi::signal_add('setup changed', 'read_settings');
114
115
116