| 32 |  | $tcp_port | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 33 |  | $filter_addr | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 34 |  | $file_list | 
 
 
 
 
 
 
 
 | 35 | + | $fqdn | 
 
 
 
 
 
 
 
 | 36 | + | $pidfile | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 37 |  | ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 38 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 39 |  | if (@ARGV != 2) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 45 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 46 |  | $seq_no = 1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 47 |  |  | 
 
 
 
 
 
 
 
 | 48 | + | # write our PID to a file | 
 
 
 
 
 
 
 
 | 49 | + | $pidfile = "ihost.pid"; | 
 
 
 
 
 
 
 
 | 50 | + | &write_pid(); | 
 
 
 
 
 
 
 
 | 51 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 52 |  | &tcp_configure(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 53 |  | &send_udp_packet(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 54 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 76 |  | `sleep $delay`; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 77 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 78 |  |  | 
 
 
 
 
 
 
 
 | 79 | + | # we'll probably never get here... | 
 
 
 
 
 
 
 
 | 80 | + | `rm -f $pidfile`; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 81 |  | exit(0); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 82 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 83 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 93 |  | PeerAddr => $filter_manager_addr, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 94 |  | PeerPort => $filter_manager_port, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 95 |  | Proto => 'tcp' | 
 
 
 
 
 
 
 
 
 
 
 | 96 | < | ); | 
 
 
 
 
 
 
 
 
 | 96 | > | ) or die "Cannot connect!"; | 
 
 
 
 
 
 
 
 
 
 
 | 97 |  | if (!defined $sock) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 98 |  | print "IHOST ERROR: Could not connect to $filter_manager_addr:$filter_manager_port.\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 99 |  | print "Please check that there is an i-scream server at this address.\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 127 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 128 |  | print "File list obtained: $file_list\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 129 |  |  | 
 
 
 
 
 
 
 
 | 130 | + | print $sock "FQDN\n"; | 
 
 
 
 
 
 
 
 | 131 | + | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 132 | + | chop $response; | 
 
 
 
 
 
 
 
 | 133 | + | $fqdn = $response; | 
 
 
 
 
 
 
 
 | 134 | + |  | 
 
 
 
 
 
 
 
 | 135 | + | print "FQDN returned: $fqdn\n"; | 
 
 
 
 
 
 
 
 | 136 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 137 |  | print $sock "UDPUpdateTime\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 138 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 139 |  | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 158 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 159 |  | print $sock "FILTER\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 160 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 161 | + | unless (defined($response)) { | 
 
 
 
 
 
 
 
 | 162 | + | print "Failed: Could not get a filter address from the filter manager.\n"; | 
 
 
 
 
 
 
 
 | 163 | + | exit(1); | 
 
 
 
 
 
 
 
 | 164 | + | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 165 |  | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 166 |  | $response =~ /(.*);(.*);(.*)/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 167 |  | ($filter_addr, $udp_port, $tcp_port) = ($1, $2, $3); | 
 
 
 
 
 
 
 
 | 168 | + | unless (defined($filter_addr) && defined($udp_port) && defined($tcp_port)) { | 
 
 
 
 
 
 
 
 | 169 | + | print "Failed: Filter address response from server did not make sense: $response\n"; | 
 
 
 
 
 
 
 
 | 170 | + | exit(1); | 
 
 
 
 
 
 
 
 | 171 | + | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 172 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 173 |  | print "Got filter data ($filter_addr, $udp_port, $tcp_port)\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 174 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 203 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 204 |  | my(@statgrab) = `./statgrab.pl`; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 205 |  | my(%packet); | 
 
 
 
 
 
 
 
 
 
 
 | 206 | < | for (my($i) = 0; $i < $#statgrab; $i++) { | 
 
 
 
 
 
 
 
 
 | 206 | > | for (my($i) = 0; $i <= $#statgrab; $i++) { | 
 
 
 
 
 
 
 
 
 
 
 | 207 |  | $statgrab[$i] =~ /^([^\s]*) (.*)$/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 208 |  | $packet{$1} = $2; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 209 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 213 |  | my($disk_info) = "<disk>"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 214 |  | my($i) = 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 215 |  | while (defined $packet{"packet.disk.p$i.attributes.mount"}) { | 
 
 
 
 
 
 
 
 
 
 
 | 216 | < | $disk_info .= "<p$i>"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 217 | < | $disk_info .= qq/<name>$packet{"packet.disk.p$i.attributes.name"}<\/name>/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 218 | < | $disk_info .= qq/<kbytes>$packet{"packet.disk.p$i.attributes.kbytes"}<\/kbytes>/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 219 | < | $disk_info .= qq/<used>$packet{"packet.disk.p$i.attributes.used"}<\/used>/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 220 | < | $disk_info .= qq/<avail>$packet{"packet.disk.p$i.attributes.avail"}<\/avail>/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 221 | < | $disk_info .= qq/<mount>$packet{"packet.disk.p$i.attributes.mount"}<\/mount>/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 222 | < | $disk_info .= "</p$i>"; | 
 
 
 
 
 
 
 
 
 | 216 | > | $disk_info .= "<p$i"; | 
 
 
 
 
 | 217 | > | $disk_info .= " name=\"" . $packet{"packet.disk.p$i.attributes.name"} . "\""; | 
 
 
 
 
 | 218 | > | $disk_info .= " kbytes=\"" . $packet{"packet.disk.p$i.attributes.kbytes"} . "\""; | 
 
 
 
 
 | 219 | > | $disk_info .= " used=\"" . $packet{"packet.disk.p$i.attributes.used"} . "\""; | 
 
 
 
 
 | 220 | > | $disk_info .= " avail=\"" . $packet{"packet.disk.p$i.attributes.avail"} . "\""; | 
 
 
 
 
 | 221 | > | $disk_info .= " mount=\"" . $packet{"packet.disk.p$i.attributes.mount"} . "\""; | 
 
 
 
 
 | 222 | > | $disk_info .= "></p$i>"; | 
 
 
 
 
 
 
 
 
 
 
 | 223 |  | ++$i; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 224 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 225 |  | $disk_info .= "</disk>"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 226 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 227 | < | my($hostname) = hostname(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 205 | < | $hostname =~ s/\..*$//g; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 206 | < | `cat /etc/resolv.conf` =~ /domain\s+([^\s]+)/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 207 | < | my($domainname) = $1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 208 | < | my($machine_name) = "$hostname.$domainname"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 209 | < | my($ip) = inet_ntoa(scalar(gethostbyname($hostname)) || 'localhost'); | 
 
 
 
 
 
 
 
 
 | 227 | > | my($ip) = inet_ntoa(scalar(gethostbyname(hostname())) || 'localhost'); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 228 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 229 |  | # Build the XML packet this way, as we can clearly | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 230 |  | # see the structure and contents... I like this ;-) | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 232 |  | # larger than 8196 bytes] | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 233 |  | my($xml) = <<EOF; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 234 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 235 | < | <packet seq_no="$seq_no" machine_name="$machine_name" date="$date" type="data" ip="$ip"> | 
 
 
 
 
 
 
 
 
 | 235 | > | <packet seq_no="$seq_no" machine_name="$fqdn" date="$date" type="data" ip="$ip"> | 
 
 
 
 
 
 
 
 
 
 
 | 236 |  | <load> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 237 |  | <load1>$packet{"packet.load.load1"}</load1> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 238 |  | <load5>$packet{"packet.load.load5"}</load5> | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 265 |  | <swap>$packet{"packet.cpu.swap"}</swap> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 266 |  | </cpu> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 267 |  | <memory> | 
 
 
 
 
 
 
 
 
 
 
 | 268 | < | <total>$packet{"packet.memory.real"}</total> | 
 
 
 
 
 
 
 
 
 | 268 | > | <total>$packet{"packet.memory.total"}</total> | 
 
 
 
 
 
 
 
 
 
 
 | 269 |  | <free>$packet{"packet.memory.free"}</free> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 270 |  | </memory> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 271 |  | <swap> | 
 
 
 
 
 
 
 
 
 
 
 | 272 | < | <total>$packet{"packet.memory.swap_total"}</total> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 273 | < | <free>$packet{"packet.memory.swap_free"}</free> | 
 
 
 
 
 
 
 
 
 | 272 | > | <total>$packet{"packet.swap.total"}</total> | 
 
 
 
 
 | 273 | > | <free>$packet{"packet.swap.free"}</free> | 
 
 
 
 
 
 
 
 
 
 
 | 274 |  | </swap> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 275 |  | $disk_info | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 276 |  | </packet> | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 279 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 280 |  | # Make the packet smaller by stripping out newlines and leading spaces. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 281 |  | $xml =~ s/\n\s*//g; | 
 
 
 
 
 
 
 
 
 
 
 | 282 | < |  | 
 
 
 
 
 
 
 
 
 | 282 | > |  | 
 
 
 
 
 
 
 
 
 
 
 | 283 |  | my($sock) = new IO::Socket::INET ( | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 284 |  | PeerPort => $udp_port, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 285 |  | PeerAddr => $filter_addr, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 286 |  | Proto => 'udp' | 
 
 
 
 
 
 
 
 
 
 
 | 287 | < | ) or die "Socket: $!\n"; | 
 
 
 
 
 
 
 
 
 | 287 | > | ) or die "Could not send UDP: $!\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 288 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 289 |  | print $sock $xml or die "Could not send UDP packet: $!\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 290 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 308 |  | PeerAddr => $filter_addr, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 309 |  | PeerPort => $tcp_port, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 310 |  | Proto => 'tcp' | 
 
 
 
 
 
 
 
 
 
 
 | 311 | < | ); | 
 
 
 
 
 
 
 
 
 | 311 | > | ) or return; | 
 
 
 
 
 
 
 
 
 
 
 | 312 |  | if (!defined $sock) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 313 |  | print "IHOST WARNING: Failed to deliver a heartbeat to the i-scream filter.\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 314 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 319 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 320 |  | print $sock "HEARTBEAT\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 321 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 322 | + | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 323 |  | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 324 |  | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 325 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 329 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 330 |  | print $sock "CONFIG\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 331 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 332 | + | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 333 |  | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 334 |  | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 335 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 339 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 340 |  | print $sock "$file_list\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 341 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 342 | + | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 343 |  | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 344 |  | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 345 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 349 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 350 |  | print $sock "$last_modified\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 351 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 352 | + | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 353 |  | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 354 |  | if ($response eq "ERROR") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 355 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 364 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 365 |  | print $sock "ENDHEARTBEAT\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 366 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 367 | + | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 368 |  | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 369 |  | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 370 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 374 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 375 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 376 |  | print "^"; | 
 
 
 
 
 
 
 
 | 377 | + |  | 
 
 
 
 
 
 
 
 | 378 | + | return; | 
 
 
 
 
 
 
 
 | 379 | + | } | 
 
 
 
 
 
 
 
 | 380 | + |  | 
 
 
 
 
 
 
 
 | 381 | + | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 382 | + | # write_pid | 
 
 
 
 
 
 
 
 | 383 | + | # Writes the PID (process ID) of this instance to $pidfile. | 
 
 
 
 
 
 
 
 | 384 | + | # This is then used by a seperate script to check (and restart) ihost. | 
 
 
 
 
 
 
 
 | 385 | + | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 386 | + | sub write_pid() { | 
 
 
 
 
 
 
 
 | 387 | + | open PID, ">$pidfile"; | 
 
 
 
 
 
 
 
 | 388 | + | print PID $$; | 
 
 
 
 
 
 
 
 | 389 | + | close PID; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 390 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 391 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 392 |  | } |