Code

7e2f6f99f7e2969e301c1a9076f5b76f9e41e282
[nagiosplug.git] / plugins-scripts / check_oracle.sh
1 #!/bin/sh
2 #
3 # latigid010@yahoo.com
4 # 01/06/2000
5 #
6 #  This Nagios plugin was created to check remote or local TNS
7 #  status and check local Database status.
8 #
9 #  Add the following lines to your object config file (i.e. commands.cfg)
10 #         command[check-tns]=/usr/local/nagios/libexec/check_ora 1 $ARG$
11 #         command[check-oradb]=/usr/local/nagios/libexec/check_ora 2 $ARG$
12 #
13 #
14 # Usage: 
15 #      To check TNS Status:  ./check_ora 1 <Oracle Sid or Hostname/IP address>
16 #  To Check local database:  ./check_ora 2 <ORACLE_SID>
17 #
18 # I have the script checking for the Oracle PMON process and 
19 # the sgadefORACLE_SID.dbf file.
20
21 #
22 # If you have any problems check that you have the $ORACLE_HOME
23 # enviroment variable set, have $ORACLE_HOME/bin in your PATH, and
24 # dont forget about your tnsnames.ora file.  when checking Local
25 # Database status your ORACLE_SID is case sensitive.
26 #
28 PROGNAME=`basename $0`
29 PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`
30 REVISION=`echo '$Revision$' | sed -e 's/[^0-9.]//g'`
32 . $PROGPATH/utils.sh
35 print_usage() {
36   echo "Usage:"
37   echo "  $PROGNAME --tns <Oracle Sid or Hostname/IP address>"
38   echo "  $PROGNAME --db <ORACLE_SID>"
39   echo "  $PROGNAME --login <ORACLE_SID>"
40   echo "  $PROGNAME --oranames <Hostname>"
41   echo "  $PROGNAME --help"
42   echo "  $PROGNAME --version"
43 }
45 print_help() {
46         print_revision $PROGNAME $REVISION
47         echo ""
48         print_usage
49         echo ""
50         echo "Check remote or local TNS status and check local Database status"
51         echo ""
52   echo "--tns=SID/IP Address"
53   echo "   Check remote TNS server"
54   echo "--db=SID"
55   echo "   Check local database (search /bin/ps for PMON process and check"
56         echo "   filesystem for sgadefORACLE_SID.dbf"
57   echo "--login=SID"
58   echo "   Attempt a dummy login and alert if not ORA-01017: invalid username/password"
59   echo "--oranames=Hostname"
60   echo "   Check remote Oracle Names server"
61   echo "--help"
62         echo "   Print this help screen"
63   echo "--version"
64         echo "   Print version and license information"
65         echo ""
66   echo "If the plugin doesn't work, check that the ORACLE_HOME environment"
67         echo "variable is set, that ORACLE_HOME/bin is in your PATH, and the"
68   echo "tnsnames.ora file is locatable and is properly configured."
69   echo ""
70   echo "When checking Local Database status your ORACLE_SID is case sensitive."
71   echo ""
72         support
73 }
75 case "$1" in
76 1)
77     cmd='--tns'
78     ;;
79 2)
80     cmd='--db'
81     ;;
82 *)
83     cmd="$1"
84     ;;
85 esac
87 # Information options
88 case "$cmd" in
89 --help)
90                 print_help
91     exit $STATE_OK
92     ;;
93 -h)
94                 print_help
95     exit $STATE_OK
96     ;;
97 --version)
98                 print_revision $PLUGIN $REVISION
99     exit $STATE_OK
100     ;;
101 -V)
102                 print_revision $PLUGIN $REVISION
103     exit $STATE_OK
104     ;;
105 esac
107 # Hunt down a reasonable ORACLE_HOME
108 if [ -z "$ORACLE_HOME" ] ; then
109         # Adjust to taste
110         for oratab in /var/opt/oracle/oratab /etc/oratab
111         do
112         [ ! -f $oratab ] && continue
113         ORACLE_HOME=`IFS=:
114                 while read SID ORACLE_HOME junk;
115                 do
116                         if [ "$SID" = "$2" ] ; then
117                                 echo $ORACLE_HOME;
118                                 exit;
119                         fi;
120                 done < $oratab`
121         [ -n "$ORACLE_HOME" ] && break
122         done
123 fi
124 # Last resort
125 [ -z "$ORACLE_HOME" -a -d $PROGPATH/oracle ] && ORACLE_HOME=$PROGPATH/oracle
127 if [ -z "$ORACLE_HOME" -o ! -d "$ORACLE_HOME" ] ; then
128         echo "Cannot determine ORACLE_HOME for sid $2"
129         exit $STATE_UNKNOWN
130 fi
131 PATH=$PATH:$ORACLE_HOME/bin
132 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
133 export ORACLE_HOME PATH LD_LIBRARY_PATH
135 case "$cmd" in
136 --tns)
137     tnschk=` tnsping $2`
138     tnschk2=` echo  $tnschk | grep -c OK`
139     if [ ${tnschk2} -eq 1 ] ; then 
140         tnschk3=` echo $tnschk | sed -e 's/.*(//' -e 's/).*//'`
141         echo "OK - reply time ${tnschk3} from $2"
142         exit $STATE_OK
143     else
144         echo "No TNS Listener on $2"
145         exit $STATE_CRITICAL
146     fi
147     ;;
148 --oranames)
149     namesctl status $2 | awk '
150     /Server has been running for:/ {
151         msg = "OK: Up"
152         for (i = 6; i <= NF; i++) {
153             msg = msg " " $i
154         }
155         status = '$STATE_OK'
156     }
157     /error/ {
158         msg = "CRITICAL: " $0
159         status = '$STATE_CRITICAL'
160     }
161     END {
162         print msg
163         exit status
164     }'
165     ;;
166 --db)
167     pmonchk=`ps -ef | grep -v grep | grep ${2} | grep -c pmon`
168     if [ ${pmonchk} -ge 1 ] ; then
169         echo "${2} OK - ${pmonchk} PMON process(es) running"
170         exit $STATE_OK
171     #if [ -f $ORACLE_HOME/dbs/sga*${2}* ] ; then
172         #if [ ${pmonchk} -eq 1 ] ; then
173     #utime=`ls -la $ORACLE_HOME/dbs/sga*$2* | cut -c 43-55`
174             #echo "${2} OK - running since ${utime}"
175             #exit $STATE_OK
176         #fi
177     else
178         echo "${2} Database is DOWN"
179         exit $STATE_CRITICAL
180     fi
181     ;;
182 --login)
183     loginchk=`sqlplus dummy/user@$2 < /dev/null`
184     loginchk2=` echo  $loginchk | grep -c ORA-01017`
185     if [ ${loginchk2} -eq 1 ] ; then 
186         echo "OK - dummy login connected"
187         exit $STATE_OK
188     else
189         loginchk3=` echo "$loginchk" | grep "ORA-" | head -1`
190         echo "CRITICAL - $loginchk3"
191         exit $STATE_CRITICAL
192     fi
193     ;;
194 *)
195     print_usage
196                 exit $STATE_UNKNOWN
197 esac