File: 0.04.01a/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: ?>