File: 0.04.01a/server/base/tests.inc.php (View as HTML)

  1: <?php // tests.inc.php
  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: ?>