#!@@PERL@@ -w # -*- perl -*- =head1 NAME sybase_space - Plugin to monitor sybase database space usage =head1 CONFIGURATION You need to add the user to all the databases you want monitored. Configuration variables: SYBASE - Sybase home SYBASE_USER - Username SYBASE_PASS - Password SYBASE_HOST - Host =head1 MAGIC MARKERS #%# family=manual #%# capabilities= =head1 AUTHOR Copyright (C) 2003-2004 Jimmy Olsen =head1 LICENSE 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; version 2 dated June, 1991. 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. =cut use strict; use DBD::Sybase; use DBI; my $user = $ENV{SYBASE_USER} || "monitor"; my $pass = $ENV{SYBASE_PASS} || "monitor"; my $host = $ENV{SYBASE_HOST} || "localhost"; my $db = $ENV{SYBASE_DB} || "master"; $ENV{SYBASE} = $ENV{SYBASE} || "/usr/local/sybase"; my $dbh = DBI->connect ("dbi:Sybase:$db;host=$host", $user, $pass); if ($ARGV[0] eq "autoconf") { if (!$dbh) { print "no (Could not connect to database.)\n"; exit 0; } print "yes\n"; exit 0; } if (!$dbh) { die "Could not run DBI::connect\n"; } my $databases = &list_dbs ($dbh); if (defined $ARGV[0] and $ARGV[0] =~ /^config$/) { print "host_name sybase-i.fileflow.com\n"; print "graph_title Sybase database space usage\n"; print "graph_args -u 100 -l 0\n"; print "graph_vlabel %\n"; print "graph_category sybase\n"; foreach my $db (keys %{$databases}) { print "$db.label $db\n"; print "$db.type GAUGE\n"; print "$db.warning 85\n"; print "$db.critical 95\n"; } exit 0; } my $db_info; foreach my $db (keys %{$databases}) { $db_info = &space_db ($dbh, $db, $db_info); } foreach my $db (keys %{$db_info}) { #print "$db $db_info->{$db}->{used} / $db_info->{$db}->{total} = ", $db_info->{$db}->{used}*100/$db_info->{$db}->{total}, ".\n"; print "$db.value ", $db_info->{$db}->{used}*100/$db_info->{$db}->{total}, "\n"; } 1; sub list_dbs { my $h = shift; my $dbs = undef; if (! $h->do ("use master")) { die "Error: could not \"use master\"...\n"; } my $sth = $dbh->prepare ("select name from sysdatabases"); my $rv = $sth->execute; if (! $rv) { die "Error: could not run \"select name from sysdatabases\"...\n"; } $dbs = $sth->fetchall_hashref ("name"); return $dbs; } sub space_db { my $h = shift; my $db = shift; my $dbs = shift; if (! $h->do ("use $db")) { die "Error: could not \"use $db\"...\n"; } my $sth = $dbh->prepare ("sp_spaceused"); my $rv = $sth->execute; if (! $rv) { die "Error: could not use \"sp_spaceused\"...\n"; } do { while (my $d = $sth->fetchrow_arrayref) { #print join ('|',@{$d}), "...\n"; if ($d->[0] =~ /^$db$/) { $dbs->{$db}->{total} = &bytes ($d->[1]); } elsif (!$d->[0]) { next; } else { $dbs->{$db}->{used} = &bytes ($d->[0]); } } } while ($sth->{syb_more_results}); return $dbs; } sub bytes { my $val = shift; if ($val =~ /^\s*([\d\.]+)\s*kb\s*$/i) { $val = $1*1024; } elsif ($val =~ /^\s*([\d\.]+)\s*mb\s*$/i) { $val = $1*1024*1024; } elsif ($val =~ /^\s*([\d\.]+)\s*gb\s*$/i) { $val = $1*1024*1024*1024; } return $val; } # vim:syntax=perl