Search-ESsearcher/bin/essearcher

342 lines
6.6 KiB
Perl
Executable File

#!/usr/bin/env perl
#
#This software is Copyright (c) 2019 by Zane C. Bowers-Hadley.
#
#This is free software, licensed under:
#
# The Artistic License 2.0 (GPL Compatible)
use strict;
use warnings;
use Search::ESsearcher;
use Getopt::Long qw(:config pass_through);
use Data::Dumper;
use JSON;
sub version{
print "essearch: 0.1.0\n";
};
# disable color if asked
if ( defined( $ENV{NO_COLOR} ) ){
$ENV{ANSI_COLORS_DISABLED}=1;
}
# set all the templates the servers use to to fault
my $search;
my $options;
my $output;
my $elastic;
my $module;
my $invert;
my $print_search;
my $print_results;
my $help;
my $warn;
my $critical;
my $check;
my $pretty;
GetOptions(
's=s' => \$search,
'g=s' => \$options,
'o=s' => \$output,
'e=s' => \$elastic,
'S' => \$print_search,
'R' => \$print_results,
'm=s' => \$module,
'i' => \$invert,
'h' => \$help,
'help' => \$help,
'n=s' => \$check,
'w=s' => \$warn,
'c=s' => \$critical,
'p' => \$pretty,
);
# if -n is set, make sure we have -w and -c
if ( defined( $check ) &&
(
( !defined( $warn ) ) ||
( !defined( $critical) )
)
){
warn('-n is set, but either -c or -w is not');
exit 255;
}
#make sure we have a valid value for check if it is defined
if ( defined( $check ) &&
( $check ne 'gt' ) &&
( $check ne 'gte' ) &&
( $check ne 'lt' ) &&
( $check ne 'lte' )
) {
warn('-n is set, but is not gt, gte, lt, or lte');
exit 255;
}
# Use module as the base to use allowing
# the other settings to override it if defined.
if (defined( $module )){
if (!defined( $options )){
$options=$module;
}
if (!defined( $output )){
$output=$module;
}
if (!defined( $search )){
$search=$module;
}
}
my $ess = Search::ESsearcher->new();
# print the help if asked to
if ( $help ){
$ess->search_set( $search );
&version;
print '
-s <search> The search template to use.
-g <getopts> The getopts config to use.
-o <output> Thee output template to use.
-m <module> Set all of the above to the same.
Any of the above being set will override this.
-e <elastic> The elasticsearch config to use.
-S Print the search out after filling it in and exit.
-p Print the search JSON prettily.
-R Run the search and print it via Data::Dumper.
-i Invert the results.
-n <check> Operate as a nagios style check.
-w <warn> Number of hits to throw a warning at.
-c <crit> Number of hits to throw a critical at.
-h Print the help.
--help Print the help.
In check mode, -w and -c both most be specified. The value
of -n is used to determine the equality to use when evaluating
-w and -c. The table is as below.
gt >
gte >=
lt <
lte <=
The order is as below.
$hits $check $warn/critical
The printed help after this line varies based on the loaded
search template. If one is found it will be printed.
'.$ess->fetch_help;
exit 255;
}
# reels in the options
$ess->options_set( $options );
$ess->load_options;
$ess->get_options;
# reels in the search template
$ess->search_set( $search );
$ess->load_search;
my $filled_in=$ess->search_fill_in;
if ( $print_search ){
#clean it up if requested
if ( $pretty ){
# eval{
my $json=JSON->new;
$json->pretty(1);
$json->relaxed(1);
$json->canonical(1);
my $decoded=$json->decode( $filled_in );
$filled_in=$json->encode($decoded);
# }
}
print $filled_in;
exit 255;
}
# reels in the elastic config
$ess->elastic_set( $elastic );
$ess->load_elastic;
#runs the search
my $results=$ess->search_run;
if ($print_results){
print Dumper($results);
exit;
}
# act as a nagios/ichinga2 style check instead of running the output section if requested
if ( defined( $check ) ){
if (
( ref( $results ) ne 'HASH' ) ||
( !defined( $results->{hits} ) )||
( !defined( $results->{hits}{hits} ) )
){
print "UNKNOWN - search failed;\n";
exit 3;
}
my $found=$#{ $results->{hits}{hits} } + 1;
my $is_critical;
my $is_warn;
if ( $check eq 'gt' ){
if ( $found > $critical ){
$is_critical=1;
}elsif( $found > $warn ){
$is_warn=1;
}
}elsif( $check eq 'gte' ){
if ( $found >= $critical ){
$is_critical=1;
}elsif( $found >= $warn ){
$is_warn=1;
}
}elsif( $check eq 'lt' ){
if ( $found < $critical ){
$is_critical=1;
}elsif( $found < $warn ){
$is_warn=1;
}
}elsif( $check eq 'lte' ){
if ( $found <= $critical ){
$is_critical=1;
}elsif( $found <= $warn ){
$is_warn=1;
}
}
if ( $is_warn ){
print "WARNING - ".$found.' '.$check.' '.$warn." hits;\n";
exit 1;
}elsif( $is_critical ){
print "CRITICAL - ".$found.' '.$check.' '.$critical." hits;\n";
exit 2;
}
print "OK - ".$found." hits;\n";
exit 0;
}
# processes the results
$ess->output_set( $output );
$ess->load_output;
my @formatted=$ess->results_process( $results );
if (!defined($formatted[0])){
exit 0;
}
#invert if requested
if ($invert){
@formatted=reverse(@formatted);
}
print join("\n", @formatted)."\n";
exit 0;
=head1 NAME
essearcher - A utility for using templates for searching elasticsearch.
=head1 SYNOPSIS
essearcher [B<-e> <elastic>] [B<-s> <search>] [B<-g> <options>] [B<-o> <options>] ...
essearcher [B<-m> <name>] [B<-e> <elastic>] ...
essearcher B<-n> B<-w> <warn> B<-c> <critical> ...
=head1 FLAGS
=head2 -s <search>
The search template to use.
=head2 -g <getopts>
The getopts config to use.
=head2 -o <output>
Thee output template to use.
=head2 -m <module>
Set all of the above to the same.
Any of the above being set will override this.
=head2 -e <elastic>
The elasticsearch config to use.
=head2 -p
If -S is given, then it will attempt to pretty print the JSON.
This will involve parsing it and then turning it back into JSON.
So it will spit out ugly JSON is malformed JSON is fed into it.
=head2 -S
Print the search out after filling it in and exit.
=head2 -R
Run the search and print it via Data::Dumper.
=head2 -i
Invert the results.
=head2 -n <check>
Operate as a nagios style check.
In check mode, -w and -c both most be specified. The value
of -n is used to determine the equality to use when evaluating
-w and -c. The table is as below.
gt >
gte >=
lt <
lte <=
The order is as below.
$hits $check $warn/critical
=head2 -w <warn>
Number of hits to throw a warning at.
=head2 -c <crit>
Number of hits to throw a critical at.
=head2 -h
Print the help.
=head2 --help
Print the help.
=head1 ENVIROMENTAL VARIABLES
=head2 NO_COLOR
If this is set, it disables color output.
=head1 NOTE
This script has dynamic command line options. The ones shown above are just the defaults.
For others see the help documentation via --help or check the pod of the module you are using.
=cut