File: 0.04.16a/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: require($BaseDir."tests/dns.inc.php"); 30: 31: function ip_lookup($hostname) // "safe" DNS lookup function to call with a hostname, URL or IP - returns 0 if unsuccessful 32: { 33: // Is it already an IP adress? 34: $out=str_replace(".","",$hostname); 35: if (is_numeric($out)) return $hostname; // yes it is 36: 37: // No it is not 38: $ip=@gethostbyname($hostname); 39: if ($ip==$hostname) return 0; // unmodified host - lookup failed 40: 41: return $ip; 42: } 43: 44: 45: 46: 47: function url_lookup($url) 48: { 49: // Sod regular expressions here as we'd have to do it twice or with cleverness I lack 50: // Is it a URL? 51: $colon=strpos($url,":"); 52: if ($colon != 0) // exists so it a URL 53: { 54: $out=preg_match("@^(?:http[s]*://)?([^/|\?|:]+)@i",$url,$matches); 55: $hostname=$matches[1]; 56: } 57: else $hostname=$url; // try direct 58: 59: return ip_lookup($hostname); 60: } 61: 62: 63: 64: 65: 66: 67: 68: function icmpChecksum($data) 69: { 70: if (strlen($data)%2) 71: $data .= "\x00"; 72: 73: $bit = unpack('n*', $data); 74: $sum = array_sum($bit); 75: 76: while ($sum >> 16) 77: $sum = ($sum >> 16) + ($sum & 0xffff); 78: 79: return pack('n*', ~$sum); 80: } 81: 82: function PingTest($host,$ctimeout=-1) 83: { 84: global $NATS; 85: $FreeNATS_Timer=new TFNTimer(); 86: // Make Package 87: $type= "\x08"; 88: $code= "\x00"; 89: $checksum= "\x00\x00"; 90: $identifier = "\x00\x00"; 91: $seqNumber = "\x00\x00"; 92: $data= "FreeNATS"; 93: $package = $type.$code.$checksum.$identifier.$seqNumber.$data; 94: $checksum = icmpChecksum($package); // Calculate the checksum 95: $package = $type.$code.$checksum.$identifier.$seqNumber.$data; 96: 97: // Return s or ms(s*1000) 98: $returnsecs=true; 99: if (isset($NATS)) 100: { 101: if ($NATS->Cfg->Get("test.icmp.returnms",0)==1) $returnsecs=false; 102: } 103: 104: // Timeout Values 105: if (isset($NATS)) $timeout=$NATS->Cfg->Get("test.icmp.timeout",10); 106: else $timeout=10; 107: if ($ctimeout>0) $timeout=$ctimeout; // use custom timeout if passed 108: if ($timeout<=0) $timeout=10; // catch-all for defaults bug 109: 110: // Create Socket 111: $socket = @socket_create(AF_INET, SOCK_RAW, 1); 112: //or die(socket_strerror(socket_last_error())); 113: if (!$socket) return 0; 114: 115: // Set Non-Blocking 116: @socket_set_nonblock($socket); 117: 118: // Connect Socket 119: $sconn=@socket_connect($socket, $host, null); 120: if (!$sconn) return 0; 121: 122: // Send Data 123: @socket_send($socket, $package, strLen($package), 0); 124: 125: // Start Timer 126: $FreeNATS_Timer->Start(); 127: $startTime = microtime(true); // need this for the looping section 128: 129: 130: // Read Data 131: $keepon=true; 132: 133: while( (!(@socket_read($socket, 255))) && $keepon) 134: { // basically just kill time 135: // consider putting some sort of sleepy thing here to lower load but would f* with figures! 136: 137: if ( (microtime(true) - $startTime) > $timeout ) 138: $keepon=false; 139: } 140: 141: if ($keepon) // didn't time out - read data 142: { 143: $elapsed=$FreeNATS_Timer->Stop(); 144: if ($returnsecs) $elapsed=round($elapsed,4); 145: else $elapsed=round( ($elapsed*1000),4 ); 146: @socket_close($socket); 147: // $ret=round(microtime(true) - $startTime, 4); -- old method 148: if ($elapsed<=0) $elapsed="0.0001"; // safety catch-all 149: return $elapsed; 150: /* 151: if ($ret==0) return "0.0001"; 152: else 153: { 154: if ($ret<=0) return "0.0001"; 155: else return $ret; 156: } 157: */ 158: } 159: 160: // Socket timed out 161: @socket_close($socket); 162: return 0; 163: } 164: 165: function WebTest($url,$timeout=-1) 166: { 167: global $NATS; 168: if ($timeout<=0) // use NATS or env 169: { 170: if (isset($NATS)) 171: { 172: $nto=$NATS->Cfg->Get("test.http.timeout",-1); 173: if ($nto>0) $timeout=$nto; // use NATS timeout 174: } 175: } 176: if ($timeout>0) // use the set timeout 177: $oldtimeout=ini_set("default_socket_timeout",$timeout); 178: 179: if (function_exists("curl_getinfo")) // use CURL if present 180: { 181: $ch=curl_init(); 182: curl_setopt($ch,CURLOPT_URL,$url); 183: curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 184: curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0); 185: curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); 186: curl_setopt($ch,CURLOPT_HEADER,1); 187: if ($timeout>0) curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); 188: if ($timeout>0) curl_setopt($ch,CURLOPT_TIMEOUT,$timeout); 189: if (!$output=curl_exec($ch)) 190: { 191: $ctr=-1; // failed 192: } 193: else $ctr=round(curl_getinfo($ch,CURLINFO_SIZE_DOWNLOAD)/1024,2); 194: curl_close($ch); 195: 196: if ($ctr==0) $ctr="0.0001"; 197: 198: } 199: else 200: { // no CURL - use fopen() 201: $fp=@fopen($url,"r"); 202: if ($fp<=0) 203: { 204: if ($timeout>0) ini_set("default_socket_timeout",$oldtimeout); 205: return -1; 206: } 207: $ctr=0; 208: while ($body=@fgets($fp,1024)) $ctr+=sizeof($body); 209: @fclose($fp); 210: } 211: 212: 213: 214: if ($timeout>0) ini_set("default_socket_timeout",$oldtimeout); 215: return $ctr; 216: } 217: 218: function DoTest($test,$param,$hostname="",$timeout=-1,$params=0) 219: { 220: if (!is_array($params)) 221: { 222: $params=array(); 223: for ($a=0; $a<10; $a++) $params[$a]=""; 224: } 225: 226: switch ($test) 227: { 228: case "web": case "wsize": 229: // Don't bother with pre-resolution as size only 230: return WebTest($param,$timeout); 231: break; 232: case "tcp": // nb TCP does not support timeouts currently 233: $ip=ip_lookup($hostname); 234: if ($ip=="0") return 0; 235: $fp=@fsockopen($ip,$param); 236: if ($fp<=0) return 0; 237: @fclose($fp); 238: return 1; 239: break; 240: case "wtime": 241: $timer=new TFNTimer(); 242: // Do a pre-lookup 243: $ip=url_lookup($param); 244: if ($ip=="0") return -1; // dns lookup failed 245: $timer->Start(); 246: $r=WebTest($param,$timeout); 247: $elapsedTime=$timer->Stop(); 248: $elapsedTime=round($elapsedTime,4); 249: if ($r<0) return -1; // open failed 250: if ($r==0) return -2; // no chars shown as returned 251: if ($elapsedTime<=0) return 0.0001; 252: return $elapsedTime; 253: break; 254: 255: case "host": 256: $timer=new TFNTimer(); 257: if (preg_match("/[a-zA-Z]/",$param)>0) $is_ip=false; 258: else $is_ip=true; 259: 260: $timer->Start(); 261: if ($is_ip) $result=gethostbyaddr($param); 262: else $result=gethostbyname($param); 263: $elapsedTime=$timer->Stop(); 264: 265: if ($result==$param) // lookup failed 266: return -1; 267: 268: if ($result=="") // lookup failed 269: return -1; 270: 271: $elapsedTime=round($elapsedTime,4); 272: if ($elapsedTime<=0) return 0.0001; 273: return $elapsedTime; 274: break; 275: 276: case "dns": 277: $timer=new TFNTimer(); 278: if ($param=="") $dnsserver=$hostname; 279: else $dnsserver=$param; 280: if ($dnsserver=="") return -3; 281: if ($timeout<=0) $timeout=60; 282: if ($params[4]==1) $udp=false; // use TCP 283: else $udp=true; 284: if (($params[3]=="")||($params[3]==0)) $port=53; 285: else $port=$params[3]; 286: 287: $dns_query=new DNSQuery($dnsserver,$port,$timeout,$udp,true); 288: $type=$params[2]; 289: $query=$params[1]; 290: 291: $timer->Start(); 292: $answer=$dns_query->Query($query,$type); 293: $elapsedTime=$timer->Stop(); 294: 295: if ( ($answer===false) || ($dns_query->error) ) return -2; // query error 296: if ($answer->count<=0) return -1; // no records returned 297: 298: // otherwise we've got some results ok 299: $elapsedTime=round($elapsedTime,4); 300: if ($elapsedTime<=0) return 0.0001; 301: return $elapsedTime; 302: break; 303: 304: case "testloop": 305: return $param; 306: break; 307: 308: case "testrand": 309: mt_srand(microtime()*1000000); 310: if ( ($param=="") || ($param==0) ) $param=100; 311: return mt_rand(0,$param); 312: break; 313: 314: case "ping": 315: return PingTest($param,$timeout); 316: break; 317: 318: case "smtp": 319: $ip=ip_lookup($param); 320: if ($ip=="0") return -1; 321: return smtp_test_time($ip,$params[1],$timeout); 322: break; 323: 324: case "imap": 325: if ($params[5]==1) $ssl=true; 326: else $ssl=false; 327: 328: $ip=ip_lookup($param); 329: if ($ip=="0") return -1; 330: 331: return imap_test_time($ip,$params[1],$params[2],$timeout,$params[3],$params[4],$ssl); 332: break; 333: 334: case "mysql": 335: $ip=ip_lookup($param); 336: if ($ip=="0") return -1; // cache only as 127.0.0.1 is not the same connection as localhost for MySQL auth! 337: 338: return mysql_test_time($param,$params[1],$params[2],$params[3],$timeout,$params[4]); 339: break; 340: 341: case "mysqlrows": 342: $ip=ip_lookup($param); 343: if ($ip=="0") return -1; // cache only - see above 344: return mysql_test_rows($param,$params[1],$params[2],$params[3],$timeout,$params[4]); 345: break; 346: 347: 348: } 349: return -1; 350: } 351: 352: function SimpleEval($test,$result) 353: { 354: switch($test) 355: { 356: case "ping": // handles both types of simple evaluation (inbuilt ICMP and remote ping) 357: if ($result<=0) return 2; 358: return 0; 359: case "web": case "wsize": 360: if ($result<=0) return 2; 361: return 0; 362: case "tcp": 363: if ($result==1) return 0; 364: return 2; 365: case "wtime": 366: if ($result<0) return 2; 367: return 0; 368: 369: case "imap": 370: if ($result<=0) return 2; 371: return 0; 372: 373: case "smtp": 374: if ($result<=0) return 2; 375: return 0; 376: 377: case "mysql": 378: if ($result<=0) return 2; 379: return 0; 380: 381: case "mysqlrows": 382: if ($result<=0) return 2; // no rows returned or error 383: return 0; 384: 385: case "host": case "dns": 386: if ($result<=0) return 2; // no records returned or error 387: 388: case "testloop": 389: return 0; 390: case "testrand": 391: return 0; 392: } 393: return -1; // untested if we don't know WTF the result was 394: } 395: 396: function aText($al) 397: { 398: return oText($al); // uses function in tests.inc.php with site config support 399: /* -- depreciated 400: switch($al) 401: { 402: case -1: return "Untested"; 403: case 0: return "Passed"; 404: case 1: return "Warning"; 405: case 2: return "Failed"; 406: default: return "Unknown"; 407: } 408: */ 409: } 410: ?>