| 1 | pjm2 | 1.6 | #!/usr/bin/perl -w | 
 
 
 
 
 
 
 
 | 2 | pjm2 | 1.1 |  | 
 
 
 
 
 | 3 |  |  | # ----------------------------------------------------------- | 
 
 
 
 
 | 4 |  |  | # Perl i-scream Host. | 
 
 
 
 
 
 
 
 | 5 | pjm2 | 1.12 | # http://www.i-scream.org.uk | 
 
 
 
 
 
 
 
 | 6 | pjm2 | 1.1 | # | 
 
 
 
 
 | 7 |  |  | # An all-in-one script to act as an i-scream host on | 
 
 
 
 
 | 8 |  |  | # a typical Unix/Linux box.  You may adapt the data-gathering | 
 
 
 
 
 | 9 |  |  | # methods as you see fit. | 
 
 
 
 
 | 10 |  |  | #  - pjm2@ukc.ac.uk | 
 
 
 
 
 | 11 |  |  | # | 
 
 
 
 
 
 
 
 | 12 | pjm2 | 1.22 | # $Author: pjm2 $ | 
 
 
 
 
 
 
 
 | 13 | pjm2 | 1.24 | # $Id: ihost.pl,v 1.23 2001/03/01 18:53:42 pjm2 Exp $ | 
 
 
 
 
 
 
 
 | 14 | pjm2 | 1.1 | #------------------------------------------------------------ | 
 
 
 
 
 | 15 |  |  |  | 
 
 
 
 
 | 16 |  |  | $| = 1; | 
 
 
 
 
 | 17 |  |  |  | 
 
 
 
 
 | 18 |  |  | use strict; | 
 
 
 
 
 | 19 |  |  | use IO::Socket; | 
 
 
 
 
 | 20 |  |  | use Sys::Hostname; | 
 
 
 
 
 | 21 |  |  |  | 
 
 
 
 
 | 22 |  |  | use vars qw ( | 
 
 
 
 
 | 23 |  |  | $filter_manager_addr | 
 
 
 
 
 | 24 |  |  | $filter_manager_port | 
 
 
 
 
 | 25 |  |  | $seq_no | 
 
 
 
 
 | 26 |  |  | $udp_update_time | 
 
 
 
 
 | 27 |  |  | $tcp_update_time | 
 
 
 
 
 | 28 |  |  | $last_udp_time | 
 
 
 
 
 | 29 |  |  | $last_tcp_time | 
 
 
 
 
 | 30 |  |  | $last_modified | 
 
 
 
 
 | 31 |  |  | $udp_port | 
 
 
 
 
 | 32 |  |  | $tcp_port | 
 
 
 
 
 | 33 |  |  | $filter_addr | 
 
 
 
 
 | 34 |  |  | $file_list | 
 
 
 
 
 
 
 
 | 35 | pjm2 | 1.17 | $fqdn | 
 
 
 
 
 
 
 
 | 36 | pjm2 | 1.1 | ); | 
 
 
 
 
 | 37 |  |  |  | 
 
 
 
 
 | 38 |  |  | if (@ARGV != 2) { | 
 
 
 
 
 | 39 |  |  | die "Usage: ihost.pl [i-scream filter manager] [TCP port]\n"; | 
 
 
 
 
 | 40 |  |  | } | 
 
 
 
 
 | 41 |  |  |  | 
 
 
 
 
 | 42 |  |  | $filter_manager_addr = $ARGV[0]; | 
 
 
 
 
 | 43 |  |  | $filter_manager_port = $ARGV[1]; | 
 
 
 
 
 | 44 |  |  |  | 
 
 
 
 
 | 45 |  |  | $seq_no = 1; | 
 
 
 
 
 | 46 |  |  |  | 
 
 
 
 
 | 47 |  |  | &tcp_configure(); | 
 
 
 
 
 | 48 |  |  | &send_udp_packet(); | 
 
 
 
 
 | 49 |  |  |  | 
 
 
 
 
 | 50 |  |  | $last_udp_time = time; | 
 
 
 
 
 | 51 |  |  | $last_tcp_time = time; | 
 
 
 
 
 | 52 |  |  | while (1) { | 
 
 
 
 
 
 
 
 | 53 | pjm2 | 1.9 | my($time) = time; | 
 
 
 
 
 | 54 |  |  | if ($time >= $last_udp_time + $udp_update_time) { | 
 
 
 
 
 
 
 
 | 55 | pjm2 | 1.1 | &send_udp_packet(); | 
 
 
 
 
 
 
 
 | 56 | pjm2 | 1.9 | $last_udp_time = $time; | 
 
 
 
 
 
 
 
 | 57 | pjm2 | 1.1 | } | 
 
 
 
 
 
 
 
 | 58 | pjm2 | 1.9 | if ($time >= $last_tcp_time + $tcp_update_time) { | 
 
 
 
 
 
 
 
 | 59 | pjm2 | 1.1 | &send_tcp_heartbeat(); | 
 
 
 
 
 
 
 
 | 60 | pjm2 | 1.9 | $last_tcp_time = $time; | 
 
 
 
 
 
 
 
 | 61 | pjm2 | 1.1 | } | 
 
 
 
 
 
 
 
 | 62 | pjm2 | 1.9 | my($next_udp) = $udp_update_time - $time + $last_udp_time; | 
 
 
 
 
 | 63 |  |  | my($next_tcp) = $tcp_update_time - $time + $last_tcp_time; | 
 
 
 
 
 | 64 |  |  | my($delay); | 
 
 
 
 
 | 65 |  |  | if ($next_udp < $next_tcp) { | 
 
 
 
 
 | 66 |  |  | $delay = $next_udp | 
 
 
 
 
 | 67 |  |  | } | 
 
 
 
 
 | 68 |  |  | else { | 
 
 
 
 
 | 69 |  |  | $delay = $next_tcp; | 
 
 
 
 
 | 70 |  |  | } | 
 
 
 
 
 | 71 |  |  | `sleep $delay`; | 
 
 
 
 
 
 
 
 | 72 | pjm2 | 1.1 | } | 
 
 
 
 
 | 73 |  |  |  | 
 
 
 
 
 | 74 |  |  | exit(0); | 
 
 
 
 
 | 75 |  |  |  | 
 
 
 
 
 
 
 
 | 76 | pjm2 | 1.12 |  | 
 
 
 
 
 | 77 |  |  | #----------------------------------------------------------------------- | 
 
 
 
 
 | 78 |  |  | # tcp_configure | 
 
 
 
 
 | 79 |  |  | # Establishes a TCP connection to the specified i-scream filter manager. | 
 
 
 
 
 | 80 |  |  | # The host then requests details from the server, such as the intervals | 
 
 
 
 
 | 81 |  |  | # at which to send UDP packets. | 
 
 
 
 
 | 82 |  |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 83 | pjm2 | 1.1 | sub tcp_configure() { | 
 
 
 
 
 | 84 |  |  |  | 
 
 
 
 
 | 85 |  |  | my($sock) = new IO::Socket::INET( | 
 
 
 
 
 | 86 |  |  | PeerAddr => $filter_manager_addr, | 
 
 
 
 
 | 87 |  |  | PeerPort => $filter_manager_port, | 
 
 
 
 
 | 88 |  |  | Proto => 'tcp' | 
 
 
 
 
 
 
 
 | 89 | pjm2 | 1.21 | ) or die "Cannot connect!"; | 
 
 
 
 
 
 
 
 | 90 | pjm2 | 1.11 | if (!defined $sock) { | 
 
 
 
 
 | 91 |  |  | print "IHOST ERROR: Could not connect to $filter_manager_addr:$filter_manager_port.\n"; | 
 
 
 
 
 | 92 |  |  | print "Please check that there is an i-scream server at this address.\n"; | 
 
 
 
 
 | 93 |  |  | print "Program ended.\n"; | 
 
 
 
 
 | 94 |  |  | exit(1); | 
 
 
 
 
 | 95 |  |  | } | 
 
 
 
 
 
 
 
 | 96 | pjm2 | 1.1 |  | 
 
 
 
 
 
 
 
 | 97 | pjm2 | 1.12 | # Now run through the configuration process... | 
 
 
 
 
 
 
 
 | 98 | pjm2 | 1.1 | my($response); | 
 
 
 
 
 | 99 |  |  |  | 
 
 
 
 
 | 100 |  |  | print $sock "STARTCONFIG\n"; | 
 
 
 
 
 | 101 |  |  | $response = <$sock>; | 
 
 
 
 
 | 102 |  |  | if (!chop $response eq "OK") { | 
 
 
 
 
 | 103 |  |  | print "The i-scream server rejected the STARTCONFIG command.  Terminated."; | 
 
 
 
 
 | 104 |  |  | exit(1); | 
 
 
 
 
 | 105 |  |  | } | 
 
 
 
 
 | 106 |  |  |  | 
 
 
 
 
 | 107 |  |  | print "Config started okay.\n"; | 
 
 
 
 
 | 108 |  |  |  | 
 
 
 
 
 | 109 |  |  | print $sock "LASTMODIFIED\n"; | 
 
 
 
 
 | 110 |  |  | $response = <$sock>; | 
 
 
 
 
 | 111 |  |  | chop $response; | 
 
 
 
 
 | 112 |  |  | $last_modified = $response; | 
 
 
 
 
 | 113 |  |  |  | 
 
 
 
 
 
 
 
 | 114 | pjm2 | 1.7 | print "Config last modified: ". (scalar localtime $last_modified/1000) . "\n"; | 
 
 
 
 
 
 
 
 | 115 | pjm2 | 1.1 |  | 
 
 
 
 
 | 116 |  |  | print $sock "FILELIST\n"; | 
 
 
 
 
 | 117 |  |  | $response = <$sock>; | 
 
 
 
 
 | 118 |  |  | chop $response; | 
 
 
 
 
 | 119 |  |  | $file_list = $response; | 
 
 
 
 
 | 120 |  |  |  | 
 
 
 
 
 | 121 |  |  | print "File list obtained: $file_list\n"; | 
 
 
 
 
 
 
 
 | 122 | pjm2 | 1.17 |  | 
 
 
 
 
 | 123 |  |  | print $sock "FQDN\n"; | 
 
 
 
 
 | 124 |  |  | $response = <$sock>; | 
 
 
 
 
 | 125 |  |  | chop $response; | 
 
 
 
 
 | 126 |  |  | $fqdn = $response; | 
 
 
 
 
 | 127 |  |  |  | 
 
 
 
 
 | 128 |  |  | print "FQDN returned: $fqdn\n"; | 
 
 
 
 
 
 
 
 | 129 | pjm2 | 1.1 |  | 
 
 
 
 
 | 130 |  |  | print $sock "UDPUpdateTime\n"; | 
 
 
 
 
 | 131 |  |  | $response = <$sock>; | 
 
 
 
 
 | 132 |  |  | chop $response; | 
 
 
 
 
 | 133 |  |  | $udp_update_time = $response; | 
 
 
 
 
 | 134 |  |  |  | 
 
 
 
 
 | 135 |  |  | print $sock "TCPUpdateTime\n"; | 
 
 
 
 
 | 136 |  |  | $response = <$sock>; | 
 
 
 
 
 | 137 |  |  | chop $response; | 
 
 
 
 
 | 138 |  |  | $tcp_update_time = $response; | 
 
 
 
 
 | 139 |  |  |  | 
 
 
 
 
 
 
 
 | 140 | pjm2 | 1.7 | print "UDP packet period: $udp_update_time seconds.\nTCP heartbeat period: $tcp_update_time seconds.\n"; | 
 
 
 
 
 
 
 
 | 141 | pjm2 | 1.1 |  | 
 
 
 
 
 | 142 |  |  | print $sock "ENDCONFIG\n"; | 
 
 
 
 
 | 143 |  |  | $response = <$sock>; | 
 
 
 
 
 | 144 |  |  | chomp $response; | 
 
 
 
 
 | 145 |  |  | if (!$response eq "OK") { | 
 
 
 
 
 | 146 |  |  | print "ENDCONFIG command to server failed.  Terminated.\n"; | 
 
 
 
 
 | 147 |  |  | exit(1); | 
 
 
 
 
 | 148 |  |  | } | 
 
 
 
 
 | 149 |  |  |  | 
 
 
 
 
 | 150 |  |  | print "Config ended.\n"; | 
 
 
 
 
 | 151 |  |  |  | 
 
 
 
 
 | 152 |  |  | print $sock "FILTER\n"; | 
 
 
 
 
 | 153 |  |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 154 | pjm2 | 1.24 | unless (defined($response)) { | 
 
 
 
 
 | 155 |  |  | print "Failed: Could not get a filter address from the filter manager.\n"; | 
 
 
 
 
 | 156 |  |  | exit(1); | 
 
 
 
 
 | 157 |  |  | } | 
 
 
 
 
 
 
 
 | 158 | pjm2 | 1.1 | chop $response; | 
 
 
 
 
 | 159 |  |  | $response =~ /(.*);(.*);(.*)/; | 
 
 
 
 
 | 160 |  |  | ($filter_addr, $udp_port, $tcp_port) = ($1, $2, $3); | 
 
 
 
 
 
 
 
 | 161 | pjm2 | 1.24 | unless (defined($filter_addr) && defined($udp_port) && defined($tcp_port)) { | 
 
 
 
 
 | 162 |  |  | print "Failed: Filter address response from server did not make sense: $response\n"; | 
 
 
 
 
 | 163 |  |  | exit(1); | 
 
 
 
 
 | 164 |  |  | } | 
 
 
 
 
 
 
 
 | 165 | pjm2 | 1.1 |  | 
 
 
 
 
 | 166 |  |  | print "Got filter data ($filter_addr, $udp_port, $tcp_port)\n"; | 
 
 
 
 
 | 167 |  |  |  | 
 
 
 
 
 | 168 |  |  | print $sock "END\n"; | 
 
 
 
 
 | 169 |  |  | $response = <$sock>; | 
 
 
 
 
 | 170 |  |  | chop $response; | 
 
 
 
 
 | 171 |  |  | if ($response eq "OK") { | 
 
 
 
 
 | 172 |  |  | print "Host successfully configured via TCP.\n" | 
 
 
 
 
 | 173 |  |  | } | 
 
 
 
 
 | 174 |  |  | else { | 
 
 
 
 
 | 175 |  |  | print "The server failed the host configuration on the END command."; | 
 
 
 
 
 | 176 |  |  | exit(1); | 
 
 
 
 
 | 177 |  |  | } | 
 
 
 
 
 | 178 |  |  |  | 
 
 
 
 
 | 179 |  |  | close($sock); | 
 
 
 
 
 | 180 |  |  |  | 
 
 
 
 
 | 181 |  |  | print "Configuration finished sucessfully!\n"; | 
 
 
 
 
 
 
 
 | 182 | pjm2 | 1.12 |  | 
 
 
 
 
 | 183 |  |  | return; | 
 
 
 
 
 
 
 
 | 184 | pjm2 | 1.1 | } | 
 
 
 
 
 | 185 |  |  |  | 
 
 
 
 
 
 
 
 | 186 | pjm2 | 1.12 |  | 
 
 
 
 
 | 187 |  |  |  | 
 
 
 
 
 | 188 |  |  |  | 
 
 
 
 
 | 189 |  |  | #----------------------------------------------------------------------- | 
 
 
 
 
 | 190 |  |  | # send_udp_packet | 
 
 
 
 
 | 191 |  |  | # Sends a UDP packet to an i-scream filter. | 
 
 
 
 
 | 192 |  |  | # The packet contains XML markup describing some of the machine's state. | 
 
 
 
 
 | 193 |  |  | # Receipt of UDP packets is not guaranteed. | 
 
 
 
 
 | 194 |  |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 195 | pjm2 | 1.1 | sub send_udp_packet() { | 
 
 
 
 
 | 196 |  |  |  | 
 
 
 
 
 | 197 |  |  | my(@statgrab) = `./statgrab.pl`; | 
 
 
 
 
 | 198 |  |  | my(%packet); | 
 
 
 
 
 
 
 
 | 199 | pjm2 | 1.13 | for (my($i) = 0; $i <= $#statgrab; $i++) { | 
 
 
 
 
 
 
 
 | 200 | pjm2 | 1.1 | $statgrab[$i] =~ /^([^\s]*) (.*)$/; | 
 
 
 
 
 | 201 |  |  | $packet{$1} = $2; | 
 
 
 
 
 | 202 |  |  | } | 
 
 
 
 
 | 203 |  |  |  | 
 
 
 
 
 | 204 |  |  | my($date) = time; | 
 
 
 
 
 | 205 |  |  |  | 
 
 
 
 
 | 206 |  |  | my($disk_info) = "<disk>"; | 
 
 
 
 
 | 207 |  |  | my($i) = 0; | 
 
 
 
 
 | 208 |  |  | while (defined $packet{"packet.disk.p$i.attributes.mount"}) { | 
 
 
 
 
 
 
 
 | 209 | pjm2 | 1.15 | $disk_info .= "<p$i"; | 
 
 
 
 
 | 210 |  |  | $disk_info .= " name=\"" . $packet{"packet.disk.p$i.attributes.name"} . "\""; | 
 
 
 
 
 | 211 |  |  | $disk_info .= " kbytes=\"" . $packet{"packet.disk.p$i.attributes.kbytes"} . "\""; | 
 
 
 
 
 | 212 |  |  | $disk_info .= " used=\"" . $packet{"packet.disk.p$i.attributes.used"} . "\""; | 
 
 
 
 
 | 213 |  |  | $disk_info .= " avail=\"" . $packet{"packet.disk.p$i.attributes.avail"} . "\""; | 
 
 
 
 
 | 214 |  |  | $disk_info .= " mount=\"" . $packet{"packet.disk.p$i.attributes.mount"} . "\""; | 
 
 
 
 
 | 215 |  |  | $disk_info .= "></p$i>"; | 
 
 
 
 
 
 
 
 | 216 | pjm2 | 1.1 | ++$i; | 
 
 
 
 
 | 217 |  |  | } | 
 
 
 
 
 | 218 |  |  | $disk_info .= "</disk>"; | 
 
 
 
 
 
 
 
 | 219 | pjm2 | 1.13 |  | 
 
 
 
 
 
 
 
 | 220 | tdb | 1.19 | my($ip) = inet_ntoa(scalar(gethostbyname(hostname())) || 'localhost'); | 
 
 
 
 
 
 
 
 | 221 | pjm2 | 1.1 |  | 
 
 
 
 
 | 222 |  |  | # Build the XML packet this way, as we can clearly | 
 
 
 
 
 | 223 |  |  | # see the structure and contents... I like this ;-) | 
 
 
 
 
 
 
 
 | 224 | pjm2 | 1.12 | # [Note that the server rejects UDP packets that are | 
 
 
 
 
 | 225 |  |  | # larger than 8196 bytes] | 
 
 
 
 
 
 
 
 | 226 | pjm2 | 1.1 | my($xml) = <<EOF; | 
 
 
 
 
 | 227 |  |  |  | 
 
 
 
 
 
 
 
 | 228 | tdb | 1.19 | <packet seq_no="$seq_no" machine_name="$fqdn" date="$date" type="data" ip="$ip"> | 
 
 
 
 
 
 
 
 | 229 | pjm2 | 1.1 | <load> | 
 
 
 
 
 | 230 |  |  | <load1>$packet{"packet.load.load1"}</load1> | 
 
 
 
 
 | 231 |  |  | <load5>$packet{"packet.load.load5"}</load5> | 
 
 
 
 
 | 232 |  |  | <load15>$packet{"packet.load.load15"}</load15> | 
 
 
 
 
 | 233 |  |  | </load> | 
 
 
 
 
 | 234 |  |  | <os> | 
 
 
 
 
 | 235 |  |  | <name>$packet{"packet.os.name"}</name> | 
 
 
 
 
 | 236 |  |  | <release>$packet{"packet.os.release"}</release> | 
 
 
 
 
 | 237 |  |  | <platform>$packet{"packet.os.platform"}</platform> | 
 
 
 
 
 | 238 |  |  | <sysname>$packet{"packet.os.sysname"}</sysname> | 
 
 
 
 
 | 239 |  |  | <version>$packet{"packet.os.version"}</version> | 
 
 
 
 
 
 
 
 | 240 | tdb | 1.10 | <uptime>$packet{"packet.os.uptime"}</uptime> | 
 
 
 
 
 
 
 
 | 241 | pjm2 | 1.1 | </os> | 
 
 
 
 
 | 242 |  |  | <users> | 
 
 
 
 
 | 243 |  |  | <count>$packet{"packet.users.count"}</count> | 
 
 
 
 
 | 244 |  |  | <list>$packet{"packet.users.list"}</list> | 
 
 
 
 
 | 245 |  |  | </users> | 
 
 
 
 
 | 246 |  |  | <processes> | 
 
 
 
 
 | 247 |  |  | <total>$packet{"packet.processes.total"}</total> | 
 
 
 
 
 | 248 |  |  | <sleeping>$packet{"packet.processes.sleeping"}</sleeping> | 
 
 
 
 
 | 249 |  |  | <zombie>$packet{"packet.processes.zombie"}</zombie> | 
 
 
 
 
 | 250 |  |  | <stopped>$packet{"packet.processes.stopped"}</stopped> | 
 
 
 
 
 | 251 |  |  | <cpu>$packet{"packet.processes.cpu"}</cpu> | 
 
 
 
 
 | 252 |  |  | </processes> | 
 
 
 
 
 | 253 |  |  | <cpu> | 
 
 
 
 
 | 254 |  |  | <idle>$packet{"packet.cpu.idle"}</idle> | 
 
 
 
 
 | 255 |  |  | <user>$packet{"packet.cpu.user"}</user> | 
 
 
 
 
 | 256 |  |  | <kernel>$packet{"packet.cpu.kernel"}</kernel> | 
 
 
 
 
 | 257 |  |  | <iowait>$packet{"packet.cpu.iowait"}</iowait> | 
 
 
 
 
 | 258 |  |  | <swap>$packet{"packet.cpu.swap"}</swap> | 
 
 
 
 
 | 259 |  |  | </cpu> | 
 
 
 
 
 | 260 |  |  | <memory> | 
 
 
 
 
 
 
 
 | 261 | pjm2 | 1.13 | <total>$packet{"packet.memory.total"}</total> | 
 
 
 
 
 
 
 
 | 262 | pjm2 | 1.1 | <free>$packet{"packet.memory.free"}</free> | 
 
 
 
 
 | 263 |  |  | </memory> | 
 
 
 
 
 | 264 |  |  | <swap> | 
 
 
 
 
 
 
 
 | 265 | pjm2 | 1.13 | <total>$packet{"packet.swap.total"}</total> | 
 
 
 
 
 | 266 |  |  | <free>$packet{"packet.swap.free"}</free> | 
 
 
 
 
 
 
 
 | 267 | pjm2 | 1.1 | </swap> | 
 
 
 
 
 | 268 |  |  | $disk_info | 
 
 
 
 
 | 269 |  |  | </packet> | 
 
 
 
 
 | 270 |  |  |  | 
 
 
 
 
 | 271 |  |  | EOF | 
 
 
 
 
 | 272 |  |  |  | 
 
 
 
 
 
 
 
 | 273 | pjm2 | 1.12 | # Make the packet smaller by stripping out newlines and leading spaces. | 
 
 
 
 
 
 
 
 | 274 | pjm2 | 1.1 | $xml =~ s/\n\s*//g; | 
 
 
 
 
 
 
 
 | 275 | tdb | 1.19 |  | 
 
 
 
 
 
 
 
 | 276 | pjm2 | 1.1 | my($sock) = new IO::Socket::INET ( | 
 
 
 
 
 | 277 |  |  | PeerPort => $udp_port, | 
 
 
 
 
 | 278 |  |  | PeerAddr => $filter_addr, | 
 
 
 
 
 | 279 |  |  | Proto => 'udp' | 
 
 
 
 
 
 
 
 | 280 | pjm2 | 1.21 | ) or die "Could not send UDP: $!\n"; | 
 
 
 
 
 
 
 
 | 281 | pjm2 | 1.1 |  | 
 
 
 
 
 | 282 |  |  | print $sock $xml or die "Could not send UDP packet: $!\n"; | 
 
 
 
 
 | 283 |  |  | close($sock); | 
 
 
 
 
 | 284 |  |  | $seq_no++; | 
 
 
 
 
 | 285 |  |  | print "-"; | 
 
 
 
 
 
 
 
 | 286 | pjm2 | 1.12 |  | 
 
 
 
 
 | 287 |  |  | return; | 
 
 
 
 
 
 
 
 | 288 | pjm2 | 1.1 | } | 
 
 
 
 
 | 289 |  |  |  | 
 
 
 
 
 
 
 
 | 290 | pjm2 | 1.12 |  | 
 
 
 
 
 | 291 |  |  |  | 
 
 
 
 
 | 292 |  |  |  | 
 
 
 
 
 | 293 |  |  | #----------------------------------------------------------------------- | 
 
 
 
 
 | 294 |  |  | # send_tcp_heartbeat | 
 
 
 
 
 | 295 |  |  | # Establishes a TCP connection to an i-scream filter. | 
 
 
 
 
 | 296 |  |  | # The heartbeat is used as a guaranteed "I'm alive" delivery mechanism. | 
 
 
 
 
 | 297 |  |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 298 | pjm2 | 1.1 | sub send_tcp_heartbeat() { | 
 
 
 
 
 | 299 |  |  |  | 
 
 
 
 
 | 300 |  |  | my($sock) = new IO::Socket::INET( | 
 
 
 
 
 | 301 |  |  | PeerAddr => $filter_addr, | 
 
 
 
 
 | 302 |  |  | PeerPort => $tcp_port, | 
 
 
 
 
 | 303 |  |  | Proto => 'tcp' | 
 
 
 
 
 
 
 
 | 304 | pjm2 | 1.21 | ) or return; | 
 
 
 
 
 
 
 
 | 305 | pjm2 | 1.11 | if (!defined $sock) { | 
 
 
 
 
 | 306 |  |  | print "IHOST WARNING: Failed to deliver a heartbeat to the i-scream filter.\n"; | 
 
 
 
 
 | 307 |  |  | return; | 
 
 
 
 
 | 308 |  |  | } | 
 
 
 
 
 
 
 
 | 309 | pjm2 | 1.1 |  | 
 
 
 
 
 | 310 |  |  | # Now run through the configuration process. | 
 
 
 
 
 | 311 |  |  | my($response); | 
 
 
 
 
 | 312 |  |  |  | 
 
 
 
 
 | 313 |  |  | print $sock "HEARTBEAT\n"; | 
 
 
 
 
 | 314 |  |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 315 | pjm2 | 1.23 | return if (!defined $response); | 
 
 
 
 
 | 316 |  |  | chop $response; | 
 
 
 
 
 
 
 
 | 317 | pjm2 | 1.1 | if (!$response eq "OK") { | 
 
 
 
 
 | 318 |  |  | close($sock); | 
 
 
 
 
 | 319 |  |  | print "Server gave wrong response to HEARTBEAT: $response\n"; | 
 
 
 
 
 | 320 |  |  | return; | 
 
 
 
 
 | 321 |  |  | } | 
 
 
 
 
 | 322 |  |  |  | 
 
 
 
 
 | 323 |  |  | print $sock "CONFIG\n"; | 
 
 
 
 
 | 324 |  |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 325 | pjm2 | 1.23 | return if (!defined $response); | 
 
 
 
 
 | 326 |  |  | chop $response; | 
 
 
 
 
 
 
 
 | 327 | pjm2 | 1.1 | if (!$response eq "OK") { | 
 
 
 
 
 | 328 |  |  | close($sock); | 
 
 
 
 
 | 329 |  |  | print "Server gave wrong response to CONFIG: $response\n"; | 
 
 
 
 
 | 330 |  |  | return; | 
 
 
 
 
 | 331 |  |  | } | 
 
 
 
 
 | 332 |  |  |  | 
 
 
 
 
 | 333 |  |  | print $sock "$file_list\n"; | 
 
 
 
 
 | 334 |  |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 335 | pjm2 | 1.23 | return if (!defined $response); | 
 
 
 
 
 | 336 |  |  | chop $response; | 
 
 
 
 
 
 
 
 | 337 | pjm2 | 1.1 | if (!$response eq "OK") { | 
 
 
 
 
 | 338 |  |  | close($sock); | 
 
 
 
 
 | 339 |  |  | print "Server gave wrong response to file list: $response\n"; | 
 
 
 
 
 | 340 |  |  | return; | 
 
 
 
 
 | 341 |  |  | } | 
 
 
 
 
 | 342 |  |  |  | 
 
 
 
 
 | 343 |  |  | print $sock "$last_modified\n"; | 
 
 
 
 
 | 344 |  |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 | 345 | pjm2 | 1.23 | return if (!defined $response); | 
 
 
 
 
 | 346 |  |  | chop $response; | 
 
 
 
 
 
 
 
 | 347 | pjm2 | 1.1 | if ($response eq "ERROR") { | 
 
 
 
 
 | 348 |  |  | close($sock); | 
 
 
 
 
 | 349 |  |  | &tcp_configure(); | 
 
 
 
 
 | 350 |  |  | return; | 
 
 
 
 
 | 351 |  |  | } | 
 
 
 
 
 | 352 |  |  | if (!$response eq "OK") { | 
 
 
 
 
 | 353 |  |  | close($sock); | 
 
 
 
 
 | 354 |  |  | print "Server gave wrong response to HEARTBEAT: $response\n"; | 
 
 
 
 
 | 355 |  |  | return; | 
 
 
 
 
 | 356 |  |  | } | 
 
 
 
 
 | 357 |  |  |  | 
 
 
 
 
 | 358 |  |  | print $sock "ENDHEARTBEAT\n"; | 
 
 
 
 
 
 
 
 | 359 | pjm2 | 1.23 | $response = <$sock>; | 
 
 
 
 
 | 360 |  |  | return if (!defined $response); | 
 
 
 
 
 
 
 
 | 361 | pjm2 | 1.1 | chop $response; | 
 
 
 
 
 | 362 |  |  | if (!$response eq "OK") { | 
 
 
 
 
 | 363 |  |  | close($sock); | 
 
 
 
 
 | 364 |  |  | print "Server gave wrong response to ENDHEARTBEAT: $response\n"; | 
 
 
 
 
 | 365 |  |  | return; | 
 
 
 
 
 | 366 |  |  | } | 
 
 
 
 
 | 367 |  |  |  | 
 
 
 
 
 | 368 |  |  | close($sock); | 
 
 
 
 
 | 369 |  |  | print "^"; | 
 
 
 
 
 
 
 
 | 370 | pjm2 | 1.12 |  | 
 
 
 
 
 | 371 |  |  | return; | 
 
 
 
 
 
 
 
 | 372 | pjm2 | 1.1 | } |