File:
0.04.15b/server/base/tests.inc.php (
View as Code)
1: 2: /* -------------------------------------------------------------
3: This file is part of FreeNATS
4:
5: FreeNATS is (C) Copyright 2008 PurplePixie Systems
6:
7: FreeNATS is free software: you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation, either version 3 of the License, or
10: (at your option) any later version.
11:
12: FreeNATS is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with FreeNATS. If not, see www.gnu.org/licenses
19:
20: For more information see www.purplepixie.org/freenats
21: -------------------------------------------------------------- */
22:
23: if (!isset($BaseDir)) $BaseDir="../base/"; //
24: require_once($BaseDir."timer.inc.php"); // just in case standalone
25:
26: require($BaseDir."tests/mysql.inc.php");
27: require($BaseDir."tests/imap.inc.php");
28: require($BaseDir."tests/smtp.inc.php");
29:
30: function ip_lookup($hostname) // "safe" DNS lookup function to call with a hostname, URL or IP - returns 0 if unsuccessful
31: {
32: // Is it already an IP adress?
33: $out=str_replace(".","",$hostname);
34: if (is_numeric($out)) return $hostname; // yes it is
35:
36: // No it is not
37: $ip=@gethostbyname($hostname);
38: if ($ip==$hostname) return 0; // unmodified host - lookup failed
39:
40: return $ip;
41: }
42:
43:
44:
45: function url_lookup($url)
46: {
47: // Sod regular expressions here as we'd have to do it twice or with cleverness I lack
48: // Is it a URL?
49: $colon=strpos($url,":");
50: if ($colon != 0) // exists so it a URL
51: {
52: $out=preg_match("@^(?:http[s]*://)?([^/|\?|:]+)@i",$url,$matches);
53: $hostname=$matches[1];
54: }
55: else $hostname=$url; // try direct
56:
57: return ip_lookup($hostname);
58: }
59:
60:
61:
62:
63:
64:
65:
66: function icmpChecksum($data)
67: {
68: if (strlen($data)%2)
69: $data .= "\x00";
70:
71: $bit = unpack('n*', $data);
72: $sum = array_sum($bit);
73:
74: while ($sum >> 16)
75: $sum = ($sum >> 16) + ($sum & 0xffff);
76:
77: return pack('n*', ~$sum);
78: }
79:
80: function PingTest($host,$ctimeout=-1)
81: {
82: global $NATS;
83: $FreeNATS_Timer=new TFNTimer();
84: // Make Package
85: $type= "\x08";
86: $code= "\x00";
87: $checksum= "\x00\x00";
88: $identifier = "\x00\x00";
89: $seqNumber = "\x00\x00";
90: $data= "FreeNATS";
91: $package = $type.$code.$checksum.$identifier.$seqNumber.$data;
92: $checksum = icmpChecksum($package); // Calculate the checksum
93: $package = $type.$code.$checksum.$identifier.$seqNumber.$data;
94:
95: // Return s or ms(s*1000)
96: $returnsecs=true;
97: if (isset($NATS))
98: {
99: if ($NATS->Cfg->Get("test.icmp.returnms",0)==1) $returnsecs=false;
100: }
101:
102: // Timeout Values
103: if (isset($NATS)) $timeout=$NATS->Cfg->Get("test.icmp.timeout",10);
104: else $timeout=10;
105: if ($ctimeout>0) $timeout=$ctimeout; // use custom timeout if passed
106: if ($timeout<=0) $timeout=10; // catch-all for defaults bug
107:
108: // Create Socket
109: $socket = @socket_create(AF_INET, SOCK_RAW, 1);
110: //or die(socket_strerror(socket_last_error()));
111: if (!$socket) return 0;
112:
113: // Set Non-Blocking
114: @socket_set_nonblock($socket);
115:
116: // Connect Socket
117: $sconn=@socket_connect($socket, $host, null);
118: if (!$sconn) return 0;
119:
120: // Send Data
121: @socket_send($socket, $package, strLen($package), 0);
122:
123: // Start Timer
124: $FreeNATS_Timer->Start();
125: $startTime = microtime(true); // need this for the looping section
126:
127:
128: // Read Data
129: $keepon=true;
130:
131: while( (!(@socket_read($socket, 255))) && $keepon)
132: { // basically just kill time
133: // consider putting some sort of sleepy thing here to lower load but would f* with figures!
134:
135: if ( (microtime(true) - $startTime) > $timeout )
136: $keepon=false;
137: }
138:
139: if ($keepon) // didn't time out - read data
140: {
141: $elapsed=$FreeNATS_Timer->Stop();
142: if ($returnsecs) $elapsed=round($elapsed,4);
143: else $elapsed=round( ($elapsed*1000),4 );
144: @socket_close($socket);
145: // $ret=round(microtime(true) - $startTime, 4); -- old method
146: if ($elapsed<=0) $elapsed="0.0001"; // safety catch-all
147: return $elapsed;
148: /*
149: if ($ret==0) return "0.0001";
150: else
151: {
152: if ($ret<=0) return "0.0001";
153: else return $ret;
154: }
155: */
156: }
157:
158: // Socket timed out
159: @socket_close($socket);
160: return 0;
161: }
162:
163: function WebTest($url,$timeout=-1)
164: {
165: global $NATS;
166: if ($timeout<=0) // use NATS or env
167: {
168: if (isset($NATS))
169: {
170: $nto=$NATS->Cfg->Get("test.http.timeout",-1);
171: if ($nto>0) $timeout=$nto; // use NATS timeout
172: }
173: }
174: if ($timeout>0) // use the set timeout
175: $oldtimeout=ini_set("default_socket_timeout",$timeout);
176:
177: if (function_exists("curl_getinfo")) // use CURL if present
178: {
179: $ch=curl_init();
180: curl_setopt($ch,CURLOPT_URL,$url);
181: curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
182: curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
183: curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
184: curl_setopt($ch,CURLOPT_HEADER,1);
185: if ($timeout>0) curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
186: if ($timeout>0) curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
187: if (!$output=curl_exec($ch))
188: {
189: $ctr=-1; // failed
190: }
191: else $ctr=round(curl_getinfo($ch,CURLINFO_SIZE_DOWNLOAD)/1024,2);
192: curl_close($ch);
193:
194: if ($ctr==0) $ctr="0.0001";
195:
196: }
197: else
198: { // no CURL - use fopen()
199: $fp=@fopen($url,"r");
200: if ($fp<=0)
201: {
202: if ($timeout>0) ini_set("default_socket_timeout",$oldtimeout);
203: return -1;
204: }
205: $ctr=0;
206: while ($body=@fgets($fp,1024)) $ctr+=sizeof($body);
207: @fclose($fp);
208: }
209:
210:
211:
212: if ($timeout>0) ini_set("default_socket_timeout",$oldtimeout);
213: return $ctr;
214: }
215:
216: function DoTest($test,$param,$hostname="",$timeout=-1,$params=0)
217: {
218: if (!is_array($params))
219: {
220: $params=array();
221: for ($a=0; $a<10; $a++) $params[$a]="";
222: }
223:
224: switch ($test)
225: {
226: case "web": case "wsize":
227: // Don't bother with pre-resolution as size only
228: return WebTest($param,$timeout);
229: break;
230: case "tcp": // nb TCP does not support timeouts currently
231: $ip=ip_lookup($hostname);
232: if ($ip=="0") return 0;
233: $fp=@fsockopen($ip,$param);
234: if ($fp<=0) return 0;
235: @fclose($fp);
236: return 1;
237: break;
238: case "wtime":
239: $timer=new TFNTimer();
240: // Do a pre-lookup
241: $ip=url_lookup($param);
242: if ($ip=="0") return -1; // dns lookup failed
243: $timer->Start();
244: $r=WebTest($param,$timeout);
245: $elapsedTime=$timer->Stop();
246: $elapsedTime=round($elapsedTime,4);
247: if ($r<0) return -1; // open failed
248: if ($r==0) return -2; // no chars shown as returned
249: if ($elapsedTime<=0) return 0.0001;
250: return $elapsedTime;
251: break;
252: case "testloop":
253: return $param;
254: break;
255:
256: case "testrand":
257: mt_srand(microtime()*1000000);
258: if ( ($param=="") || ($param==0) ) $param=100;
259: return mt_rand(0,$param);
260: break;
261:
262: case "ping":
263: return PingTest($param,$timeout);
264: break;
265:
266: case "smtp":
267: $ip=ip_lookup($param);
268: if ($ip=="0") return -1;
269: return smtp_test_time($ip,$params[1],$timeout);
270: break;
271:
272: case "imap":
273: if ($params[5]==1) $ssl=true;
274: else $ssl=false;
275:
276: $ip=ip_lookup($param);
277: if ($ip=="0") return -1;
278:
279: return imap_test_time($ip,$params[1],$params[2],$timeout,$params[3],$params[4],$ssl);
280: break;
281:
282: case "mysql":
283: $ip=ip_lookup($param);
284: if ($ip=="0") return -1; // cache only as 127.0.0.1 is not the same connection as localhost for MySQL auth!
285:
286: return mysql_test_time($param,$params[1],$params[2],$params[3],$timeout,$params[4]);
287: break;
288:
289: case "mysqlrows":
290: $ip=ip_lookup($param);
291: if ($ip=="0") return -1; // cache only - see above
292: return mysql_test_rows($param,$params[1],$params[2],$params[3],$timeout,$params[4]);
293: break;
294:
295:
296: }
297: return -1;
298: }
299:
300: function SimpleEval($test,$result)
301: {
302: switch($test)
303: {
304: case "ping": // handles both types of simple evaluation (inbuilt ICMP and remote ping)
305: if ($result<=0) return 2;
306: return 0;
307: case "web": case "wsize":
308: if ($result<=0) return 2;
309: return 0;
310: case "tcp":
311: if ($result==1) return 0;
312: return 2;
313: case "wtime":
314: if ($result<0) return 2;
315: return 0;
316:
317: case "imap":
318: if ($result<=0) return 2;
319: return 0;
320:
321: case "smtp":
322: if ($result<=0) return 2;
323: return 0;
324:
325: case "mysql":
326: if ($result<=0) return 2;
327: return 0;
328:
329: case "mysqlrows":
330: if ($result<=0) return 2; // no rows returned or error
331: return 0;
332:
333: case "testloop":
334: return 0;
335: case "testrand":
336: return 0;
337: }
338: return -1;
339: }
340:
341: function aText($al)
342: {
343: switch($al)
344: {
345: case -1: return "Untested";
346: case 0: return "Passed";
347: case 1: return "Warning";
348: case 2: return "Failed";
349: default: return "Unknown";
350: }
351: }
352: ?>