| 5 |  | # http://www.i-scream.org.uk | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 6 |  | # | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 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 | 
 
 
 
 
 
 
 
 
 | 8 | > | # a typical Unix/Linux box. | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 9 |  | # | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 10 |  | # $Author$ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 11 |  | # $Id$ | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 32 |  | $file_list | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 33 |  | $fqdn | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 34 |  | $pidfile | 
 
 
 
 
 
 
 
 | 35 | + | $retry_wait | 
 
 
 
 
 
 
 
 | 36 | + | @data | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 37 |  | ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 38 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 39 |  | if (@ARGV != 2) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 44 |  | $filter_manager_port = $ARGV[1]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 45 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 46 |  | $seq_no = 1; | 
 
 
 
 
 
 
 
 | 47 | + | $retry_wait = 60; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 48 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 49 |  | # write our PID to a file | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 50 |  | $pidfile = "/var/tmp/ihost.pid"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 74 |  | else { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 75 |  | $delay = $next_tcp; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 76 |  | } | 
 
 
 
 
 
 
 
 
 
 
 | 77 | < | `sleep $delay`; | 
 
 
 
 
 
 
 
 
 | 77 | > | sleep $delay; | 
 
 
 
 
 
 
 
 
 
 
 | 78 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 79 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 80 |  | # we'll probably never get here... | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 83 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 84 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 85 |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 86 | + | # wait_then_retry | 
 
 
 
 
 
 
 
 | 87 | + | # Waits for the period of time specified in $retry_wait, then attempts | 
 
 
 
 
 
 
 
 | 88 | + | # to reconfigure with the server. | 
 
 
 
 
 
 
 
 | 89 | + | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 90 | + | sub wait_then_retry() { | 
 
 
 
 
 
 
 
 | 91 | + | print "Will retry configuration with filter manager in $retry_wait seconds.\n"; | 
 
 
 
 
 
 
 
 | 92 | + | sleep $retry_wait; | 
 
 
 
 
 
 
 
 | 93 | + | } | 
 
 
 
 
 
 
 
 | 94 | + |  | 
 
 
 
 
 
 
 
 | 95 | + |  | 
 
 
 
 
 
 
 
 | 96 | + | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 97 |  | # tcp_configure | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 98 |  | # Establishes a TCP connection to the specified i-scream filter manager. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 99 |  | # The host then requests details from the server, such as the intervals | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 101 |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 102 |  | sub tcp_configure() { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 103 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 104 | < | my($sock) = new IO::Socket::INET( | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 105 | < | PeerAddr => $filter_manager_addr, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 106 | < | PeerPort => $filter_manager_port, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 107 | < | Proto => 'tcp' | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 108 | < | ) or die "Cannot connect!"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 109 | < | if (!defined $sock) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 110 | < | print "IHOST ERROR: Could not connect to $filter_manager_addr:$filter_manager_port.\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 111 | < | print "Please check that there is an i-scream server at this address.\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 112 | < | print "Program ended.\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 113 | < | exit(1); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 114 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 104 | > | while (1) { | 
 
 
 
 
 | 105 | > | my($sock) = new IO::Socket::INET( | 
 
 
 
 
 | 106 | > | PeerAddr => $filter_manager_addr, | 
 
 
 
 
 | 107 | > | PeerPort => $filter_manager_port, | 
 
 
 
 
 | 108 | > | Proto => 'tcp' | 
 
 
 
 
 | 109 | > | ) or die "Cannot connect!"; | 
 
 
 
 
 | 110 | > | if (!defined $sock) { | 
 
 
 
 
 | 111 | > | print "IHOST ERROR: Could not connect to $filter_manager_addr:$filter_manager_port.\n"; | 
 
 
 
 
 | 112 | > | print "Please check that there is an i-scream server at this address.\n"; | 
 
 
 
 
 | 113 | > | wait_then_retry(); | 
 
 
 
 
 | 114 | > | next; | 
 
 
 
 
 | 115 | > | } | 
 
 
 
 
 
 
 
 
 
 
 | 116 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 117 | < | # Now run through the configuration process... | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 118 | < | my($response); | 
 
 
 
 
 
 
 
 
 | 117 | > | # Now run through the configuration process... | 
 
 
 
 
 | 118 | > | my($response); | 
 
 
 
 
 
 
 
 
 
 
 | 119 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 120 | < | print $sock "STARTCONFIG\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 121 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 122 | < | if (!chop $response eq "OK") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 123 | < | print "The i-scream server rejected the STARTCONFIG command.  Terminated."; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 124 | < | exit(1); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 125 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 120 | > | print $sock "STARTCONFIG\n"; | 
 
 
 
 
 | 121 | > | $response = <$sock>; | 
 
 
 
 
 | 122 | > | if ($response && !($response eq "OK\n")) { | 
 
 
 
 
 | 123 | > | print "The i-scream server rejected the STARTCONFIG command.\n"; | 
 
 
 
 
 | 124 | > | close($sock); | 
 
 
 
 
 | 125 | > | wait_then_retry(); | 
 
 
 
 
 | 126 | > | next; | 
 
 
 
 
 | 127 | > | } | 
 
 
 
 
 
 
 
 
 
 
 | 128 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 129 | < | print "Config started okay.\n"; | 
 
 
 
 
 
 
 
 
 | 129 | > | print "Config started okay.\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 130 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 131 | < | print $sock "LASTMODIFIED\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 132 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 133 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 134 | < | $last_modified = $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 131 | > | print $sock "LASTMODIFIED\n"; | 
 
 
 
 
 | 132 | > | $response = <$sock>; | 
 
 
 
 
 | 133 | > | if (!$response) { | 
 
 
 
 
 | 134 | > | print "The i-scream server did not return anything for the LASTMODIFIED command.\n"; | 
 
 
 
 
 | 135 | > | close($sock); | 
 
 
 
 
 | 136 | > | wait_then_retry(); | 
 
 
 
 
 | 137 | > | next; | 
 
 
 
 
 | 138 | > | } | 
 
 
 
 
 | 139 | > | chop $response; | 
 
 
 
 
 | 140 | > | $last_modified = $response; | 
 
 
 
 
 
 
 
 
 
 
 | 141 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 142 | < | print "Config last modified: ". (scalar localtime $last_modified/1000) . "\n"; | 
 
 
 
 
 
 
 
 
 | 142 | > | print "Config last modified: ". (scalar localtime $last_modified/1000) . "\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 143 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 144 | < | print $sock "FILELIST\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 145 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 146 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 147 | < | $file_list = $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 144 | > | print $sock "FILELIST\n"; | 
 
 
 
 
 | 145 | > | $response = <$sock>; | 
 
 
 
 
 | 146 | > | if (!$response) { | 
 
 
 
 
 | 147 | > | print "The i-scream server did not provide a configuration file list.\n"; | 
 
 
 
 
 | 148 | > | close($sock); | 
 
 
 
 
 | 149 | > | wait_then_retry(); | 
 
 
 
 
 | 150 | > | next; | 
 
 
 
 
 | 151 | > | } | 
 
 
 
 
 | 152 | > | chop $response; | 
 
 
 
 
 | 153 | > | $file_list = $response; | 
 
 
 
 
 
 
 
 
 
 
 | 154 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 155 | < | print "File list obtained: $file_list\n"; | 
 
 
 
 
 
 
 
 
 | 155 | > | print "File list obtained: $file_list\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 156 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 157 | < | print $sock "FQDN\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 158 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 159 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 160 | < | $fqdn = $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 157 | > | print $sock "FQDN\n"; | 
 
 
 
 
 | 158 | > | $response = <$sock>; | 
 
 
 
 
 | 159 | > | if (!$response) { | 
 
 
 
 
 | 160 | > | print "The i-scream server did not tell us our FQDN.\n"; | 
 
 
 
 
 | 161 | > | close($sock); | 
 
 
 
 
 | 162 | > | wait_then_retry(); | 
 
 
 
 
 | 163 | > | next; | 
 
 
 
 
 | 164 | > | } | 
 
 
 
 
 | 165 | > | chop $response; | 
 
 
 
 
 | 166 | > | $fqdn = $response; | 
 
 
 
 
 
 
 
 
 
 
 | 167 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 168 | < | print "FQDN returned: $fqdn\n"; | 
 
 
 
 
 
 
 
 
 | 168 | > | print "FQDN returned: $fqdn\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 169 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 170 | < | print $sock "UDPUpdateTime\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 171 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 172 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 173 | < | $udp_update_time = $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 170 | > | print $sock "UDPUpdateTime\n"; | 
 
 
 
 
 | 171 | > | $response = <$sock>; | 
 
 
 
 
 | 172 | > | if (!$response) { | 
 
 
 
 
 | 173 | > | print "The i-scream server did not give us a UDPUpdateTime.\n"; | 
 
 
 
 
 | 174 | > | close($sock); | 
 
 
 
 
 | 175 | > | wait_then_retry(); | 
 
 
 
 
 | 176 | > | next; | 
 
 
 
 
 | 177 | > | } | 
 
 
 
 
 | 178 | > | chop $response; | 
 
 
 
 
 | 179 | > | $udp_update_time = $response; | 
 
 
 
 
 
 
 
 
 
 
 | 180 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 181 | < | print $sock "TCPUpdateTime\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 182 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 183 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 184 | < | $tcp_update_time = $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 181 | > | print $sock "TCPUpdateTime\n"; | 
 
 
 
 
 | 182 | > | $response = <$sock>; | 
 
 
 
 
 | 183 | > | if (!$response) { | 
 
 
 
 
 | 184 | > | print "The i-scream server did not give us a TCPUpdateTime.\n"; | 
 
 
 
 
 | 185 | > | close($sock); | 
 
 
 
 
 | 186 | > | wait_then_retry(); | 
 
 
 
 
 | 187 | > | next; | 
 
 
 
 
 | 188 | > | } | 
 
 
 
 
 | 189 | > | chop $response; | 
 
 
 
 
 | 190 | > | $tcp_update_time = $response; | 
 
 
 
 
 
 
 
 
 
 
 | 191 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 192 | < | print "UDP packet period: $udp_update_time seconds.\nTCP heartbeat period: $tcp_update_time seconds.\n"; | 
 
 
 
 
 
 
 
 
 | 192 | > | print "UDP packet period: $udp_update_time seconds.\nTCP heartbeat period: $tcp_update_time seconds.\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 193 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 194 | < | print $sock "ENDCONFIG\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 195 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 196 | < | chomp $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 197 | < | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 198 | < | print "ENDCONFIG command to server failed.  Terminated.\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 199 | < | exit(1); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 200 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 194 | > | print $sock "ENDCONFIG\n"; | 
 
 
 
 
 | 195 | > | $response = <$sock>; | 
 
 
 
 
 | 196 | > | if ($response && !($response eq "OK\n")) { | 
 
 
 
 
 | 197 | > | print "ENDCONFIG command to server failed.  Terminated.\n"; | 
 
 
 
 
 | 198 | > | close($sock); | 
 
 
 
 
 | 199 | > | wait_then_retry(); | 
 
 
 
 
 | 200 | > | next; | 
 
 
 
 
 | 201 | > | } | 
 
 
 
 
 
 
 
 
 
 
 | 202 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 203 | < | print "Config ended.\n"; | 
 
 
 
 
 
 
 
 
 | 203 | > | print "Config ended.\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 204 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 205 | < | print $sock "FILTER\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 206 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 207 | < | unless (defined($response)) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 208 | < | print "Failed: Could not get a filter address from the filter manager.\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 209 | < | exit(1); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 210 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 211 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 212 | < | $response =~ /(.*);(.*);(.*)/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 213 | < | ($filter_addr, $udp_port, $tcp_port) = ($1, $2, $3); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 214 | < | unless (defined($filter_addr) && defined($udp_port) && defined($tcp_port)) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 215 | < | print "Failed: Filter address response from server did not make sense: $response\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 216 | < | exit(1); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 217 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 205 | > | print $sock "FILTER\n"; | 
 
 
 
 
 | 206 | > | $response = <$sock>; | 
 
 
 
 
 | 207 | > | if (!$response) { | 
 
 
 
 
 | 208 | > | print "Failed: Could not get a filter address from the filter manager.\n"; | 
 
 
 
 
 | 209 | > | close($sock); | 
 
 
 
 
 | 210 | > | wait_then_retry(); | 
 
 
 
 
 | 211 | > | next; | 
 
 
 
 
 | 212 | > | } | 
 
 
 
 
 | 213 | > | chop $response; | 
 
 
 
 
 | 214 | > | $response =~ /^(.*);(.*);(.*)/; | 
 
 
 
 
 | 215 | > | if ($response eq "ERROR") { | 
 
 
 
 
 | 216 | > | print "There are no active configured filters for your host.\n"; | 
 
 
 
 
 | 217 | > | close($sock); | 
 
 
 
 
 | 218 | > | wait_then_retry(); | 
 
 
 
 
 | 219 | > | next; | 
 
 
 
 
 | 220 | > | } | 
 
 
 
 
 | 221 | > | ($filter_addr, $udp_port, $tcp_port) = ($1, $2, $3); | 
 
 
 
 
 | 222 | > | unless (defined($filter_addr) && defined($udp_port) && defined($tcp_port)) { | 
 
 
 
 
 | 223 | > | print "Failed: Filter address response from server did not make sense: $response\n"; | 
 
 
 
 
 | 224 | > | close($sock); | 
 
 
 
 
 | 225 | > | wait_then_retry(); | 
 
 
 
 
 | 226 | > | next; | 
 
 
 
 
 | 227 | > | } | 
 
 
 
 
 
 
 
 
 
 
 | 228 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 229 | < | print "Got filter data ($filter_addr, $udp_port, $tcp_port)\n"; | 
 
 
 
 
 
 
 
 
 | 229 | > | print "Got filter data ($filter_addr, $udp_port, $tcp_port)\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 230 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 231 | < | print $sock "END\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 232 | < | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 233 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 234 | < | if ($response eq "OK") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 235 | < | print "Host successfully configured via TCP.\n" | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 236 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 237 | < | else { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 238 | < | print "The server failed the host configuration on the END command."; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 239 | < | exit(1); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 240 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 231 | > | print $sock "END\n"; | 
 
 
 
 
 | 232 | > | $response = <$sock>; | 
 
 
 
 
 | 233 | > | if ($response && ($response eq "OK\n")) { | 
 
 
 
 
 | 234 | > | print "Host successfully configured via TCP.\n" | 
 
 
 
 
 | 235 | > | } | 
 
 
 
 
 | 236 | > | else { | 
 
 
 
 
 | 237 | > | print "The server failed the host configuration on the END command.\n"; | 
 
 
 
 
 | 238 | > | close($sock); | 
 
 
 
 
 | 239 | > | wait_then_retry(); | 
 
 
 
 
 | 240 | > | next; | 
 
 
 
 
 | 241 | > | } | 
 
 
 
 
 
 
 
 
 
 
 | 242 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 243 | < | close($sock); | 
 
 
 
 
 
 
 
 
 | 243 | > | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 | 244 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 245 | < | print "Configuration finished sucessfully!\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 246 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 245 | > | print "Configuration finished sucessfully!\n"; | 
 
 
 
 
 | 246 | > | last; | 
 
 
 
 
 | 247 | > | } | 
 
 
 
 
 
 
 
 
 
 
 | 248 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 249 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 250 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 251 |  |  | 
 
 
 
 
 
 
 
 
 | 194 | – |  | 
 
 
 
 
 
 
 
 
 | 195 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 252 |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 253 |  | # send_udp_packet | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 254 |  | # Sends a UDP packet to an i-scream filter. | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 257 |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 258 |  | sub send_udp_packet() { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 259 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 260 | < | my(@statgrab) = `./statgrab.pl`; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 261 | < | my(%packet); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 262 | < | for (my($i) = 0; $i <= $#statgrab; $i++) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 263 | < | $statgrab[$i] =~ /^([^\s]*) (.*)$/; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 264 | < | $packet{$1} = $2; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 260 | > | my($plugins_dir) = "plugins"; | 
 
 
 
 
 | 261 | > |  | 
 
 
 
 
 | 262 | > | opendir PLUGINS, $plugins_dir; | 
 
 
 
 
 | 263 | > | my(@plugins) = readdir PLUGINS; | 
 
 
 
 
 | 264 | > | foreach my $plugin (@plugins) { | 
 
 
 
 
 | 265 | > | push @data, `$plugins_dir/$plugin` if -x "$plugins_dir/$plugin" && -f "$plugins_dir/$plugin"; | 
 
 
 
 
 
 
 
 
 
 
 | 266 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 267 |  |  | 
 
 
 
 
 
 
 
 | 268 | + | # get some extra data | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 269 |  | my($date) = time; | 
 
 
 
 
 
 
 
 | 270 | + | my($ip); | 
 
 
 
 
 
 
 
 | 271 | + | $ip = inet_ntoa(scalar(gethostbyname(hostname())) || 'localhost') or $ip = 'localhost'; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 272 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 273 | < | my($disk_info) = "<disk>"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 274 | < | my($i) = 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 275 | < | while (defined $packet{"packet.disk.p$i.attributes.mount"}) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 276 | < | $disk_info .= "<p$i"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 277 | < | $disk_info .= " name=\"" . $packet{"packet.disk.p$i.attributes.name"} . "\""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 278 | < | $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($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 ;-) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 231 | < | # [Note that the server rejects UDP packets that are | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 232 | < | # larger than 8196 bytes] | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 233 | < | my($xml) = <<EOF; | 
 
 
 
 
 
 
 
 
 | 273 | > | # add some extra data to the array | 
 
 
 
 
 | 274 | > | push(@data, "packet.attributes.seq_no=$seq_no"); | 
 
 
 
 
 | 275 | > | push(@data, "packet.attributes.machine_name=$fqdn"); | 
 
 
 
 
 | 276 | > | push(@data, "packet.attributes.date=$date"); | 
 
 
 
 
 | 277 | > | push(@data, "packet.attributes.type=data"); | 
 
 
 
 
 | 278 | > | push(@data, "packet.attributes.ip=$ip"); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 279 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 280 | < | <packet seq_no="$seq_no" machine_name="$fqdn" date="$date" type="data" ip="$ip"> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 281 | < | <load> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 282 | < | <load1>$packet{"packet.load.load1"}</load1> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 283 | < | <load5>$packet{"packet.load.load5"}</load5> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 284 | < | <load15>$packet{"packet.load.load15"}</load15> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 285 | < | </load> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 241 | < | <os> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 242 | < | <name>$packet{"packet.os.name"}</name> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 243 | < | <release>$packet{"packet.os.release"}</release> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 244 | < | <platform>$packet{"packet.os.platform"}</platform> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 245 | < | <sysname>$packet{"packet.os.sysname"}</sysname> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 246 | < | <version>$packet{"packet.os.version"}</version> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 247 | < | <uptime>$packet{"packet.os.uptime"}</uptime> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 248 | < | </os> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 249 | < | <users> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 250 | < | <count>$packet{"packet.users.count"}</count> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 251 | < | <list>$packet{"packet.users.list"}</list> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 252 | < | </users> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 253 | < | <processes> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 254 | < | <total>$packet{"packet.processes.total"}</total> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 255 | < | <sleeping>$packet{"packet.processes.sleeping"}</sleeping> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 256 | < | <zombie>$packet{"packet.processes.zombie"}</zombie> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 257 | < | <stopped>$packet{"packet.processes.stopped"}</stopped> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 258 | < | <cpu>$packet{"packet.processes.cpu"}</cpu> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 259 | < | </processes> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 260 | < | <cpu> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 261 | < | <idle>$packet{"packet.cpu.idle"}</idle> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 262 | < | <user>$packet{"packet.cpu.user"}</user> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 263 | < | <kernel>$packet{"packet.cpu.kernel"}</kernel> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 264 | < | <iowait>$packet{"packet.cpu.iowait"}</iowait> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 265 | < | <swap>$packet{"packet.cpu.swap"}</swap> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 266 | < | </cpu> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 267 | < | <memory> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 268 | < | <total>$packet{"packet.memory.total"}</total> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 269 | < | <free>$packet{"packet.memory.free"}</free> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 270 | < | </memory> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 271 | < | <swap> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 272 | < | <total>$packet{"packet.swap.total"}</total> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 273 | < | <free>$packet{"packet.swap.free"}</free> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 274 | < | </swap> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 275 | < | $disk_info | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 276 | < | </packet> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 277 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 278 | < | EOF | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 279 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 280 | < | # Make the packet smaller by stripping out newlines and leading spaces. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 281 | < | $xml =~ s/\n\s*//g; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 282 | < |  | 
 
 
 
 
 
 
 
 
 | 280 | > | # sort the data | 
 
 
 
 
 | 281 | > | @data = sort(@data); | 
 
 
 
 
 | 282 | > |  | 
 
 
 
 
 | 283 | > | # turn the array into some nice XML | 
 
 
 
 
 | 284 | > | my($xml) = &make_xml("", ""); | 
 
 
 
 
 | 285 | > |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 286 |  | my($sock) = new IO::Socket::INET ( | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 287 |  | PeerPort => $udp_port, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 288 |  | PeerAddr => $filter_addr, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 289 |  | Proto => 'udp' | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 290 |  | ) or die "Could not send UDP: $!\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 291 | < |  | 
 
 
 
 
 
 
 
 
 | 291 | > |  | 
 
 
 
 
 
 
 
 
 
 
 | 292 |  | print $sock $xml or die "Could not send UDP packet: $!\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 293 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 294 |  | $seq_no++; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 298 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 299 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 300 |  |  | 
 
 
 
 
 
 
 
 
 | 298 | – |  | 
 
 
 
 
 
 
 
 
 | 299 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 301 |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 302 |  | # send_tcp_heartbeat | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 303 |  | # Establishes a TCP connection to an i-scream filter. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 304 |  | # The heartbeat is used as a guaranteed "I'm alive" delivery mechanism. | 
 
 
 
 
 
 
 
 | 305 | + | # If we need to reconfigure, then we complete the heartbeat before | 
 
 
 
 
 
 
 
 | 306 | + | # doing so. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 307 |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 308 |  | sub send_tcp_heartbeat() { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 309 |  |  | 
 
 
 
 
 
 
 
 | 310 | + | my ($doReconfigure) = 0; | 
 
 
 
 
 
 
 
 | 311 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 312 |  | my($sock) = new IO::Socket::INET( | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 313 |  | PeerAddr => $filter_addr, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 314 |  | PeerPort => $tcp_port, | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 316 |  | ) or return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 317 |  | if (!defined $sock) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 318 |  | print "IHOST WARNING: Failed to deliver a heartbeat to the i-scream filter.\n"; | 
 
 
 
 
 
 
 
 | 319 | + | &tcp_configure(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 320 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 321 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 322 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 325 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 326 |  | print $sock "HEARTBEAT\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 327 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 | 328 | < | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 323 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 324 | < | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 | 328 | > | if (!$response eq "OK\n") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 329 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 330 |  | print "Server gave wrong response to HEARTBEAT: $response\n"; | 
 
 
 
 
 
 
 
 | 331 | + | &tcp_configure(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 332 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 333 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 334 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 335 |  | print $sock "CONFIG\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 336 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 | 337 | < | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 333 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 334 | < | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 | 337 | > | if (!$response eq "OK\n") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 338 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 339 |  | print "Server gave wrong response to CONFIG: $response\n"; | 
 
 
 
 
 
 
 
 | 340 | + | &tcp_configure(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 341 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 342 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 343 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 344 |  | print $sock "$file_list\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 345 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 | 346 | < | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 343 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 344 | < | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 | 346 | > | if (!$response eq "OK\n") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 347 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 348 |  | print "Server gave wrong response to file list: $response\n"; | 
 
 
 
 
 
 
 
 | 349 | + | &tcp_configure(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 350 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 351 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 352 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 353 |  | print $sock "$last_modified\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 354 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 | 355 | < | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 353 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 354 | < | if ($response eq "ERROR") { | 
 
 
 
 
 
 
 
 
 | 355 | > | if ($response eq "ERROR\n") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 356 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 | 357 | < | &tcp_configure(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 358 | < | return; | 
 
 
 
 
 
 
 
 
 | 357 | > | print "Server configuration changed.  Reconfiguring with filter manager.\n"; | 
 
 
 
 
 | 358 | > | $doReconfigure = 1; | 
 
 
 
 
 
 
 
 
 
 
 | 359 |  | } | 
 
 
 
 
 
 
 
 
 
 
 | 360 | < | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 | 360 | > | if (!$response eq "OK\n") { | 
 
 
 
 
 
 
 
 
 
 
 | 361 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 362 |  | print "Server gave wrong response to HEARTBEAT: $response\n"; | 
 
 
 
 
 
 
 
 | 363 | + | &tcp_configure(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 364 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 365 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 366 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 367 |  | print $sock "ENDHEARTBEAT\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 368 |  | $response = <$sock>; | 
 
 
 
 
 
 
 
 
 
 
 | 369 | < | return if (!defined $response); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 368 | < | chop $response; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 369 | < | if (!$response eq "OK") { | 
 
 
 
 
 
 
 
 
 | 369 | > | if (!$response eq "OK\n") { | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 370 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 371 |  | print "Server gave wrong response to ENDHEARTBEAT: $response\n"; | 
 
 
 
 
 
 
 
 | 372 | + | &tcp_configure(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 373 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 374 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 375 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 376 |  | close($sock); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 377 |  | print "^"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 378 |  |  | 
 
 
 
 
 
 
 
 | 379 | + | &tcp_configure() if $doReconfigure; | 
 
 
 
 
 
 
 
 | 380 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 381 |  | return; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 382 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 383 |  |  | 
 
 
 
 
 
 
 
 | 384 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 385 |  | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 386 |  | # write_pid | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 387 |  | # Writes the PID (process ID) of this instance to $pidfile. | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 393 |  | close PID; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 394 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 395 |  | return; | 
 
 
 
 
 
 
 
 | 396 | + | } | 
 
 
 
 
 
 
 
 | 397 | + |  | 
 
 
 
 
 
 
 
 | 398 | + | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 399 | + | # make_xml | 
 
 
 
 
 
 
 
 | 400 | + | # Turns an array of plugins data into an XML string. | 
 
 
 
 
 
 
 
 | 401 | + | #----------------------------------------------------------------------- | 
 
 
 
 
 
 
 
 | 402 | + | sub make_xml() { | 
 
 
 
 
 
 
 
 | 403 | + | my($curlevel, $curline) = @_; | 
 
 
 
 
 
 
 
 | 404 | + | my($xmltemp) = ""; my($curtag) = ""; my($attributes) = ""; | 
 
 
 
 
 
 
 
 | 405 | + | while(1) { | 
 
 
 
 
 
 
 
 | 406 | + | $curline = shift(@data) if $curline eq ""; chomp $curline; | 
 
 
 
 
 
 
 
 | 407 | + | if($curline =~ /^$curlevel([^\.\s]+\.)/) { | 
 
 
 
 
 
 
 
 | 408 | + | $curtag=$1; | 
 
 
 
 
 
 
 
 | 409 | + | } | 
 
 
 
 
 
 
 
 | 410 | + | if($curline =~ /^$curlevel$curtag([^\.\s]+)\s+(.*)$/) { | 
 
 
 
 
 
 
 
 | 411 | + | $xmltemp .= "<$1$attributes>$2</$1>"; | 
 
 
 
 
 
 
 
 | 412 | + | } | 
 
 
 
 
 
 
 
 | 413 | + | elsif($curline =~ /^$curlevel$curtag(attributes)\.([^\.=]+)=(.*)$/) { | 
 
 
 
 
 
 
 
 | 414 | + | $attributes .= " $2=\"$3\""; | 
 
 
 
 
 
 
 
 | 415 | + | } | 
 
 
 
 
 
 
 
 | 416 | + | else { | 
 
 
 
 
 
 
 
 | 417 | + | $xmltemp .= &make_xml("$curlevel$curtag", $curline); | 
 
 
 
 
 
 
 
 | 418 | + | } | 
 
 
 
 
 
 
 
 | 419 | + | my($nextline) = $data[0]; chomp $nextline if defined $nextline; | 
 
 
 
 
 
 
 
 | 420 | + | $curtag =~ s/(.*)\./$1/; | 
 
 
 
 
 
 
 
 | 421 | + | if((defined $nextline) && ($nextline =~ /^$curlevel$curtag\./)) { | 
 
 
 
 
 
 
 
 | 422 | + | $curline = ""; | 
 
 
 
 
 
 
 
 | 423 | + | } | 
 
 
 
 
 
 
 
 | 424 | + | else { | 
 
 
 
 
 
 
 
 | 425 | + | $xmltemp = "<$curtag$attributes>$xmltemp</$curtag>" unless $curtag eq ""; | 
 
 
 
 
 
 
 
 | 426 | + | return $xmltemp; | 
 
 
 
 
 
 
 
 | 427 | + | } | 
 
 
 
 
 
 
 
 | 428 | + | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 429 |  | } |