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