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.
109 lines
3.0 KiB
109 lines
3.0 KiB
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
use JSON;
|
|
use Data::Dumper;
|
|
use Getopt::Long;
|
|
|
|
my $what = 'all';
|
|
my $defaults = undef;
|
|
my $host = undef;
|
|
my $port = undef;
|
|
my $user = undef;
|
|
my $password = undef;
|
|
my $help = 0;
|
|
my $pretty = 0;
|
|
my $exit = 0;
|
|
|
|
my $json = {
|
|
zbx_error => "none"
|
|
};
|
|
|
|
GetOptions(
|
|
"what=s" => \$what,
|
|
"help" => \$help,
|
|
"defaults=s" => \$defaults,
|
|
"host=s" => \$host,
|
|
"port=s" => \$port,
|
|
"user=s" => \$user,
|
|
"password=s" => \$password,
|
|
"pretty" => \$pretty
|
|
);
|
|
|
|
# Basic input checks
|
|
if (defined $defaults and $defaults ne '' and not -e $defaults){
|
|
$json->{zbx_error} = "File $defaults doesn't exist";
|
|
$exit = 1;
|
|
} elsif (defined $host and $host ne '' and $host !~ m/^[\w\-\.]+$/){
|
|
$json->{zbx_error} = "Bad value for --host";
|
|
$exit = 1;
|
|
} elsif (defined $port and $port ne '' and ($port !~ m/^\d+$/ or $port lt 1 or $port gt 65535)){
|
|
$json->{zbx_error} = "Bad value for --port";
|
|
$exit = 1;
|
|
} elsif (defined $user and $user ne '' and $user !~ m/^[\w\-\.]+$/){
|
|
$json->{zbx_error} = "Bad value for --user";
|
|
$exit = 1;
|
|
} elsif (defined $password and $password ne '') {
|
|
# Just escape quotes as will protect the password with
|
|
$password =~ s/'/\\'/g;
|
|
}
|
|
|
|
if ($help){
|
|
print <<_EOF;
|
|
Usage: $0 [--what=key] [--help] [--pretty]
|
|
|
|
* --what : if a key is given (eg --what=Bytes_received) will print only this value.
|
|
Else, all the stats are printed in a json format.
|
|
Run once without --what to get a list of available keys
|
|
|
|
* --help : print this help and exit
|
|
|
|
* --defaults : set the file from which mysql will read defaults
|
|
|
|
* --host : set the hostname to connect to
|
|
|
|
* --user : set the user to connect as
|
|
|
|
* --password : set the password to use
|
|
|
|
* --pretty : prints JSON in a pretty, human readable format. Has no use when --what is also given
|
|
_EOF
|
|
exit 0;
|
|
}
|
|
|
|
if ($exit eq 0){
|
|
my $opt = "";
|
|
$opt .= " --defaults-file=$defaults" if (defined $defaults and $defaults ne '');
|
|
$opt .= " --host=$host" if (defined $host and $host ne '');
|
|
$opt .= " --user=$user" if (defined $user and $user ne '');
|
|
$opt .= " --password='$password'" if (defined $password and $password ne '');
|
|
my @status = qx(mysql $opt --batch --execute 'show global status;' 2>&1);
|
|
if ($? != 0){
|
|
$exit = $?;
|
|
$json->{zbx_error} = join '', @status;
|
|
} else {
|
|
foreach (@status){
|
|
chomp;
|
|
my ($key, $val) = split(/\t/, $_);
|
|
$json->{$key} = $val;
|
|
}
|
|
# Some older MySQL do not have all the variables we might want
|
|
if (not defined $json->{Acl_users}){
|
|
$json->{Acl_users} = qx(mysql $opt --batch --skip-column-names --execute 'select count(user) from user;' mysql);
|
|
chomp $json->{Acl_users};
|
|
}
|
|
if (not defined $json->{Max_statement_time_exceeded} and defined $json->{Max_execution_time_exceeded}){
|
|
$json->{Max_statement_time_exceeded} = $json->{Max_execution_time_exceeded}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($what ne 'all' and defined $json->{$what}){
|
|
print $json->{$what} . "\n";
|
|
} else {
|
|
print to_json($json, { pretty => $pretty });
|
|
}
|
|
|
|
exit $exit;
|
|
|
|
|