This file is indexed.

/usr/share/munin/plugins/mysql_innodb is in munin-node 1.4.6-3ubuntu3.

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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#!/bin/sh

: << =cut

=head1 NAME

mysql_innodb - Plugin to monitor free space in a pre-allocated innodb
tablespace

=head1 ABOUT

Munin plugin to monitor free space in the InnoDB tablespace of MySQL.
Mostly useful if you use InnoDB on a block device, or if you have
created files for InnoDB storage, and do not want to autoextend the
last file.

If you have set innodb_file_per_table, you do not need to worry about
free tablespace, and you should use the "df" plugin instead.

=head1 USAGE

This plugin should be run as a user with a username and password
stored in ~/.my.cnf, or with --defaults-extra-file pointing to such a
file.

To increase security, the plugin can use its own schema with a simple,
empty table using the InnoDB engine.  To create an empty schema within
the default INNODB tablespace, do the following:

  mysql> CREATE SCHEMA munin_innodb;
  mysql> USE munin_innodb
  mysql> CREATE TABLE something (anything int) ENGINE=InnoDB;
  mysql> GRANT SELECT ON munin_innodb.* TO 'munin'@'localhost' IDENTIFIED BY 'munin';

=head1 CONFIGURATION

Configuration parameters for /etc/munin/mysql_innodb,
if you need to override the defaults below:

 [mysql_innodb]
  env.mysql     - Path to the mysql binary
  env.mysqlopts - Options to pass to mysql (host, username, password)
  env.warning   - Generate a warning if free space goes below this level
  env.critical  - Generate a critical if free space goes below this level

=head2 DEFAULT CONFIGURATION

 [mysql_innodb]
  env.mysql /usr/bin/mysql
  env.mysqlopts --user=munin --password=munin --host=localhost
  env.warning 2147483648
  env.critical 1073741824

=head1 AUTHOR

Stig Sandbeck Mathisen <ssm@fnord.no>

=head1 LICENSE

GNU General Public License, version 2 or any later version

=begin comment

This file is part of Munin.

This program 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; either version 2 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
Street, Fifth Floor, Boston, MA  02110-1301, USA.

=end comment

=head1 MAGIC MARKERS

=begin comment

These magic markers are used by munin-node-configure when installing
munin-node.

=end comment

 #%# family=manual
 #%# capabilities=autoconf

=cut

## Tunable parameters with defaults
MYSQL="${mysql:-/usr/bin/mysql}"
MYSQLOPTS="${mysqlopts:---user=munin --password=munin --host=localhost}"

WARNING=${warning:-2147483648}   # 2GB
CRITICAL=${critical:-1073741824} # 1GB

# Convenient variables
MEXEC="$MYSQL $MYSQLOPTS --batch --skip-column-names --database=information_schema --execute"

## No user serviceable parts below
print_config() {
    echo 'graph_title MySQL InnoDB free tablespace'
    echo 'graph_args --base 1024'
    echo 'graph_vlabel Bytes'
    echo 'graph_category mysql'
    echo 'graph_info Free bytes in the InnoDB tablespace'
    echo 'free.label Bytes free'
    echo 'free.type GAUGE'
    echo 'free.min 0'
    echo 'free.warning' $WARNING:
    echo 'free.critical' $CRITICAL:
    exit 0
}

print_data() {
    innodb_free | xargs -r printf "free.value %s\n"
}

check_autoconf() {

    # Check client
    if [ ! -x $MYSQL ]; then
	echo "no ($MYSQL not executable)"
	return 0
    fi

    # Check server
    $MEXEC "select(1);" | \
	while read res; do
	    case $res in
		1)
		# All is well
		    ;;
		*)
		    echo "no (Could not contact mysql server)"
		    return 0
		    ;;
	    esac
    done

    $MEXEC "SHOW VARIABLES LIKE 'innodb_file_per_table';" | \
	while read var res; do
	    case $res in
		OFF)
		# All is well
		    ;;
		ON)
		    echo "no (innodb_file_per_table is ON, should be OFF)"
		    return 0
		    ;;
		*)
		    echo "no (could not read innodb_file_per_table)"
		    return 0
		    ;;
	    esac
    done

    $MEXEC "SELECT count(*) FROM tables WHERE ENGINE = 'InnoDB';" | \
	while read res; do
	    if [ "$res" = "0" ]; then
		echo "no (No visible tables use InnoDB)"
		return 0
	    fi
    done

    # Default, say "yes" and hope for the best
    echo "yes"
}

# Get major.minor version of the server
mysql_version() {
    $MEXEC "SELECT version();" | awk '{printf "%1.1f", $1}'
}

# InnoDB free bytes for MySQL 5.1 and newer
innodb_free_new() {
    t=$($MEXEC "SELECT count(*) FROM tables WHERE ENGINE = 'InnoDB';")
    if [ "$t" ">" "0" ]; then
	$MEXEC "SELECT data_free FROM tables WHERE ENGINE = 'InnoDB' LIMIT 1;"
    else
	echo >&2 "$0: Error: No visible tables use InnoDB"
	echo U
	return 1
    fi
}

# InnoDB free bytes for MySQL 5.0 and older
innodb_free_old() {
    $MEXEC "SELECT table_comment FROM tables WHERE ENGINE = 'InnoDB' LIMIT 1;" \
	| awk '/^InnoDB free:/ {print $3 * 1024}'
}

# InnoDB free bytes wrapper
innodb_free() {
    ver=$(mysql_version)
    if [ "$ver" ">" "5.0" ]; then
		case $ver in
			5.0.*|5.1.?|5.1.1?|5.1.2[0123])
				innodb_free_old
				;;
			*)
				innodb_free_new
				;;
		esac
    else
	innodb_free_old
    fi
}

# Parse arguments, run correct function
case $1 in
    "autoconf")
	check_autoconf
	;;
    "config")
	print_config
	;;
    *)
	print_data
	;;
esac