Skip to content

Commit 8003f3c

Browse files
committed
Try harder to find the pg_controldata executable
1 parent 9fc7a98 commit 8003f3c

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

check_postgres.pl

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ package check_postgres;
2323
use Getopt::Long qw/GetOptions/;
2424
Getopt::Long::Configure(qw/ no_ignore_case pass_through /);
2525
use File::Basename qw/basename/;
26-
use File::Spec;
26+
use File::Spec::Functions;
2727
use File::Temp qw/tempfile tempdir/;
2828
File::Temp->safe_level( File::Temp::MEDIUM );
2929
use Cwd;
@@ -113,6 +113,7 @@ package check_postgres;
113113
'checkpoint-baddir2' => q{pg_controldata could not read the given data directory: "$1"},
114114
'checkpoint-badver' => q{Failed to run pg_controldata - probably the wrong version ($1)},
115115
'checkpoint-badver2' => q{Failed to run pg_controldata - is it the correct version?},
116+
'checkpoint-nobin' => q{Could not find a suitable pg_controldata executable},
116117
'checkpoint-nodir' => q{Must supply a --datadir argument or set the PGDATA environment variable},
117118
'checkpoint-nodp' => q{Must install the Perl module Date::Parse to use the checkpoint action},
118119
'checkpoint-noparse' => q{Unable to parse pg_controldata output: "$1"},
@@ -373,6 +374,7 @@ package check_postgres;
373374
'checkpoint-baddir2' => q{pg_controldata no pudo leer el directorio de datos: "$1"},
374375
'checkpoint-badver' => q{Fallo al ejecutar pg_controldata - probable que la versión sea incorrecta ($1)},
375376
'checkpoint-badver2' => q{Fallo al ejecutar pg_controldata - verifique que es la versión correcta},
377+
'checkpoint-nobin' => q{Could not find a suitable pg_controldata executable},
376378
'checkpoint-nodir' => q{Debe especificar el argumento --datadir o definir la variable de ambiente PGDATA},
377379
'checkpoint-nodp' => q{Debe instalar el módulo Perl Date::Parse para usar la acción checkpoint},
378380
'checkpoint-noparse' => q{No se pudo interpretar la salida de pg_controldata: "$1"},
@@ -631,6 +633,7 @@ package check_postgres;
631633
'checkpoint-baddir2' => q{pg_controldata n'a pas pu lire le répertoire des données indiqué : « $1 »},
632634
'checkpoint-badver' => q{Échec lors de l'exécution de pg_controldata - probablement la mauvaise version ($1)},
633635
'checkpoint-badver2' => q{Échec lors de l'exécution de pg_controldata - est-ce la bonne version ?},
636+
'checkpoint-nobin' => q{Could not find a suitable pg_controldata executable},
634637
'checkpoint-nodir' => q{Vous devez fournir un argument --datadir ou configurer la variable d'environnement PGDATA},
635638
'checkpoint-nodp' => q{Vous devez installer le module Perl Date::Parse pour utiliser l'action checkpoint},
636639
'checkpoint-noparse' => q{Incapable d'analyser le résultat de la commande pg_controldata : "$1"},
@@ -895,6 +898,7 @@ package check_postgres;
895898
'checkpoint-baddir2' => q{pg_controldata konnte das angebene Verzeichnis lesen: "$1"},
896899
'checkpoint-badver' => q{Kann pg_controldata nicht starten - vielleicht die falsche Version ($1)},
897900
'checkpoint-badver2' => q{Fehler beim Start von pg_controldata - ist es die richtige Version?},
901+
'checkpoint-nobin' => q{Could not find a suitable pg_controldata executable},
898902
'checkpoint-nodir' => q{Entweder muss die Option --datadir als Argument angegebn werden, oder die Umgebungsvariable PGDATA muss gesetzt sein},
899903
'checkpoint-nodp' => q{Das Perl-Modul Date::Parse muss installiert sein für die Verwendung der checkpoint-Aktion},
900904
'checkpoint-noparse' => q{Kann die Ausgabe von pg_controldata nicht lesen: "$1"},
@@ -3912,16 +3916,40 @@ sub open_controldata {
39123916
}
39133917

39143918
## Run pg_controldata
3915-
## We still catch deprecated option
39163919
my $pgc;
39173920
if (defined $ENV{PGCONTROLDATA} and length $ENV{PGCONTROLDATA}) {
39183921
$pgc = "$ENV{PGCONTROLDATA}";
39193922
}
3923+
elsif (defined $ENV{PGBINDIR} and length $ENV{PGBINDIR}) {
3924+
$pgc = "$PGBINDIR/pg_controldata";
3925+
}
39203926
else {
3921-
$pgc = (defined $PGBINDIR) ? "$PGBINDIR/pg_controldata" : 'pg_controldata';
3922-
chomp($pgc = qx{which "$pgc"});
3927+
my $pgctry = 'pg_controldata';
3928+
my $result = qx{$pgctry --version 2>/dev/null};
3929+
if ($result =~ /\d/) {
3930+
$pgc = $pgctry;
3931+
}
3932+
else {
3933+
## Need to refactor this someday
3934+
my $basedir = '/usr/lib/postgresql/';
3935+
if (opendir my $dh, $basedir) {
3936+
for my $subdir (sort { $b <=> $a } grep { /^\d+[\d\.]+$/ } readdir $dh) {
3937+
$pgctry = catfile($basedir, $subdir, 'bin', 'pg_controldata');
3938+
next if ! -e $pgctry;
3939+
$result = qx{$pgctry --version 2>/dev/null};
3940+
if ($result =~ /\d/) {
3941+
$pgc = $pgctry;
3942+
last;
3943+
}
3944+
}
3945+
closedir $dh;
3946+
}
3947+
if (! defined $pgc) {
3948+
ndie msg('checkpoint-nobin');
3949+
}
3950+
}
39233951
}
3924-
-x $pgc or ndie msg('opt-psql-noexec', $pgc);
3952+
-x $pgc or ndie msg('checkpoint-nobin');
39253953

39263954
$COM = qq{$pgc "$dir"};
39273955
eval {
@@ -7625,7 +7653,7 @@ sub audit_filename {
76257653
my $adir = $opt{'audit-file-dir'};
76267654
if (defined $adir) {
76277655
-d $adir or die qq{Cannot write to directory "$adir": $!\n};
7628-
$filename = File::Spec->catfile($adir, $filename);
7656+
$filename = catfile($adir, $filename);
76297657
}
76307658

76317659
return $filename;

t/02_checkpoint.t

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ like ($cp->run('-c 10 --datadir=foobar'), qr{^ERROR: Invalid data_directory}, $t
4141
my $host = $cp->get_dbhost();
4242
$t=qq{$S fails when called against a non datadir datadir};
4343
like ($cp->run(qq{-c 10 --datadir="$host"}), qr{^ERROR:.+could not read the given data directory}, $t);
44-
exit;
4544

4645
$t=qq{$S works when called for a recent checkpoint};
4746
my $dbh = $cp->get_dbh();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy