parent
9cff9cf2e0
commit
a42acdda65
3 changed files with 223 additions and 0 deletions
@ -0,0 +1,8 @@ |
||||
|
||||
# Discover GLusterFS volume or peers, based on the argument |
||||
UserParameter=gluster.discovery[*],/usr/bin/sudo /var/lib/zabbix/bin/disco_gluster_sudo --what=$1 |
||||
|
||||
# Check GlusterFS volume or peer status |
||||
UserParameter=gluster.volume.status[*],/usr/bin/sudo /var/lib/zabbix/bin/check_gluster_sudo --what=volume --volume=$1 --bricks=$2 |
||||
UserParameter=gluster.peer.status[*],/usr/bin/sudo /var/lib/zabbix/bin/check_gluster_sudo --what=peer --peer=$1 |
||||
|
@ -0,0 +1,109 @@ |
||||
#!/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 |
||||
} |
||||
|
||||
if (($what eq 'volume' && !$volume) || |
||||
($what eq 'peer' && !$peer) || |
||||
($what ne 'volume' && $what ne 'peer')){ |
||||
usage(); |
||||
} |
||||
|
||||
if ($what eq 'volume'){ |
||||
open (VOLUMEINFO, "$gluster vol status $volume |") |
||||
|| die "error: Could not execute gluster vol status $volume"; |
||||
my $bricksfound = 0; |
||||
my $status = 1; |
||||
foreach my $line (<VOLUMEINFO>){ |
||||
# Check that all bricks are online |
||||
if ($line =~ m/^Brick\ [\w\.]+:\/[\w\.\/]+\s+\d+\s+(Y|N)/){ |
||||
$bricksfound++; |
||||
$status = 0 if ($1 ne 'Y'); |
||||
} |
||||
# Check the Self-Heal daemons are up and running |
||||
elsif ($line =~ m/^Self-heal\ Daemon\ on\ [\w\.]+\s+N\/A\\s+(Y|N)/){ |
||||
$status = 0 if ($1 ne 'Y'); |
||||
} |
||||
} |
||||
# Check the number of bricks is the one we expect |
||||
if ($bricks && $bricks != $bricksfound){ |
||||
$status = 0; |
||||
} |
||||
close VOLUMEINFO; |
||||
open (VOLUMEINFO, "$gluster vol heal $volume info heal-failed |") |
||||
|| die "error: Could not execute gluster vol heal $volume info heal-failed"; |
||||
foreach my $line (<VOLUMEINFO>){ |
||||
# 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 = 0 if ($1 gt 0); |
||||
} |
||||
} |
||||
close VOLUMEINFO; |
||||
open (VOLUMEINFO, "$gluster vol heal $volume info split-brain |") |
||||
|| die "error: Could not execute gluster vol heal $volume info split-brain"; |
||||
foreach my $line (<VOLUMEINFO>){ |
||||
# Now, check we don't have any file in a split-brain situation |
||||
if ($line =~ m/^Number\ of\ entries:\s+(\d+)$/){ |
||||
$status = 0 if ($1 gt 0); |
||||
} |
||||
} |
||||
close VOLUMEINFO; |
||||
open (VOLUMEINFO, "$gluster vol info $volume |") |
||||
|| die "error: Could not execute gluster vol info $volume"; |
||||
foreach my $line (<VOLUMEINFO>){ |
||||
# Check the volume is started |
||||
if ($line =~ m/^Status:\s+(\w+)$/){ |
||||
$status = 0 unless ($1 eq 'Started'); |
||||
} |
||||
} |
||||
close VOLUMEINFO; |
||||
print $status; |
||||
} |
||||
elsif ($what eq 'peer'){ |
||||
open (PEERLIST, "$gluster pool list |") |
||||
|| die "error: Could not execute gluster pool list"; |
||||
|
||||
my $status = 0; |
||||
foreach my $line (<PEERLIST>){ |
||||
if (($line =~ m/^$peer\s+/) || |
||||
($line =~ m/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}\s+$peer\s+/)){ |
||||
my (undef,undef,$state) = split(/\s+/, $line); |
||||
$status = 1 if ($state eq 'Connected'); |
||||
} |
||||
} |
||||
close PEERLIST; |
||||
print $status; |
||||
} |
||||
|
@ -0,0 +1,106 @@ |
||||
#!/usr/bin/perl -w |
||||
|
||||
use strict; |
||||
use File::Which; |
||||
use Getopt::Long; |
||||
use JSON; |
||||
|
||||
my $json; |
||||
@{$json->{data}} = (); |
||||
|
||||
my $gluster = which('gluster'); |
||||
|
||||
unless($gluster){ |
||||
# Gluster is not installed, just return an empty JSON object |
||||
print to_json($json); |
||||
exit(0); |
||||
} |
||||
|
||||
my $what = 'volumes'; |
||||
GetOptions( |
||||
"what=s" => \$what, |
||||
); |
||||
|
||||
sub usage (){ |
||||
print <<"EOF"; |
||||
|
||||
Usage: $0 --what=[volumes|peers] |
||||
|
||||
EOF |
||||
} |
||||
|
||||
if ($what eq 'volumes'){ |
||||
open (VOLUMES, "$gluster vol info all |") |
||||
|| die "error: Could not execute gluster vol info all"; |
||||
|
||||
foreach my $line (<VOLUMES>){ |
||||
if ($line =~ m/^Volume\ Name:\ (\w+)$/){ |
||||
my $vol = $1; |
||||
my ($type,$bricks,$uuid,$status,$transport) = ('unknown'); |
||||
open (VOLUMEINFO, "$gluster vol info $vol |") |
||||
|| die "error: Could not execute gluster vol info $vol"; |
||||
foreach my $info (<VOLUMEINFO>){ |
||||
if ($info =~ m/^Type:\ (.*)$/){ |
||||
$type = $1; |
||||
} |
||||
elsif ($info =~ m/^Volume\ ID:\ ([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})$/){ |
||||
$uuid = $1; |
||||
} |
||||
elsif ($info =~ m/^Status:\ (\w+)$/){ |
||||
$status = $1; |
||||
} |
||||
elsif ($info =~ m/^Transport-type:\ (\w+)$/){ |
||||
$transport = $1; |
||||
} |
||||
elsif ($info =~ m/^Number\ of\ Bricks:\ \d+\ x\ \d+\ =\ (\d+)$/){ |
||||
$bricks = $1; |
||||
} |
||||
} |
||||
close VOLUMEINFO; |
||||
push @{$json->{data}}, { |
||||
"{#GLUSTER_VOL_NAME}" => $vol, |
||||
"{#GLUSTER_VOL_TYPE}" => $type, |
||||
"{#GLUSTER_VOL_UUID}" => $uuid, |
||||
"{#GLUSTER_VOL_STATUS}" => $status, |
||||
"{#GLUSTER_VOL_TRANSPORT}" => $transport, |
||||
"{#GLUSTER_VOL_BRICKS}" => $bricks |
||||
}; |
||||
} |
||||
} |
||||
close VOLUMES; |
||||
} |
||||
elsif ($what eq 'peers'){ |
||||
open (PEERS, "$gluster peer status |") |
||||
|| die "error: Could not execute gluster peer status"; |
||||
|
||||
my $peerno = 0; |
||||
my ($host,$uuid,$status) = ('unknown'); |
||||
foreach my $line (<PEERS>){ |
||||
if ($line =~ m/^Number of Peers:\ (\d+)$/){ |
||||
$peerno = $1; |
||||
} |
||||
elsif ($line =~ m/^Hostname:\ ([\w\.]+)$/){ |
||||
$host = $1; |
||||
} |
||||
elsif ($line =~ m/Uuid:\ ([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})$/){ |
||||
$uuid = $1; |
||||
} |
||||
elsif ($line =~ m/State:\ [\w\s]+\((\w+)\)$/){ |
||||
$status = $1; |
||||
push @{$json->{data}}, { |
||||
"{#GLUSTER_PEER_HOST}" => $host, |
||||
"{#GLUSTER_PEER_UUID}" => $uuid, |
||||
"{#GLUSTER_PEER_STATUS}" => $status |
||||
}; |
||||
} |
||||
} |
||||
close PEERS; |
||||
} |
||||
else{ |
||||
usage(); |
||||
exit(1); |
||||
} |
||||
|
||||
print to_json($json); |
||||
exit(0); |
||||
|
Loading…
Reference in new issue