1 |
#!/usr/bin/perl -w |
2 |
|
3 |
use 5.6.1; |
4 |
use strict; |
5 |
use warnings; |
6 |
use LWP::UserAgent qw(); |
7 |
use HTML::TokeParser qw(); |
8 |
use HTTP::Request::Common qw(); |
9 |
|
10 |
use constant USER => 'admin'; |
11 |
use constant PASS => 'password'; |
12 |
use constant REALM => 'Control Panel'; |
13 |
use constant NETLOC => '192.168.0.2:443'; |
14 |
use constant URL => 'https://'.NETLOC.'/admin/index.cgi?button=Current&MODIFIED=0&CURRENTPAGE=Status&CURRENTTAB=health&DEBUGLEVEL=0&command=Refresh&MODE=Advanced'; |
15 |
use constant RRDURL => 'http://rrd.me.uk/cgi-bin/rrd-server.cgi'; |
16 |
|
17 |
my $ua = LWP::UserAgent->new; |
18 |
$ua->timeout(10); |
19 |
$ua->credentials(NETLOC, REALM, USER, PASS); |
20 |
my $response = $ua->get(URL); |
21 |
die $response->status_line unless $response->is_success; |
22 |
|
23 |
my $p = HTML::TokeParser->new(\$response->content); |
24 |
my %update = (); |
25 |
my $time = time; |
26 |
|
27 |
while (my $token = $p->get_tag('tr')) { |
28 |
my $text = $p->get_trimmed_text('/tr'); |
29 |
$text =~ s/[^a-zA-Z0-9\.\-\_\%\/\\]/ /g; |
30 |
if ($text =~ /\b((Disk|Fan|Temp|UPS)(?:\s+([0-9]+)\b)?.+)/) { |
31 |
my ($type,$num) = ($2,$3); |
32 |
local $_ = $1; |
33 |
|
34 |
if ($type eq 'Disk' || $type eq 'Temp') { |
35 |
if (/\s(([0-9\.]+)\s*C)\s/) { $update{"hdd.temp.c"}->{"${type}_${num}_C"} = $2; } |
36 |
if (/\s(([0-9\.]+)\s*F)\s/) { $update{"hdd.temp.f"}->{"${type}_${num}_F"} = $2; } |
37 |
} |
38 |
|
39 |
if ($type eq 'Fan' && /\s(([0-9\.]+)\s*RPM)\s/) { $update{"misc.fan.rpm"}->{"${type}_${num}_RPM"} = $2; } |
40 |
} |
41 |
} |
42 |
|
43 |
|
44 |
while (my ($graph,$ref) = each %update) { |
45 |
my $data = ''; |
46 |
while (my ($key,$value) = each %{$ref}) { |
47 |
$data .= "$time.$graph.$key $value\n" |
48 |
} |
49 |
update($data); |
50 |
} |
51 |
|
52 |
|
53 |
exit; |
54 |
|
55 |
|
56 |
sub update { |
57 |
my $data = shift; |
58 |
|
59 |
my $ua = LWP::UserAgent->new(agent => $0); |
60 |
my $resp = $ua->request(HTTP::Request::Common::POST(RRDURL, |
61 |
Content_Type => 'text/plain', |
62 |
Content => $data |
63 |
)); |
64 |
|
65 |
if ($resp->is_success) { |
66 |
printf("%s\n",$resp->content); |
67 |
} else { |
68 |
warn 'Posting Error: '.$resp->status_line; |
69 |
} |
70 |
|
71 |
return $resp->is_success; |
72 |
} |
73 |
|
74 |
|
75 |
__END__ |
76 |
nicolaw@eowyn:~$ wget -q -O - --no-check-certificate --http-user=admin --http-password=password "https://192.168.0.2/admin/index.cgi?button=Current&MODIFIED=0&CURRENTPAGE=Status&CURRENTTAB=health&DEBUGLEVEL=0&command=Refresh&MODE=Advanced" | html2text -width 300 | egrep -io " (Disk|Fan|Temp|UPS) [0-9] .*" |
77 |
Disk 1 Seagate ST3500630AS 465 GB, 40C / 104F, Write-cache ON, SMART+ OK |
78 |
Disk 2 Seagate ST3500630AS 465 GB, 41C / 105F, Write-cache ON, SMART+ OK |
79 |
Disk 3 Seagate ST3500630AS 465 GB, 41C / 105F, Write-cache ON, SMART+ OK |
80 |
Disk 4 Seagate ST3500630AS 465 GB, 39C / 102F, Write-cache ON, SMART+ OK |
81 |
Fan 1 1744 RPM [Unknown INPUT type] OK |
82 |
Temp 1 34.0C / 93F [Normal 0-60C / 32-140F] OK |
83 |
UPS 1 Not present OK |
84 |
nicolaw@eowyn:~$ |
85 |
|