File: 1.19.1b/server/web/test.graph.php (View as Code)

1: 2: ob_start(); 3: /* ------------------------------------------------------------- 4: This file is part of FreeNATS 5: 6: FreeNATS is (C) Copyright 2008 PurplePixie Systems 7: 8: FreeNATS is free software: you can redistribute it and/or modify 9: it under the terms of the GNU General Public License as published by 10: the Free Software Foundation, either version 3 of the License, or 11: (at your option) any later version. 12: 13: FreeNATS is distributed in the hope that it will be useful, 14: but WITHOUT ANY WARRANTY; without even the implied warranty of 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16: GNU General Public License for more details. 17: 18: You should have received a copy of the GNU General Public License 19: along with FreeNATS. If not, see www.gnu.org/licenses 20: 21: For more information see www.purplepixie.org/freenats 22: -------------------------------------------------------------- */ 23: 24: require("include.php"); 25: $NATS->Start(); 26: 27: 28: 29: 30: function ty($y) 31: { 32: global $height; 33: return $height-$y; 34: } 35: 36: //if (!isset($_REQUEST['testid'])) $_REQUEST['testid']="L26"; 37: 38: // width height suid startx finishx 39: 40: if (isset($_REQUEST['width'])) $width=$_REQUEST['width']; 41: else $width=700; 42: if (isset($_REQUEST['height'])) $height=$_REQUEST['height']; 43: else $height=150; 44: 45: // other incoming stuff 46: if (isset($_REQUEST['draw_spike'])) $draw_spike=$_REQUEST['draw_spike']; 47: else $draw_spike=1; 48: if (isset($_REQUEST['draw_track'])) $draw_track=$_REQUEST['draw_track']; 49: else $draw_track=1; 50: if (isset($_REQUEST['draw_under'])) $draw_under=$_REQUEST['draw_under']; 51: else $draw_under=1; 52: if (isset($_REQUEST['draw_under_pass'])) $draw_under=$_REQUEST['draw_under_pass']; 53: else $draw_under_pass=0; 54: 55: // Transparent logic (1.14.1/2) 56: // options in order of presidence (URI, Config, Default): 57: // transparent=1 in URI: transparent, transparent=0 in URI: non-transparent, 58: // site.graph.transparent=1: transparent, default: non-transparent 59: if (isset($_REQUEST['transparent']) && $_REQUEST['transparent']==1) 60: $transparent=1; 61: else if (isset($_REQUEST['transparent']) && $_REQUEST['transparent']==0) 62: $transparent=0; 63: else if ($NATS->Cfg->Get("site.graph.transparent",0)==1) 64: $transparent=1; 65: else 66: $transparent=0; 67: 68: $draw_x_grid=true; 69: $draw_y_grid=true; 70: 71: if (isset($_REQUEST['no_x_grid'])) $draw_x_grid=false; 72: if (isset($_REQUEST['no_y_grid'])) $graw_y_grid=false; 73: if (isset($_REQUEST['no_grid'])) 74: { 75: $draw_x_grid=false; 76: $draw_y_grid=false; 77: } 78: 79: // start image 80: $im=@imagecreate($width,$height) 81: or die("Cannot create image"); 82: 83: // setup colours 84: $col=array(); 85: $col['white']=imagecolorallocate($im,255,255,255); 86: $col['black']=imagecolorallocate($im,0,0,0); 87: $col['red']=imagecolorallocate($im,250,50,50); 88: $col['lightgrey']=imagecolorallocate($im,200,200,200); 89: $col['verylightgrey']=imagecolorallocate($im,240,240,240); 90: $col['blue']=imagecolorallocate($im,150,150,255); 91: $col['green']=imagecolorallocate($im,0,200,0); 92: $col['lightgreen']=imagecolorallocate($im,150,250,150); 93: $col['grey']=imagecolorallocate($im,150,150,150); 94: $col['orange']=imagecolorallocate($im,200,200,0); 95: 96: if (isset($_REQUEST['bgcol'])) $c_bg=$col[$_REQUEST['bgcol']]; 97: else $c_bg=$col['white']; 98: 99: if (isset($_REQUEST['txtcol'])) $c_txt=$col[$_REQUEST['txtcol']]; 100: else $c_txt=$col['black']; 101: 102: if (isset($_REQUEST['axescol'])) $c_axes=$col[$_REQUEST['axescol']]; 103: else $c_axes=$col['lightgrey']; 104: 105: if (isset($_REQUEST['trackcol'])) $c_track=$col[$_REQUEST['trackcol']]; 106: else $c_track=$col['blue']; 107: 108: if (isset($_REQUEST['gridcol'])) $c_grid=$col[$_REQUEST['gridcol']]; 109: else $c_grid=$col['verylightgrey']; 110: 111: // transparent check 1.14.1 112: if ($transparent == 1) 113: imagecolortransparent($im, $c_bg); 114: 115: // fill background 116: imagefill($im,1,1,$c_bg); 117: 118: function ierror($t) 119: { 120: global $im,$width,$height,$col; 121: ob_clean(); 122: header("Content-type: image/png"); 123: imagestring($im,2,($width/2)-20,$height/2,"ERROR: ".$t,$col['red']); 124: imagepng($im); 125: imagedestroy($im); 126: exit(); 127: } 128: 129: //ierror("Test"); 130: 131: $session=$NATS_Session->Check($NATS->DB); 132: 133: if (!$session) 134: { 135: if ($NATS->Cfg->Get("site.graph.public",0)!=1) 136: { 137: ierror("Authorisation Failure"); 138: exit(); 139: } 140: $key=$NATS->Cfg->Get("site.graph.key",""); 141: if (isset($_REQUEST['graphkey'])) $userkey=$_REQUEST['graphkey']; 142: else $userkey=""; 143: 144: if ( ($key!="") && ($key!=$userkey) ) 145: { 146: ierror("Graph Key Failure"); 147: exit(); 148: } 149: } 150: 151: 152: if (!isset($_REQUEST['nodeid'])) $nodeid=""; 153: else $nodeid=$_REQUEST['nodeid']; 154: 155: if (!isset($_REQUEST['testid'])) ierror("No test ID"); 156: 157: $day=date("d"); 158: $month=date("m"); 159: $year=date("Y"); 160: 161: if (isset($_REQUEST['startx'])) $startx=$_REQUEST['startx']; 162: else 163: { // 0:00 today HMS mo da yr 164: $startx=mktime(0,0,0,$month,$day,$year); 165: //$startx=1203451396; 166: } 167: 168: if (isset($_REQUEST['finishx'])) $finishx=$_REQUEST['finishx']; 169: else $finishx=mktime(23,59,59,$month,$day,$year); 170: 171: if ($startx<=0) $startx=time()+$startx; 172: if ($finishx<=0) $finishx=time()+$finishx; 173: 174: //$finishx=1203454996; 175: $periodx=$finishx-$startx; 176: $startt=date("H:i:s d/m/y",$startx); 177: $finisht=date("H:i:s d/m/y",$finishx); 178: 179: 180: // titles and stuff 181: imagestring($im,2,2,2,$startt,$c_txt); 182: // -90 for size 1 183: imagestring($im,2,$width-108,2,$finisht,$c_txt); 184: 185: if (isset($_REQUEST['title'])) $title=$_REQUEST['title']; 186: else $title=$nodeid; 187: $len=strlen($title)*4; 188: imagestring($im,4,($width/2)-$len,2,$title,$c_txt); 189: 190: // offsets and lengths 191: $xoff=50+1; 192: $xlen=$width-$xoff-5; 193: 194: $yoff=1; 195: $ylen=$height-$yoff-20; 196: 197: 198: // v-axes 199: imageline($im,50,ty(1),50,ty($height-20),$c_axes); 200: imageline($im,$width-5,ty(1),$width-5,ty($height-20),$c_axes); 201: // y-axes 202: imageline($im,50,ty(1),$width-5,ty(1),$c_axes); 203: imageline($im,$width-5,ty($height-20),50,ty($height-20),$c_axes); 204: //ierror("hello"); 205: 206: 207: // range data 208: 209: // Lowest 210: 211: if (isset($_REQUEST['rangemin'])) $dlow=$_REQUEST['rangemin']; 212: else 213: { 214: $dlow=0; 215: /* 216: $q="SELECT testvalue FROM fnrecord WHERE testid=\"".ss($_REQUEST['testid'])."\""; 217: $q.=" AND recordx>=".ss($startx)." AND recordx<=".ss($finishx)." "; 218: $q.="ORDER BY testvalue ASC LIMIT 0,1"; // lowest 219: $r=$NATS->DB->Query($q); 220: //ierror($q); 221: if (!$row=$NATS->DB->Fetch_Array($r)) ierror("No data for test"); 222: $lowest=$row['testvalue']; 223: $dlow=$lowest; 224: if ($dlow>0) $dlow=0; 225: $NATS->DB->Free($r); 226: */ 227: } 228: 229: 230: // Highest 231: 232: if (isset($_REQUEST['rangemax'])) $dhigh=$_REQUEST['rangemax']; 233: else 234: { 235: $q="SELECT testvalue FROM fnrecord WHERE testid=\"".ss($_REQUEST['testid'])."\""; 236: $q.=" AND recordx>=".ss($startx)." AND recordx<=".ss($finishx)." "; 237: $q.= "ORDER BY testvalue DESC LIMIT 0,1"; //highest 238: 239: $r=$NATS->DB->Query($q); 240: $row=$NATS->DB->Fetch_Array($r); 241: $highest=$row['testvalue']; 242: $dhigh=$highest; 243: $NATS->DB->Free($r); 244: if (isset($_REQUEST['rangemaxmin'])) 245: { 246: if ($dhigh<$_REQUEST['rangemaxmin']) $dhigh=$_REQUEST['rangemaxmin']; 247: } 248: } 249: 250: $drange=$dhigh-$dlow; 251: 252: // calculate scales 253: $xscale=$xlen/$periodx; 254: if ($drange>0) $yscale=$ylen/$drange; 255: else $yscale=1; // doesn't display but no change! 256: 257: // Grid Lines 258: 259: // Grid X - the X values 260: 261: /* Oh if only I was actually any good at programming. There MUST be soooo many better ways to do these ranges 262: with all sorts of calculations to round to the nearest power of ten etc etc. Unfortunately I have the programming 263: skill of a walrus and typing code with tusks is difficult! */ 264: 265: /* TODO: Make this all like really elegant and stuff */ 266: 267: if ($draw_x_grid) 268: { 269: $xg_step=1; 270: $xg_scale=1; 271: if ($drange<0.001) $xg_scale=0.0001; 272: else if ($drange<0.01) $xg_scale=0.001; 273: else if ($drange<0.1) $xg_scale=0.01; 274: else if ($drange<1) $xg_scale=0.1; 275: else if ($drange<6) $xg_scale=1; 276: else if ($drange<11) $xg_scale=2; 277: else if ($drange<16) $xg_scale=4; 278: else if ($drange<21) $xg_scale=5; 279: else if ($drange<51) $xg_scale=10; 280: else if ($drange<101) $xg_scale=20; 281: else if ($drange<201) $xg_scale=50; 282: else if ($drange<501) $xg_scale=100; 283: else if ($drange<1001) $xg_scale=250; 284: else if ($drange<10001) $xg_scale=1000; 285: else if ($drange<100001) $xg_scale=10000; 286: else if ($drange<1000001) $xg_scale=100000; 287: else $draw_x_grid=false; 288: 289: if ($xg_scale<0) $xg_step=($xg_scale); 290: } 291: 292: if ($draw_x_grid) 293: { 294: //imagestring($im,1,2,ty(50),"Drawing X Grid ".$xg_scale,$c_txt); 295: for ($a=$dlow; $a<=$dhigh; $a+=$xg_scale) 296: { 297: if (($a!=0)&&( ($a % $xg_scale) == 0)) 298: { 299: //imagestring($im,1,2,ty(50+($a*5)),"Drawing X Grid ".$a,$c_txt); 300: // draw a line 301: imageline($im,posx($startx),ty(posy($a)),posx($finishx),ty(posy($a)),$c_grid); 302: // imageline($im,$lastx,ty($lasty),$x,ty($y),$c_track); 303: } 304: } 305: } 306: 307: // Grid Y - the time values 308: 309: if ($draw_y_grid) 310: { 311: $min=60; 312: $hour=$min*60; 313: $day=$hour*24; 314: 315: $syr=date("Y",$startx); 316: $smo=date("m",$startx); 317: $sda=date("d",$startx); 318: $shr=date("H",$startx); 319: // h m s mo da yr 320: $lhr=mktime($shr,0,0,$smo,$sda,$syr); 321: $lda=mktime(0,0,0,$smo,$sda,$syr); 322: 323: if ($periodx< (($hour*2)+1) ) 324: { 325: $yg_scale=$min; 326: $yg_start=$lhr; 327: } 328: else if ($periodx< (($day*2)+1) ) 329: { 330: $yg_scale=$hour; 331: $yg_start=$lhr; 332: } 333: else if ($periodx < ($day*32) ) 334: { 335: $yg_scale=$day; 336: $yg_start=$lda; 337: } 338: else $draw_y_grid=false; 339: } 340: 341: if ($draw_y_grid) 342: { 343: //imagestring($im,1,2,ty(50),"Drawing Y Grid ",$c_txt); 344: for ($a=$yg_start; $a<$finishx; $a+=$yg_scale) 345: { 346: if ($a>$startx) 347: { 348: // draw line 349: imageline($im,posx($a),ty(posy($dlow)),posx($a),ty(posy($dhigh)),$c_grid); 350: } 351: } 352: } 353: function posx($time) // timex 354: { 355: global $xscale,$startx,$xoff; 356: $drawx=$xscale*($time-$startx); 357: $screenx=$drawx+$xoff; 358: $screenx=floor($screenx); 359: return $screenx; 360: } 361: 362: function posy($value) 363: { 364: global $yscale,$dlow,$yoff,$dhigh; 365: if ($value>$dhigh) $value=$dhigh; 366: $drawy=$yscale*($value-$dlow); 367: $screeny=$drawy+$yoff; 368: $screeny=floor($screeny); 369: return $screeny; 370: } 371: 372: 373: 374: // show axes scales 375: imagestring($im,1,2,ty(10),$dlow,$c_txt); 376: imagestring($im,1,2,ty($height-18),$dhigh,$c_txt); 377: 378: 379: if (isset($_REQUEST['units'])) 380: { 381: if (strpos($_REQUEST['units'],"/")===false) 382: imagestring($im,1,2,ty($height-28),$_REQUEST['units'],$c_txt); 383: 384: 385: else 386: { 387: $unit_array=explode("/",$_REQUEST['units']); 388: $a=0; 389: foreach($unit_array as $unit_string) 390: { 391: imagestring($im,1,2,ty($height-28-($a*8)),$unit_string,$c_txt); 392: $a++; 393: } 394: } 395: } 396: 397: 398: // get data and draw 399: $q="SELECT testvalue,alertlevel,recordx FROM fnrecord WHERE testid=\"".ss($_REQUEST['testid'])."\" "; 400: $q.="AND recordx>=".ss($startx)." AND recordx<=".ss($finishx)." ORDER BY recordx ASC"; 401: //$q.="LIMIT 0,100"; 402: $r=$NATS->DB->Query($q); 403: $lastx=0; 404: $lasty=0; 405: 406: $startval=0; 407: $finishval=0; 408: 409: while ($row=mysqli_fetch_array($r)) 410: { 411: $x=posx($row['recordx']); 412: //$y=posy($row['testvalue']); 413: $val=$row['testvalue']; 414: if ($val<0) $y=posy(0); 415: else $y=posy($val); 416: 417: if ($row['alertlevel']==-1) $c=$col['grey']; 418: else if ($row['alertlevel']==0) $c=$col['lightgreen']; 419: else if ($row['alertlevel']==1) $c=$col['orange']; 420: else if ($row['alertlevel']==2) $c=$col['red']; 421: else $c=$col['black']; 422: 423: // up lines 424: if ($draw_spike==1) imageline($im,$x,ty(0),$x,ty($y),$c); 425: 426: 427: 428: if ($lastx!=0) 429: { 430: 431: // join-the-dots 432: if ($draw_track==1) imageline($im,$lastx,ty($lasty),$x,ty($y),$c_track); 433: 434: // fill -- DOES NOT WORK 435: //if (($draw_fill==1)&&($draw_spike==1)&&($draw_track==1)) 436: //imagefill($im,$x-1,ty(1),$c); 437: 438: // bottom line 439: if ($draw_under==1) 440: { 441: if (($row['alertlevel']>0)|| 442: (($row['alertlevel']==0)&&($draw_under_pass==1)) ) 443: { 444: imageline($im,$lastx,ty(1),$x,ty(1),$c); 445: imageline($im,$lastx,ty(2),$x,ty(2),$c); 446: } 447: } 448: } 449: 450: //imageellipse($im,$x,ty($y),1,1,$c_red); 451: 452: $lastx=$x; 453: $lasty=$y; 454: 455: } 456: mysqli_free_result($r); 457: 458: 459: 460: // output image 461: ob_clean(); 462: header("Content-type: image/png"); 463: imagepng($im); 464: imagedestroy($im); 465: exit(); // just in case 466: 467: ?> 468: