Basic i18n support.
authorGreg Sabino Mullane <greg@endpoint.com>
Sun, 15 Feb 2009 22:36:16 +0000 (17:36 -0500)
committerGreg Sabino Mullane <greg@endpoint.com>
Sun, 15 Feb 2009 22:36:16 +0000 (17:36 -0500)
check_postgres.pl
check_postgres.pl.html
index.html

index 0d5d431b43fa0fd16b1e3d259c28646c9dd31a85..378b3359abdd4c9c0d26ad155aa874203fc0d272 100755 (executable)
@@ -65,7 +65,7 @@ our $YELLNAME = 1;
 
 ## Nothing below this line should need to be changed for normal usage.
 ## If you do find yourself needing to change something,
-## please email the author as it probably indicates something 
+## please email the author as it probably indicates something
 ## that could be made into a command-line option or moved above.
 
 ## Messages are stored in these until the final output via finishup()
@@ -239,6 +239,43 @@ for (sort keys %$action_info) {
        $action_usage .= sprintf " %-*s - %s\n", 2+$longname, $_, $action_info->{$_}[1];
 }
 
+## Standard messages. Translations always welcome
+
+our %msg = (
+       'en' => {
+               'T-EXCLUDE-DB'       => 'No matching databases found due to exclusion/inclusion options',
+               'T-EXCLUDE-FS'       => 'No matching file systems found due to exclusion/inclusion options',
+               'T-EXCLUDE-REL'      => 'No matching relations found due to exclusion/inclusion options',
+               'T-EXCLUDE-SET'      => 'No matching settings found due to exclusion/inclusion options',
+               'T-EXCLUDE-TABLE'    => 'No matching tables found due to exclusion/inclusion options',
+               'T-EXCLUDE-USEROK'   => 'No matching entries found due to user exclusion/inclusion options',
+               'T-BAD-QUERY'        => 'Invalid query returned:',
+               'invalid-psql'       => 'Invalid psql argument: must be full path to a file named psql',
+               'no-find-psql'       => 'Cannot find given psql executable: $1',
+               'no-time-hires'      => q{Cannot find Time::HiRes, needed if 'showtime' is true},
+               'no-psql'            => q{Could not find a suitable psql executable},
+               'no-psql-executable' => q{The file "$1" does not appear to be executable},
+               'no-psql-version'    => q{Could not determine psql version},
+               'create-symlink'     => q{Created "$1"},
+               'symlink-exists'     => q{Not creating "$1": $2 file already exists},
+               'symlink-done'       => qq{Not creating "\$1": \$2 already linked to "\$3"\n},
+               'symlink-fail'       => qq{Could not symlink \$1 to \$2: \$3\n},
+               'no-target-database' => q{No target databases could be found},
+       },
+       'de' => {
+               'T-BAD-QUERY'       => 'Invalid query returned:',
+       },
+       'es' => {
+               'T-BAD-QUERY'       => 'Invalid query returned:',
+       },
+       'fr' => {
+               'T-BAD-QUERY'       => 'Invalid query returned:',
+       },
+       );
+
+my $lang = $ENV{LC_ALL} || $ENV{LC_MESSAGES} || $ENV{LANG} || 'en';
+$lang = substr($lang,0,2);
+
 if ($opt{help}) {
        print qq{Usage: $ME2 <options>
 Run various tests against one or more Postgres databases.
@@ -304,7 +341,7 @@ if ($opt{showtime}) {
                import Time::HiRes qw/gettimeofday tv_interval sleep/;
        };
        if ($@) {
-               die qq{Cannot find Time::HiRes, needed if 'showtime' is true\n};
+               die msg('no-time-hires');
        }
 }
 
@@ -317,6 +354,32 @@ sub ndie {
        exit 3;
 }
 
+sub msg {
+
+       my $name = shift || '?';
+
+       my $msg = '';
+
+       if (exists $msg{$lang}{$name}) {
+               $msg = $msg{$lang}{$name};
+       }
+       elsif (exists $msg{'en'}{$name}) {
+               $msg = $msg{'en'}{$name};
+       }
+       else {
+               return "Invalid message: $name";
+       }
+
+       my $x=1;
+       {
+               last unless $msg =~ s/\$$x/$_[$x-1]/ge;
+               $x++;
+               redo;
+       }
+       return $msg;
+
+} ## end of msg
+
 ## Everything from here on out needs psql, so find and verify a working version:
 if ($NO_PSQL_OPTION) {
        delete $opt{PSQL};
@@ -325,37 +388,23 @@ if ($NO_PSQL_OPTION) {
 if (! defined $PSQL or ! length $PSQL) {
        if (exists $opt{PSQL}) {
                $PSQL = $opt{PSQL};
-               $PSQL =~ m{^/[\w\d\/]*psql$} or ndie qq{Invalid psql argument: must be full path to a file named psql\n};
-               -e $PSQL or ndie qq{Cannot find given psql executable: $PSQL\n};
+               $PSQL =~ m{^/[\w\d\/]*psql$} or ndie msg('invalid-psql');
+               -e $PSQL or ndie msg('no-find-psql', $PSQL);
        }
        else {
                chomp($PSQL = qx{which psql});
-               $PSQL or ndie qq{Could not find a suitable psql executable\n};
+               $PSQL or ndie msg('no-psql');
        }
 }
--x $PSQL or ndie qq{The file "$PSQL" does not appear to be executable\n};
+-x $PSQL or ndie msg('no-psql-executable', $PSQL);
 $res = qx{$PSQL --version};
-$res =~ /^psql \(PostgreSQL\) (\d+\.\d+)/ or ndie qq{Could not determine psql version\n};
+$res =~ /^psql \(PostgreSQL\) (\d+\.\d+)/ or ndie msg('no-psql-version');
 our $psql_version = $1;
 
 $VERBOSE >= 1 and warn qq{psql=$PSQL version=$psql_version\n};
 
 $opt{defaultdb} = $psql_version >= 7.4 ? 'postgres' : 'template1';
 
-## Standard messages. Use these whenever possible when building actions.
-
-our %template =
-       (
-        'T-EXCLUDE-DB'      => 'No matching databases found due to exclusion/inclusion options',
-        'T-EXCLUDE-FS'      => 'No matching file systems found due to exclusion/inclusion options',
-        'T-EXCLUDE-REL'     => 'No matching relations found due to exclusion/inclusion options',
-        'T-EXCLUDE-SET'     => 'No matching settings found due to exclusion/inclusion options',
-        'T-EXCLUDE-TABLE'   => 'No matching tables found due to exclusion/inclusion options',
-        'T-EXCLUDE-USEROK'  => 'No matching entries found due to user exclusion/inclusion options',
-        'T-BAD-QUERY'       => 'Invalid query returned:',
-        );
-
-
 sub add_response {
        my ($type,$msg) = @_;
 
@@ -369,7 +418,7 @@ sub add_response {
        if ($db->{perf}) {
                $perf .= " $db->{perf}";
        }
-       $msg =~ s/(T-[\w\-]+)/$template{$1}/g;
+       $msg =~ s/(T-[\w\-]+)/msg($1)/ge;
        push @{$type->{$header}} => [$msg,$perf];
 }
 
@@ -765,22 +814,22 @@ sub build_symlinks {
                if (-l $file) {
                        if (!$force) {
                                my $source = readlink $file;
-                               print qq{Not creating "$file":$space already linked to "$source"\n};
+                               print msg('symlink-done', $file, $space, $source);
                                next;
                        }
                        print qq{Unlinking "$file":$space };
                        unlink $file or die qq{Failed to unlink "$file": $!\n};
                }
                elsif (-e $file) {
-                       print qq{Not creating "$file":$space file already exists\n};
+                       print msg('symlink-exists', $file, $space);
                        next;
                }
 
                if (symlink $0, $file) {
-                       print qq{Created "$file"\n};
+                       print msg('create-symlink', $file);
                }
                else {
-                       print qq{Could not symlink $file to $ME: $!\n};
+                       print msg('symlink-fail', $file, $ME, $!);
                }
        }
 
@@ -1011,7 +1060,7 @@ sub run_command {
        } ## end GROUP
 
        if (! @target) {
-               ndie qq{No target databases found\n};
+               ndie msg('no-target-database');
        }
 
        ## Create a temp file to store our results
@@ -5238,6 +5287,7 @@ Items not specifically attributed are by Greg Sabino Mullane.
 =item B<Version 2.8.0> (February ??, 2009)
 
   Add the 'disabled_triggers' check.
+  Added basic internationalization support.
 
 =item B<Version 2.7.3> (February 10, 2009)
 
index 0e4304f065db1b0e759be415faebc18d65377b46..145d91c6bf318a9011bddb0e94fd77077f2ffc8e 100644 (file)
@@ -43,6 +43,7 @@
                <li><a href="#custom_query"><strong>custom_query</strong></a></li>
                <li><a href="#database_size"><strong>database_size</strong></a></li>
                <li><a href="#dbstats"><strong>dbstats</strong></a></li>
+               <li><a href="#disabled_triggers"><strong>disabled_triggers</strong></a></li>
                <li><a href="#disk_space"><strong>disk_space</strong></a></li>
                <li><a href="#fsm_pages"><strong>fsm_pages</strong></a></li>
                <li><a href="#fsm_relations"><strong>fsm_relations</strong></a></li>
@@ -92,7 +93,7 @@
 <hr />
 <h1><a name="name">NAME</a></h1>
 <p><strong>check_postgres.pl</strong> - a Postgres monitoring script for Nagios, MRTG, Cacti, and others</p>
-<p>This documents describes check_postgres.pl version 2.7.3</p>
+<p>This documents describes check_postgres.pl version 2.8.0</p>
 <p>
 </p>
 <hr />
@@ -228,7 +229,7 @@ it defaults to 'postgres'.</p>
 <dt><strong><a name="item__2d_2ddbpass_3dpassword"><strong>--dbpass=PASSWORD</strong></a></strong></dt>
 
 <dd>
-<p>Provides the password to connect to the database with. Use of this option is highly discouraged. 
+<p>Provides the password to connect to the database with. Use of this option is highly discouraged.
 Instead, one should use a .pgpass file.</p>
 </dd>
 <dt><strong><a name="item__2d_2ddbservice_3dname"><strong>--dbservice=NAME</strong></a></strong></dt>
@@ -644,6 +645,19 @@ not available in those versions.</p>
   check_postgres_dbstats --dbhost willow --dbname products</pre>
 <p>
 </p>
+<h2><a name="disabled_triggers"><strong>disabled_triggers</strong></a></h2>
+<p>(<code>symlink: check_postgres_disabled_triggers</code>) Checks on the number of disabled triggers inside the database.
+The <em>--warning</em> and <em>--critical</em> options are the number of such triggers found, and both 
+default to &quot;1&quot;, as in normal usage having disabled triggers is a dangerous event. If the 
+database being checked is 8.3 or higher, the check is for the number of triggers that are 
+in a 'disabled' status (as opposed to being 'always' or 'replica'). The output will show 
+the name of the table and the name of the trigger for each disabled trigger.</p>
+<p>Example 1: Make sure that there are no disabled triggers</p>
+<pre>
+  check_postgres_disabled_triggers</pre>
+<p>For MRTG output, returns the number of disabled triggers on the first line.</p>
+<p>
+</p>
 <h2><a name="disk_space"><strong>disk_space</strong></a></h2>
 <p>(<code>symlink: check_postgres_disk_space</code>) Checks on the available physical disk space used by Postgres. This action requires 
 that you have the executable &quot;/bin/df&quot; available to report on disk sizes, and it 
@@ -1235,6 +1249,13 @@ feature requests, and commit notices, send email to <a href="mailto:check_postgr
 <h1><a name="history">HISTORY</a></h1>
 <p>Items not specifically attributed are by Greg Sabino Mullane.</p>
 <dl>
+<dt><strong><a name="item_0"><strong>Version 2.8.0</strong> (February ??, 2009)</a></strong></dt>
+
+<dd>
+<pre>
+  Add the 'disabled_triggers' check.
+  Added basic internationalization support.</pre>
+</dd>
 <dt><strong><a name="item_3"><strong>Version 2.7.3</strong> (February 10, 2009)</a></strong></dt>
 
 <dd>
@@ -1254,7 +1275,7 @@ feature requests, and commit notices, send email to <a href="mailto:check_postgr
 <pre>
   Allow the -p argument for port to work again.</pre>
 </dd>
-<dt><strong><a name="item_0"><strong>Version 2.7.0</strong> (February 4, 2009)</a></strong></dt>
+<dt><strong><strong>Version 2.7.0</strong> (February 4, 2009)</strong></dt>
 
 <dd>
 <pre>
index d525be58d7b3914fe77efdb324d59effb1e63c39..8b981c6b492f62c0e0f5a2b2355c5e909a63d533 100644 (file)
@@ -21,14 +21,14 @@ h1 {
 
 <h1>check_postgres.pl</h1>
 
-<p><b>check_postgres.pl</b> is a script for checking the state of one or more Postgres databases and reporting back in a Nagios-friendly manner. It was developed by Greg Sabino Mullane of <a href="http://www.endpoint.com/">End Point Corporation</a> and is BSD-licensed. The latest version is <b>2.7.3</b>, and was released on February 10, 2009.</p>
+<p><b>check_postgres.pl</b> is a script for checking the state of one or more Postgres databases and reporting back in a Nagios-friendly manner. It was developed by Greg Sabino Mullane of <a href="http://www.endpoint.com/">End Point Corporation</a> and is BSD-licensed. The latest version is <b>2.8.0</b>, and was released on February 15, 2009.</p>
 
 <ul>
- <li><a href="/check_postgres/check_postgres.pl.html">Documentation for check_postgres 2.7.3</a></li>
+ <li><a href="/check_postgres/check_postgres.pl.html">Documentation for check_postgres 2.8.0</a></li>
 </ul>
 <ul>
- <li><a href="/check_postgres/check_postgres.pl">Download check_postgres.pl 2.7.3</a></li>
- <li><a href="/check_postgres/check_postgres.pl.asc">PGP signature for check_postgres.pl 2.7.3</a></li>
+ <li><a href="/check_postgres/check_postgres.pl">Download check_postgres.pl 2.8.0</a></li>
+ <li><a href="/check_postgres/check_postgres.pl.asc">PGP signature for check_postgres.pl 2.8.0</a></li>
 </ul>
 
 <p>The latest development version can be downloaded via git:</p>