ROOTPLOIT
Server: Apache
System: Linux node6122.myfcloud.com 6.14.3-x86_64-linode168 #1 SMP PREEMPT_DYNAMIC Mon Apr 21 19:47:55 EDT 2025 x86_64
User: bashacomputer (1004)
PHP: 7.4.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //lib64/nagios/plugins/check_elastic
#!/bin/bash

#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

PROGNAME=`basename $0`
VERSION="Version 0.4.0"
AUTHOR="Andrew Lyon, Based on Mike Adolphs (http://www.matejunkie.com/) check_nginx.sh code. Authentication support added by Ryan Gallant, CA support added by Michael Koch."

ST_OK=0
ST_WR=1
ST_CR=2
ST_UK=3
epoch=`date +%s`
hostname="localhost"
user=elastic
pass=changeme
authentication="False"
use_ca="False"
use_cert="False"
use_key="False"
use_no_check="False"
port=9200
status_page="_cluster/health"
output_dir=/tmp
scheme=http
carbon_server=""
carbon_port=""
carbon_key="system.:::name:::.cluster.app.elasticsearch.cluster"
use_proxy="on"
use_jq="False"
verbose="False"
wget_add_args=()
jq="jq -r"


print_version() {
    echo "$VERSION $AUTHOR"
}

print_help() {
    print_version $PROGNAME $VERSION
    echo ""
    echo "$PROGNAME is a Nagios plugin to check the cluster status of elasticsearch."
    echo "It also parses the status page to get a few useful variables out, and return"
    echo "them in the output."
    echo ""
    echo "$PROGNAME -H localhost -P 9200 -o /tmp"
    echo ""
    echo "Options:"
    echo "  -h/--help)"
    echo "     Print help."
    echo "  -H/--hostname)"
    echo "     Defines the hostname. Default is: localhost"
    echo "  -P/--port)"
    echo "     Defines the port. Default is: 9200"
    echo "  -s/--secure)"
    echo "     Use TLS. Defaults to false."
    echo "  -o/--output-directory)"
    echo "     Specifies where to write the tmp-file that the check creates."
    echo "     Default is: /tmp"
    echo "  -u/--username)"
    echo "    Username for elasticsearch. Turns on authentication mode when set"
    echo "  -p/--password)"
    echo "    Password for elasticsearch. Turns on authentication mode when set"
    echo "  -a/--auth)"
    echo "    Turns on authentication mode with default credentials."
    echo "  -c/--ca-certificate)"
    echo "    Uses the provided CA certificate."
    echo "  -C/--certificate)"
    echo "    Uses the provided certificate."
    echo "  -K/--private-key)"
    echo "    Uses the provided private key."
    echo "  -N/--no-check-certificate)"
    echo "     Don't check the server certificate against the available certificate authorities."
    echo "  -k/--ok-on-yellow)"
    echo "     Exit with OK state if the cluster is yellow."
    echo "  -x/--proxy)"
    echo "     System proxy off or on. Default is: on"
    echo "  --carbon-server)"
    echo "     Defines the carbon server. Default is Null"
    echo "  --carbon-port)"
    echo "     Defines the carbon port. Default is Null"
    echo "  --carbon-key)"
    echo "     Defines the carbon key. Default is system.:::name:::.cluster.app.elasticsearch.cluster"
    echo "  -V/--verbose)"
    echo "     Enable verbose mode."
    exit $ST_UK
}

while test -n "$1"; do
    case "$1" in
        --help|-h)
            print_help
            exit $ST_UK
            ;;
        --version|-v)
            print_version $PROGNAME $VERSION
            exit $ST_UK
            ;;
        --hostname|-H)
            hostname=$2
            shift
            ;;
        --ok-on-yellow|-k)
            ok_on_yellow="True"
            ;;
        --secure|-s)
            scheme=https
            ;;
        --port|-P)
            port=$2
            shift
            ;;
        --proxy|-x)
            use_proxy=$2
            shift
            ;;
        --password|-p)
            pass=$2
            authentication="True"
            shift
            ;;
        --username|-u)
            user=$2
            authentication="True"
            shift
            ;;
        --auth|-a)
            authentication="True"
            ;;
        --ca-certificate|-c)
            ca_cert=$2
            use_ca="True"
            shift
            ;;
        --certificate|-C)
            cert=$2
            use_cert="True"
            shift
            ;;
        --private-key|-K)
            private_key=$2
            use_key="True"
            shift
            ;;
        --no-check-certificate|-N)
            use_no_check="True"
            ;;
        --output-directory|-o)
            output_dir=$2
            shift
            ;;
        --carbon-server)
            carbon_server=$2
            shift
            ;;
        --carbon-port)
            carbon_port=$2
            shift
            ;;
        --carbon-key)
            carbon_key=$2
            shift
            ;;
        --verbose|-V)
            verbose="True"
            ;;
        --use-jq)
            use_jq="True"
            ;;
        *)
        echo "Unknown argument: $1"
        print_help
        exit $ST_UK
        ;;
    esac
    shift
done

if [ "$authentication" = "True" ]; then
    pass="--password=${pass}"
    user="--user=${user}"
    wget_add_args+=("--auth-no-challenge")
fi

if [ "$use_ca" = "True" ]; then
    ca_cert="--ca-certificate=${ca_cert}"
fi

if [ "$use_cert" = "True" ]; then
    cert="--certificate=${cert}"
fi

if [ "$use_key" = "True" ]; then
    private_key="--private-key=${private_key}"
fi

if [ "$use_proxy" = "off" ]; then
    proxy="--proxy=${use_proxy}"
fi

if [ "$use_no_check" = "True" ]; then
    wget_add_args+=("--no-check-certificate")
fi

if [ "$verbose" != "True" ]; then
    wget_add_args+=("-q")
fi

get_status() {
    filename=$(mktemp -u -p "$output_dir" --suffix="-${PROGNAME}")

    # If authentication via private key ist defined
    if [ -n "${private_key}" ]
    then
       wget -t 3 -T 3 ${cert} ${private_key} $scheme://${hostname}:${port}/${status_page}?pretty=true -O ${filename} ${proxy} ${wget_add_args[@]}
    elif [ "${authentication}" = "True" ]; then
       wget -t 3 -T 3 ${ca_cert} ${user} ${pass} $scheme://${hostname}:${port}/${status_page}?pretty=true -O ${filename} ${proxy} ${wget_add_args[@]}
    else
       wget -t 3 -T 3 ${ca_cert} $scheme://${hostname}:${port}/${status_page}?pretty=true -O ${filename} ${proxy} ${wget_add_args[@]}
    fi
}

get_val() {
    filename=$1
    key=$2
    ty=$3

    if [[ $use_jq == "True" ]]; then
        ${jq} ".${key}" ${filename}
    else
        line=$(grep '"'"${key}"'"' ${filename})
        if [ "${ty}" == "string" ]; then
            echo ${line} | awk -F '"' '{print $4}'
        else
            echo ${line} | awk '{print $3}' | sed 's|[\r",]||g'
        fi
    fi
}

get_vals() {
    name=$(get_val ${filename} "cluster_name" "string")
    status=$(get_val ${filename} "status" "string")
    timed_out=$(get_val ${filename} "timed_out")
    number_nodes=$(get_val ${filename} "number_of_nodes")
    number_data_nodes=$(get_val ${filename} "number_of_data_nodes")
    active_primary_shards=$(get_val ${filename} "active_primary_shards")
    active_shards=$(get_val ${filename} "active_shards")
    relocating_shards=$(get_val ${filename} "relocating_shards")
    initializing_shards=$(get_val ${filename} "initializing_shards")
    delayed_unassigned_shards=$(get_val ${filename} "delayed_unassigned_shards")
    unassigned_shards=$(get_val ${filename} "unassigned_shards")
    rm -f ${filename}

    # Determine the Nagios Status and Exit Code
    if [ "$status" = "red" ]; then
        NAGSTATUS="CRITICAL"
        EXST=$ST_CR
    elif [ "$status" = "yellow" ]; then
        if [ -z "$ok_on_yellow" ]; then
            NAGSTATUS="WARNING"
            EXST=$ST_WR
        else
            NAGSTATUS="OK"
            EXST=$ST_OK
        fi
    elif [ "$status" = "green" ]; then
        NAGSTATUS="OK"
        EXST=$ST_OK
    else
        NAGSTATUS="UNKNOWN"
        EXST=$ST_UK
    fi
}

do_output() {
    output="elasticsearch ($name) is running. \
status: $status; \
timed_out: $timed_out; \
number_of_nodes: $number_nodes; \
number_of_data_nodes: $number_data_nodes; \
active_primary_shards: $active_primary_shards; \
active_shards: $active_shards; \
relocating_shards: $relocating_shards; \
initializing_shards: $initializing_shards; \
delayed_unassigned_shards: $delayed_unassigned_shards; \
unassigned_shards: $unassigned_shards "
}

do_perfdata() {
    #perfdata="'idle'=$iproc 'active'=$aproc 'total'=$tproc"
    perfdata="'active_primary'=$active_primary_shards 'active'=$active_shards 'relocating'=$relocating_shards 'init'=$initializing_shards 'delay_unass'=$delayed_unassigned_shards 'unass'=$unassigned_shards"
}

do_graphite() {
    if [ "$carbon_server" != "" -a "$carbon_port" != "" ]; then
        key=$(echo $carbon_key | sed "s/:::name:::/$name/")
        echo "$key.cluster.status                $EXST                  $epoch" | nc -w 2 $carbon_server $carbon_port
        echo "$key.cluster.nodes.ttl             $number_nodes          $epoch" | nc -w 2 $carbon_server $carbon_port
        echo "$key.cluster.nodes.data            $number_data_nodes     $epoch" | nc -w 2 $carbon_server $carbon_port
        echo "$key.cluster.shards.active         $active_shards         $epoch" | nc -w 2 $carbon_server $carbon_port
        echo "$key.cluster.shards.active_primary $active_primary_shards $epoch" | nc -w 2 $carbon_server $carbon_port
        echo "$key.cluster.shards.initializing   $initializing_shards   $epoch" | nc -w 2 $carbon_server $carbon_port
        echo "$key.cluster.shards.relocating     $relocating_shards     $epoch" | nc -w 2 $carbon_server $carbon_port
        echo "$key.cluster.shards.delayed_unassigned     $delayed_unassigned_shards     $epoch" | nc -w 2 $carbon_server $carbon_port
        echo "$key.cluster.shards.unassigned     $unassigned_shards     $epoch" | nc -w 2 $carbon_server $carbon_port
        unset key
    fi
}

# Here we go!
which wget >/dev/null 2>&1
if [ "$?" != "0" ]; then
    echo "CRITICAL - wget is not installed"
    exit $ST_CR
fi
get_status
if [ ! -s "$filename" ]; then
    echo "CRITICAL - Could not connect to server $hostname"
    rm -f "$filename"
    exit $ST_CR
else
    get_vals
    if [ -z "$name" ]; then
        echo "CRITICAL - Error parsing server output"
        exit $ST_CR
    else
        do_output
        do_perfdata
    do_graphite
    fi
fi

COMPARE=$listql

echo "${NAGSTATUS} - ${output} | ${perfdata}"
exit $EXST