-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsentry-cdu-dumper
executable file
·127 lines (107 loc) · 3.14 KB
/
sentry-cdu-dumper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
use Data::Dumper;
use Net::Telnet;
use Data::Validate::IP;
use Getopt::Long;
use Socket;
my $arg_match;
my $do_totals = 0;
my $slave_collapse = 0;
GetOptions(
't|totals' => \$do_totals,
's|slave_total' => \$slave_collapse,
'm|match=s' => \$arg_match,
) or croak "error in command line args";
my @pdus = @ARGV;
my $ip_validator = Data::Validate::IP->new;
# header
my @field_names = qw( id outlet_name status load_amps voltage_volts power_watts );
print join( "\t", @field_names ) . "\n";
my %totals;
my $pdu_pass = $ENV{'PDU_PASS'} || 'admn';
foreach my $pdu_ip (@pdus) {
unless ( $ip_validator->is_ipv4($pdu_ip) ) {
my $packed_ip = inet_aton($pdu_ip) or croak "could not resolve $pdu_ip";
$pdu_ip = inet_ntoa($packed_ip);
}
my $telnet = Net::Telnet->new(
Timeout => 10,
Errmode => 'die',
Prompt => '/Switched CDU: /'
);
$telnet->open($pdu_ip);
$telnet->login( 'admn', $pdu_pass );
$telnet->print('set option more disabled');
$telnet->print('ostat all');
my @datalines;
while ( my $line = $telnet->getline( Timeout => 3, Errmode => 'return' ) ) {
push( @datalines, $line ) if $line =~ /\s*\.[AB][0-9]/x;
}
my %outlets;
foreach my $dataline (@datalines) {
my ( $outlet_id, $outlet_name, $status, $load, $voltage, $power );
if ( $dataline =~ m{^\s+\.([AB]\w+)\s+}x ) {
$outlet_id = $1;
} else {
croak "match fail start $dataline";
}
$dataline =~ s{^\s+\.([AB]\w+)\s+}{}x;
if ( $dataline =~ m{\s+(\w+)\s+(\d+\.\d+)\s+(\d+\.\d)\s+(\d+)\s*$}x ) {
$status = $1;
$load = $2;
$voltage = $3;
$power = $4;
} else {
croak "match fail end $dataline";
}
$dataline =~ s{\s+(\w+)\s+(\d+\.\d+)\s+(\d+\.\d)\s+(\d+)\s*$}{}x;
$outlet_name = $dataline;
if ($do_totals) {
$totals{load} += $load;
$totals{voltage} += $voltage;
$totals{power} += $power;
}
my $outlet_long_id = $outlet_id;
substr($outlet_long_id,1,0) = '0' if length($outlet_long_id) == 2;
$outlets{$outlet_long_id} = {
id => $outlet_id,
name => $outlet_name,
status => $status,
load => $load,
voltage => $voltage,
power => $power,
};
}
foreach my $outlet (sort keys %outlets) {
my $id = $outlets{$outlet}->{id};
my $name = $outlets{$outlet}->{name};
my $status = $outlets{$outlet}->{status};
my $load = $outlets{$outlet}->{load};
my $voltage = $outlets{$outlet}->{voltage};
my $power = $outlets{$outlet}->{power};
if ( defined $arg_match ) {
next unless $name =~ /$arg_match/;
}
if ( $slave_collapse ) {
next if $id =~ /^B/; # merged into A
$id =~ /^[AB](\d+)$/ or die "bad id $id";
my $seq = $1;
my $slave_long = sprintf("B%02d",$seq);
my $slave_id = $outlets{$slave_long}->{id};
$id .= ",$slave_id";
$name .= "," . $outlets{$slave_long}->{name};
$status .= "," . $outlets{$slave_long}->{status};
$load += $outlets{$slave_long}->{load};
$voltage += $outlets{$slave_long}->{voltage};
$power += $outlets{$slave_long}->{power};
}
print "$id\t$name\t$status\t$load\t$voltage\t$power\n";
}
$telnet->print('logout');
}
if ($do_totals) {
print "N/A\tSUMMED TOTALS\tN/A\t$totals{load}\t$totals{voltage}\t$totals{power}\n";
}