|
|
|
#!/usr/bin/perl -w
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
use JSON;
|
|
|
|
use File::Which;
|
|
|
|
use Getopt::Long;
|
|
|
|
|
|
|
|
my $json;
|
|
|
|
@{$json->{data}} = ();
|
|
|
|
my $zpool = which('zpool');
|
|
|
|
my $zfs = which('zfs');
|
|
|
|
my $sanoid = which('sanoid');
|
|
|
|
|
|
|
|
if (not $zpool or not $zfs){
|
|
|
|
print 'ZBX_NOTSUPPOTED';
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
my $pools = 1;
|
|
|
|
my $fs = 0;
|
|
|
|
my $zvol = 0;
|
|
|
|
my $snap = 0;
|
|
|
|
my $sanoidmon = 0;
|
|
|
|
my $pretty = 0;
|
|
|
|
|
|
|
|
GetOptions(
|
|
|
|
"pools" => \$pools,
|
|
|
|
"fs|filesystems" => \$fs,
|
|
|
|
"zvols|volumes" => \$zvol,
|
|
|
|
"snapshots" => \$snap,
|
|
|
|
"sanoid" => \$sanoidmon,
|
|
|
|
"pretty" => \$pretty
|
|
|
|
);
|
|
|
|
|
|
|
|
if ($fs or $zvol or $snap or $sanoidmon){
|
|
|
|
$pools = 0;
|
|
|
|
}
|
|
|
|
if ($pools + $fs + $zvol + $snap + $sanoidmon != 1){
|
|
|
|
die "One and only one type of discovery should be provided\n";
|
|
|
|
}
|
|
|
|
if ($sanoidmon and not $sanoid){
|
|
|
|
print to_json($json);
|
|
|
|
exit 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($pools){
|
|
|
|
foreach (qx($zpool list -H -o name)){
|
|
|
|
chomp;
|
|
|
|
push @{$json->{data}}, { '{#ZPOOL}' => $_ };
|
|
|
|
}
|
|
|
|
} elsif ($fs){
|
|
|
|
foreach (qx($zfs list -H -o name -t filesystem)){
|
|
|
|
chomp;
|
|
|
|
push @{$json->{data}}, { '{#ZFS_FS}' => $_ };
|
|
|
|
}
|
|
|
|
} elsif ($zvol){
|
|
|
|
foreach (qx($zfs list -H -o name -t volume)){
|
|
|
|
chomp;
|
|
|
|
push @{$json->{data}}, { '{#ZFS_ZVOL}' => $_ };
|
|
|
|
}
|
|
|
|
} elsif ($snap){
|
|
|
|
foreach (qx($zfs list -H -o name -t snap)){
|
|
|
|
chomp;
|
|
|
|
# Remove @ as they are not allowed in item key names
|
|
|
|
# They will be converted back to @ by check_zfs script
|
|
|
|
$_ =~ s/\@/%40/g;
|
|
|
|
push @{$json->{data}}, { '{#ZFS_SNAP}' => $_ };
|
|
|
|
}
|
|
|
|
} elsif ($sanoidmon){
|
|
|
|
push @{$json->{data}}, { '{#ZFS_SANOID}' => $_ } foreach (qw(snapshot capacity health));
|
|
|
|
}
|
|
|
|
print to_json($json, { pretty => $pretty });
|