=ADDDATE(NOW(),' . $min_time . ')' . ' AND `ssh_log`.`duration` IS NOT NULL' . ' AND `ssh_log`.`action` != "ping-from-slave"' . ' AND `ssh_log`.`exit_code` = 0' . ' ORDER BY `ssh_log`.`date`' ); $infos = array(); while ($row = $result -> fetch_assoc()) { $info = array( 'date' => $row['date'], 'duration' => $row['duration'], 'action' => $row['action'] ); if ($row['action'] == 'return-assignment') { if (substr($row['parameters'], -6) == ' ERROR') $info['action'] .= ' ERROR'; elseif (substr($row['parameters'], -6) == ' ABORT') $info['action'] .= ' ABORT'; else $info['action'] .= ' SUCCESS'; } $infos[] = $info; } foreach ($infos as $info) $actions[$info['action']][] = array( 'date' => $info['date'], 'duration' => $info['duration'] ); foreach ($actions as $action) foreach ($action as $event) { if (isset($min_date)) { $min_date = min($min_date, $event['date']); $max_date = max($max_date, $event['date']); $max_duration = max($max_duration, $event['duration']); } else { $min_date = $event['date']; $max_date = $event['date']; $max_duration = $event['duration']; } } $width = 1600; $height = 600; $border = 5; $legend_line_length = 10; $legend_height = 2*ImageFontHeight(5) + $legend_line_length; $left_legend_length = strlen($max_duration) * ImageFontWidth(5); $im = @ImageCreate ($width + $legend_line_length + $left_legend_length, $height + $legend_height) or die ('Cannot create new gd-image-stream'); $background_color = ImageColorAllocate ($im, 255, 255, 255); $foreground_color = ImageColorAllocate ($im, 0, 0, 0); $colors['return-assignment SUCCESS'] = ImageColorAllocate ($im, 0, 255, 0); $colors['return-assignment ERROR'] = ImageColorAllocate ($im, 255, 0, 0); $colors['return-assignment ABORT'] = ImageColorAllocate ($im, 255, 0, 0); $colors['get-assignment'] = ImageColorAllocate ($im, 0, 0, 255); $colors['undef'] = ImageColorAllocate ($im, 255, 0, 255); function scale($x, $x_min, $x_max, $scale, $log) { if ($log) { $x = log($x + 10); $x_min = log($x_min + 10); $x_max = log($x_max + 10); }; if ($x_max == $x_min) $frac = 0; else $frac = ($x - $x_min)/($x_max - $x_min); if ($scale < 0) return ($frac-1) * $scale; else return $frac * $scale; }; function print_graph($data, $color) { global $width, $height, $im, $min_date, $max_date, $min_duration, $max_duration, $border, $legend_line_length, $left_legend_length; foreach ($data as $val) { ImageFilledEllipse( $im, scale($val['date'], $min_date, $max_date, $width - 2*$border - $left_legend_length, false) + $border + $legend_line_length + $left_legend_length, scale($val['duration'], 0, $max_duration, -$height + 2*$border, array_key_exists('log', $_GET)) + $border, max(2,pow($val['duration'],0.4)), max(2,pow($val['duration'],0.4)), $color ); } /* ImageString( $im, 5, $width + $legend_line_length, scale($last_val, 0, $val_max, -$height + 2*$border, array_key_exists('log', $_GET)) + $border - ImageFontHeight(5)/2, ' ' . $data[$t_max], $color ); */ }; ImageRectangle($im, $legend_line_length + $left_legend_length, 0, $width-1 + $legend_line_length, $height-1, $foreground_color); $xpos = $legend_line_length + $left_legend_length; foreach ($actions as $action => $data) { if (array_key_exists($action, $colors)) $color = $colors[$action]; else $color = $colors['undef']; print_graph($data, $color); ImageString($im, 5, $xpos, $height + $legend_line_length + ImageFontHeight(5), $action, $color); $xpos += (strlen($action) + 1.75) * ImageFontWidth(5); } ImageString($im, 5, $legend_line_length+$left_legend_length, $height + $legend_line_length, date('Y-m-d H:i', $min_date), $foreground_color); $s = date('Y-m-d H:i', $max_date); ImageString($im, 5, $width+$legend_line_length - strlen($s)*ImageFontWidth(5), $height + $legend_line_length, $s, $foreground_color); for ($t=ceil($min_date/24/60/60); $t<=floor($max_date/24/60/60); $t++) ImageLine( $im, scale($t*24*60*60,$min_date,$max_date,$width-2*$border-$left_legend_length,false)+$border+$legend_line_length+$left_legend_length, $height, scale($t*24*60*60,$min_date,$max_date,$width-2*$border-$left_legend_length,false)+$border+$legend_line_length+$left_legend_length, $height+$legend_line_length, $foreground_color ); for ($val = 0; $val <= $max_duration;) { ImageLine( $im, $left_legend_length, scale($val, 0, $max_duration, -$height + 2*$border, array_key_exists('log', $_GET)) + $border, $legend_line_length+$left_legend_length, scale($val, 0, $max_duration, -$height + 2*$border, array_key_exists('log', $_GET)) + $border, $foreground_color ); ImageString( $im, 5, $left_legend_length - strlen($val)*ImageFontWidth(5), scale($val, 0, $max_duration, -$height + 2*$border, array_key_exists('log', $_GET)) + $border - 0.5*ImageFontHeight(5), $val, $foreground_color ); if (! array_key_exists('log', $_GET)) $val+=pow(10, round(log($max_duration) / log(10)) - 1); elseif ($val == 0) $val++; else $val = $val*10; } // ImageString ($im, 1, 5, 5, "Test-String ".rand(), $foreground_color); header ('Content-type: image/png'); ImagePNG ($im);