## Linux::hddtemp - monitors hard drive temperatures using the ## linux hddtemp utility package Linux::hddtemp; use strict; use warnings; use IO::Socket; use vars qw($VERSION); $VERSION = "0.01"; sub new { my $self = shift; my $class = ref($self) || $self; my %args; $#_ % 2 ? %args = @_ : warn "Odd argument list at " . __PACKAGE__ . "::new"; my %options = ( port => 7634, host => 'localhost', separator => '|', ); return bless { %options, %args}, $class; } sub get { my $self = shift; my %info; my $data = $self->_raw; ## Escape bad chars for regex (my $s = $self->{separator}) =~ s/([\|\[\]\-\^\$])/\\$1/g; foreach my $drive (split(/$s$s/, $$data)) { $drive =~ s/^$s//; $drive =~ s/$s$//; my @drive = split(/$s/, $drive); $info{$drive[0]} = { name => $drive[1], temp => $drive[2], unit => $drive[3], } } return \%info; } sub _raw { my $self = shift; my $data; my $sock = IO::Socket::INET->new( Proto => 'tcp', PeerAddr => $self->{host}, PeerPort => $self->{port}, ) || _croak("Could not connect to $self->{host}:$self->{port}: $@"); while(<$sock>) { $data .= $_; } $sock->shutdown(2); return \$data; } sub _croak { my $msg = shift; require Carp; Carp::croak($msg); } 1; __END__ =head1 NAME Linux::hddtemp - monitors hard drive temperatures using the linux hddtemp utility =head1 SYNOPSIS use Linux::hddtemp; my $hdt = Linux::hddtemp->new(); my $temps = $hdt->get(); print $temps->{/dev/hda}{temp}; ## or: print Linux::hddtemp->new()->get()->{/dev/hda}{temp}; =head1 DESCRIPTION C will fetch hard drive temperatures from the linux hddtemp utility, see L below. You will need hddtemp to run in daemon mode for this module to work. This can simply be done with the -d option of hddtemp, see the hddtemp manual for more information. =head2 METHODS The following methods can be used. =head3 new my $hdt = Linux::hddtemp->new( host => 'localhost', port => 7634, separator => '|', ); C creates a new Linux::hddtemp object using the configuration passed to it. =head4 options The following options can be passed to C =over 4 =item host Specifies the host/ip-address where hddtemp is run, defaults to localhost. =item port Specifies the port to which hddtemp is listening, as set with the -p option of hddtemp, defaults to 7634. =item separator Specifies the separator set with the -s option of hddtemp, defaults to |. =back =head3 get my $hashref = $hdt->get(); print $hashref->{/dev/hda}{name} . ": " . $hashref->{/dev/hda}{temp}; C returns a hashref containing temperatures and other information returned from the hddtemp daemon in the following format: { /dev/hda => { # device (as specified with the hddtemp options) name => 'MAXTOR 6L200P0', # name of the device temp => 32, # the temperature of the device unit => 'C' # temperature unit (normally degrees celcius) } } Note that C is in most cases a normal integer, but can also be 'UKN' if the temperature of the disk is unknown or 'SLP' if the drive is sleeping. In those cases, C will be '*'. =head1 SEE ALSO L, hddtemp(8), L =head1 BUGS If you find a bug, please report it at L or send an e-mail to the author. =head1 AUTHOR Y. Heling, Eyorhel@cpan.orgE =head1 COPYRIGHT AND LICENSE Copyright (C) 2005 by Y. Heling This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut