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