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