Monitoring-GLPlugin
view release on metacpan or search on metacpan
lib/Monitoring/GLPlugin.pm view on Meta::CPAN
$empty_events->{lookback_history} = $last_values->{lookback_history};
foreach (@keys) {
if (ref($self->{$_}) eq "ARRAY") {
@{$empty_events->{lookback_history}->{$_}->{$now}} = @{$self->{$_}};
} else {
$empty_events->{lookback_history}->{$_}->{$now} = $self->{$_};
}
}
}
if ($mode eq "lookback_freeze_defrost") {
delete $empty_events->{freeze};
}
$empty_events;
};
$self->save_state(%params);
}
sub create_statefilesdir {
my ($self) = @_;
if (! -d $self->statefilesdir()) {
eval {
use File::Path;
mkpath $self->statefilesdir();
};
if ($@ || ! -w $self->statefilesdir()) {
$self->add_message(UNKNOWN,
sprintf "cannot create status dir %s! check your filesystem (permissions/usage/integrity) and disk devices", $self->statefilesdir());
}
} elsif (! -w $self->statefilesdir()) {
$self->add_message(UNKNOWN,
sprintf "cannot write status dir %s! check your filesystem (permissions/usage/integrity) and disk devices", $self->statefilesdir());
}
}
sub create_statefile {
my ($self, %params) = @_;
my $extension = "";
$extension .= $params{name} ? '_'.$params{name} : '';
$extension =~ s/\//_/g;
$extension =~ s/\(/_/g;
$extension =~ s/\)/_/g;
$extension =~ s/\*/_/g;
$extension =~ s/\s/_/g;
return sprintf "%s/%s%s", $self->statefilesdir(),
$self->clean_path($self->mode), $self->clean_path(lc $extension);
}
sub clean_path {
my ($self, $path) = @_;
if ($^O =~ /MSWin/) {
$path =~ s/:/_/g;
}
return $path;
}
sub schimpf {
my ($self) = @_;
printf "statefilesdir %s is not writable.\nYou didn't run this plugin as root, didn't you?\n", $self->statefilesdir();
}
# $self->protect_value('1.1-flat_index', 'cpu_busy', 'percent');
sub protect_value {
my ($self, $ident, $key, $validfunc) = @_;
if (ref($validfunc) ne "CODE" && $validfunc eq "percent") {
$validfunc = sub {
my $value = shift;
return 0 if ! defined $value;
return 0 if $value !~ /^[-+]?([0-9]+(\.[0-9]+)?|\.[0-9]+)$/;
return ($value < 0 || $value > 100) ? 0 : 1;
};
} elsif (ref($validfunc) ne "CODE" && $validfunc eq "positive") {
$validfunc = sub {
my $value = shift;
return 0 if ! defined $value;
return 0 if $value !~ /^[-+]?([0-9]+(\.[0-9]+)?|\.[0-9]+)$/;
return ($value < 0) ? 0 : 1;
};
}
if (&$validfunc($self->{$key})) {
$self->save_state(name => 'protect_'.$ident.'_'.$key, save => {
$key => $self->{$key},
exception => 0,
});
} else {
# if the device gives us an clearly wrong value, simply use the last value.
my $laststate = $self->load_state(name => 'protect_'.$ident.'_'.$key);
$self->debug(sprintf "self->{%s} is %s and invalid for the %dth time",
$key, $self->{$key}, $laststate->{exception} + 1);
if ($laststate->{exception} <= 5) {
# but only 5 times.
# if the error persists, somebody has to check the device.
$self->{$key} = $laststate->{$key};
}
$self->save_state(name => 'protect_'.$ident.'_'.$key, save => {
$key => $laststate->{$key},
exception => ++$laststate->{exception},
});
}
}
sub save_state {
my ($self, %params) = @_;
$self->create_statefilesdir();
my $statefile = $self->create_statefile(%params);
my $tmpfile = $self->statefilesdir().'/check__health_tmp_'.$$;
if ((ref($params{save}) eq "HASH") && exists $params{save}->{timestamp}) {
$params{save}->{localtime} = scalar localtime $params{save}->{timestamp};
}
my $seekfh = IO::File->new();
if ($seekfh->open($tmpfile, "w")) {
$seekfh->printf("%s", Data::Dumper::Dumper($params{save}));
$seekfh->flush();
$seekfh->close();
$self->debug(sprintf "saved %s to %s",
Data::Dumper::Dumper($params{save}), $statefile);
}
if (! rename $tmpfile, $statefile) {
$self->add_message(UNKNOWN,
sprintf "cannot write status file %s! check your filesystem (permissions/usage/integrity) and disk devices", $statefile);
}
}
( run in 0.606 second using v1.01-cache-2.11-cpan-39bf76dae61 )