diff options
author | Greg Sabino Mullane | 2011-06-07 03:28:13 +0000 |
---|---|---|
committer | Greg Sabino Mullane | 2011-06-07 03:28:13 +0000 |
commit | 88568090e49e51683fc6ba86631be749677a3278 (patch) | |
tree | 16b2229d6d3818db4e2972c065290b131f42f7ed | |
parent | 0e5a87dafcaec05164bc505e0b9955e7a22a602a (diff) |
Allow unlimited number of databases, e.g. dbname2, dbname3, dbname4, ...
-rwxr-xr-x | check_postgres.pl | 177 | ||||
-rw-r--r-- | t/02_same_schema.t | 51 |
2 files changed, 138 insertions, 90 deletions
diff --git a/check_postgres.pl b/check_postgres.pl index 27e327d28..6fcc47993 100755 --- a/check_postgres.pl +++ b/check_postgres.pl @@ -20,7 +20,7 @@ use strict; use warnings; use utf8; use Getopt::Long qw/GetOptions/; -Getopt::Long::Configure(qw/no_ignore_case/); +Getopt::Long::Configure(qw/ no_ignore_case pass_through /); use File::Basename qw/basename/; use File::Temp qw/tempfile tempdir/; File::Temp->safe_level( File::Temp::MEDIUM ); @@ -695,17 +695,18 @@ if (defined $rcfile) { elsif ($name eq 'u' or $name eq 'u1' or $name eq 'dbuser1') { $name = 'dbuser'; } - if ($name eq 'dbport2' or $name eq 'p2') { - $name = 'port2'; + ## Now for all the additional non-1 databases + elsif ($name =~ /^dbport(\d+)$/o or $name eq /^p(\d+)$/o) { + $name = "port$1"; } - elsif ($name eq 'dbhost2' or $name eq 'H2') { - $name = 'host2'; + elsif ($name =~ /^dbhost(\d+)$/o or $name eq /^H(\d+)$/o) { + $name = "host$1"; } - elsif ($name eq 'db2') { - $name = 'dbname2'; + elsif ($name =~ /^db(\d)$/o) { + $name = "dbname$1"; } - elsif ($name eq 'u2') { - $name = 'dbuser2'; + elsif ($name =~ /^u(\d+)$/o) { + $name = 'dbuser$1'; } ## These options are multiples ('@s') @@ -720,67 +721,103 @@ if (defined $rcfile) { close $rc or die; } -die $USAGE unless - GetOptions( - \%opt, - 'version|V', - 'verbose|v+', - 'vv', - 'help|h', - 'quiet|q', - 'man', - 'output=s', - 'simple', - 'showperf=i', - 'perflimit=i', - 'showtime=i', - 'timeout|t=i', - 'test', - 'symlinks', - 'debugoutput=s', - 'no-check_postgresrc', - 'assume-standby-mode', - - 'action=s', - 'warning=s', - 'critical=s', - 'include=s@', - 'exclude=s@', - 'includeuser=s@', - 'excludeuser=s@', - - 'host|dbhost|H|dbhost1|H1=s@', - 'port|dbport|p|port1|dbport1|p1=s@', - 'dbname|db|dbname1|db1=s@', - 'dbuser|u|dbuser1|u1=s@', - 'dbpass|dbpass1=s@', - 'dbservice|dbservice1=s@', - - 'host2|dbhost2|H2=s@', - 'port2|dbport2|p2=s@', - 'dbname2|db2=s@', - 'dbuser2|u2=s@', - 'dbpass2=s@', - 'dbservice2=s@', - - 'PSQL=s', - - 'tempdir=s', - 'get_method=s', - 'language=s', - 'mrtg=s', ## used by MRTG checks only - 'logfile=s', ## used by check_logfile only - 'queryname=s', ## used by query_runtime only - 'query=s', ## used by custom_query only - 'valtype=s', ## used by custom_query only - 'reverse', ## used by custom_query only - 'repinfo=s', ## used by replicate_row only - 'noidle', ## used by backends only - 'datadir=s', ## used by checkpoint only - 'schema=s', ## used by slony_status only - ) - and keys %opt - and ! @ARGV; +die $USAGE if ! @ARGV; + +GetOptions( + \%opt, + 'version|V', + 'verbose|v+', + 'vv', + 'help|h', + 'quiet|q', + 'man', + 'output=s', + 'simple', + 'showperf=i', + 'perflimit=i', + 'showtime=i', + 'timeout|t=i', + 'test', + 'symlinks', + 'debugoutput=s', + 'no-check_postgresrc', + 'assume-standby-mode', + + 'action=s', + 'warning=s', + 'critical=s', + 'include=s@', + 'exclude=s@', + 'includeuser=s@', + 'excludeuser=s@', + + 'host|dbhost|H|dbhost1|H1=s@', + 'port|dbport|p|port1|dbport1|p1=s@', + 'dbname|db|dbname1|db1=s@', + 'dbuser|u|dbuser1|u1=s@', + 'dbpass|dbpass1=s@', + 'dbservice|dbservice1=s@', + + 'PSQL=s', + + 'tempdir=s', + 'get_method=s', + 'language=s', + 'mrtg=s', ## used by MRTG checks only + 'logfile=s', ## used by check_logfile only + 'queryname=s', ## used by query_runtime only + 'query=s', ## used by custom_query only + 'valtype=s', ## used by custom_query only + 'reverse', ## used by custom_query only + 'repinfo=s', ## used by replicate_row only + 'noidle', ## used by backends only + 'datadir=s', ## used by checkpoint only + 'schema=s', ## used by slony_status only +); + +die $USAGE if ! keys %opt and ! @ARGV; + +## Process the args that are not so easy for Getopt::Long +my @badargs; + +while (my $arg = pop @ARGV) { + + ## These must be of the form x=y + if ($arg =~ /^\-?\-?(\w+)\s*=\s*(.+)/o) { + my ($name,$value) = (lc $1, $2); + if ($name =~ /^(?:db)?port(\d+)$/o or $name =~ /^p(\d+)$/o) { + $opt{"port$1"} = $value; + } + elsif ($name =~ /^(?:db)?host(\d+)$/o or $name =~ /^H(\d+)$/o) { + $opt{"host$1"} = $value; + } + elsif ($name =~ /^db(?:name)?(\d+)$/o) { + $opt{"dbname$1"} = $value; + } + elsif ($name =~ /^dbuser(\d+)$/o or $name =~ /^u(\d+)/o) { + $opt{"dbuser$1"} = $value; + } + elsif ($name =~ /^dbpass(\d+)$/o) { + $opt{"dbpass$1"} = $value; + } + elsif ($name =~ /^dbservice(\d+)$/o) { + $opt{"dbservice$1"} = $value; + } + else { + push @badargs => $arg; + } + next; + } + push @badargs => $arg; +} + +if (@badargs) { + warn "Invalid arguments:\n"; + for (@badargs) { + print " $_\n"; + } + die $USAGE; +} if ( $opt{man} ) { require Pod::Usage; diff --git a/t/02_same_schema.t b/t/02_same_schema.t index de49c95b7..877b04568 100644 --- a/t/02_same_schema.t +++ b/t/02_same_schema.t @@ -35,26 +35,34 @@ like ($cp1->run('foobar=12'), $dbh1 = $cp1->recreate_database($dbh1); $dbh2 = $cp2->recreate_database($dbh2); +## Drop any previous users +$dbh1->{AutoCommit} = 1; +$dbh2->{AutoCommit} = 1; +{ + local $dbh1->{Warn} = 0; + local $dbh2->{Warn} = 0; + $dbh1->do(q{DROP USER IF EXISTS user_1_only}); + $dbh2->do(q{DROP USER IF EXISTS user_2_only}); +} + $t = qq{$S succeeds with two empty databases}; like ($cp1->run($stdargs), qr{^$label OK}, $t); #/////////// Users -$dbh1->{AutoCommit} = 1; -$dbh2->{AutoCommit} = 1; $t = qq{$S fails when first schema has an extra user}; $dbh1->do(q{CREATE USER user_1_only}); like ($cp1->run($stdargs), - qr{^$label CRITICAL.*Items not matched: 1\b.*Users in 1 but not 2: user_1_only}, + qr{^$label CRITICAL.*Items not matched: 1 .*Roles in 1 but not 2: user_1_only}s, $t); $dbh1->do(q{DROP USER user_1_only}); $t = qq{$S fails when second schema has an extra user}; $dbh2->do(q{CREATE USER user_2_only}); like ($cp1->run($stdargs), - qr{^$label CRITICAL.*Items not matched: 1\b.*Users in 2 but not 1: user_2_only}, + qr{^$label CRITICAL.*Items not matched: 1 .*Roles in 2 but not 1: user_2_only}s, $t); $dbh2->do(q{DROP USER user_2_only}); @@ -63,18 +71,18 @@ $dbh2->do(q{DROP USER user_2_only}); $t = qq{$S fails when first schema has an extra schema}; $dbh1->do(q{CREATE SCHEMA schema_1_only}); like ($cp1->run($stdargs), - qr{^$label CRITICAL.*Items not matched: 1\b.*Schema in 1 but not 2: schema_1_only}, + qr{^$label CRITICAL.*Items not matched: 1 .*Schemas in 1 but not 2: schema_1_only}s, $t); $t = qq{$S succeeds when noschema filter used}; -like ($cp1->run(qq{--warning=noschema $stdargs}), +like ($cp1->run(qq{--filter=noschema $stdargs}), qr{^$label OK}, $t); $t = qq{$S fails when schemas have different owners}; $dbh1->do(q{ALTER SCHEMA schema_1_only OWNER TO alternate_owner}); $dbh2->do(q{CREATE SCHEMA schema_1_only}); like ($cp1->run($stdargs), - qr{^$label CRITICAL.*Items not matched: 1\b.*Schema "schema_1_only" owned by "alternate_owner"}, + qr{^$label CRITICAL.*Items not matched: 1\b.*Schema "schema_1_only" has an owner of "alternate_owner"}s, $t); $dbh1->do(q{DROP SCHEMA schema_1_only}); @@ -83,18 +91,18 @@ $dbh2->do(q{DROP SCHEMA schema_1_only}); $t = qq{$S fails when second schema has an extra schema}; $dbh2->do(q{CREATE SCHEMA schema_2_only}); like ($cp1->run($stdargs), - qr{^$label CRITICAL.*Items not matched: 1\b.*Schema in 2 but not 1: schema_2_only}, + qr{^$label CRITICAL.*Items not matched: 1\b.*Schemas in 2 but not 1: schema_2_only}s, $t); $t = qq{$S succeeds when noschema filter used}; -like ($cp1->run(qq{--warning=noschema $stdargs}), +like ($cp1->run(qq{--filter=noschema $stdargs}), qr{^$label OK}, $t); $t = qq{$S fails when schemas have different owners}; $dbh2->do(q{ALTER SCHEMA schema_2_only OWNER TO alternate_owner}); $dbh1->do(q{CREATE SCHEMA schema_2_only}); like ($cp1->run($stdargs), - qr{^$label CRITICAL.*Items not matched: 1\b.*Schema "schema_2_only" owned by "check_postgres_testing"}, + qr{^$label CRITICAL.*Items not matched: 1\b.*Schema "schema_2_only" has an owner of "check_postgres_testing"}s, $t); $dbh1->do(q{DROP SCHEMA schema_2_only}); $dbh2->do(q{DROP SCHEMA schema_2_only}); @@ -104,13 +112,16 @@ $dbh2->do(q{DROP SCHEMA schema_2_only}); $t = qq{$S fails when first schema has an extra table}; $dbh1->do(q{CREATE TABLE table_1_only (a int)}); like ($cp1->run($stdargs), - qr{^$label CRITICAL.*Items not matched: 1\b.*Table in 1 but not 2: public.table_1_only}, + qr{^$label CRITICAL.*Items not matched: 1\b.*Tables in 1 but not 2: public.table_1_only}s, $t); $t = qq{$S succeeds when notables filter used}; -like ($cp1->run(qq{--warning=notables $stdargs}), +like ($cp1->run(qq{--filter=notables $stdargs}), qr{^$label OK}, $t); + +exit; + $t = qq{$S fails when tables have different owners}; $dbh1->do(q{ALTER TABLE table_1_only OWNER TO alternate_owner}); $dbh2->do(q{CREATE TABLE table_1_only (a int)}); @@ -127,7 +138,7 @@ like ($cp1->run($stdargs), $t); $t = qq{$S succeeds when notables filter used}; -like ($cp1->run(qq{--warning=notables $stdargs}), +like ($cp1->run(qq{--filter=notables $stdargs}), qr{^$label OK}, $t); $t = qq{$S fails when tables have different owners}; @@ -138,7 +149,7 @@ like ($cp1->run($stdargs), $t); $dbh1->do(q{DROP TABLE table_2_only}); $dbh2->do(q{DROP TABLE table_2_only}); - +exit; $t = qq{$S fails when tables have different permissions}; $dbh1->do(q{CREATE TABLE table_permtest (a int)}); $dbh2->do(q{CREATE TABLE table_permtest (a int)}); @@ -159,7 +170,7 @@ like ($cp1->run($stdargs), $t); $t = qq{$S succeeds when nosequences filter used}; -like ($cp1->run(qq{--warning=nosequences $stdargs}), +like ($cp1->run(qq{--filter=nosequences $stdargs}), qr{^$label OK}, $t); $dbh1->do(q{DROP SEQUENCE sequence_1_only}); @@ -171,7 +182,7 @@ like ($cp1->run($stdargs), $t); $t = qq{$S succeeds when nosequences filter used}; -like ($cp1->run(qq{--warning=nosequences $stdargs}), +like ($cp1->run(qq{--filter=nosequences $stdargs}), qr{^$label OK}, $t); $dbh2->do(q{DROP SEQUENCE sequence_2_only}); @@ -185,7 +196,7 @@ like ($cp1->run($stdargs), $t); $t = qq{$S succeeds when noviews filter used}; -like ($cp1->run(qq{--warning=noviews $stdargs}), +like ($cp1->run(qq{--filter=noviews $stdargs}), qr{^$label OK}, $t); $dbh1->do(q{DROP VIEW view_1_only}); @@ -214,7 +225,7 @@ like ($cp1->run($stdargs), $t); $t = qq{$S succeeds when noviews filter used}; -like ($cp1->run(qq{--warning=noviews $stdargs}), +like ($cp1->run(qq{--filter=noviews $stdargs}), qr{^$label OK}, $t); $dbh2->do(q{DROP VIEW view_2_only}); @@ -233,7 +244,7 @@ like ($cp1->run($stdargs), $t); $t = qq{$S succeeds when notriggers filter used}; -like ($cp1->run(qq{--warning=notriggers $stdargs}), +like ($cp1->run(qq{--filter=notriggers $stdargs}), qr{^$label OK}, $t); $dbh1->do(q{DROP TABLE table_w_trigger}); @@ -278,7 +289,7 @@ $dbh1->do(q{DROP TABLE table_w_another_cons}); $dbh2->do(q{DROP TABLE table_w_another_cons}); $t = qq{$S succeeds when noconstraints filter used}; -like ($cp1->run(qq{--warning=noconstraints $stdargs}), +like ($cp1->run(qq{--filter=noconstraints $stdargs}), qr{^$label OK}, $t); $dbh1->do(q{DROP TABLE table_w_constraint}); |