| <?php |
| |
| /******************************** |
| * Name: get_hour_offset |
| * Function: since the time via update on the nodes is not 24hour it needs to be adjusted |
| * for processing in the following special cases: if it's morning and the hour is 12 then the |
| * the result needs to be 0. Also if it's afternoon/evening and the hour is NOT 12, then the result |
| * needs to be +12. |
| * |
| * I/O: takes the current hour(from the data not local time) and the minutes(which has am/pm stuck on) |
| * returns the modifier(0(default(AM)), -12(12am) or +12(!12PM)) |
| * |
| * |
| */ |
| function get_hour_offset( $hour, $indicator ){ |
| //is it 12 am? |
| if( ( $hour == 12) && ( preg_match('/am/i',$indicator) == 1) ){ |
| return -12; |
| } |
| //how about some time after lunch? |
| else if( ( $hour != 12) && ( preg_match('/pm/i',$indicator) == 1) ){ |
| return 12; |
| } else { |
| return 0; |
| } |
| } |
| |
| define('DEBUG',0); |
| define('SPACE',3.5); |
| define('YOFFSET',179); |
| define('XOFFSET', 40); |
| define('FONT', 3); |
| define('BARWIDTH', 3.29); |
| //this is the server we want to draw for(full path) |
| $serv = $_REQUEST['server']; |
| //this allows us to use this code to draw the current,last5 and last15(1,2,3) |
| //$resolution = $_REQUEST['resolution']; |
| //check that hte request is a number, if it isn't then set it to 0 |
| //if( is_numeric($resolution) === FALSE) |
| $resolution = 2; |
| //check to see if someone passed in a request for a specific day |
| if( isset($_REQUEST['day']) && $_REQUEST['day'] != '' && is_numeric($_REQUEST['day']) && $_REQUEST['day'] >= 0 && $_REQUEST['day'] <= 31 ){ |
| $today = $_REQUEST['day']; |
| }else{ //if whatever the passed failed the above get the current day so that we can open the files. |
| $today = date ( 'd' ); |
| } |
| //check to see if someone passed in a request for a specific month |
| if( isset($_REQUEST['month']) && $_REQUEST['month'] != '' && is_numeric($_REQUEST['month']) && $_REQUEST['month'] >= 0 && $_REQUEST['month'] <= 12 ){ |
| $month = $_REQUEST['month']; |
| }else{ //if whatever the passed failed the above get the current month so that we can open the files. |
| $month = date ('n'); |
| } |
| //check to see if someone passed in a request for a specific year |
| if( isset($_REQUEST['year']) && $_REQUEST['year'] != '' && is_numeric($_REQUEST['year']) && $_REQUEST['year'] >= 2007 && $_REQUEST['year'] <= 3000 ){ |
| $year = $_REQUEST['year']; |
| }else{ //if whatever the passed failed the above get the current year so that we can open the files. |
| $year = date ('Y'); |
| } |
| //get the Current month 3 letter short form |
| $month_name = date( 'M', mktime( 0,0,0,$month,$today,$year)); |
| |
| //break down the request string so that the name can be extracted |
| $name = explode('/',$serv); |
| //open the data file for today. |
| $data = @file( $serv . "/" . $year . "/" . $month_name . "/loadavgfor." . $today); |
| #echo "walla: " . $data; |
| if ( $data !== false ){ |
| //set the start point in so that ther |
| $x = XOFFSET+1; |
| header("Content-type: image/png"); |
| $im = imagecreate(1000, 200); |
| |
| //now compute the y offset based on the font height |
| $fonthieght = (imagefontheight( FONT ))/2; |
| |
| //Allocate colors |
| $white = imagecolorallocate($im, 255, 255, 255); |
| $red = imagecolorallocate($im, 240, 70, 70); |
| $blue = imagecolorallocate($im, 70, 70, 240); |
| $green = imagecolorallocate($im, 70, 240, 70); |
| $black = imagecolorallocate($im, 0, 0, 0); |
| // Background |
| imagefilledrectangle($im, 0, 0, imagesx($im), imagesy($im), $white); |
| // Title |
| $title = "Load for: " . end($name) . " on " . $month_name . " " . $today . " " . $year; |
| //compute the middle of the image(i know it should be 'static') |
| $title_x = (imagesx($im)/2 - 40) - (strlen($title)) ; |
| //now compute the y offset based on the font height |
| $title_y = ($fonthieght - 4); |
| imagestring($im, FONT, $title_x, $title_y, $title, $black); |
| $index = 0; |
| $maxload= 0.1; |
| $minload= 10000; |
| |
| foreach( $data as $line ) { |
| //list( $time,$current,$lastfive,$lastonefive) = explode(',',$line); |
| list( $load_data[$index][0],$load_data[$index][1],$load_data[$index][2],$load_data[$index][3]) = explode(',',rtrim($line)); |
| $maxload = ($load_data[$index][$resolution] < $maxload) ? $maxload : $load_data[$index][$resolution]; |
| $minload = ($load_data[$index][$resolution] > $minload) ? $minload : $load_data[$index][$resolution]; |
| $index=$index+1; |
| }// Draw time |
| |
| $title_y = 190 - $fonthieght ; |
| $Start = $load_data[0][0]; |
| $Stop = $load_data[$index-1][0]; |
| //this is the 'start' |
| list($hour,$minutes) = explode(':',$Start); |
| $title_x = XOFFSET + ((($hour+get_hour_offset($hour,$minutes)) * 12) + ( $minutes/5)) * BARWIDTH; |
| imagestring($im, FONT, $title_x, $title_y ,$Start,$black); |
| |
| //this is the 'stop' |
| list($hour,$minutes) = explode(':',$Stop); |
| $title_x = XOFFSET + ((($hour+get_hour_offset($hour,$minutes)) * 12) + ( $minutes/5)) * BARWIDTH; |
| imagestring($im, FONT, $title_x, $title_y ,$Stop,$black); |
| //now one to seperate the scale |
| imageline($im, XOFFSET-1, 10, XOFFSET-1, 180, $black); |
| //now work out where the end of the graph will be |
| $title_x = XOFFSET + ( 24 * 12 ) * BARWIDTH; |
| //now a line to mark the right side end |
| imageline($im, $title_x, 10, $title_x, 180, $black); |
| //draw a base line to seperate the lower text |
| imageline($im, 40, 180, $title_x, 180, $black); |
| |
| //now ticks to mark each hour |
| for( $loop = 1; $loop <=24; $loop++){ |
| $datax = XOFFSET + ( $loop * 12 ) * BARWIDTH; |
| imageline($im, $datax, 175, $datax, 185, $black); |
| //mark every 3 hours |
| if ( ( $loop % 3 ) == 0 ) |
| if( $loop > 12) |
| imagestring($im, FONT, $datax, (190-$fonthieght), $loop-12, $black); |
| else |
| imagestring($im, FONT, $datax, (190-$fonthieght), $loop, $black); |
| } |
| |
| //change the processing based on resolution( 0 is current, 1 is last five and 2 is last 15) |
| if( $resolution == 1 ){ |
| $color = $green; |
| }else if( $resolution == 2 ){ |
| $color = $blue; |
| }else if( $resolution == 3 ){ |
| $color = $red; |
| } |
| //compute the offset mult(dynamically adjust the hieghts of the bars) |
| $mult = (YOFFSET - 15)/$maxload; |
| $index = 0; |
| foreach( $load_data as $load){ |
| //find out where the hell this item goes |
| //first we explode the hours and minutes out of the time stamp |
| // the hours * 12 * BARWIDTH are where this bar should go. |
| //but the fine tune is all that + ((minutes/5) * BARWIDTH |
| //catch is minute values that fall out of mod 5 will get in the way so we will |
| //use them to control wether or not we process this value |
| list($hour,$minutes) = explode(':',$load[0]); |
| if ( ( $minutes % 5 ) == 0) { |
| $datax = XOFFSET + ((($hour+get_hour_offset($hour,$minutes)) * 12) + ( $minutes/5) ) * BARWIDTH; |
| //testing local $datax = (XOFFSET + 1) + ( ( $hour * 12 ) + ( $minutes/5) ) * BARWIDTH; |
| $load_y = YOFFSET - ( $load[$resolution] * $mult); |
| imagefilledrectangle($im, $datax, $load_y, $datax+BARWIDTH, YOFFSET, $color); |
| if( DEBUG == 1 ) |
| imagestring($im, FONT, $datax, $minutes, get_hour_offset($hour,$minutes), $black); |
| } |
| } |
| //display the max value |
| $max_y = (YOFFSET - ($maxload * $mult )) - $fonthieght; |
| imagestring($im, FONT, 0, $max_y, $maxload, $red); |
| //now for a marker line |
| $max_y = $max_y + $fonthieght; |
| imageline($im, 40, $max_y, $datax,$max_y, $black); |
| //now the min value |
| $min_y = (YOFFSET - ($minload * $mult )) - $fonthieght; |
| imagestring($im, FONT, 0, $min_y, $minload, $green);//another marker line |
| $min_y = $min_y + $fonthieght; |
| imageline($im, 40, $min_y, $datax, $min_y, $black); |
| |
| //draw some ticks for the load scale |
| $loadscale = $maxload /5; |
| for( $mark = 1; $mark <= 4; $mark++) { |
| $scale =YOFFSET -( $loadscale * $mult * $mark); |
| if ( ( $scale > ($max_y - ($fonthieght*2)) ) && ( $scale < ($max_y + ($fonthieght*2)) ) ){ |
| continue; |
| } |
| else if ( ( $scale > ($min_y - ($fonthieght*2)) ) && ( $scale < ($min_y + ($fonthieght*2)) ) ){ |
| continue; |
| } |
| imageline($im, 35, $scale, $datax, $scale, $black); |
| imagestring($im, FONT, 0, ($scale- $fonthieght), round( ($loadscale * $mark), 2), $black); |
| } |
| |
| // Display image |
| imagepng($im); |
| // Release allocated resources |
| imagedestroy($im); |
| } else { |
| header("Content-type: image/png"); |
| $im = imagecreate(800, 200); |
| |
| //now compute the y offset based on the font height |
| $fonthieght = (imagefontheight( FONT ))/2; |
| |
| //Allocate colors |
| $white = imagecolorallocate($im, 255, 255, 255); |
| $red = imagecolorallocate($im, 240, 70, 70); |
| // Background |
| imagefilledrectangle($im, 0, 0, imagesx($im), imagesy($im), $white); |
| // Title |
| $title = "Unable to find the requested data for: " . $month_name . " " . $today . " " . $year; |
| //compute the middle of the image(i know it should be 'static') |
| $title_x = (imagesx($im)/2 ) - (strlen($title)) ; |
| //now compute the y offset based on the font height |
| $title_y = (imagesy($im)/2 ) - ($fonthieght - 4); |
| imagestring($im, FONT, $title_x, $title_y, $title, $red); |
| // Display image |
| imagepng($im); |
| // Release allocated resources |
| imagedestroy($im); |
| } |
| ?> |