File: 0.02.58a/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:  function icmpChecksum($data)
 24:     {
 25:     if (strlen($data)%2)
 26:     $data .= "\x00";
 27:     
 28:     $bit = unpack('n*', $data);
 29:     $sum = array_sum($bit);
 30:     
 31:     while ($sum >> 16)
 32:     $sum = ($sum >> 16) + ($sum & 0xffff);
 33:     
 34:     return pack('n*', ~$sum);
 35:     }
 36:    
 37: function PingTest($host,$ctimeout=-1)
 38: 	{
 39: 	global $NATS;
 40:     // Make Package
 41:     $type= "\x08";
 42:     $code= "\x00";
 43:     $checksum= "\x00\x00";
 44:     $identifier = "\x00\x00";
 45:     $seqNumber = "\x00\x00";
 46:     $data= "FreeNATS";
 47:     $package = $type.$code.$checksum.$identifier.$seqNumber.$data;
 48:     $checksum = icmpChecksum($package); // Calculate the checksum
 49:     $package = $type.$code.$checksum.$identifier.$seqNumber.$data;
 50:     
 51:     // Create Socket
 52:     $socket = @socket_create(AF_INET, SOCK_RAW, 1);
 53:     	//or die(socket_strerror(socket_last_error()));
 54:     if (!$socket) return 0;
 55:     
 56:     // Set Non-Blocking
 57:     @socket_set_nonblock($socket);
 58:     	
 59:     // Connect Socket
 60:     $sconn=@socket_connect($socket, $host, null);
 61:     if (!$sconn) return 0;
 62:     
 63:     // Start Timer
 64:     $startTime = microtime(true);
 65:     
 66:     // Send Data
 67:     @socket_send($socket, $package, strLen($package), 0);
 68:     
 69:     // Read Data
 70:     $keepon=true;
 71:     if (isset($NATS)) $timeout=$NATS->Cfg->Get("test.icmp.timeout",10);
 72:     else $timeout=10;
 73:     if ($ctimeout>0) $timeout=$ctimeout; // use custom timeout if passed
 74:     if ($timeout<=0) $timeout=10; // catch-all for defaults bug
 75:     while( (!(@socket_read($socket, 255))) && $keepon)
 76:     	{ // basically just kill time
 77:     	// consider putting some sort of sleepy thing here to lower load but would f* with figures!
 78:     	
 79:     	if ( (microtime(true) - $startTime) > $timeout )
 80:     		$keepon=false;
 81: 		}
 82:     	
 83: 	if ($keepon) // didn't time out - read data
 84:     	{
 85: 	    @socket_close($socket);
 86:     	$ret=round(microtime(true) - $startTime, 4);
 87:     	if ($ret==0) return "0.0001";
 88:     	else 
 89:     		{
 90: 	    	if ($ret<=0) return "0.0001";
 91: 	    	else return $ret;
 92:     		}
 93:     	}
 94:     	
 95:     // Socket timed out
 96:     @socket_close($socket);
 97:     return 0;
 98: 	}
 99: 
100: function WebTest($url,$timeout=-1)
101: 	{
102: 	global $NATS;
103: 	if ($timeout<=0) // use NATS or env
104: 		{
105: 		if (isset($NATS))
106: 			{
107: 			$nto=$NATS->Cfg->Get("test.http.timeout",-1);
108: 			if ($nto>0) $timeout=$nto; // use NATS timeout
109: 			}
110: 		}
111: 	if ($timeout>0) // use the set timeout
112: 		$oldtimeout=ini_set("default_socket_timeout",$timeout);
113: 	$fp=@fopen($url,"r");
114: 	if ($fp<=0)
115: 		{
116: 		if ($timeout>0) ini_set("default_socket_timeout",$oldtimeout);
117: 		return -1;
118: 		}
119: 	$ctr=0;
120: 	while ($body=@fgets($fp,1024)) $ctr+=sizeof($body);
121: 	@fclose($fp);
122: 	if ($timeout>0) ini_set("default_socket_timeout",$oldtimeout);
123: 	return $ctr;
124: 	}
125: 	
126: function DoTest($test,$param,$hostname="",$timeout=-1)
127: {
128: switch ($test)
129: 	{
130: 	case "web":
131: 		return WebTest($param,$timeout);
132: 		break;
133: 	case "tcp": // nb TCP does not support timeouts currently
134: 		$fp=@fsockopen($hostname,$param);
135: 		if ($fp<=0) return 0;
136: 		@fclose($fp);
137: 		return 1;
138: 		break;
139: 	case "wtime":
140: 		$startTime=microtime(true);
141: 		$r=WebTest($param,$timeout);
142: 		$elapsedTime=round(microtime(true)-$startTime,4);
143: 		if ($r<0) return -1; // fopen failed
144: 		if ($r==0) return -2; // no chars shown as returned
145: 		if ($elapsedTime<=0) return 0.0001;
146: 		return $elapsedTime;
147: 		break;
148: 	case "testloop":
149: 		return $param;
150: 		break;
151: 		
152: 	case "testrand":
153: 		mt_srand(microtime()*1000000);
154: 		if ( ($param=="") || ($param==0) ) $param=100;
155: 		return mt_rand(0,$param);
156: 		break;
157: 		
158: 	case "ping":
159: 		return PingTest($param,$timeout);
160: 		break;
161: 	}
162: return -1;
163: }
164: 
165: function SimpleEval($test,$result)
166: {
167: switch($test)
168: 	{
169: 	case "ping": // handles both types of simple evaluation (inbuilt ICMP and remote ping)
170: 		if ($result<=0) return 2;
171: 		return 0;
172: 	case "web":
173: 		if ($result<=0) return 2;
174: 		return 0;
175: 	case "tcp":
176: 		if ($result==1) return 0;
177: 		return 2;
178: 	case "wtime":
179: 		if ($result<0) return 2;
180: 		return 0;
181: 	case "testloop":
182: 		return 0;
183: 	case "testrand":
184: 		return 0;
185: 	}
186: return -1;
187: }
188: 
189: function aText($al)
190: {
191: switch($al)
192: 	{
193: 	case -1: return "Untested";
194: 	case 0: return "Passed";
195: 	case 1: return "Warning";
196: 	case 2: return "Failed";
197: 	default: return "Unknown";
198: 	}
199: }
200: ?>