=== modified file 'PgCommon.pm' --- PgCommon.pm 2015-02-04 19:30:03 +0000 +++ PgCommon.pm 2015-02-10 14:41:14 +0000 @@ -25,7 +25,8 @@ our @EXPORT = qw/error user_cluster_map get_cluster_port set_cluster_port get_cluster_socketdir set_cluster_socketdir cluster_port_running get_cluster_start_conf set_cluster_start_conf set_cluster_pg_ctl_conf - get_program_path cluster_info get_versions get_newest_version version_exists + get_program_path cluster_info get_versions get_numeric_versions + get_newest_version version_exists get_version_clusters next_free_port cluster_exists install_file change_ugid config_bool get_db_encoding get_db_locales get_cluster_locales get_cluster_databases read_cluster_conf_file read_pg_hba read_pidfile/; @@ -377,8 +378,9 @@ # Arguments: sub get_cluster_socketdir { # if it is explicitly configured, just return it + (my $numversion) = $_[0] =~ /^(\d+\.\d+)/ ; my $socketdir = get_conf_value($_[0], $_[1], 'postgresql.conf', - $_[0] >= 9.3 ? 'unix_socket_directories' : 'unix_socket_directory'); + $numversion >= 9.3 ? 'unix_socket_directories' : 'unix_socket_directory'); $socketdir =~ s/\s*,.*// if ($socketdir); # ignore additional directories for now return $socketdir if $socketdir; @@ -409,8 +411,9 @@ # Set the socket directory of a particular cluster. # Arguments: sub set_cluster_socketdir { + (my $numversion) = $_[0] =~ /^(\d+\.\d+)/ ; set_conf_value $_[0], $_[1], 'postgresql.conf', - $_[0] >= 9.3 ? 'unix_socket_directories' : 'unix_socket_directory', + $numversion >= 9.3 ? 'unix_socket_directories' : 'unix_socket_directory', $_[2]; } @@ -633,8 +636,9 @@ $result{log_filename} = $postgresql_conf{log_filename}; # autovacuum defaults to on since 8.3 - $result{'avac_enable'} = config_bool $postgresql_conf{'autovacuum'} || ($v >= '8.3'); - + (my $numversion) = $_[0] =~ /^(\d+\.\d+)/ ; + $result{'avac_enable'} = config_bool $postgresql_conf{'autovacuum'} || ($numversion >= '8.3'); + return %result; } @@ -649,18 +653,35 @@ next if $entry eq '.' || $entry eq '..'; my $pfx = ''; #redhat# $pfx = "pgsql-"; - ($entry) = $entry =~ /^$pfx(\d+\.\d+)$/; # untaint - push @versions, $entry if get_program_path ('psql', $entry); - } - closedir D; - } - return @versions; -} + ($entry) = $entry =~ /^$pfx(\d+\.\d+$|^\d+\.\d+\-\w+)$/; # untaint + push @versions, $entry if get_program_path ('psql', $entry); + } + closedir D; + } + return @versions; +} + + +# Return an array of all available PostgreSQL versions +sub get_numeric_versions { + my @versions = (); + if (opendir (D, $binroot)) { + my $entry; + while (defined ($entry = readdir D)) { + next if $entry eq '.' || $entry eq '..'; + ($entry) = $entry =~ /^(\d+\.\d+)/; # untaint + push @versions, $entry if get_program_path ('psql', $entry); + } + closedir D; + } + return @versions; +} + # Return the newest available version sub get_newest_version { my $newest = 0; - map { $newest = $_ if $newest < $_ } get_versions; + map { $newest = $_ if $newest < $_ } get_numeric_versions; return $newest; } @@ -932,8 +953,9 @@ sub get_cluster_locales { my ($version, $cluster) = @_; my ($lc_ctype, $lc_collate) = (undef, undef); + my ($numversion) = $version =~ /^(\d+\.\d+)/ ; - if ($version >= '8.4') { + if ($numversion >= '8.4') { print STDERR "Error: get_cluster_locales() does not work for 8.4+\n"; exit 1; } === modified file 'debian/supported-versions' --- debian/supported-versions 2014-12-17 18:59:59 +0000 +++ debian/supported-versions 2015-02-10 16:20:25 +0000 @@ -150,10 +150,10 @@ pgdg() { case $1 in testing | unstable) - /bin/echo -e "8.4\n9.0\n9.1\n9.2\n9.3\n9.4" # 9.4 default + /bin/echo -e "8.4\n9.0\n9.1\n9.2\n9.3\n9.4\n9.4-bdr" # 9.4 default ;; *) - /bin/echo -e "8.4\n9.0\n9.1\n9.2\n9.3\n9.4" # 9.4 default + /bin/echo -e "8.4\n9.0\n9.1\n9.2\n9.3\n9.4\n9.4-bdr" # 9.4 default ;; esac } === modified file 'pg_createcluster' --- pg_createcluster 2014-10-15 13:16:43 +0000 +++ pg_createcluster 2014-11-27 15:13:41 +0000 @@ -40,12 +40,13 @@ sub init_db { my ($version, $datadir, $owneruid, $ownergid, $initdb_opts_from_cli) = @_; $datadir = readlink $datadir if (-l $datadir); - if ($version >= '8.4') { + ($numversion) = $version =~ /^(\d+\.\d+)/ ; # numeric PostgreSQL version + if ($numversion >= '8.4') { $ident_method = 'ident'; } else { $ident_method = 'ident sameuser'; } - if ($version >= '9.1') { + if ($numversion >= '9.1') { $peer_method = 'peer'; } else { $peer_method = $ident_method; @@ -70,7 +71,7 @@ } if ($explicit_auth_config) { # do nothing - } elsif ($version >= '9.2') { + } elsif ($numversion >= '9.2') { push @initdb, ('--auth-local', $peer_method); push @initdb, ('--auth-host', 'md5'); } else { @@ -88,7 +89,7 @@ # pre-8.2 servers do not ignore LANG when LC_ALL is set; work around this # bug - if ($version <= '8.2' && $ENV{'LC_ALL'}) { + if ($numversion <= '8.2' && $ENV{'LC_ALL'}) { $ENV{'LANG'} = $ENV{'LC_ALL'}; } @@ -146,6 +147,7 @@ sub setup_pg_hba { my ($version) = @_; $user = (getpwuid $owneruid)[0]; + ($numversion) = $version =~ /^(\d+\.\d+)/ ; $fname = "$confdir/pg_hba.conf"; $su_comment = " # DO NOT DISABLE! @@ -170,7 +172,7 @@ $search = 0; } - if (not $explicit_auth_config and $version lt '9.2') { + if (not $explicit_auth_config and $numversion lt '9.2') { # default authentication for Unix socket connections if ($line =~ /^#?local/) { $line =~ s/trust/$peer_method/; @@ -282,8 +284,9 @@ error 'clusters must not be owned by root' unless $owneruid && $ownergid; -($version) = $ARGV[0] =~ /^(\d+\.\d+)$/; +($version) = $ARGV[0] =~ /^(\d+\.\d+$|^\d+\.\d+\-\w+)$/ ; error "invalid version '$ARGV[0]'" unless defined $version; +($numversion) = $version =~ /^(\d+\.\d+)/ ; ($cluster) = $ARGV[1] =~ /^([-.\w]+)$/; error "invalid cluster name '$ARGV[1]'" unless defined $cluster; splice @ARGV, 0, 2; @@ -499,7 +502,7 @@ # enable SSL if we have the snakeoil default certificate if ($want_ssl && $newcluster && -e $ssl_cert_file && $ssl_key_access) { - if ($version >= '9.2') { + if ($numversion >= '9.2') { PgCommon::set_conf_value $version, $cluster, 'postgresql.conf', 'ssl_cert_file', $ssl_cert_file; PgCommon::set_conf_value $version, $cluster, 'postgresql.conf', @@ -530,7 +533,7 @@ # SSL client certificate revocation list if ($want_ssl && $newcluster && -e "$PgCommon::common_confdir/root.crl") { - if ($version >= '9.2') { + if ($numversion >= '9.2') { PgCommon::set_conf_value $version, $cluster, 'postgresql.conf', 'ssl_crl_file', "$PgCommon::common_confdir/root.crl"; } else { === modified file 'pg_ctlcluster' --- pg_ctlcluster 2014-09-16 20:12:08 +0000 +++ pg_ctlcluster 2015-02-11 10:49:31 +0000 @@ -25,7 +25,7 @@ use PgCommon; use Fcntl 'SEEK_SET'; -my ($version, $cluster, $pg_ctl, $force); +my ($version, $numversion, $cluster, $pg_ctl, $force); my (@postmaster_auxoptions, @pg_ctl_opts_from_cli); my (%postgresql_conf, %info); my $mode = 'smart'; # default shutdown mode @@ -141,7 +141,7 @@ } my $postmaster_opts = ''; - my $usd = $version >= 9.3 ? 'unix_socket_directories' : 'unix_socket_directory'; + my $usd = $numversion >= 9.3 ? 'unix_socket_directories' : 'unix_socket_directory'; if (!(PgCommon::get_conf_value $version, $cluster, 'postgresql.conf', $usd)) { $postmaster_opts .= "-c $usd=\"$info{'socketdir'}\""; } @@ -339,21 +339,22 @@ print "Usage: $0 \n"; exit 1; } - $version = shift @ARGV; -if ($version =~ m!^(\d+\.\d)[-/](.+)!) { - ($version, $cluster) = ($1, $2); -} else { +#print "regex" . $version =~ m!^(\d+\.\d)[-/](.+)! . "\n"; +#if ($version =~ m!^(\d+\.\d)[-/](.+)!) { +# print "r $version | $1 | $2 \n" ; +# ($version, $cluster) = ($1, $2); +#} else { $cluster = shift @ARGV; -} +#} my $action = shift @ARGV; @pg_ctl_opts_from_cli=(); foreach my $argv (@ARGV) { push @pg_ctl_opts_from_cli, $argv =~ /(.*)/; # untaint } - -($version) = $version =~ /^(\d+\.\d+)$/; # untaint +($version) = $version =~ /^(\d+\.\d+$|^\d+\.\d+\-\w+)$/; # untaint +($numversion) = $version =~ /^(\d+\.\d+)/ ; ($cluster) = $cluster =~ /^([^'"\s]+)$/; # untaint error 'specified cluster does not exist' unless $version && $cluster && cluster_exists $version, $cluster; %info = cluster_info ($version, $cluster); @@ -422,7 +423,7 @@ if ($> == 0) { # have postgres start with increased OOM killer protection; 9.1 and # later has builtin support for resetting the adjustment of child processes - if ($action eq 'start' and $version >= '9.1' and not $PgCommon::rpm) { + if ($action eq 'start' && $numversion >= '9.1' and not $PgCommon::rpm) { if (-w '/proc/self/oom_score_adj') { open F, '>/proc/self/oom_score_adj'; print F "-900\n"; === modified file 'pg_dropcluster' --- pg_dropcluster 2014-09-16 20:12:08 +0000 +++ pg_dropcluster 2014-11-27 15:23:37 +0000 @@ -31,7 +31,7 @@ exit 1; } -($version) = $ARGV[0] =~ /^(\d+\.\d+)$/; +($version) = $ARGV[0] =~ /^(\d+\.\d+$|^\d+\.\d+\-\w+)$/; ($cluster) = $ARGV[1] =~ /^([-.\w]+)$/; error 'invalid version' unless defined $version; error 'invalid cluster name' unless defined $cluster; === modified file 'pg_upgradecluster' --- pg_upgradecluster 2015-01-06 23:37:11 +0000 +++ pg_upgradecluster 2015-02-10 15:50:26 +0000 @@ -26,7 +26,7 @@ delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; # global variables -my ($version, $newversion, $cluster, $newcluster); +my ($version, $newversion, $numversion, $newnumversion, $cluster, $newcluster); my (%info, %newinfo); my ($encoding, $old_lc_ctype, $old_lc_collate); # old cluster encoding @@ -72,7 +72,7 @@ set $guc, $val; } - if ($newversion >= '8.2') { + if ($newnumversion >= '8.2') { # preload_libraries -> shared_preload_libraries transition rename_ \%c, 'preload_libraries', 'shared_preload_libraries'; @@ -85,7 +85,7 @@ } } - if ($newversion >= '8.3') { + if ($newnumversion >= '8.3') { deprecate \%c, 'bgwriter_lru_percent', 'deprecated'; deprecate \%c, 'bgwriter_all_percent', 'deprecated'; deprecate \%c, 'bgwriter_all_maxpages', 'deprecated'; @@ -109,7 +109,7 @@ } } - if ($newversion >= '8.4') { + if ($newnumversion >= '8.4') { deprecate \%c, 'max_fsm_pages', 'not needed any more'; deprecate \%c, 'max_fsm_relations', 'not needed any more'; deprecate \%c, 'krb_server_hostname', 'does not exist any more'; @@ -131,12 +131,12 @@ rename "$hba.new", $hba or error "rename: $!"; } - if ($newversion >= '9.0') { + if ($newnumversion >= '9.0') { deprecate \%c, 'add_missing_from', 'does not exist any more'; deprecate \%c, 'regex_flavor', 'does not exist any more'; } - if ($newversion >= '9.2') { + if ($newnumversion >= '9.2') { deprecate \%c, 'wal_sender_delay', 'does not exist any more'; deprecate \%c, 'silent_mode', 'does not exist any more'; deprecate \%c, 'custom_variable_classes', 'does not exist any more'; @@ -157,12 +157,12 @@ } } - if ($newversion >= '9.3') { + if ($newnumversion >= '9.3') { rename_ \%c, 'unix_socket_directory', 'unix_socket_directories'; rename_ \%c, 'replication_timeout', 'wal_sender_timeout'; } - if ($newversion >= '9.4') { + if ($newnumversion >= '9.4') { deprecate \%c, 'krb_srvname', 'native krb5 authentication deprecated in favor of GSSAPI'; } } @@ -204,7 +204,7 @@ sub get_encoding { my ($version, $cluster) = @_; $encoding = get_db_encoding $version, $cluster, 'template1'; - if ($version <= '8.3') { + if ($numversion <= '8.3') { ($old_lc_ctype, $old_lc_collate) = get_cluster_locales $version, $cluster; } else { ($old_lc_ctype, $old_lc_collate) = get_db_locales $version, $cluster, 'template1'; @@ -257,7 +257,8 @@ $method eq 'dump' or $method eq 'upgrade' or error 'method must be "dump" or "upgrade"'; # untaint -($newversion) = $newversion =~ /^(\d+\.\d+)$/; +($newversion) = $newversion =~ /^(\d+\.\d+$|^\d+\.\d+\-\w+)$/ ; +($newnumversion) = $newversion =~ /^(\d+\.\d+)/ ; ($locale) = $locale =~ /^([\w@._-]+)$/ if $locale; ($lc_collate) = $lc_collate =~ /^([\w@._-]+)$/ if $lc_collate; ($lc_ctype) = $lc_ctype =~ /^([\w@._-]+)$/ if $lc_ctype; @@ -272,7 +273,8 @@ exit 1; } -($version) = $ARGV[0] =~ /^(\d+\.\d+)$/; +($version) = $ARGV[0] =~ /^(\d+\.\d+$|^\d+\.\d+\-\w+)$/ ; +($numversion) = $version =~ /^(\d+\.\d+)$/; ($cluster) = $ARGV[1] =~ /^([-.\w]+)$/; $newcluster ||= $cluster; # use old cluster name by default ($newcluster) = $newcluster =~ /^([-.\w]+)$/; @@ -303,7 +305,7 @@ get_encoding $version, $cluster; print "Stopping old cluster...\n"; my @argv = ('pg_ctlcluster', $version, $cluster, 'stop', '--'); - push @argv, ('-t', '5') if $version >= '8.4'; + push @argv, ('-t', '5') if $numversion >= '8.4'; error "Could not stop old cluster" if system @argv; } @@ -322,7 +324,7 @@ if ($method eq 'upgrade') { print "Stopping old cluster...\n"; @argv = ('pg_ctlcluster', $version, $cluster, 'stop', '--'); - push @argv, ('-t', '5') if $version >= '8.4'; + push @argv, ('-t', '5') if $numversion >= '8.4'; error "Could not stop old cluster" if system @argv; } } @@ -491,7 +493,7 @@ print "Fixing hardcoded library paths for stored procedures...\n"; # starting from 9.0, replace() works on strings; for ealier versions it # works on bytea - if ($version >= '9.0') { + if ($numversion >= '9.0') { (system $psql, '-h', $oldsocket, '-p', $info{'port'}, '-q', '-d', $db, '-c', "BEGIN READ WRITE; \ UPDATE pg_proc SET probin = replace(\ @@ -516,7 +518,7 @@ my @restore_argv = ($pg_restore, '-h', $newsocket, '-p', $newinfo{'port'}, '--data-only', '-d', $db); - if ($newversion >= '8.3') { + if ($newnumversion >= '8.3') { push @restore_argv, '--disable-triggers'; }