From ac6ec92e03101949de7ae094016f6bc94d91c96e Mon Sep 17 00:00:00 2001 From: dodger Date: Wed, 11 May 2022 18:14:55 +0200 Subject: [PATCH 1/3] getops first version --- check_remote_oracle | 354 +++++++++++++++++++++++++++++++++----------- 1 file changed, 270 insertions(+), 84 deletions(-) diff --git a/check_remote_oracle b/check_remote_oracle index fae50b4..5119e65 100755 --- a/check_remote_oracle +++ b/check_remote_oracle @@ -25,11 +25,21 @@ REVISION="6.6.6" # colors -LIGHTGREEN="\033[1;32m" +BOLD="\e[1m" +GREEN="\e[32m" +LIGHTGREEN="${BOLD}${GREEN}" +RED="\033[1;31m" LIGHTRED="\033[1;31m" +BLUE="\e[34m" +LIGHTBLUE="${BOLD}${BLUE}" +YELLOW="\e[33m" +LIGHTYELLOW="${BOLD}${YELLOW}" WHITE="\033[0;37m" RESET="\033[0;00m" + +DEBUG=0 + NOHEAD="SET HEAD OFF SET PAGES 0 SET FEED OFF" @@ -64,6 +74,50 @@ print_revision() { printf "%sThe nagios plugins come with ABSOLUTELY NO WARRANTY. You may redistribute\ncopies of the plugins under the terms of the GNU General Public License.\nFor more information about these matters, see the file named COPYING.\n" | sed -e 's/\n/ /g' } +# H host +# U oracle user +# S sid +# W warning +# C critical +# t tns +# d db +# l login +# o ospassword +# s sessions +# c cache +# p parsing +# b tablespace +# u undo +# g diskgroup +# f FRA +# r redogen + +usage() +{ + echo -e "${LIGHTBLUE}USAGE${RESET} +# H host +# U oracle user +# S sid +# W warning +# C critical +# t tns +# d db +# l login +# o ospassword +# s sessions +# c cache +# p parsing +# b tablespace +# u undo +# g diskgroup +# f FRA +# r redogen + + +" + exit 0 +} + print_usage() { echo "Usage: @@ -152,24 +206,24 @@ print_help() " } -usage() -{ - # Information options - case "${1^^}" in - "--HELP"|"-H") - print_help - exit $STATE_OK - ;; - "--VERSION"|"-V") - print_revision $PROGNAME $REVISION - exit $STATE_OK - ;; - *) - print_usage - exit $STATE_OK - ;; - esac -} +## getops ### usage() +## getops ### { +## getops ### # Information options +## getops ### case "${1^^}" in +## getops ### "--HELP"|"-H") +## getops ### print_help +## getops ### exit $STATE_OK +## getops ### ;; +## getops ### "--VERSION"|"-V") +## getops ### print_revision $PROGNAME $REVISION +## getops ### exit $STATE_OK +## getops ### ;; +## getops ### *) +## getops ### print_usage +## getops ### exit $STATE_OK +## getops ### ;; +## getops ### esac +## getops ### } oraerror_check() @@ -1438,10 +1492,6 @@ check_userslocked() check_seqapply() { -# if [[ ! ${ORACLE_SID^^} = "BAVEL12SGDN" ]] ; then -# echo "CRITICAL - ${ORACLE_SID} Not avalaible for sequece apply check" -# return ${STATE_CRITICAL} -# fi if [[ "${ORACLE_SID}" =~ (.*)GDN$ ]] ; then local AUXSID=${BASH_REMATCH[1]} #echo ${AUXSID} @@ -1507,27 +1557,25 @@ ORDER BY 1; PROGNAME=$(basename $0) PROGPATH=$(dirname $0) - -[ $# -le 1 ] && usage $* - - -REMOTE_SERVER=$2 && shift 2 - -if [[ ! ${REMOTE_SERVER} ]] -then - echo "No remote server specified!!!" - exit ${STATE_UNKNOWN} -fi - -# Checking for non-standard user to connect -if [[ "${1}" = "-U" ]] -then - ORACLE_OSUSER=$2 && shift 2 -else - ORACLE_OSUSER="oracle" -fi - -SSH="ssh ${ORACLE_OSUSER}@${REMOTE_SERVER} -xq" +## getops ###[ $# -le 1 ] && usage $* +## getops ### +## getops ###REMOTE_SERVER=$2 && shift 2 +## getops ### +## getops ###if [[ ! ${REMOTE_SERVER} ]] +## getops ###then +## getops ### echo "No remote server specified!!!" +## getops ### exit ${STATE_UNKNOWN} +## getops ###fi +## getops ### +## getops #### Checking for non-standard user to connect +## getops ###if [[ "${1}" = "-U" ]] +## getops ###then +## getops ### ORACLE_OSUSER=$2 && shift 2 +## getops ###else +## getops ### ORACLE_OSUSER="oracle" +## getops ###fi +## getops ### +## getops ###SSH="ssh ${ORACLE_OSUSER}@${REMOTE_SERVER} -xq" ORACLEUSER="NAGIOS" ORACLEUSERPASSWORD="D2HSHBFMO5IINME9I9WT" @@ -1544,52 +1592,131 @@ ORACLEUSERPASSWORD="D2HSHBFMO5IINME9I9WT" # ######################################################################## -# CLEANING THE COMMAND -COMMAND="${1:2}" -ORACLE_SID="$2" -[[ ! "${COMMAND}" || ! "${ORACLE_SID}" ]] && print_usage && exit ${STATE_UNKNOWN} -if [ $# -eq 3 ] ; then - #ospassword check - # the values are REVERSE as it use reverse_return_values - CRITICAL=$2 - WARNING=$3 +# H host +# U oracle user +# S sid +# W warning +# C critical +# t tns +# d db +# l login +# o ospassword +# s sessions +# c cache +# p parsing +# b tablespace +# u undo +# g diskgroup +# f FRA +# r redogen - if [[ "${WARNING}" && ${CRITICAL} ]] ; then - if [[ ${CRITICAL} -gt ${WARNING} ]] ; then - echo "UNKNOWN - ${COMMAND} CRITICAL level is bigger than WARNING (reverse check)" - exit $STATE_UNKNOWN - fi - fi -else - if [ $# -eq 4 ] ; then - CRITICAL=$3 - WARNING=$4 - elif [ $# -eq 5 ] ; then - TSDG=$3 - CRITICAL=$4 - WARNING=$5 - fi - if [[ "${WARNING}" && ${CRITICAL} ]] ; then - if [[ ${WARNING} -gt ${CRITICAL} ]] ; then - echo "UNKNOWN - ${COMMAND} Warning level is less than Critical" - exit $STATE_UNKNOWN - fi - fi +while getopts "H:U:S:W:C:tdloscpbugfrhDF" arg; do + case $arg in + # H host + H) + REMOTE_SERVER=${OPTARG} + ;; + # U oracle user + U) + ORACLE_OSUSER="${OPTARG}" + ;; + # S sid + S) + ORACLE_SID="${OPTARG}" + ;; + # W warning + W) + WARNING="${OPTARG}" + ;; + # C critical + C) + CRITICAL="${OPTARG}" + ;; + # t tns + t) + COMMAND="tns" + ;; + # d db + d) + COMMAND="db" + ;; + # l login + l) + COMMAND="login" + ;; + # o ospassword + o) + COMMAND="ospassword" + ;; + # s sessions + s) + COMMAND="sessions" + ;; + # c cache + c) + COMMAND="cache" + ;; + # p parsing + p) + COMMAND="parsing" + ;; + # b tablespace + b) + COMMAND="tablespace" + ;; + # u undo + u) + COMMAND="undo" + ;; + # g diskgroup + g) + COMMAND="diskgroup" + ;; + # f FRA + f) + COMMAND="fra" + ;; + # r redogen + r) + COMMAND="redogen" + ;; + h) + usage + ;; + F) + MAYTHEFORCEBEWITHYOU=true + echo -e "${LIGHTBLUE}The force is strong in you?${RESET}" + ;; + D) + DEBUG=0 + ;; + *) + usage + ;; + esac +done +# mandatory ops +if [[ ! "${REMOTE_SERVER}" ]] ; then + usage +fi +if [[ ! "${ORACLE_OSUSER}" ]] ; then + usage +fi +if [[ ! "${ORACLE_SID}" ]] ; then + usage +fi +if [[ ! "${WARNING}" || ! "${CRITICAL}" ]] ; then + usage fi -# if the check is not for asmfs, then a ORACLE_HOME is necessary -if ! [[ "${COMMAND}" = "asmfs" || "${COMMAND}" = "ospassword" ]] ; then - get_remote_oraclehome - RES=$? - if [ ${RES} -ne ${STATE_OK} ] ; then - echo "CRITICAL - No ORACLE_HOME found" - exit $STATE_UNKNOWN - fi -# -fi + + +SSH="ssh ${ORACLE_OSUSER}@${REMOTE_SERVER} -xq" + +get_remote_oraclehome # SQLPLUS FOR CONNECTIONS SQLPLUS="sqlplus -s '${ORACLEUSER}/${ORACLEUSERPASSWORD}@${ORACLE_SID}'" @@ -1597,6 +1724,65 @@ ORAENV="ORACLE_HOME=${ORACLE_HOME};PATH=$PATH:$ORACLE_HOME/bin;LD_LIBRARY_PATH=$ +echo -e "${SSH}" +echo -e "${SQLPLUS}" +echo -e "${ORAENV}" +echo -e "${COMMAND}" +exit 0 + + +## getops ### # CLEANING THE COMMAND +## getops ### COMMAND="${1:2}" +## getops ### ORACLE_SID="$2" +## getops ### [[ ! "${COMMAND}" || ! "${ORACLE_SID}" ]] && print_usage && exit ${STATE_UNKNOWN} + + +## getops ### if [ $# -eq 3 ] ; then +## getops ### #ospassword check +## getops ### # the values are REVERSE as it use reverse_return_values +## getops ### CRITICAL=$2 +## getops ### WARNING=$3 +## getops ### +## getops ### if [[ "${WARNING}" && ${CRITICAL} ]] ; then +## getops ### if [[ ${CRITICAL} -gt ${WARNING} ]] ; then +## getops ### echo "UNKNOWN - ${COMMAND} CRITICAL level is bigger than WARNING (reverse check)" +## getops ### exit $STATE_UNKNOWN +## getops ### fi +## getops ### fi +## getops ### else +## getops ### if [ $# -eq 4 ] ; then +## getops ### CRITICAL=$3 +## getops ### WARNING=$4 +## getops ### elif [ $# -eq 5 ] ; then +## getops ### TSDG=$3 +## getops ### CRITICAL=$4 +## getops ### WARNING=$5 +## getops ### fi +## getops ### if [[ "${WARNING}" && ${CRITICAL} ]] ; then +## getops ### if [[ ${WARNING} -gt ${CRITICAL} ]] ; then +## getops ### echo "UNKNOWN - ${COMMAND} Warning level is less than Critical" +## getops ### exit $STATE_UNKNOWN +## getops ### fi +## getops ### fi +## getops ### +## getops ### fi + +## getops ### # if the check is not for asmfs, then a ORACLE_HOME is necessary +## getops ### if ! [[ "${COMMAND}" = "asmfs" || "${COMMAND}" = "ospassword" ]] ; then +## getops ### get_remote_oraclehome +## getops ### RES=$? +## getops ### if [ ${RES} -ne ${STATE_OK} ] ; then +## getops ### echo "CRITICAL - No ORACLE_HOME found" +## getops ### exit $STATE_UNKNOWN +## getops ### fi +## getops ### # +## getops ### fi + +## getops ### # SQLPLUS FOR CONNECTIONS +## getops ### SQLPLUS="sqlplus -s '${ORACLEUSER}/${ORACLEUSERPASSWORD}@${ORACLE_SID}'" +## getops ### ORAENV="ORACLE_HOME=${ORACLE_HOME};PATH=$PATH:$ORACLE_HOME/bin;LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib;export ORACLE_HOME PATH LD_LIBRARY_PATH;" + + case "${COMMAND}" in "tns") check_tns From 434b1713a15dedbdea40f17dda5451a7ee2ca10a Mon Sep 17 00:00:00 2001 From: dodger Date: Thu, 12 May 2022 11:55:38 +0200 Subject: [PATCH 2/3] a lot of changtes --- check_remote_oracle | 227 ++++++++++++++++++++++++-------------------- 1 file changed, 125 insertions(+), 102 deletions(-) diff --git a/check_remote_oracle b/check_remote_oracle index 5119e65..e17d886 100755 --- a/check_remote_oracle +++ b/check_remote_oracle @@ -7,6 +7,39 @@ # +# GRANTS for nagios user +# CREATE USER NAGIOS IDENTIFIED BY SOMEPASSWORD; +# GRANT CONNECT, RESOURCE TO NAGIOS ; +# GRANT SELECT ON V_$ARCHIVED_LOG to nagios ; +# GRANT SELECT ON V_$ASM_DISKGROUP to nagios ; +# GRANT SELECT ON V_$DATAGUARD_STATS to nagios ; +# GRANT SELECT ON V_$LOCK to nagios ; +# GRANT SELECT ON V_$LOG_HISTORY to nagios ; +# GRANT SELECT ON V_$PROCESS to nagios ; +# GRANT SELECT ON V_$SESSION to nagios ; +# GRANT SELECT ON V_$SESSION_WAIT to nagios ; +# GRANT SELECT ON V_$SQLAREA to nagios ; +# GRANT SELECT ON V_$SYSSTAT to nagios ; +# GRANT SELECT ON V_$controlfile to nagios ; +# GRANT SELECT ON V_$librarycache to nagios ; +# GRANT SELECT ON V_$lock to nagios ; +# GRANT SELECT ON V_$log to nagios ; +# GRANT SELECT ON V_$log_history to nagios ; +# GRANT SELECT ON V_$parameter to nagios ; +# GRANT SELECT ON V_$recovery_file_dest to nagios ; +# GRANT SELECT ON V_$session to nagios ; +# GRANT SELECT ON V_$sysstat to nagios ; +# GRANT SELECT ON DBA_DATA_FILES TO NAGIOS ; +# GRANT SELECT ON DBA_EXTENTS TO NAGIOS ; +# GRANT SELECT ON DBA_UNDO_EXTENTS TO NAGIOS ; +# GRANT SELECT ON dba_data_files TO NAGIOS ; +# GRANT SELECT ON dba_free_space TO NAGIOS ; +# GRANT SELECT ON dba_objects TO NAGIOS ; +# GRANT SELECT ON dba_source TO NAGIOS ; +# GRANT SELECT ON dba_temp_files TO NAGIOS ; + + + ######################################################################## # # CONSTANTS @@ -82,7 +115,7 @@ print_revision() { # t tns # d db # l login -# o ospassword +# o ospassword <- NOT NECESSARY # s sessions # c cache # p parsing @@ -91,28 +124,49 @@ print_revision() { # g diskgroup # f FRA # r redogen - +# k locks +# a dgstats +# o totalspace usage() { echo -e "${LIGHTBLUE}USAGE${RESET} -# H host -# U oracle user -# S sid -# W warning -# C critical -# t tns -# d db -# l login -# o ospassword -# s sessions -# c cache -# p parsing -# b tablespace -# u undo -# g diskgroup -# f FRA -# r redogen + Mandatory options: + -H destination_hostname + -U oracle_linux_user + -S ORACLE_SID + Optional arguments (required for some checks): + -W warning + -C critical + Checks: + -t + Check remote TNS server + -d + Check remote database (search /bin/ps for PMON process) + -s + Check remote database concurrent active sessions + -l + Attempt a dummy login and alert if not ORA-01017: invalid username/password + -c + Check remote database for library and buffer cache hit ratios + -p + Check remote database for Soft/Hard parse ratios + -b + Check remote database for tablespace capacity in ORACLE_SID + -u + Check remote database for UNDO tablespace capacity in ORACLE_SID + -f + Check remote database for FLASH_RECOVERY_AREA capacity in ORACLE_SID + -d + Check remote database for diskgroup capacity in ORACLE_ASM_SID (Tipically +ASM1/2...) + -a + Dataguard statistics (Apply & Transport Lag). This check is done ON THE STANDBY (the master does not have information on V\$DATAGUARD_STATS. So ORACLE_SID and HOSTNAME must be the STANDBY ones. + -r + Daily check for yesterday's redo generation + -k + Watch for session locks (any lock with return CRITICAL) + -o + Total Space taken by the database Excluding sytem tablespaces. " exit 0 @@ -278,6 +332,9 @@ reverse_return_values() +# get_remote_oraclehome look for ORACLE_SID on oratab +# so if you don't have ORACLE_SID in the oratab file, it will avoid +# you can add a pseudo dummy line there... get_remote_oraclehome() { #set -x @@ -1541,6 +1598,31 @@ ORDER BY 1; } +printmsg() +{ + echo -e "$*" +} + + +abort_message() +{ + local let ABORTCODE=1 + [[ ${EXITCODE} -ne 0 ]] && ABORTCODE=${EXITCODE} + printmsg "${LIGHTRED}ERROR${RESET}: $*" + exit ${ABORTCODE} +} + + +# debug_me uses variable ${DEBUG} +debug_me() +{ + if [[ "${DEBUG}" && ${DEBUG} -eq 0 ]] ; then + echo -e "${LIGHTBLUE}DEBUG: ${RESET}$*" + fi +} + + + ######################################################################## # # / FUNCTIONS @@ -1593,26 +1675,7 @@ ORACLEUSERPASSWORD="D2HSHBFMO5IINME9I9WT" ######################################################################## - -# H host -# U oracle user -# S sid -# W warning -# C critical -# t tns -# d db -# l login -# o ospassword -# s sessions -# c cache -# p parsing -# b tablespace -# u undo -# g diskgroup -# f FRA -# r redogen - -while getopts "H:U:S:W:C:tdloscpbugfrhDF" arg; do +while getopts "H:U:S:W:C:tdloscpbugfrhkaDF" arg; do case $arg in # H host H) @@ -1646,9 +1709,11 @@ while getopts "H:U:S:W:C:tdloscpbugfrhDF" arg; do l) COMMAND="login" ;; - # o ospassword + # o ospassword <- not necessary + # o totalspace o) - COMMAND="ospassword" + #COMMAND="ospassword" + COMMAND="totalspace" ;; # s sessions s) @@ -1682,6 +1747,14 @@ while getopts "H:U:S:W:C:tdloscpbugfrhDF" arg; do r) COMMAND="redogen" ;; + # k sessionlock + k) + COMMAND="sessionlock" + ;; + # a dgstats + a) + COMMAND="dgstats" + ;; h) usage ;; @@ -1700,20 +1773,25 @@ done # mandatory ops if [[ ! "${REMOTE_SERVER}" ]] ; then + debug_me "No REMOTE_SERVER" usage fi if [[ ! "${ORACLE_OSUSER}" ]] ; then + debug_me "No ORACLE_OSUSER" usage fi if [[ ! "${ORACLE_SID}" ]] ; then + debug_me "No ORACLE_SID" usage fi if [[ ! "${WARNING}" || ! "${CRITICAL}" ]] ; then + debug_me "no warning or critical, maybe this will fail" +fi +if [[ ! "${COMMAND}" ]] ; then + debug_me "No COMMAND received" usage fi - - SSH="ssh ${ORACLE_OSUSER}@${REMOTE_SERVER} -xq" get_remote_oraclehome @@ -1722,65 +1800,10 @@ get_remote_oraclehome SQLPLUS="sqlplus -s '${ORACLEUSER}/${ORACLEUSERPASSWORD}@${ORACLE_SID}'" ORAENV="ORACLE_HOME=${ORACLE_HOME};PATH=$PATH:$ORACLE_HOME/bin;LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib;export ORACLE_HOME PATH LD_LIBRARY_PATH;" - - -echo -e "${SSH}" -echo -e "${SQLPLUS}" -echo -e "${ORAENV}" -echo -e "${COMMAND}" -exit 0 - - -## getops ### # CLEANING THE COMMAND -## getops ### COMMAND="${1:2}" -## getops ### ORACLE_SID="$2" -## getops ### [[ ! "${COMMAND}" || ! "${ORACLE_SID}" ]] && print_usage && exit ${STATE_UNKNOWN} - - -## getops ### if [ $# -eq 3 ] ; then -## getops ### #ospassword check -## getops ### # the values are REVERSE as it use reverse_return_values -## getops ### CRITICAL=$2 -## getops ### WARNING=$3 -## getops ### -## getops ### if [[ "${WARNING}" && ${CRITICAL} ]] ; then -## getops ### if [[ ${CRITICAL} -gt ${WARNING} ]] ; then -## getops ### echo "UNKNOWN - ${COMMAND} CRITICAL level is bigger than WARNING (reverse check)" -## getops ### exit $STATE_UNKNOWN -## getops ### fi -## getops ### fi -## getops ### else -## getops ### if [ $# -eq 4 ] ; then -## getops ### CRITICAL=$3 -## getops ### WARNING=$4 -## getops ### elif [ $# -eq 5 ] ; then -## getops ### TSDG=$3 -## getops ### CRITICAL=$4 -## getops ### WARNING=$5 -## getops ### fi -## getops ### if [[ "${WARNING}" && ${CRITICAL} ]] ; then -## getops ### if [[ ${WARNING} -gt ${CRITICAL} ]] ; then -## getops ### echo "UNKNOWN - ${COMMAND} Warning level is less than Critical" -## getops ### exit $STATE_UNKNOWN -## getops ### fi -## getops ### fi -## getops ### -## getops ### fi - -## getops ### # if the check is not for asmfs, then a ORACLE_HOME is necessary -## getops ### if ! [[ "${COMMAND}" = "asmfs" || "${COMMAND}" = "ospassword" ]] ; then -## getops ### get_remote_oraclehome -## getops ### RES=$? -## getops ### if [ ${RES} -ne ${STATE_OK} ] ; then -## getops ### echo "CRITICAL - No ORACLE_HOME found" -## getops ### exit $STATE_UNKNOWN -## getops ### fi -## getops ### # -## getops ### fi - -## getops ### # SQLPLUS FOR CONNECTIONS -## getops ### SQLPLUS="sqlplus -s '${ORACLEUSER}/${ORACLEUSERPASSWORD}@${ORACLE_SID}'" -## getops ### ORAENV="ORACLE_HOME=${ORACLE_HOME};PATH=$PATH:$ORACLE_HOME/bin;LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib;export ORACLE_HOME PATH LD_LIBRARY_PATH;" +debug_me "${SSH}" +debug_me "${SQLPLUS}" +debug_me "${ORAENV}" +debug_me "${COMMAND}" case "${COMMAND}" in From 0243024b96d037fc5078b933cb60c5219ce1e1fd Mon Sep 17 00:00:00 2001 From: dodger Date: Thu, 12 May 2022 12:24:40 +0200 Subject: [PATCH 3/3] first version with getops working --- check_remote_oracle | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/check_remote_oracle b/check_remote_oracle index e17d886..1cc5a93 100755 --- a/check_remote_oracle +++ b/check_remote_oracle @@ -152,11 +152,11 @@ usage() -p Check remote database for Soft/Hard parse ratios -b - Check remote database for tablespace capacity in ORACLE_SID + Check remote database for ALL tablespaces capacity -u - Check remote database for UNDO tablespace capacity in ORACLE_SID + Check remote database for UNDO tablespace capacity -f - Check remote database for FLASH_RECOVERY_AREA capacity in ORACLE_SID + Check remote database for FLASH_RECOVERY_AREA capacity -d Check remote database for diskgroup capacity in ORACLE_ASM_SID (Tipically +ASM1/2...) -a @@ -1412,8 +1412,7 @@ select ( select nvl(sum(bytes),0)/1024/1024 temp_size from dba_temp_files ) + ( select sum(bytes)/1024/1024 redo_size from sys.v_\\\$log ) + ( select sum(BLOCK_SIZE*FILE_SIZE_BLKS)/1024/1024 controlfile_size from v\\\$controlfile) TOTAL_MB -from -dual; +from dual /" ;; "redogen" ) @@ -1729,7 +1728,8 @@ while getopts "H:U:S:W:C:tdloscpbugfrhkaDF" arg; do ;; # b tablespace b) - COMMAND="tablespace" + #COMMAND="tablespace" + COMMAND="alltablespacesspace" ;; # u undo u) @@ -1883,7 +1883,6 @@ case "${COMMAND}" in RES=$? ;; "dgstats") -# dataguard_stats dataguard_stats_new RES=$? ;;