html/uptime.pl


   1 # uptime - irssi 0.7.98.CVS 
   2 #
   3 #    $Id: uptime.pl,v 1.6 2003/02/04 02:43:06 peder Exp $
   4 #
   5 # Copyright (C) 2002, 2003 by Peder Stray <peder@ninja.no>
   6 #
   7 
   8 use strict;
   9 use Irssi;
  10 use Irssi::Irc;
  11 use Irssi::TextUI;
  12 
  13 # ======[ Script Header ]===============================================
  14 
  15 use vars qw{$VERSION %IRSSI};
  16 ($VERSION) = '$Revision: 1.6 $' =~ / (\d+\.\d+) /;
  17 %IRSSI = (
  18           name        => 'uptime',
  19           authors     => 'Peder Stray',
  20           contact     => 'peder@ninja.no',
  21           url         => 'http://ninja.no/irssi/uptime.pl',
  22           license     => 'GPL',
  23           description => 'Try a little harder to figure out client uptime',
  24 	  sbitems     => 'uptime',
  25          );
  26 
  27 # ======[ Variables ]===================================================
  28 
  29 my($timer) = 0;			# ID of current timer
  30 
  31 # ======[ Helper functions ]============================================
  32 
  33 # --------[ uptime_linux ]----------------------------------------------
  34 
  35 sub uptime_linux {
  36     my($sys_uptime);
  37     my($irssi_start);
  38     local(*FILE);
  39 
  40     open FILE, "< /proc/uptime";
  41     $sys_uptime = (split " ", <FILE>)[0];
  42     close FILE;
  43 
  44     open FILE, "< /proc/$$/stat";
  45     $irssi_start = (split " ", <FILE>)[21];
  46     close FILE;
  47 
  48     return $sys_uptime - $irssi_start/100;
  49 }
  50 
  51 # --------[ uptime_solaris ]--------------------------------------------
  52 
  53 sub uptime_solaris {
  54     my($irssi_start);
  55 
  56     $irssi_start = time - (stat("/proc/$$"))[9];
  57 
  58     return $irssi_start;
  59 }
  60 
  61 # --------[ uptime ]----------------------------------------------------
  62 
  63 sub uptime {
  64     my($sysname) = @_;
  65     my($time);
  66 
  67     if ($sysname eq 'Linux') {
  68 	$time = uptime_linux;
  69     } elsif ($sysname eq 'SunOS') {
  70 	$time = uptime_solaris;
  71     } else {
  72 	$time = time - $^T;
  73     }
  74 
  75     return $time;
  76 }
  77 
  78 # --------[ format_interval ]-------------------------------------------
  79 
  80 sub format_interval {
  81     my($interval) = @_;
  82 
  83     my(@interval,$str);
  84     for (60, 60, 24, 365) {
  85 	push @interval, $interval%$_;
  86 	$interval = int($interval/$_);
  87     }
  88     $str = sprintf "%dy %dd %dh %dm %ds", $interval, @interval[3,2,1,0];
  89     $str =~ s/^(0. )+//;
  90 
  91     return $str;
  92 }
  93 
  94 # ======[ Commands ]====================================================
  95 
  96 # --------[ cmd_uptime ]------------------------------------------------
  97 
  98 sub cmd_uptime {
  99     my($data,$server,$witem) = @_;
 100     my($sysname) = Irssi::parse_special('$sysname');
 101     my($uptime) = uptime($sysname);
 102     my($str) = format_interval($uptime);
 103 
 104     if ($data && $server) {
 105 	$server->command("MSG $data uptime: $str");
 106     } elsif ($witem && ($witem->{type} eq "CHANNEL" ||
 107                         $witem->{type} eq "QUERY")) {
 108 	$witem->command("MSG ".$witem->{name}." uptime: $str");
 109     } else {
 110 	Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'uptime',
 111 			   $str, $sysname);
 112     }
 113 }
 114 
 115 # ======[ Signal Hooks ]================================================
 116 
 117 # --------[ sig_setup_changed ]-----------------------------------------
 118 
 119 sub sig_setup_changed {
 120     my($interval) = Irssi::settings_get_int('uptime_refresh_interval');
 121 
 122     Irssi::timeout_remove($timer);
 123 
 124     if ($interval < 1) {
 125 	$interval = 0;
 126     }
 127 
 128     return unless $interval;
 129 
 130     $interval *= 1000;
 131     $timer = Irssi::timeout_add($interval, 'uptime_refresh' , undef);
 132 }
 133 
 134 # ======[ Statusbar Hooks ]=============================================
 135 
 136 # --------[ sb_uptime ]-------------------------------------------------
 137 
 138 sub sb_uptime {
 139     my($item, $get_size_only) = @_;
 140     my $format = "";
 141     my($uptime) = uptime(Irssi::parse_special('$sysname'));
 142     my($time) = format_interval($uptime);
 143     
 144     $format = "{sb %g$time%n}";
 145     
 146     $item->default_handler($get_size_only, $format, undef, 1);
 147 }
 148 
 149 # ======[ Timers ]======================================================
 150 
 151 # --------[ uptime_refresh ]--------------------------------------------
 152 
 153 sub uptime_refresh {
 154     Irssi::statusbar_items_redraw('uptime');
 155 }
 156 
 157 # ======[ Setup ]=======================================================
 158 
 159 # --------[ Register commands ]-----------------------------------------
 160 
 161 Irssi::command_bind('uptime', 'cmd_uptime');
 162 
 163 # --------[ Register formats ]------------------------------------------
 164 
 165 Irssi::theme_register(
 166 [
 167  'uptime',
 168  '{line_start}{hilight Uptime:} $0 ($1)',
 169 ]);
 170 
 171 # --------[ Register settings ]-----------------------------------------
 172 
 173 Irssi::settings_add_int('upgrade', 'uptime_refresh_interval', 12);
 174 
 175 # --------[ Register signals ]------------------------------------------
 176 
 177 Irssi::signal_add('setup changed', 'sig_setup_changed');
 178 
 179 # --------[ Register statusbar items ]----------------------------------
 180 
 181 Irssi::statusbar_item_register('uptime', undef, 'sb_uptime');
 182 
 183 # --------[ Other setup ]-----------------------------------------------
 184 
 185 sig_setup_changed;
 186 
 187 # ======[ END ]=========================================================
 188 
 189 # Local Variables:
 190 # header-initial-hide: t
 191 # mode: header-minor
 192 # end: