File:
0.04.02a/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 icmpChecksum($data)
31: {
32: if (strlen($data)%2)
33: $data .= "\x00";
34:
35: $bit = unpack('n*', $data);
36: $sum = array_sum($bit);
37:
38: while ($sum >> 16)
39: $sum = ($sum >> 16) + ($sum & 0xffff);
40:
41: return pack('n*', ~$sum);
42: }
43:
44: function PingTest($host,$ctimeout=-1)
45: {
46: global $NATS;
47: $FreeNATS_Timer=new TFNTimer();
48: // Make Package
49: $type= "\x08";
50: $code= "\x00";
51: $checksum= "\x00\x00";
52: $identifier = "\x00\x00";
53: $seqNumber = "\x00\x00";
54: $data= "FreeNATS";
55: $package = $type.$code.$checksum.$identifier.$seqNumber.$data;
56: $checksum = icmpChecksum($package); // Calculate the checksum
57: $package = $type.$code.$checksum.$identifier.$seqNumber.$data;
58:
59: // Return s or ms(s*1000)
60: $returnsecs=true;
61: if (isset($NATS))
62: {
63: if ($NATS->Cfg->Get("test.icmp.returnms",0)==1) $returnsecs=false;
64: }
65:
66: // Timeout Values
67: if (isset($NATS)) $timeout=$NATS->Cfg->Get("test.icmp.timeout",10);
68: else $timeout=10;
69: if ($ctimeout>0) $timeout=$ctimeout; // use custom timeout if passed
70: if ($timeout<=0) $timeout=10; // catch-all for defaults bug
71:
72: // Create Socket
73: $socket = @socket_create(AF_INET, SOCK_RAW, 1);
74: //or die(socket_strerror(socket_last_error()));
75: if (!$socket) return 0;
76:
77: // Set Non-Blocking
78: @socket_set_nonblock($socket);
79:
80: // Connect Socket
81: $sconn=@socket_connect($socket, $host, null);
82: if (!$sconn) return 0;
83:
84: // Send Data
85: @socket_send($socket, $package, strLen($package), 0);
86:
87: // Start Timer
88: $FreeNATS_Timer->Start();
89: $startTime = microtime(true); // need this for the looping section
90:
91:
92: // Read Data
93: $keepon=true;
94:
95: while( (!(@socket_read($socket, 255))) && $keepon)
96: { // basically just kill time
97: // consider putting some sort of sleepy thing here to lower load but would f* with figures!
98:
99: if ( (microtime(true) - $startTime) > $timeout )
100: $keepon=false;
101: }
102:
103: if ($keepon) // didn't time out - read data
104: {
105: $elapsed=$FreeNATS_Timer->Stop();
106: if ($returnsecs) $elapsed=round($elapsed,4);
107: else $elapsed=round( ($elapsed*1000),4 );
108: @socket_close($socket);
109: // $ret=round(microtime(true) - $startTime, 4); -- old method
110: if ($elapsed<=0) $elapsed="0.0001"; // safety catch-all
111: return $elapsed;
112: /*
113: if ($ret==0) return "0.0001";
114: else
115: {
116: if ($ret<=0) return "0.0001";
117: else return $ret;
118: }
119: */
120: }
121:
122: // Socket timed out
123: @socket_close($socket);
124: return 0;
125: }
126:
127: function WebTest($url,$timeout=-1)
128: {
129: global $NATS;
130: if ($timeout<=0) // use NATS or env
131: {
132: if (isset($NATS))
133: {
134: $nto=$NATS->Cfg->Get("test.http.timeout",-1);
135: if ($nto>0) $timeout=$nto; // use NATS timeout
136: }
137: }
138: if ($timeout>0) // use the set timeout
139: $oldtimeout=ini_set("default_socket_timeout",$timeout);
140:
141: if (function_exists("curl_getinfo")) // use CURL if present
142: {
143: $ch=curl_init();
144: curl_setopt($ch,CURLOPT_URL,$url);
145: curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
146: curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
147: curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
148: curl_setopt($ch,CURLOPT_HEADER,1);
149: if ($timeout>0) curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
150: if (!$output=curl_exec($ch))
151: {
152: $ctr=-1; // failed
153: }
154: else $ctr=round(curl_getinfo($ch,CURLINFO_SIZE_DOWNLOAD)/1024,2);
155: curl_close($ch);
156:
157: if ($ctr==0) $ctr="0.0001";
158:
159: }
160: else
161: { // no CURL - use fopen()
162: $fp=@fopen($url,"r");
163: if ($fp<=0)
164: {
165: if ($timeout>0) ini_set("default_socket_timeout",$oldtimeout);
166: return -1;
167: }
168: $ctr=0;
169: while ($body=@fgets($fp,1024)) $ctr+=sizeof($body);
170: @fclose($fp);
171: }
172:
173:
174:
175: if ($timeout>0) ini_set("default_socket_timeout",$oldtimeout);
176: return $ctr;
177: }
178:
179: function DoTest($test,$param,$hostname="",$timeout=-1,$params=0)
180: {
181: if (!is_array($params))
182: {
183: $params=array();
184: for ($a=0; $a<10; $a++) $params[$a]="";
185: }
186:
187: switch ($test)
188: {
189: case "web": case "wsize":
190: return WebTest($param,$timeout);
191: break;
192: case "tcp": // nb TCP does not support timeouts currently
193: $fp=@fsockopen($hostname,$param);
194: if ($fp<=0) return 0;
195: @fclose($fp);
196: return 1;
197: break;
198: case "wtime":
199: $timer=new TFNTimer();
200: $timer->Start();
201: $r=WebTest($param,$timeout);
202: $elapsedTime=$timer->Stop();
203: $elapsedTime=round($elapsedTime,4);
204: if ($r<0) return -1; // open failed
205: if ($r==0) return -2; // no chars shown as returned
206: if ($elapsedTime<=0) return 0.0001;
207: return $elapsedTime;
208: break;
209: case "testloop":
210: return $param;
211: break;
212:
213: case "testrand":
214: mt_srand(microtime()*1000000);
215: if ( ($param=="") || ($param==0) ) $param=100;
216: return mt_rand(0,$param);
217: break;
218:
219: case "ping":
220: return PingTest($param,$timeout);
221: break;
222:
223: case "smtp":
224: return smtp_test_time($param,$params[1],$timeout);
225: break;
226:
227: case "imap":
228: if ($params[5]==1) $ssl=true;
229: else $ssl=false;
230:
231: return imap_test_time($param,$params[1],$params[2],$timeout,$params[3],$params[4],$ssl);
232: break;
233:
234: case "mysql":
235: return mysql_test_time($param,$params[1],$params[2],$params[3],$timeout,$params[4]);
236: break;
237:
238: case "mysqlrows":
239: return mysql_test_rows($param,$params[1],$params[2],$params[3],$timeout,$params[4]);
240: break;
241:
242:
243: }
244: return -1;
245: }
246:
247: function SimpleEval($test,$result)
248: {
249: switch($test)
250: {
251: case "ping": // handles both types of simple evaluation (inbuilt ICMP and remote ping)
252: if ($result<=0) return 2;
253: return 0;
254: case "web": case "wsize":
255: if ($result<=0) return 2;
256: return 0;
257: case "tcp":
258: if ($result==1) return 0;
259: return 2;
260: case "wtime":
261: if ($result<0) return 2;
262: return 0;
263:
264: case "imap":
265: if ($result<=0) return 2;
266: return 0;
267:
268: case "smtp":
269: if ($result<=0) return 2;
270: return 0;
271:
272: case "mysql":
273: if ($result<=0) return 2;
274: return 0;
275:
276: case "mysqlrows":
277: if ($result<=0) return 2; // no rows returned or error
278: return 0;
279:
280: case "testloop":
281: return 0;
282: case "testrand":
283: return 0;
284: }
285: return -1;
286: }
287:
288: function aText($al)
289: {
290: switch($al)
291: {
292: case -1: return "Untested";
293: case 0: return "Passed";
294: case 1: return "Warning";
295: case 2: return "Failed";
296: default: return "Unknown";
297: }
298: }
299: ?>