1 |
tdb |
1.1 |
#!/usr/local/bin/perl -w |
2 |
|
|
|
3 |
|
|
$| = 1; |
4 |
|
|
|
5 |
|
|
use strict; |
6 |
|
|
use iscream::XMLParser; |
7 |
|
|
use IO::Socket; |
8 |
|
|
|
9 |
|
|
if (@ARGV != 2) { |
10 |
|
|
die "Usage: ihost.pl [i-scream client interface] [TCP port]\n"; |
11 |
|
|
} |
12 |
|
|
|
13 |
|
|
my($addr) = $ARGV[0]; |
14 |
|
|
my($cport) = $ARGV[1]; |
15 |
|
|
|
16 |
|
|
my($csock) = new IO::Socket::INET( |
17 |
|
|
PeerAddr => $addr, |
18 |
|
|
PeerPort => $cport, |
19 |
|
|
Proto => 'tcp' |
20 |
|
|
) or die "Cannot connect!"; |
21 |
|
|
|
22 |
|
|
if (!defined $csock) { |
23 |
|
|
print "ERROR: Could not connect to $addr:$cport.\n"; |
24 |
|
|
print "Please check that there is an i-scream server at this address.\n"; |
25 |
|
|
exit(1); |
26 |
|
|
} |
27 |
|
|
|
28 |
|
|
my($response); |
29 |
|
|
|
30 |
|
|
$response = <$csock>; |
31 |
|
|
if ($response && $response ne "PROTOCOL 1.1\n") { |
32 |
|
|
print "The i-scream server sent an unexpected protocol id: $response\n"; |
33 |
|
|
close($csock); |
34 |
|
|
exit(1); |
35 |
|
|
} |
36 |
|
|
|
37 |
|
|
print $csock "queuegrapher\n"; |
38 |
|
|
$response = <$csock>; |
39 |
|
|
if ($response && $response ne "OK\n") { |
40 |
|
|
print "Received unexpected response: $response\n"; |
41 |
|
|
close($csock); |
42 |
|
|
exit(1); |
43 |
|
|
} |
44 |
|
|
|
45 |
|
|
print $csock "SETHOSTLIST\n"; |
46 |
|
|
$response = <$csock>; |
47 |
|
|
if ($response && $response ne "OK\n") { |
48 |
|
|
print "Received odd response: $response\n"; |
49 |
|
|
close($csock); |
50 |
|
|
exit(1); |
51 |
|
|
} |
52 |
|
|
|
53 |
|
|
print $csock "_NULL_\n"; |
54 |
|
|
$response = <$csock>; |
55 |
|
|
if ($response && $response ne "OK\n") { |
56 |
|
|
print "Received odd response: $response\n"; |
57 |
|
|
close($csock); |
58 |
|
|
exit(1); |
59 |
|
|
} |
60 |
|
|
|
61 |
|
|
print $csock "STARTDATA\n"; |
62 |
|
|
$response = <$csock>; |
63 |
|
|
|
64 |
|
|
chop $response; |
65 |
|
|
print "Asked to connect to port $response on $addr, connecting...\n"; |
66 |
|
|
|
67 |
|
|
my($dport) = $response; |
68 |
|
|
|
69 |
|
|
my($dsock) = new IO::Socket::INET( |
70 |
|
|
PeerAddr => $addr, |
71 |
|
|
PeerPort => $dport, |
72 |
|
|
Proto => 'tcp' |
73 |
|
|
) or die "Cannot connect!"; |
74 |
|
|
|
75 |
|
|
if (!defined $dsock) { |
76 |
|
|
print "ERROR: Could not connect to $addr:$dport.\n"; |
77 |
|
|
print "Failure in communications.\n"; |
78 |
|
|
close($csock); |
79 |
|
|
exit(1); |
80 |
|
|
} |
81 |
|
|
|
82 |
|
|
while(1) { |
83 |
|
|
$response = <$dsock>; |
84 |
|
|
my($err, %xmlhash) = &iscream::XMLParser::parse($response); |
85 |
|
|
if($err) { |
86 |
|
|
print "SKIPPED (bad xml): $response"; |
87 |
|
|
} |
88 |
|
|
#foreach my $key (keys %xmlhash) { |
89 |
|
|
# print "$key == $xmlhash{$key}\n"; |
90 |
|
|
#} |
91 |
|
|
if($xmlhash{"packet.attributes.type"} eq "queueStat") { |
92 |
|
|
my($hash) = $xmlhash{"packet.attributes.hashCode"}; |
93 |
|
|
my($date) = $xmlhash{"packet.attributes.date"}; |
94 |
|
|
my($name) = $xmlhash{"packet.attributes.name"}; |
95 |
|
|
my($total) = $xmlhash{"packet.queue.attributes.total"}; |
96 |
|
|
my($i) = 0; |
97 |
|
|
while(defined $xmlhash{"packet.queue.attributes.queue$i"}) { |
98 |
|
|
if( ! -f "$hash\_$i.rrd" ) { |
99 |
|
|
print "making new database for $hash\_$i\n"; |
100 |
|
|
&makerrd($hash, $i, $date, $name); |
101 |
|
|
} |
102 |
|
|
my($size) = $xmlhash{"packet.queue.attributes.queue$i"}; |
103 |
|
|
my($cmd) = "rrdtool update $hash\_$i.rrd $date:$size:$total"; |
104 |
|
|
print `$cmd`; |
105 |
|
|
print "$cmd\n"; |
106 |
|
|
++$i; |
107 |
|
|
} |
108 |
|
|
} |
109 |
|
|
else { |
110 |
|
|
print "SKIPPED: valid xml, but not a queueStat packet"; |
111 |
|
|
} |
112 |
|
|
#if($response =~ /^<packet type="queueStat" date="(\d+)" name="(.*)" hashCode="(\d+)"><queue queue0="(\d+)" total="(\d+)" maxSize="(\d+)"><\/queue><\/packet>$/) { |
113 |
|
|
# print "DATE: $1 HASH: $3 SIZE0: $4 TOTAL: $5 MAX: $6\n"; |
114 |
|
|
# if( ! -f "$3.rrd" ) { |
115 |
|
|
# print "making new database for $3\n"; |
116 |
|
|
# &makerrd($3, $1, $2); |
117 |
|
|
# } |
118 |
|
|
# my($cmd) = "rrdtool update $3.rrd $1:$4:$5"; |
119 |
|
|
# print `$cmd`; |
120 |
|
|
#} |
121 |
|
|
#else { |
122 |
|
|
# print "SKIPPED: $response"; |
123 |
|
|
#} |
124 |
|
|
} |
125 |
|
|
|
126 |
|
|
exit 0; |
127 |
|
|
|
128 |
|
|
#<packet type="queueStat" date="1003332749" name="net3filter Filter" hashCode="2905137"><queue queue0="0" total="783170" maxSize="1000"></queue></packet> |
129 |
|
|
|
130 |
|
|
#packet.attributes.name == realtimeclients TCPHandler:myrtle.ukc.ac.uk |
131 |
|
|
#packet.queue.attributes.total == 13 |
132 |
|
|
#packet.queue.attributes.maxSize == 1000 |
133 |
|
|
#packet.queue.attributes.queue0 == 0 |
134 |
|
|
#packet.queue.attributes.queue1 == 0 |
135 |
|
|
#packet.attributes.hashCode == 4575504 |
136 |
|
|
#packet.attributes.date == 1003614252 |
137 |
|
|
#packet.attributes.type == queueStat |
138 |
|
|
|
139 |
|
|
sub makerrd() { |
140 |
|
|
my($name, $queuenum, $start, $comment) = @_; |
141 |
|
|
$start = $start - 15; |
142 |
|
|
my($init) = "rrdtool create $name\_$queuenum.rrd --start $start --step 15"; |
143 |
|
|
my($ds) = "DS:size:GAUGE:600:U:U DS:total:COUNTER:600:U:U"; |
144 |
|
|
# 3h in 15s samples 1d in 2m samples 1w in 15m samples 1m in 1hr samples |
145 |
|
|
my($rra1) = "RRA:AVERAGE:0.5:1:720 RRA:AVERAGE:0.5:8:720 RRA:AVERAGE:0.5:60:672 RRA:AVERAGE:0.5:240:744"; |
146 |
|
|
my($rra2) = "RRA:MAX:0.5:1:720 RRA:MAX:0.5:8:720 RRA:MAX:0.5:60:672 RRA:MAX:0.5:60:744"; |
147 |
|
|
my($cmd) = "$init $ds $rra1 $rra2"; |
148 |
|
|
print `$cmd`; |
149 |
|
|
print "$cmd\n"; |
150 |
|
|
print `echo "$comment" > $name.def`; |
151 |
|
|
} |