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