#! /usr/bin/perl
# anders@fupp.net 2008-04-06
# Check if MySQL tables are within Max_data_length

use Getopt::Std;
use DBI;
use POSIX qw(strftime);

getopts('w:c:');
die("Usage: -w <warn%> -c <crit%>") unless ($opt_w && $opt_c);
$|=1;

$user='root';
$pass='XXXXXX';
$host='localhost';

$port='3306';
$warntext = "";
$crittext = "";

@baser = ();
my $dbh = DBI->connect("DBI:mysql:database=$opt_d:host=$host:port=$port",$user,$pass,{PrintError=>0});
my $dbq = $dbh->prepare("show databases;");
$dbq->execute;
while($row = $dbq->fetchrow_hashref()) {
	push(@baser, $row->{Database});
}
$dbq->finish;

foreach $base (@baser) {
	$dbq = $dbh->prepare("use $base;");
	$dbq->execute;
	$dbq->finish;
#	print "Base: $base\n";
#	$dbq = $dbh->prepare("show tables;");
	$dbq = $dbh->prepare("show table status;");
	$dbq->execute;
	$columns = $dbq->{NAME};
	$kolonner = "@$columns";

	while($row = $dbq->fetchrow_hashref()) {
		$tab = $row->{Name};
#		print "Sjekker tabell $tab.\n";
		$maxsize = int($row->{Max_data_length});
		$size = int($row->{Data_length});
		$mbfree = int(($maxsize-$size)/1024);
		$pfree = int(($maxsize-$size)/$maxsize*100);
#		print "DEBUG Sjekker tab=$tab maxsize=$maxsize size=$size pfree=$pfree mbfree=$mbfree\n";
		if ($pfree <= $opt_c) {
			$crittext .= "$tab (" . $pfree ."%/" . $mbfree . "MB free) ";
		} elsif ($pfree <= $opt_w) {
			$warntext .= "$tab/$base (" . $pfree ."%/" . $mbfree . "MB free) ";
		}

	}
	$dbq->finish;
}
$dbh->disconnect;

if ($crittext) {
	$text = $crittext . $warntext;
	$text =~ s@\ $@@;
	print "CRITCIAL, " . $text . "\n";
	exit(2);
} elsif ($warntext) {
	$text = $warntext;
	$text =~ s@\ $@@;
	print "WARNING, " . $text . "\n";
} else {
	print "OK, 0 tables with less than $opt_w% (warning)/$opt_c% (critical) free diskspace.\n";
	exit(0);
}
