Additional scripts for Zabbix agent on Linux to discover and monitor several services
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.1 KiB

#!/usr/bin/perl -w
use strict;
use File::Which;
use Getopt::Long;
my $what = 'volume';
my $volume = undef;
my $peer = undef;
my $bricks = undef;
my $gluster = which('gluster');
unless($gluster){
# Gluster is not installed, exit with an error
die "gluster command not found";
}
GetOptions(
"what=s" => \$what,
"volume=s" => \$volume,
"bricks=i" => \$bricks,
"peer=s" => \$peer
);
sub usage(){
print <<"EOF";
usage: $0 --what=[peer|volume]
If --what=volume you need to pass --volume=<volname>. The optional --bricks arg can be used to pass the number of expected bricks
If --what=peer you need to pass --peer=<host>
EOF
}
sub gluster($){
my $cmd = shift;
my $code = 256;
my @result = ();
# Loop to run gluster cmd as it can fail if two run at the same time
for (my $i = 0; ($code != 0 && $i < 10); $i++){
open (RES, "$cmd |")
|| die "error: Could not execute $cmd";
@result = <RES>;
close RES;
$code = $?;
sleep(1) unless ($code == 0);
}
die "error: Could not execute $cmd" unless ($code == 0);
return @result;
}
if (($what eq 'volume' && !$volume) ||
($what eq 'peer' && !$peer) ||
($what ne 'volume' && $what ne 'peer')){
usage();
}
if ($what eq 'volume'){
my @volinfo = gluster("$gluster vol status $volume");
my $bricksfound = 0;
my $status = 'OK';
foreach my $line (@volinfo){
# Check that all bricks are online
if ($line =~ m/^Brick\ ([\w\.]+:\/[\w\.\/]+)\s+\d+\s+([A-Z])/){
$bricksfound++;
$status = "CRITICAL: brick status (reported $2 on $1)" if ($2 ne 'Y');
}
# Check the Self-Heal daemons are up and running
elsif ($line =~ m/^Self-heal\ Daemon\ on\ ([\w\.]+)\s+N\/A\\s+([A-Z])/){
$status = "CRITICAL: self-heal daemon (reported $2 on $1)" if ($2 ne 'Y');
}
}
# Check the number of bricks is the one we expect
if ($bricks && $bricks != $bricksfound){
$status = "CRITICAL: bricks count mismatch (found $bricksfound while expecting $bricks)";
}
@volinfo = gluster("$gluster vol heal $volume info heal-failed");
foreach my $line (@volinfo){
# Now, check we don't have any file which the Self-Heal daemon couldn't sync
if ($line =~ m/^Number\ of\ entries:\s+(\d+)$/){
$status = "CRITICAL: self-heal error ($1)" if ($1 gt 0);
}
}
@volinfo = gluster("$gluster vol heal $volume info split-brain");
foreach my $line (@volinfo){
# Now, check we don't have any file in a split-brain situation
if ($line =~ m/^Number\ of\ entries:\s+(\d+)$/){
$status = "CRITICAL: split-bran ($1)" if ($1 gt 0);
}
}
@volinfo = gluster("$gluster vol info $volume");
foreach my $line (@volinfo){
# Check the volume is started
if ($line =~ m/^Status:\s+(\w+)$/){
$status = 'CRITICAL: The volume is not started' unless ($1 eq 'Started');
}
}
print $status;
}
elsif ($what eq 'peer'){
my @peers = gluster("$gluster pool list");
my $status = 'unknown';
foreach my $line (@peers){
if (($line =~ m/^$peer\s+/) ||
($line =~ m/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}\s+$peer\s+/)){
(undef,undef,$status) = split(/\s+/, $line);
}
}
print $status;
}