Your message dated Sun, 13 Aug 2017 17:55:31 +0200
with message-id <[email protected]>
and subject line Re: Bug#585613: postgresql-common scripts should accept 
alphanumerical version id
has caused the Debian Bug report #585613,
regarding postgresql-common scripts should accept alphanumerical version id
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
585613: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=585613
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: postgresql-common
Version: 94lenny1

I need to run a customized postgresql installation and wanted to get good
integration into the debian installation when I realized that the highly useful
postgresql-common scripts only support purely numerical version ids. Here's a
simplistic example:

# pg_createcluster 8.3nfs test
Use of uninitialized value $version in concatenation (.) or string at
/usr/bin/pg_createcluster line 281.
Use of uninitialized value $version in concatenation (.) or string at
/usr/bin/pg_createcluster line 282.
Use of uninitialized value $version in concatenation (.) or string at
/usr/bin/pg_createcluster line 286.
Error: invalid version:

I'll attach suggested patches to extend the scripts to also handle
alphanumerical version ids matching the regexp

        [a-z]*\d+.\d+[a-z]*

This was seen on:

# uname -a
Linux <name> 2.6.26-2-amd64 #1 SMP Tue Mar 9 22:29:32 UTC 2010 x86_64 GNU/Linux
# cat /etc/debian_version
5.0.4

Thank you,

Nils

-- 

** * * UPLEX - Nils Goroll Systemoptimierung

Schwanenwik 24
22087 Hamburg

tel +49 40 28805731
mob +49 170 2723133
fax +49 40 42949753

http://uplex.de/
diff -rub usr/bin.o/pg_createcluster usr/bin/pg_createcluster
--- usr/bin.o/pg_createcluster  2009-02-06 00:00:51.000000000 +0100
+++ usr/bin/pg_createcluster    2010-06-11 18:26:55.000000000 +0200
@@ -50,16 +50,19 @@
 sub init_db {
     $datadir = (-l $_[1]) ? readlink $_[1] : $_[1];
 
+    my $v;
+    ($v = $_[0])  =~ y/0-9.//cd;
+
     if (system 'install', '-d', '-o', $_[2], '-g', $_[3], $datadir) {
         error 'could not create data directory; you might need to run this 
program with root privileges';
     }
 
     @initdb = ((get_program_path 'initdb', $_[0]), '-D', $datadir);
-    if ($_[0] ge '8.0') {
+    if ($v ge '8.0') {
         push @initdb, ('-A', 'ident sameuser');
     }
     die 'Internal error: could not determine initdb path' unless $initdb[0];
-    if (!$encoding and $version < 8) { 
+    if (!$encoding and $nversion < 8) { 
         $encoding = get_encoding_from_locale();
     }
     push @initdb, ('--encoding', $encoding) if $encoding;
@@ -73,7 +76,7 @@
 
     # pre-8.2 servers do not ignore LANG when LC_ALL is set; work around this
     # bug
-    if ($_[0] le '8.2' && $ENV{'LC_ALL'}) {
+    if ($v le '8.2' && $ENV{'LC_ALL'}) {
         $ENV{'LANG'} = $ENV{'LC_ALL'};
     }
 
@@ -106,7 +109,7 @@
 
        @pathcomps = split ('/', $file);
        $target .= '/' . $pathcomps[-1];
-        if ($version lt '8') {
+        if ($nversion lt '8') {
             $oldgid = $);
             $olduid = $>;
             $) = $gid;
@@ -274,7 +277,8 @@
 
 error 'clusters must not be owned by root' unless $owneruid && $ownergid;
 
-($version) = $ARGV[0] =~ /^(\d+\.\d+)$/;
+($version) = $ARGV[0] =~ /^([a-z]*\d+\.\d+[a-z]*)$/;
+($nversion = $version)  =~ y/0-9.//cd;
 ($cluster) = $ARGV[1] =~ /^([-.\w]+)$/;
 error 'invalid cluster name' unless defined $cluster;
 
@@ -337,7 +341,7 @@
 move_conffile "$datadir/pg_ident.conf", $confdir, $owneruid, $ownergid, '640', 
'ident_file';
 chown $owneruid, $ownergid, $datadir, $confdir, "$confdir/start.conf" or die 
"chown: $!";
 
-if ($version ge '8.0') {
+if ($nversion ge '8.0') {
     PgCommon::set_conf_value $version, $cluster, 'postgresql.conf', 
'data_directory', $datadir;
 } else {
     # pre-8.0 clusters did not have data_directory and thus need a pgdata 
symlink
@@ -395,7 +399,7 @@
 }
 
 # create autovacuum log file for servers < 8.1
-if ($version < 8.1) {
+if ($nversion < 8.1) {
     $real_logfile = "/var/log/postgresql/pg_autovacuum-$version-$cluster.log";
     if (! -e $real_logfile) {
         open L, ">$real_logfile" or error "could not create log file 
$real_logfile";
@@ -407,7 +411,7 @@
 }
 
 # version specific default configuration tweaking
-$conf_fn = "configure_$version";
+$conf_fn = "configure_$nversion";
 $conf_fn =~tr/./_/;
 &$conf_fn if defined &$conf_fn and $newcluster;
 
@@ -426,7 +430,7 @@
 # so, enable SSL
 
 if ($newcluster && -e '/etc/ssl/certs/ssl-cert-snakeoil.pem' && 
-    $ssl_key_access && $version ge '8.0') {
+    $ssl_key_access && $nversion ge '8.0') {
     symlink '/etc/ssl/certs/ssl-cert-snakeoil.pem', $datadir.'/server.crt';
     symlink '/etc/ssl/private/ssl-cert-snakeoil.key', $datadir.'/server.key';
 
@@ -455,7 +459,7 @@
 $createsuccess = 1;
 
 # configure to create external PID file
-if ($version ge '8.0' && $socketdir eq '/var/run/postgresql') {
+if ($nversion ge '8.0' && $socketdir eq '/var/run/postgresql') {
     PgCommon::set_conf_value $version, $cluster, 'postgresql.conf', 
'external_pid_file', "/var/run/postgresql/$version-$cluster.pid";
 }
 
diff -rub usr/bin.o/pg_ctlcluster usr/bin/pg_ctlcluster
--- usr/bin.o/pg_ctlcluster     2009-02-06 00:02:22.000000000 +0100
+++ usr/bin/pg_ctlcluster       2010-06-11 18:29:34.000000000 +0200
@@ -131,7 +131,7 @@
 }
 
 sub autovacuum_start {
-    if ($version ge '8.1') {
+    if ($nversion ge '8.1') {
        error 'PostgreSQL 8.1 and above has an integrated autovacuum daemon 
which cannot be controlled by this program.';
     }
 
@@ -207,7 +207,7 @@
 }
 
 sub autovacuum_stop {
-    if ($version ge '8.1') {
+    if ($nversion ge '8.1') {
        error 'PostgreSQL 8.1 and above has an integrated autovacuum daemon 
which cannot be controlled by this program.';
     }
 
@@ -226,7 +226,7 @@
 }
 
 sub autovacuum_restart {
-    if ($version ge '8.1') {
+    if ($nversion ge '8.1') {
        error 'PostgreSQL 8.1 and above has an integrated autovacuum daemon 
which cannot be controlled by this program.';
     }
 
@@ -262,7 +262,7 @@
     }
 
     # versions 8.0+ support configurable conffile locations and external PID 
files
-    if ($version ge '8.0') {
+    if ($nversion ge '8.0') {
         $postmaster_opts .= " -c config_file=\"$cdir/postgresql.conf\""; 
        if (!(PgCommon::get_conf_value $version, $cluster, 'postgresql.conf', 
'hba_file')) {
            $postmaster_opts .= " -c hba_file=\"$cdir/pg_hba.conf\"";
@@ -348,7 +348,7 @@
     }
 
     if ($success) {
-        if ($version lt '8.1' && $info{'avac_enable'} && $pg_autovacuum) {
+        if ($nversion lt '8.1' && $info{'avac_enable'} && $pg_autovacuum) {
             autovacuum_start;
         }
     } else {
@@ -426,7 +426,8 @@
 }
 
 ($version, $cluster, $action) = @ARGV;
-($version) = $version =~ /^(\d+\.\d+)$/; # untaint
+($version) = $version =~ /^([a-z]*\d+\.\d+[a-z]*)$/; # untaint
+($nversion = $version)  =~ y/0-9.//cd;
 ($cluster) = $cluster =~ /^([^'"\s]+)$/; # untaint
 error 'specified cluster does not exist' unless $version && $cluster && 
cluster_exists $version, $cluster;
 %info = cluster_info ($version, $cluster);
diff -rub usr/bin.o/pg_dropcluster usr/bin/pg_dropcluster
--- usr/bin.o/pg_dropcluster    2009-02-06 00:00:51.000000000 +0100
+++ usr/bin/pg_dropcluster      2010-06-11 18:30:38.000000000 +0200
@@ -22,7 +22,8 @@
     exit 1;
 }
 
-($version) = $ARGV[0] =~ /^(\d+\.\d+)$/;
+($version) = $ARGV[0] =~ /^([a-z]*\d+\.\d+[a-z]*)$/;
+($nversion = $version)  =~ y/0-9.//cd;
 ($cluster) = $ARGV[1] =~ /^([-.\w]+)$/;
 error 'invalid version' unless defined $version;
 error 'invalid cluster name' unless defined $cluster;
diff -rub usr/bin.o/pg_upgradecluster usr/bin/pg_upgradecluster
--- usr/bin.o/pg_upgradecluster 2009-02-06 00:00:51.000000000 +0100
+++ usr/bin/pg_upgradecluster   2010-06-11 18:43:39.000000000 +0200
@@ -15,7 +15,7 @@
 $ENV{'PATH'} = '/bin:/usr/bin';
 delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
 
-my ($version, $newversion, $cluster);
+my ($version, $newversion, $nversion, $nnewversion, $cluster);
 my (%info, %newinfo);
 
 # do not trip over cwd not being accessible to postgres superuser
@@ -60,7 +60,7 @@
        'ident_file', strrepl($c{'ident_file'}, $version, $newversion) if 
$c{'ident_file'};
     PgCommon::set_conf_value $newversion, $cluster, 'postgresql.conf',
        'external_pid_file', strrepl($c{'external_pid_file'}, $version, 
$newversion) if $c{'external_pid_file'};
-    if ($newversion ge '8.0') {
+    if ($nnewversion ge '8.0') {
         PgCommon::set_conf_value $newversion, $cluster, 'postgresql.conf',
             'data_directory', $newinfo{'pgdata'};
     }
@@ -87,7 +87,7 @@
     }
 
     # sort_mem -> work_mem transition
-    rename_ \%c, 'sort_mem', 'work_mem' if $newversion ge '8.0';
+    rename_ \%c, 'sort_mem', 'work_mem' if $nnewversion ge '8.0';
 
     # log_statement transition
     if (defined $c{'log_statement'}) {
@@ -115,7 +115,7 @@
     # obsolete max_expr_depth
     deprecate \%c, 'max_expr_depth', 'does not exist any more, look at 
max_stack_depth';
 
-    if ($newversion ge '8.1') {
+    if ($nnewversion ge '8.1') {
         # obsolete rendezvous_name 
         deprecate \%c, 'rendezvous_name', 'obsolete in 8.1';
 
@@ -129,7 +129,7 @@
         rename_ \%c, 'bgwriter_maxpages', 'bgwriter_all_maxpages';
     }
 
-    if ($newversion ge '8.2') {
+    if ($nnewversion ge '8.2') {
         # preload_libraries -> shared_preload_libraries transition
         rename_ \%c, 'preload_libraries', 'shared_preload_libraries';
 
@@ -142,7 +142,7 @@
        }
     }
 
-    if ($newversion ge '8.3') {
+    if ($nnewversion ge '8.3') {
         deprecate \%c, 'bgwriter_lru_percent', 'deprecated';
         deprecate \%c, 'bgwriter_all_percent', 'deprecated';
         deprecate \%c, 'bgwriter_all_maxpages', 'deprecated';
@@ -214,7 +214,8 @@
     'lc-time=s' => \$lc_time);
 
 # untaint
-($newversion) = $newversion =~ /^(\d+\.\d+)$/;
+($newversion) = $newversion =~ /^([a-z]*\d+\.\d+[a-z]*)$/;
+($nnewversion = $newversion)  =~ y/0-9.//cd;
 ($locale) = $locale =~ /^([\w@._-]+)$/ if $locale;
 ($lc_collate) = $lc_collate =~ /^([\w@._-]+)$/ if $lc_collate;
 ($lc_ctype) = $lc_ctype =~ /^([\w@._-]+)$/ if $lc_ctype;
@@ -228,7 +229,8 @@
     exit 1;
 }
 
-($version) = $ARGV[0] =~ /^(\d+\.\d+)$/;
+($version) = $ARGV[0] =~ /^([a-z]*\d+\.\d+[a-z]*)$/;
+($nversion = $version)  =~ y/0-9.//cd;
 ($cluster) = $ARGV[1] =~ /^([-.\w]+)$/;
 my $datadir;
 ($datadir) = $ARGV[2] =~ /(.*)/ if defined $ARGV[2];
@@ -257,7 +259,7 @@
 
     # check for users and groups with the same name when upgrading < 8.1 to >=
     # 8.1
-    if ($version lt '8.1' && $newversion ge '8.1') {
+    if ($nversion lt '8.1' && $nnewversion ge '8.1') {
         my @samename;
         print "Checking for users and groups with the same name...\n";
         open F, '-|', $oldpsql, '-h', $oldsocket, '-p', $info{'port'}, 
@@ -398,7 +400,7 @@
     for my $db (keys %databases) {
         next if $db eq 'template0';
 
-       if ($db eq 'postgres' && $newversion ge '8.1') {
+       if ($db eq 'postgres' && $nnewversion ge '8.1') {
            (system 'dropdb', '--cluster', "$newversion/$cluster", '-q', 
'postgres');
        }
 
@@ -427,9 +429,9 @@
         my @restore_argv = ($pg_restore, '-h', $newsocket, '-p', 
$newinfo{'port'});
 
        if ($upgrade_scripts) {
-           if ($newversion eq '8.1') {
+           if ($nnewversion eq '8.1') {
                 push @restore_argv, ('-X', 'no-data-for-failed-tables');
-            } elsif ($newversion gt '8.1') {
+            } elsif ($nnewversion gt '8.1') {
                 push @restore_argv, '--no-data-for-failed-tables';
             }
         }
diff -rub usr/share/postgresql-common.o/maintscripts-functions 
usr/share/postgresql-common/maintscripts-functions
--- usr/share/postgresql-common.o/maintscripts-functions        2009-02-06 
00:00:51.000000000 +0100
+++ usr/share/postgresql-common/maintscripts-functions  2010-06-11 
18:04:25.000000000 +0200
@@ -49,7 +49,8 @@
 
 configure_contrib_version() {
     # later versions have integrated autovacuuming
-    [ "$1" = "7.4" -o "$1" = "8.0" ] || return 0
+    v=`echo $1 | tr -cd '[0-9].'`
+    [ "$v" = "7.4" -o "$v" = "8.0" ] || return 0
 
     if [ "$2" ]; then
        cmd="autovac-restart"
@@ -66,7 +67,8 @@
 
 remove_contrib_version() {
     # later versions have integrated autovacuuming
-    [ "$1" = "7.4" -o "$1" = "8.0" ] || return 0
+    v=`echo $1 | tr -cd '[0-9].'`
+    [ "$v" = "7.4" -o "$v" = "8.0" ] || return 0
 
     if [ -x /usr/sbin/invoke-rc.d ]; then
            invoke-rc.d postgresql-$1 autovac-stop || exit 0
diff -rub usr/share/postgresql-common.o/PgCommon.pm 
usr/share/postgresql-common/PgCommon.pm
--- usr/share/postgresql-common.o/PgCommon.pm   2009-02-06 00:00:51.000000000 
+0100
+++ usr/share/postgresql-common/PgCommon.pm     2010-06-11 18:17:17.000000000 
+0200
@@ -441,7 +441,9 @@
 
     # autovacuum settings
 
-    if ($_[0] lt '8.1') {
+    my $nversion;
+    ($nversion = $_[0])  =~ y/0-9.//cd;
+    if ($nversion lt '8.1') {
         $result{'avac_logfile'} = readlink ($result{'configdir'} . 
"/autovacuum_log");
         ($result{'avac_logfile'}) = $result{'avac_logfile'} =~ /(.*)/; # 
untaint
         if (get_program_path 'pg_autovacuum', $_[0]) {
@@ -472,7 +474,7 @@
        my $entry;
         while (defined ($entry = readdir D)) {
             next if $entry eq '.' || $entry eq '..';
-           ($entry) = $entry =~ /^(\d+\.\d+)$/; # untaint
+           ($entry) = $entry =~ /^([a-z]*\d+\.\d+[a-z]*)$/; # untaint
             push @versions, $entry if get_program_path ('psql', $entry);
         }
         closedir D;
@@ -483,7 +485,8 @@
 # Return the newest available version
 sub get_newest_version {
     my $newest = 0;
-    map { $newest = $_ if $newest < $_ } get_versions;
+    my $v;
+    map { ($v = $_)  =~ y/0-9.//cd; $newest = $v if $newest < $v } 
get_versions;
     return $newest;
 }
 
diff -rub usr/share/postgresql-common.o/run-upgrade-scripts 
usr/share/postgresql-common/run-upgrade-scripts
--- usr/share/postgresql-common.o/run-upgrade-scripts   2009-02-06 
00:00:51.000000000 +0100
+++ usr/share/postgresql-common/run-upgrade-scripts     2010-06-11 
17:53:42.000000000 +0200
@@ -61,6 +61,7 @@
 }
 
 my $upgraded_version  = $ARGV[0];
+my ($nupgraded_version = $upgraded_version) =~ y/0-9.//cd;
 
 # determine path of upgrade scripts
 my @f = split(/\//, $0);
@@ -74,9 +75,11 @@
     my ($fname, $ext) = split /\./, $script;
     my ($version, $name, $scope) = split /_/, $fname;
     my $is_sql = (defined $ext && $ext eq 'sql');
+    my ($nversion = $version)  =~ y/0-9.//cd;
+
     next unless defined ($scope) && ($is_sql || -x "$scriptpath/$script");
 
-    next unless ($version eq 'all' || $upgraded_version <= $version);
+    next unless ($version eq 'all' || $nupgraded_version <= $nversion);
     print "Executing upgrade script $name...\n";
 
     for my $v (get_versions) {

--- End Message ---
--- Begin Message ---
Control: tags -1 wontfix

Re: Nils Goroll 2010-06-12 <[email protected]>
> I need to run a customized postgresql installation and wanted to get good
> integration into the debian installation when I realized that the highly 
> useful
> postgresql-common scripts only support purely numerical version ids. Here's a
> simplistic example:
> 
> # pg_createcluster 8.3nfs test

Hi,

sorry for letting this sit uncommented for so long.

The problem with non-standard version numbers here is that they break
version comparisons. We have several checks in the code that test for
things like "is this version 8.3 or later" to be able to configure the
server accordingly. Also, it's unclear how upgrades to/from "8.3nfs"
should work.

There's probably solutions to these problems, but for now, I think the
added code complexity around version number handling exceeds the
general usefulness of this feature request.

Christoph

--- End Message ---
_______________________________________________
Pkg-postgresql-public mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-postgresql-public

Reply via email to