2 # -*- encoding: utf-8; py-indent-offset: 4 -*-
3 # +------------------------------------------------------------------+
4 # | ____ _ _ __ __ _ __ |
5 # | / ___| |__ ___ ___| | __ | \/ | |/ / |
6 # | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
7 # | | |___| | | | __/ (__| < | | | | . \ |
8 # | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
10 # | Copyright Mathias Kettner 2014 mk@mathias-kettner.de |
11 # +------------------------------------------------------------------+
13 # This file is part of Check_MK.
14 # The official homepage is at http://mathias-kettner.de/check_mk.
16 # check_mk is free software; you can redistribute it and/or modify it
17 # under the terms of the GNU General Public License as published by
18 # the Free Software Foundation in version 2. check_mk is distributed
19 # in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
20 # out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
21 # PARTICULAR PURPOSE. See the GNU General Public License for more de-
22 # tails. You should have received a copy of the GNU General Public
23 # License along with GNU Make; see the file COPYING. If not, write
24 # to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
25 # Boston, MA 02110-1301 USA.
28 # IODBSZ1 SYS SM$CLEAN_AUTO_SPLIT_MERGE SCHEDULED 0 763 TRUE 24.04.13 00:00:00,600000 EUROPE/VIENNA - SUCCEEDED
29 # IODBSZ1 SYS RSE$CLEAN_RECOVERABLE_SCRIPT SCHEDULED 0 763 TRUE 24.04.13 00:00:00,100000 EUROPE/VIENNA - SUCCEEDED
30 # IODBSZ1 SYS BSLN_MAINTAIN_STATS_JOB SCHEDULED 0 110 TRUE 29.04.13 00:00:00,300000 +01:00 BSLN_MAINTAIN_STATS_SCHED SUCCEEDED
31 # IODBSZ1 SYS DRA_REEVALUATE_OPEN_FAILURES SCHEDULED 0 97 TRUE 01.01.70 00:00:00,000000 +02:00 MAINTENANCE_WINDOW_GROUP SUCCEEDED
32 # IODBSZ1 SYS ORA$AUTOTASK_CLEAN SCHEDULED 0 763 TRUE 24.04.13 03:00:00,900000 EUROPE/VIENNA DAILY_PURGE_SCHEDULE SUCCEEDED
33 # IODBSZ1 SYS PURGE_LOG SCHEDULED 0 763 TRUE 24.04.13 03:00:00,800000 EUROPE/VIENNA DAILY_PURGE_SCHEDULE SUCCEEDED
34 # IODBSZ1 ORACLE_OCM MGMT_CONFIG_JOB SCHEDULED 0 97 TRUE 01.01.70 00:00:00,000000 +02:00 MAINTENANCE_WINDOW_GROUP SUCCEEDED
35 # IODBSZ1 ORACLE_OCM MGMT_STATS_CONFIG_JOB SCHEDULED 0 3 TRUE 01.05.13 01:01:01,000000 +01:00 - SUCCEEDED
36 # IODBSZ1 EXFSYS RLM$SCHDNEGACTION SCHEDULED 0 18954 TRUE 23.04.13 14:51:57,000000 +02:00 - SUCCEEDED
37 # IODBSZ1 EXFSYS RLM$EVTCLEANUP SCHEDULED 0 18202 TRUE 23.04.13 13:41:48,200000 +01:00 - SUCCEEDED
40 # <<<oracle_jobs:sep(124)>>>
41 # QS1|SYS|SM$CLEAN_AUTO_SPLIT_MERGE|SCHEDULED|1|877|TRUE|02-AUG-15 12.00.00.500000 AM EUROPE/VIENNA|-|SUCCEEDED
42 # QS1|SYS|RSE$CLEAN_RECOVERABLE_SCRIPT|SCHEDULED|0|877|TRUE|02-AUG-15 12.00.00.800000 AM EUROPE/VIENNA|-|SUCCEEDED
43 # QS1|SYS|FGR$AUTOPURGE_JOB|DISABLED||0|FALSE|01-JAN-70 12.00.00.000000 AM +02:00|-|
44 # QS1|SYS|BSLN_MAINTAIN_STATS_JOB|SCHEDULED|12|128|TRUE|02-AUG-15 12.00.00.600000 AM +01:00|BSLN_MAINTAIN_STATS_SCHED|SUCCEEDED
45 # QS1|SYS|DRA_REEVALUATE_OPEN_FAILURES|SCHEDULED|0|156|TRUE|01-JAN-70 12.00.00.000000 AM +02:00|MAINTENANCE_WINDOW_GROUP|SUCCEEDED
46 # QS1|SYS|HM_CREATE_OFFLINE_DICTIONARY|DISABLED||0|FALSE|01-JAN-70 12.00.00.000000 AM +02:00|MAINTENANCE_WINDOW_GROUP|
47 # QS1|SYS|ORA$AUTOTASK_CLEAN|SCHEDULED|0|877|TRUE|02-AUG-15 03.00.00.200000 AM EUROPE/VIENNA|DAILY_PURGE_SCHEDULE|SUCCEEDED
48 # QS1|SYS|FILE_WATCHER|DISABLED||0|FALSE|01-JAN-70 12.00.00.000000 AM +02:00|FILE_WATCHER_SCHEDULE|
49 # QS1|SYS|PURGE_LOG|SCHEDULED|0|877|TRUE|02-AUG-15 03.00.00.700000 AM EUROPE/VIENNA|DAILY_PURGE_SCHEDULE|SUCCEEDED
50 # QS1|ORACLE_OCM|MGMT_STATS_CONFIG_JOB|DISABLED|0|2|FALSE|01-MAY-15 01.01.01.100000 AM +01:00|-|
51 # QS1|ORACLE_OCM|MGMT_CONFIG_JOB|DISABLED|0|40|FALSE|08-APR-15 01.01.01.200000 AM +01:00|-|
52 # QS1|DBADMIN|DATENEXPORT-FUR|COMPLETED|0|3|FALSE|22-AUG-14 01.11.00.000000 AM EUROPE/BERLIN|-|
54 factory_settings
["oracle_jobs_defaults"] = {
61 def inventory_oracle_jobs(info
):
63 # old format < RDBMS 12.1
64 if len(line
) >= 3 and len(line
) <= 10:
65 yield "%s.%s.%s" % (line
[0], line
[1], line
[2]), {}
67 # new format: sid.pdb_name.job_owner.job_name
68 yield "%s.%s.%s.%s" % (line
[0], line
[1], line
[2], line
[3]), {}
71 def check_oracle_jobs(item
, params
, info
):
73 # only extract the sid from item.
74 sid
= item
[0:item
.index('.', 0)]
85 # check for pdb_name in agent output
86 # => the agentoutput is responsible for the format of item from Check_MK!
87 # item could have the following formats. Keep in mind, that job_name could include a '.'!
89 # => sid.pdb_name.job_owner.job_name
90 itemsid
, itempdb
, itemowner
, itemname
= item
.split('.', 4)
93 sid
, job_pdb
, job_owner
, job_name
, job_state
, job_runtime
, _job_run_count
, \
94 job_enabled
, job_nextrun
, job_schedule
, job_last_state
= line
97 # sid.job_owner.job_name
98 itemsid
, itemowner
, itemname
= item
.split('.', 3)
102 sid
, job_owner
, job_name
, job_state
, job_runtime
, _job_run_count
, \
103 job_enabled
, job_nextrun
, job_schedule
, job_last_state
= line
106 # really old plugins without job_owner...
107 # this should be removed in a future release!
110 itemsid
, itemname
= item
.split('.', 2)
117 job_runtime
= line
[4]
118 job_enabled
= line
[6]
119 job_nextrun
= " ".join(line
[7:-3])
120 job_schedule
= line
[-2]
121 job_last_state
= line
[-1]
123 if (lineformat
== 3 and itemname
== job_name
and itemowner
== job_owner
and itempdb
== job_pdb
and itemsid
== sid
) \
124 or(lineformat
== 2 and itemname
== job_name
and itemowner
== job_owner
and itemsid
== sid
) \
125 or(lineformat
== 1 and itemname
== job_name
and itemsid
== sid
):
128 param_disabled
= params
["disabled"]
133 # In case of missing information we assume that the login into
134 # the database has failed and we simply skip this check. It won't
135 # switch to UNKNOWN, but will get stale.
136 raise MKCounterWrapped("Login not possible for check %s" % item
)
138 if not service_found
:
139 missingjob
= params
.get('missingjob')
140 state
= max(state
, missingjob
)
141 return (state
, 'Job is missing')
147 txt
= "Job-State: %s" % job_state
148 if job_state
== "BROKEN":
150 state
= max(state
, 2)
153 txt
= "Enabled: %s" % (job_enabled
== "TRUE" and "Yes" or "No")
154 if job_enabled
!= "TRUE" and job_state
!= 'RUNNING':
159 state
= max(state
, 1)
162 if job_runtime
== '' or job_runtime
== 'SCHEDULED':
165 last_duration
= int(job_runtime
.replace('.', ',').split(',', 1)[0])
166 # bugfix for an error in mk_oracle agent with missing round over last_duration
167 output
.append("Last Duration: %s" % (get_age_human_readable(last_duration
)))
169 if "run_duration" in params
:
170 warn
, crit
= params
["run_duration"]
172 output
.append(" (warn/crit at %ds/%ds)" % (warn
, crit
))
174 if last_duration
>= crit
:
175 output
.append("(!!)")
176 state
= max(state
, 2)
177 elif last_duration
>= warn
:
179 state
= max(state
, 1)
181 perfdata
.append(("duration", last_duration
))
183 # 01.05.13 01:01:01,000000 +01:00
184 if job_nextrun
.startswith("01.01.70 00:00:00"):
185 if job_schedule
== "-" and job_state
!= "DISABLED":
186 job_nextrun
= "not scheduled(!)"
187 state
= max(state
, 1)
189 job_nextrun
= job_schedule
190 output
.append("Next Run: %s" % job_nextrun
)
192 if "missinglog" in params
:
193 missinglog
= params
["missinglog"]
197 # A job who is running forever has no last run state and job_last_state is
199 if job_state
== "RUNNING" and job_runtime
== '' and job_last_state
== 'STOPPED':
200 txt
= 'Job is running forever'
203 if job_last_state
== '':
204 # no information from job log (outer join in SQL is empty)
205 txt
= ' no log information found'
209 elif missinglog
== 1:
211 elif missinglog
== 2:
213 elif missinglog
== 3:
217 state
= max(state
, missinglog
)
220 txt
= "Last Run Status: %s" % (job_last_state
)
222 if job_enabled
== "TRUE" and job_last_state
!= "SUCCEEDED":
223 state
= max(state
, 2)
225 txt
+= ' (ignored disabled Job)'
228 if job_state
== "DISABLED" and "status_disabled_jobs" in params
:
229 state
= params
["status_disabled_jobs"]
231 return (state
, ", ".join(output
), perfdata
)
234 check_info
['oracle_jobs'] = {
235 "service_description": "ORA %s Job",
236 "group": "oracle_jobs",
237 "check_function": check_oracle_jobs
,
238 "inventory_function": inventory_oracle_jobs
,
239 "has_perfdata": True,
240 "default_levels_variable": "oracle_jobs_defaults",