This file is indexed.

/usr/share/check_mk/checks/oracle_tablespaces is in check-mk-server 1.1.12-1ubuntu1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# +------------------------------------------------------------------+
# |             ____ _               _        __  __ _  __           |
# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |
# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |
# |           | |___| | | |  __/ (__|   <    | |  | | . \            |
# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |
# |                                                                  |
# | Copyright Mathias Kettner 2010             mk@mathias-kettner.de |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk 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 in version 2.  check_mk is  distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with-
# out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A
# PARTICULAR PURPOSE. See the  GNU General Public License for more de-
# ails.  You should have  received  a copy of the  GNU  General Public
# License along with GNU Make; see the file  COPYING.  If  not,  write
# to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,
# Boston, MA 02110-1301 USA.

# <<<oracle_tablespaces>>>
# pengt /database/pengt/daten155/dbf/system_01.dbf SYSTEM AVAILABLE YES 38400 4194302 38392 1280 SYSTEM 8192 ONLINE
# pengt /database/pengt/daten155/dbf/undotbs_01.dbf UNDOTBS1 AVAILABLE YES 128000 4194302 127992 640 ONLINE 8192 ONLINE
# pengt /database/pengt/daten155/dbf/sysaux_01.dbf SYSAUX AVAILABLE YES 25600 4194302 25592 1280 ONLINE 8192 ONLINE
# pengt /database/pengt/daten155/dbf/ts_user_01.dbf TS_USER AVAILABLE YES 8480 1280000 8472 160 ONLINE 8192 ONLINE
# pengt /database/pengt/daten155/dbf/TS_PENG_ABR_01.dbf TS_PENG_ABR AVAILABLE YES 12800 1280000 12792 12800 ONLINE 8192 ONLINE

#
# Order of columns (it is a table of data files, so table spaces appear multiple times)
# 0. database SID
# 1. data file name
# 2. table space name
# 3. status of the data file
# 4. whether the file is auto extensible
# 5. current size of data file in blocks
# 6. maximum size of data file in blocks (if auto extensible)
# 7. currently number of blocks used by user data
# 8. size of next increment in blocks (if auto extensible)
# 9. wheter the file is in use (online)
# 10. block size in bytes
# 11. status of the table space

# default levels for *free* space. float: percent,
# integer: MB.
oracle_tablespaces_default_levels = (10.0, 5.0)

# Whether to check auto extend settings
oracle_tablespaces_check_autoext = True

# Whether to check default increment size
oracle_tablespaces_check_default_increment = True

def inventory_oracle_tablespaces(info):
    tablespaces = set([])
    autoextensible = set([])
    for line in info:
        ts = (line[0], line[2])
        if line[11] in [ "ONLINE", "READONLY" ]:
            tablespaces.add(ts)
        if line[4] == "YES":
            autoextensible.add(ts)

    inventory = []
    for t in tablespaces:
        if oracle_tablespaces_check_autoext:
            ae = t in autoextensible
        else:
            ae = None # means: ignore, only display setting
        inventory.append( ("%s.%s" % t,
       "(%s, oracle_tablespaces_default_levels[0], oracle_tablespaces_default_levels[1])" % ae))
    return inventory

def check_oracle_tablespaces(item, params, info):
    sid, tbsname = item.split('.')
    ts_status = None
    num_files = 0
    num_avail = 0
    num_extensible = 0
    current_size = 0
    max_size = 0
    used = 0
    num_increments = 0
    increment_size = 0
    free_space = 0

    uses_default_increment = False

    for line in info:
        if line[0] == sid and line[2] == tbsname:
            ts_status = line[11]
            blocksize = int(line[10])
            num_files += 1
            if line[3] in [ "AVAILABLE", "ONLINE", "READONLY" ]:
                num_avail += 1
                current_size += blocksize * int(line[5])
                used += blocksize * int(line[7])
                # Autoextensible? Honor max size
                if line[4] == "YES":
                    num_extensible += 1
                    my_max_size = blocksize * int(line[6])
                    max_size += my_max_size
                    free_bl = int(line[6]) - int(line[5]) # number of free extension blocks
                    incsize = int(line[8]) # size of next increment in blocks
                    if incsize == 1:
                        uses_default_increment = True
                    incs = free_bl / incsize
                    num_increments += incs
                    increment_size += blocksize * incsize * incs
                    free_space += blocksize * (incsize * incs + (int(line[5]) - int(line[7])))
                # not autoextensible: take current size as maximum
                else:
                    my_max_size = blocksize * int(line[5])
                    max_size += my_max_size
                    free_space += blocksize * (int(line[5]) - int(line[7]))


    if ts_status == None:
        return (3, "UNKNOWN - Tablespace not found")

    infotext = " - %s, size %s, used %s" % \
       (ts_status,
        get_bytes_human_readable(current_size),
        get_bytes_human_readable(used))

    if num_extensible > 0:
        infotext += ", max %s" % get_bytes_human_readable(max_size)
        infotext += " - %d increments (%s)" % \
            (num_increments, get_bytes_human_readable(increment_size))

    status = 0
    autoext, warn, crit = params

    # Check increment size, should not be set to default (1)
    if oracle_tablespaces_check_default_increment:
        if uses_default_increment:
            infotext += ", DEFAULT INCREMENT!"
            status = 1

    # Check autoextend status if parameter not set to None
    if autoext != None:
        if autoext and num_extensible == 0:
            infotext += ", AUTOEXTEND!!"
            status = 2
        elif not autoext and num_extensible > 0:
            infotext += ", NO AUTOTEXTEND!!"
            status = 2
    elif num_extensible > 0:
        infotext += ", autoextend"
    else:
        infotext += ", no autoextend"

    # warn/crit level are float => percentages of max size, otherwise MB
    if type(warn) == float:
        warn = warn / 100.0 * max_size
    else:
        warn *= 1024 * 1024

    if type(crit) == float:
        crit = crit / 100.0 * max_size
    else:
        crit *= 1024 * 1024

    # Check free space, but only if status is not READONLY
    if ts_status != "READONLY":
        if free_space <= crit or free_space <= warn:
            infotext += ", only %s left" % get_bytes_human_readable(free_space)
            infotext += " (levels at %s/%s)" % (
             get_bytes_human_readable(warn), get_bytes_human_readable(crit))
            if free_space <= crit:
                status = 2
            else:
                status = max(1, status)

    perfdata = [ ("size", current_size, max_size - warn, max_size - crit),
                 ("used", used),
                 ("max_size", max_size) ]

    if num_files != 1 or num_avail != 1 or num_extensible != 1:
        infotext += ", %d data files (%d avail, %d autoext)" % (num_files, num_avail, num_extensible)

    return (status, nagios_state_names[status] + infotext, perfdata)

check_info['oracle_tablespaces'] = (check_oracle_tablespaces, "ORA %s Tablespace", 1,  inventory_oracle_tablespaces )
check_config_variables.append("oracle_tablespaces_check_default_increment")