########
# INFO
#
# Type this to add the item:
#
# /statusbar window add hddtemp
#
# See
#
# /help statusbar
#
#
# If you want to use this script install the hddtemp daemon on the host
# you like to monitor and set it up, You can use multiple hosts aswell.
#
# Example:
# /set hddtemp_hosts host1 host2 host3
# /set hddtemp_ports 7634 7635 7553
#
# If all the daemons run all on the same port you can set a single port,
# It will be used for all hosts.
#
# Example:
# /set hddtemp_ports 7634
#
# There are 2 coloring threshold settings hddtemp_threshold_green
# and hddtemp_threshold_red. If the temperature is higher than
# green and lower then red the color will be yellow.
#
# Example:
# /set hddtemp_threshold_green 35
# /set hddtemp_threshold_red 45
#
# (I don't know if the unit retured by the daemon depends on the
# locale. I've Celsius values here.)
#
#
# There is a setting for the degree sign.
# Since there is a difference between 8bit and utf-8
# you can set it to what you prefer
#
########
# CHANGES:
# 0.13 - added forking (not blocking irrsi while fetching the temperatures)
#######
# TODO: themeing support
#
use strict;
use Irssi;
use Irssi::TextUI;
use IO::Socket::INET;
use POSIX;
use vars qw($VERSION %IRSSI);
$VERSION = "0.15";
%IRSSI = (
authors => "Valentin Batz",
contact => "vb\@g-23.org",
name => "hddtemp",
description => "adds a statusbar item which shows temperatures of harddisks (with multiple hddtemp-hosts support)",
license => "GPLv2",
changed => "2017-03-16",
url => "http://hurzelgnom.bei.t-online.de/irssi/scripts/hddtemp.pl",
sbitems => "hddtemp"
);
my $forked;
my $pipe_tag;
my $outstring = 'hddtemp...';
sub get_data {
my $lines;
my @hosts = split(/ /, Irssi::settings_get_str("hddtemp_hosts"));
my @ports = split(/ /, Irssi::settings_get_str("hddtemp_ports"));
print "hi";
while(scalar(@hosts) > scalar(@ports)){
push @ports, @ports[0];
}
my $i=0;
for ($i;$inew(PeerAddr => @hosts[$i],
PeerPort => @ports[$i],
Proto => 'tcp',
Timeout => 10);
#skip dead hosts
next unless $sock;
while( $_ = $sock->getline()) {
$lines .= $_.';';
}
}
return $lines;
}
sub get_temp {
my ($rh, $wh);
pipe($rh, $wh);
return if $forked;
my $pid = fork();
if (!defined($pid)) {
Irssi::print("Can't fork() - aborting");
close($rh); close($wh);
return;
}
$forked = 1;
if ($pid > 0) {
#parent
close($wh);
Irssi::pidwait_add($pid);
$pipe_tag = Irssi::input_add(fileno($rh), INPUT_READ, \&pipe_input, $rh);
return;
}
my $lines;
eval {
#child
$lines = get_data();
#write the reply
print ($wh $lines);
close($wh);
};
POSIX::_exit(1);
}
sub pipe_input {
my $rh=shift;
my $linesx=<$rh>;
close($rh);
Irssi::input_remove($pipe_tag);
$forked = 0;
my %temps;
my $green = Irssi::settings_get_int("hddtemp_threshold_green");
my $red = Irssi::settings_get_int("hddtemp_threshold_red");
my $degree = Irssi::settings_get_str("hddtemp_degree_sign");
unless ($linesx) {
return(0);
}
my ($hdd, $model, $temp, $unit);
my $i=0;
foreach my $lines (split(';', $linesx)) {
foreach my $line (split(/\|\|/, $lines)) {
#remove heading/traling |
$line =~ s/^\|//;
$line =~ s/\|$//;
($hdd, $model, $temp, $unit) = split(/\|/,$line,4);
$hdd =~ s/(.*)\/(.*)$/$2/;
#different colors for different termperatures
if ($temp <= $green) {
$temps{$i.':'.$hdd} = '%g'.$temp.'%n'.$degree.$unit;
} elsif ($temp > $green && $temp < $red) {
$temps{$i.':'.$hdd} = '%y'.$temp.'%n'.$degree.$unit;
} elsif ($temp >= $red) {
$temps{$i.':'.$hdd} = '%r'.$temp.'%n'.$degree.$unit;
}
}
$i++;
}
my $out='';
foreach (sort keys %temps) {
$out .= "$_: $temps{$_} ";
}
$out=~s/\s+$//;
# temporal use of $out to prevent statusbar drawing errors
$outstring=$out;
Irssi::statusbar_items_redraw('hddtemp');
}
sub sb_hddtemp() {
my ($item, $get_size_only) = @_;
$item->default_handler($get_size_only, "{sb $outstring}", undef, 1);
}
Irssi::timeout_add(15000, \&get_temp, undef);
Irssi::statusbar_item_register('hddtemp', undef, 'sb_hddtemp');
Irssi::settings_add_str("hddtemp", "hddtemp_hosts","localhost");
Irssi::settings_add_str("hddtemp", "hddtemp_ports","7634");
Irssi::settings_add_int("hddtemp", "hddtemp_threshold_green", 35);
Irssi::settings_add_int("hddtemp", "hddtemp_threshold_red", 45);
Irssi::settings_add_str("hddtemp", "hddtemp_degree_sign","°");
Irssi::signal_add("setup changed", \&get_temp);
get_temp();