) {
my $res = {};
my ($hour, $min);
if (($hour, $min, $res->{'memtot'}, $res->{'memfree'}, $res->{'buffers'}, $res->{'cached'}, $res->{'slabmem'}, $res->{'swptot'}, $res->{'swpfree'}) =
($line =~ m/^(\d\d)\:(\d\d)\:\d\d\s+(\d+)M\s+(\d+)M\s+(\d+)M\s+(\d+)M\s+(\d+)M\s+(\d+)M\s+(\d+)M/)) {
$found = 1;
$res->{'mem'} = $res->{'memtot'} - $res->{'memfree'} - $res->{'buffers'} - $res->{'cached'};
$res->{'swap'} = $res->{'swptot'} - $res->{'swpfree'};
push @$data0, $hour;
# hack: +0 to convert string to number (avoid problems with GD::GRAPH)
my $v = $res->{"$sel"} + 0;
push @$data1, $v;
$max = $v if $v && $max < $v;
if ($sel eq 'mem') {
$v = $res->{"swap"} + 0;
push @$data2, $v;
$max = $v if $v && $max < $v;
}
}
}
$max = 1 if !$max;
close (TMP);
if (!$found) {
print OUT __("No data available.");
return;
}
my @data = ($data0, $data1);
my @legend = (decode_entities ($sel));
if ($sel eq 'mem') {
push @data, $data2;
push @legend, decode_entities ('swap');
}
my $graph = GD::Graph::lines->new (600, 400);
my $txt = '';
foreach my $va (@{$fdat{__sarsel}}) {
$txt = $va->[1] if $fdat{sarsel} eq $va->[0];
}
my $prec = $max < 1 ? 100 : 10;
my $rmax = int (($max * 1.1 + (1/$prec)) * $prec) / $prec;
$graph->set(
title => sprintf (decode_entities (("$txt (%s)")), $fdat{sardate}) ,
transparent => 0,
y_long_ticks => 1,
dclrs => [ qw(green lblue cyan lyellow lpurple lred lorange) ],
y_min_value => 0,
y_max_value => $rmax,
y_number_format => '%.2f',
x_labels_vertical => 1,
x_label_skip => 6,
);
if ($intvalue) {
my $maxv = int ($max * 1.1);
my $ytn = $max < 5 ? $max : 5;
$graph->set(y_number_format => '%d', y_min_value => 0, y_max_value => $maxv, y_tick_number => $ytn);
}
$graph->set_legend(@legend);
$graph->plot(\@data);
$out .= "";
my $fn = 'cpuload.png';
open (TMP, ">$dir$fn") or die "Cannot open $fn for write: $!";
print TMP $graph->gd->png();
close TMP;
$out .= "
";
print OUT $out;
-]