diff --git a/library.sh b/library.sh new file mode 100644 index 0000000000000000000000000000000000000000..02d067ac2d1a88fd6b83c9c114c8918aed973e1a --- /dev/null +++ b/library.sh @@ -0,0 +1,62 @@ +die() { echo >&2 $"FATAL: $@" ; exit 1 ; } +error() { echo >&2 $"ERROR: $@" ; } +error_q() { echo >&2 $" $@" ; } +warn() { echo >&2 $"WARNING: $@" ; } +warn_q() { echo >&2 $" $@" ; } +info() { echo >&2 $" * $@" ; } +info_q() { echo >&2 $" $@" ; } +debug() { test "$option_debug" != "1" || echo >&2 $"DEBUG: $@"; } + + +set_var() +{ + eval "$1=\"$2\"" +} + + +root_prereq() +{ + test -z "$PGSETUP_TEST" || return 0 + test "$(id -u)" -eq 0 || die "$0 requires root access for this action" +} + + +read_config_file() +{ + local key="" val="" + + test -r "$1" || die "can't read file '$1'" + + for i in $2; do + eval "unset __pg_conf_$i" + done + + # No easy (and secure) way to read configuration files from bash script, + # sorry. + while read key val; do + [[ $key =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]] || return 1 + + case " $2 " in + *" $key "*) + ;; + *) + warn "config file '$1': unknown key '$key'" + continue + ;; + esac + + # Strip double quotes + case "$val" in + \"*\") + val=${val##\"} + val=${val%%\"} + ;; + esac + + # Make it reasonably safe. Keep dolar-sign escaped. + eval "__pg_conf_$key=\$val" + + done < <(grep -v -e "^$" -e "^#" < "$1") +} + + diff --git a/postgresql-9.6.10.tar.bz2 b/postgresql-9.6.10.tar.bz2 deleted file mode 100644 index 77f059fcd766c320f461d9e0afac1b73fe8beca4..0000000000000000000000000000000000000000 Binary files a/postgresql-9.6.10.tar.bz2 and /dev/null differ diff --git a/postgresql-9.6.10.tar.bz2.sha256 b/postgresql-9.6.10.tar.bz2.sha256 deleted file mode 100644 index 1d5f96bfb90a6d480bce4157365c78aae92c4cf5..0000000000000000000000000000000000000000 --- a/postgresql-9.6.10.tar.bz2.sha256 +++ /dev/null @@ -1 +0,0 @@ -8615acc56646401f0ede97a767dfd27ce07a8ae9c952afdb57163b7234fe8426 postgresql-9.6.10.tar.bz2 diff --git a/postgresql-check-db-dir b/postgresql-check-db-dir new file mode 100755 index 0000000000000000000000000000000000000000..c9e6c0b1fb9bda0fdf847a2f474d5c0c61f8f946 --- /dev/null +++ b/postgresql-check-db-dir @@ -0,0 +1,104 @@ +#!/bin/bash + +# This script verifies that the postgresql data directory has been correctly +# initialized. We do not want to automatically initdb it, because that has +# a risk of catastrophic failure (ie, overwriting a valuable database) in +# corner cases, such as a remotely mounted database on a volume that's a +# bit slow to mount. But we can at least emit a message advising newbies +# what to do. + +if test -z "$1"; then + echo "Maintainer error: $0 must be run with one argument" + exit 1 +fi + +service_name="$1" + +if [ -z "$PGDATA" ]; then + echo $"You try to start '$service_name' service" + echo $"but the required \$PGDATA environment variable is not set." + + if test 0 -eq 1; then + echo $"You should use the /etc/sysconfig/pgsql/$service_name" + else + echo $"You should use the /etc/systemd/system/$service_name.service.d/ANYTHING.conf" + fi + + echo $"configuration file to set \$PGDATA. For more info see" + echo $"the /usr/share/doc/postgresql/README.rpm-dist file." + + exit 1 +fi + + +# Warn the user that the configuration should be adjusted via drop-in, in case +# the $PGDATA variable is set different way (and non-default service name is +# used, systemd systems only). +conf_dir="/etc/systemd/system/$service_name.service.d" +if test 0 = 0 && [[ "$service_name" == *@* ]] && test ! -d "$conf_dir"; then + echo >&2 $"WARNING: Note that the '$conf_dir'" + echo >&2 $"directory does not exist while you are using non-default service" + echo >&2 $"name '$service_name'. You are encouraged to use the" + echo >&2 $"$conf_dir directory for systemd configuration according" + echo >&2 $"to /usr/share/doc/postgresql/README.rpm-dist documentation." +fi + +# Full PostgreSQL version, e.g. 9.0.2 +PGVERSION=10.5 + +# Major version of PostgreSQL, e.g. 9.0 +PGMAJORVERSION=10 + +# Distribution README file +README_DIST=/usr/share/doc/postgresql/README.rpm-dist + +bad_version() +{ + local real_version="$1" + + . "/usr/share/postgresql-setup/library.sh" + + while read id version; do + test "$version" = "$real_version" || continue + + local cmd="postgresql-setup --upgrade" + + test "postgresql" = "$id" \ + || cmd="$cmd --upgrade-from $id" + + echo $"An old version of the database format was found." + echo $"Use '$cmd' to upgrade to version '$PGMAJORVERSION'" + echo $"See $README_DIST for more information." + + return + done < <(parse_upgrade_setup list) + + echo $"An old version '$real_version' of the database format was found." + echo $"You need to dump and reload before using PostgreSQL $PGVERSION." + echo $"See $README_DIST for more information." + + return +} + +# Check for the PGDATA structure +if [ -f "$PGDATA/PG_VERSION" ] && [ -d "$PGDATA/base" ] +then + real_version=`cat "$PGDATA/PG_VERSION"` + # Check version of existing PGDATA + if [ x"$real_version" = x"$PGMAJORVERSION" ] + then + : A-OK + else + bad_version "$real_version" + exit 1 + fi +else + # No existing PGDATA! Warn the user to initdb it. + echo $"Directory \"$PGDATA\" is missing or empty." + echo $"Use \"/usr/bin/postgresql-setup --initdb\"" + echo $"to initialize the database cluster." + echo $"See $README_DIST for more information." + exit 1 +fi + +exit 0 diff --git a/postgresql-setup b/postgresql-setup new file mode 100755 index 0000000000000000000000000000000000000000..21c961e594d2a142cbe9c4163814d9662a665529 --- /dev/null +++ b/postgresql-setup @@ -0,0 +1,789 @@ +#!/bin/bash +# +# postgresql-setup - Initialization and upgrade operations for PostgreSQL + +if test "$(id -u)" -eq 0; then + cmd= + for v in PGSETUP_DEBUG PGSETUP_INITDB_OPTIONS PGSETUP_PGUPGRADE_OPTIONS; do + eval var_content=\$$v + test -z "$var_content" && continue + cmd+=$v="$(printf %q "$var_content") " + done + cmd+=$(printf %q "$(readlink -f "$0")") + for arg; do cmd+=" $(printf %q "$arg")" ; done + # Drop root privileges asap. It's not recommended to run postgresql-setup + # script under root nowadays; so we take the liberty to switch to the + # PostgreSQL admin user (by default 'postgres') without any other option. + exec /usr/sbin/runuser -s /bin/sh -l postgres -c "$cmd" +fi + +# ensure privacy +umask 0077 + +: ${RESTORECON=/sbin/restorecon} +test -x $RESTORECON || RESTORECON=: + +test -z "$PATH" && export PATH="/sbin:/usr/sbin:/bin:/usr/bin" + +test x"$PGSETUP_DEBUG" != x && set -x && PS4='${LINENO}: ' + +# The current user name. +USER=$(id -u -n) + +# Directory containing the postmaster executable +PGENGINE=/usr/bin + +# Distribution README file +README_DIST=/usr/share/doc/postgresql/README.rpm-dist + +# Home directory of postgres user +POSTGRES_HOMEDIR=/var/lib/pgsql + +# The where PostgreSQL server listens by default +PGPORT_DEF=5432 + + +. "/usr/share/postgresql-setup/library.sh" + +: + +# We upgrade by default from system's default PostgreSQL installation +option_upgradefrom="postgresql" + +srvsuff= +test 0 -eq 0 && srvsuff=".service" + +USAGE_STRING=$"\ +Usage: $0 MODE_OPTION [--unit=UNIT_NAME] [OPTION...] + +Script is aimed to help sysadmin with basic database cluster administration. +Usually, \"postgresql-setup --initdb\" and \"postgresql-setup --upgrade\" is +enough, however there are other options described below. + +For more info and howto/when use this script please look at the documentation +file $README_DIST. + +Available operation mode: + --initdb Initialize new PostgreSQL database cluster. This is usually the + first action you perform after PostgreSQL server installation. + --upgrade Upgrade database cluster for new major version of PostgreSQL + server. See the --upgrade-from option for more info. + +Options: + --unit=UNIT_NAME The UNIT_NAME is used to select proper unit + configuration (unit == service or initscript name + on non-systemd systems). For example, if you want + to work with unit called + 'postgresql@com_example.service', you should use + 'postgresql@com_example' (without trailing .service + string). When no UNIT_NAME is explicitly passed, + the 'postgresql' string is used by default. + --port=PORT port where the initialized server will listen for + connections" + +test 0 -eq 0 && \ +USAGE_STRING+=" + --new-systemd-unit We dropped this option for security reasons. + Nowadays, please use the root-only script + /usr/sbin/postgresql-new-systemd-unit. + --datadir Dropped with --new-systemd-unit." + +USAGE_STRING+=" + --upgrade-from-unit=UNIT Select proper unit name to upgrade from. This + has similar semantics as --unit option. + --upgrade-ids Print list of available IDs of upgrade scenarios to + standard output. + --upgrade-from=ID Specify id \"old\" postgresql stack to upgrade + from. List of available IDs can be listed by + --upgrade-ids. Default is '$option_upgradefrom'. + +Other options: + --help show this help + --version show version of this package + --debug show basic debugging information + +Environment: + PGSETUP_INITDB_OPTIONS Options carried by this variable are passed to + subsequent call of \`initdb\` binary (see man + initdb(1)). This variable is used also during + 'upgrade' mode because the new cluster is actually + re-initialized from the old one. + PGSETUP_PGUPGRADE_OPTIONS Options in this variable are passed next to the + subsequent call of \`pg_upgrade\`. For more info + about possible options please look at man + pg_upgrade(1). + PGSETUP_DEBUG Set to '1' if you want to see very verbose shell + debugging output." + + +print_version() +{ + echo "postgresql-setup 8.2" + echo $"Built against PostgreSQL version 10.5." +} + + +check_not_initialized() +{ + if test -f "$pgdata/PG_VERSION"; then + error $"Data directory $pgdata is not empty!" + return 1 + fi + return 0 +} + + +# code shared between initdb and upgrade actions +perform_initdb() +{ + if [ ! -e "$pgdata" ]; then + mkdir "$pgdata" || return 1 + fi + $RESTORECON "$pgdata" + test -w "$pgdata" || die "$pgdata is not writeable by $USER" + + # Clean up SELinux tagging for pgdata + [ -x /sbin/restorecon ] && /sbin/restorecon "$pgdata" + + # Create the initdb log file if needed + if [ ! -e "$initdb_log" ]; then + touch "$initdb_log" || return 1 + fi + $RESTORECON "$initdb_log" + test -w "$initdb_log" || echo "$initdb_log is not writeable by $USER" + + # Initialize the database + initdbcmd+=( "$PGENGINE"/initdb --pgdata="$pgdata" --auth=ident ) + eval "initdbcmd+=( $PGSETUP_INITDB_OPTIONS )" + "${initdbcmd[@]}" >> "$initdb_log" 2>&1 < /dev/null + + # Create directory for postmaster log files + mkdir "$pgdata/pg_log" + $RESTORECON "$pgdata/pg_log" + + # This if-fork is just to not unnecessarily overwrite what upstream + # generates by initdb (upstream implicitly uses PGPORT_DEF). + if test "$pgport" != "$PGPORT_DEF"; then + local pgconf="$pgdata/postgresql.conf" + sed -i "s|^[[:space:]#]*port[[:space:]]=[^#]*|port = $pgport |g" \ + "$pgconf" \ + && grep "^port = " "$pgconf" >/dev/null + + if test $? -ne 0; then + error "can not change port in $pgdata/postgresql.conf" + return 1 + fi + fi + + test -f "$pgdata/PG_VERSION" +} + + +initdb() +{ + port_info= + test "$pgport" != "$PGPORT_DEF" \ + && port_info=$", listening on port '$pgport'" + + info $"Initializing database in '$pgdata'$port_info" + if check_not_initialized && perform_initdb; then + info $"Initialized, logs are in ${initdb_log}" + else + error $"Initializing database failed, possibly see $initdb_log" + script_result=1 + fi +} + + +old_data_in_use() +{ + local pidfile="$pgdataold/postmaster.pid" + test -f "$pidfile" || return 1 + error $"The pidfile '$pidfile' exists. Verify that there is no postmaster" + error_q $"running the $pgdataold directory." +} + + +upgrade() +{ + local inplace=false + test "$pgdata" = "$upgradefrom_data" && inplace=true + + debug "running inplace upgrade: $inplace" + + # must see previous version in PG_VERSION + local old_data_version="`cat "$upgradefrom_data/PG_VERSION"`" + if [ ! -f "$upgradefrom_data/PG_VERSION" -o \ + x"$old_data_version" != x"$upgradefrom_major" ] + then + error $"Cannot upgrade because the database in $upgradefrom_data is of" + error_q $"version $old_data_version but it should be $upgradefrom_major" + exit 1 + fi + if [ ! -x "$upgradefrom_engine/postgres" ]; then + error $"Please install the $upgradefrom_package package." + exit 5 + fi + if [ ! -x "$PGENGINE/pg_upgrade" ]; then + # The "$PGENGINE/postgres" depends transitively on + # pg_upgrade binary in rather newer packaging, but SCL with PostgreSQL + # 9.4 provides '*-upgrade' package having `pg_upgrade` inside. We need + # to have this installed, too. Keep till {rh,sclo}-postgresql94 is + # still a thing. + error $"Please install the postgresql-upgrade package." + exit 5 + fi + + # Set up log file for pg_upgrade + rm -f "$upgrade_log" + touch "$upgrade_log" || die "can't write into $upgrade_log file" + $RESTORECON "$upgrade_log" + + # Move old DB to pgdataold + + if $inplace; then + pgdataold="${pgdata}-old" + rm -rf "$pgdataold" + mv "$pgdata" "$pgdataold" || exit 1 + else + pgdataold="$upgradefrom_data" + fi + + # Create configuration file for upgrade process + HBA_CONF_BACKUP="$pgdataold/pg_hba.conf.postgresql-setup.`date +%s`" + HBA_CONF_BACKUP_EXISTS=0 + + if [ ! -f $HBA_CONF_BACKUP ]; then + mv "$pgdataold/pg_hba.conf" "$HBA_CONF_BACKUP" + HBA_CONF_BACKUP_EXISTS=1 + + # For fluent upgrade 'postgres' user should be able to connect + # to any database without password. Temporarily, no other type + # of connection is needed. + echo "local all postgres ident" > "$pgdataold/pg_hba.conf" + $RESTORECON "$pgdataold" + fi + + info $"Upgrading database." + + scls_upgrade_hacks= + test -n "$upgradefrom_scls" && { + debug "scls [$upgradefrom_scls] will be enabled" + scls_upgrade_hacks="source scl_source enable $upgradefrom_scls" + } + + test x"$upgradefrom_redhat_sockets_hack" = xyes && { + debug "upgrading from redhat server" + socket_hacks="export REDHAT_PGUPGRADE_FROM_RHEL=yes" + } + + test -n "$upgradefrom_pghost_override" && { + pghost_override="export PGHOST='$upgradefrom_pghost_override'" + } + + local failure_cleanup=true + if old_data_in_use; then + script_result=1 + # Cleanup makes sense once perform_initdb gets called. + failure_cleanup=false + elif ! check_not_initialized; then + # Don't try to re-init initialized data directory and also do not + # remove it after this unsuccessful upgrade. + script_result=1 + failure_cleanup=false + elif perform_initdb; then + $inplace && link_option=--link + + # After creating the empty new-format database, do the upgrade + ( + cd # pg_upgrade writes to $PWD + eval " + $scls_upgrade_hacks + $socket_hacks + $pghost_override + " + eval "add_options=( $PGSETUP_PGUPGRADE_OPTIONS )" + + "$PGENGINE"/pg_upgrade \ + --old-bindir="$upgradefrom_engine" \ + --new-bindir="$PGENGINE" \ + --old-datadir="$pgdataold" \ + --new-datadir="$pgdata" \ + $link_option \ + --old-port="$PGPORT" \ + --new-port="$PGPORT" \ + --username=postgres \ + "${add_options[@]}" \ + >>"$upgrade_log" 2>>"$upgrade_log" + ) + + if [ $? -ne 0 ]; then + # pg_upgrade failed + error $"pg_upgrade tool failed" + script_result=1 + fi + else + error $"initdb failed" + script_result=1 + fi + + # Move back the backed-up pg_hba.conf regardless of the script_result. + if [ x$HBA_CONF_BACKUP_EXISTS = x1 ]; then + mv -f "$HBA_CONF_BACKUP" "$pgdataold/pg_hba.conf" + fi + + if [ $script_result -eq 0 ]; then + info $"Upgraded OK." + warn $"The configuration files were replaced by default configuration." + warn $"The previous configuration and data are stored in folder" + warn $pgdataold. + else + # Clean up after failure. + $failure_cleanup && rm -rf "$pgdata" + $inplace && mv "$pgdataold" "$pgdata" + error $"Upgrade failed." + fi + info $"See $upgrade_log for details." +} + + +check_daemon_reload() +{ + local nr_option=NeedDaemonReload + + test 0 = 1 && return 0 + + local nr_out="`systemctl show -p $nr_option $option_service.service 2>/dev/null`" + if [[ "$nr_out" != "$nr_option=no" ]]; then + error $"Note that systemd configuration for '$option_service' changed." + error_q $"You need to perform 'systemctl daemon-reload' otherwise the" + error_q $"results of this script can be inadequate." + exit 1 + fi +} + + +handle_service_env() +{ + local service="$1" + + local systemd_env="$(systemctl show -p Environment "${service}.service")" \ + || { return; } + + for env_var in `echo "$systemd_env" | sed 's/^Environment=//'`; do + # If one variable name is defined multiple times the last definition wins. + case "$env_var" in + PGDATA=*) + unit_pgdata="${env_var##PGDATA=}" + debug "unit's datadir: '$unit_pgdata'" + ;; + PGPORT=*) + unit_pgport="${env_var##PGPORT=}" + debug "unit's pgport: $unit_pgport" + ;; + esac + done +} + + +handle_envfile() +{ + local file="$1" + + debug "trying to read '$file' env file" + if test ! -r "$file"; then + if test 0 = 1; then + return + fi + error "Can not read EnvironmentFile '$file' specified" + error_q "in ${service}.service" + fi + + # Note that the env file parser in systemd does not perform exactly the + # same job. + unset PGPORT PGDATA + . "$file" + envfile_pgdata="$PGDATA" + envfile_pgport="$PGPORT" + unset PGPORT PGDATA +} + + +handle_service_envfiles() +{ + local mode="$1" + local service="$2" + + local envfiles="$(systemctl show -p EnvironmentFiles "${service}.service")"\ + || return + + test -z "$envfiles" && return + + envfiles=$(echo $envfiles | \ + sed -e 's/^EnvironmentFile=//' \ + -e 's| ([^)]*)$||' + ) + + # Read the file names line-by-line (spaces may be inside) + while read line; do + handle_envfile "$line" + done <<<"$envfiles" +} + + +handle_pgconf() +{ + local datadir="$1" + local conffile="$datadir/postgresql.conf" + + debug "postgresql.conf: $conffile" + + test -r "$conffile" || { + error "config file $conffile is not readable or does not exist" + die "Old cluster in '$data' does not seem to be initialized" + } + + local sp='[[:space:]]' + local sed_expr="s/^$sp*port$sp*=$sp\([0-9]\+\).*/\1/p" + + rv=0 + conf_pgport=`sed -n "$sed_expr" $conffile | tail -1` || rv=1 + test -n "$conf_pgport" && debug "postgresql.conf pgport: $conf_pgport" + return $rv +} + + +service_configuration() +{ + local data= + local port= + local unit_pgport= + local unit_pgdata= + local envfile_pgport= + local envfile_pgdata= + + # 'mode' is 'initdb' or 'upgrade'. Basically, if called with mode=initdb, we + # parse configuration of the current (maybe already configured) service. + # When run with mode=upgrade, we try to parse the configuration of the old + # PostgreSQL configuration that we try to upgrade from. + + local mode="$1" datavar="$2" portvar="$3" service="$4" + + debug "running service_configuration() for $service, mode: $mode" + + if test "0" = 1; then + # Sysvinit has the default PGDATA (for default unit name only) + # configured directly in the initscript, so no additional configuration + # must exist. Set the default value of pgdata here to match whats in + # initscript for the cases when no additional configuration file exists. + # This is done to avoid parsing of whole initscript (for the real value) + # and mainly to not fail in the logic following 'service_configuration' + # call, where we usually want to error that pgdata is not defined.. + # Don't set the default pgdata for upgrade case, however, as we must + # upgrade only from already properly configured & working stack (missing + # pgdata here is a good reason to die later). + test initdb = "$mode" && test "$service" = "postgresql" \ + && set_var "$datavar" "/var/lib/pgsql/data" + handle_envfile "/etc/sysconfig/pgsql/$service" + else + # We ship two service files, postgresql.service and + # postgresql@.service. The former has PGDATA set by default + # similarly to sysvinit case. + handle_service_env "$service" + handle_service_envfiles "$option_mode" "$service" + fi + + # EnvironmentFile beats Environment configuration in systemd. In sysvinit + # there is no "unit_pgdata". So make sure the envfile_gpdata is used later + # than unit_pgdata. + test -n "$unit_pgdata" && set_var "$datavar" "$unit_pgdata" + test -n "$envfile_pgdata" && set_var "$datavar" "$envfile_pgdata" + + # skip for the first run + test initdb = "$mode" && return + + set_var data "\$$datavar" + handle_pgconf "$data" + + test -n "$conf_pgport" && set_var "$portvar" "$conf_pgport" + test -n "$unit_pgport" && set_var "$portvar" "$unit_pgport" + test -n "$envfile_pgport" && set_var "$portvar" "$envfile_pgport" +} + +# +# Alow users to use the old style arguments like +# 'postgresql-setup initdb $SERVICE_NAME'. +case "$1" in initdb|upgrade) + action="--$1" + shift + + warn "using obsoleted argument syntax, try --help" + old_long_args="help,usage,version,debug" + oldargs=`getopt -o "" -l "$old_long_args" -n "old-options" -- "$@"` \ + || die "can't parse old arguments" + eval set -- "$oldargs" + additional_opts= + while true; do + case "$1" in + --version|--help|--usage|--debug) + additional_opts="$additional_opts $1" + shift + ;; + --) + shift + break + ;; + esac + done + + service="postgresql" + if test -n "$1"; then + service=$1 + shift + fi + + set -- $additional_opts "$action" --unit "$service" "$@" + warn "arguments transformed to: ${0##*/} $*" +esac +# + + +# postgresql-setup arguments are parsed into those variables +option_mode=none +option_service="postgresql" +option_port= +option_debug=0 +option_upgradefrom_unit= + +# Content of EnvironmentFile= files fills those: +envfile_pgdata= +envfile_pgport= + +# Configuration from (/etc/systemd/system/$option_service.service) fills those +# variables. +unit_pgdata= +unit_pgport= + +# Configuration from postgresql.conf: +conf_pgport= + +# Key variables. Try to fill them by postgresql.conf, Environment= statement in +# service file or EnvironmentFile= content (the later mentioned has more +# priority). +pgdata=default +pgport=default + +## PARSE SCRIPT ARGUMENTS ## + +short_opts="" +long_opts="\ +initdb,upgrade,\ +new-systemd-unit,upgrade-ids,\ +unit:,service:,port:,datadir:,upgrade-from:,upgrade-from-unit:,\ +debug,\ +version,help,usage" + +args=`getopt -o "$short_opts" -l "$long_opts" -n "postgresql-setup" -- "$@"` \ + || die "can't parse arguments" +eval set -- "$args" +parse_fail=0 +while true; do + case "$1" in + --initdb|--upgrade) + if test "$option_mode" != none; then + error "bad argument $1, mode already specified: --$option_mode" + parse_fail=1 + else + option_mode=${1##--} + fi + shift + ;; + + --unit|--service) + option_service=$2 + shift 2 + ;; + + --port) + option_port=$2 + shift 2 + ;; + + --datadir|--new-systemd-unit) + error $"Removed option --new-systemd-unit/--datadir, please use" + error_q $"/usr/sbin/postgresql-new-systemd-unit script" + exit 1 + ;; + + --debug) + option_debug=1 + shift + ;; + + --help|--usage) + echo "$USAGE_STRING" + exit 0 + ;; + + --upgrade-from) + option_upgradefrom="$2" + shift 2 + ;; + + --upgrade-from-unit) + option_upgradefrom_unit="$2" + shift 2 + ;; + + --upgrade-ids) + parse_upgrade_setup help + exit 0 + ;; + + --version) + print_version + exit 0 + ;; + + --) + shift + break + ;; + + *) + die "author's fault: option $1 not handled" + break + ;; + esac +done + +test $parse_fail -ne 0 && die "can't parse arguments" + +test "$option_mode" = none \ + && die "no mode specified, use --initdb or --upgrade, or --help" + +if ! parse_upgrade_setup config "$option_upgradefrom"; then + if test upgrade = "$option_mode"; then + die $"bad --upgrade-from parameter '$option_upgradefrom'," \ + $"try --upgrade-ids" + fi +fi + +## GATHER THE SETUP FIRST ## + +initdb_log="$POSTGRES_HOMEDIR/initdb_${option_service}.log" +upgrade_log="$POSTGRES_HOMEDIR/upgrade_${option_service}.log" + +debug "mode used: $option_mode" +debug "service name: $option_service" + +# load service's pgdata +service_configuration initdb pgdata UNUSED "$option_service" + +test "$pgdata" = default \ + && die $"no db datadir (PGDATA) configured for '$option_service$srvsuff' unit" + +[[ "$pgdata" =~ ^/.* ]] \ + || die $"the PostgreSQL datadir not absolute path: '$pgdata', try --debug" + +## GATHER DATA FROM INITIALIZED DATADIR ## + +test -n "$option_port" && pgport=$option_port + +if test upgrade = "$option_mode"; then + upgradefrom_data="$upgradefrom_data_default" + + if test -z "$option_upgradefrom_unit"; then + if test "postgresql" = "postgresql"; then + # Fedora usecase -> upgrade while keeping the same name of + # service/unit. + option_upgradefrom_unit=$option_service + else + # PGRPMs/RHSCL usecase -> we upgrade from one service/unit name to + # a different one, e.g. from postgresql92 to postgresql93, or from + # postgresql (system version) to postgresql94 (scl). + option_upgradefrom_unit=$upgradefrom_id + + # Try to predict situations: postgresql93@second -> postgresql94@second + if [[ "$option_service" =~ ^postgresql@(.*)$ ]]; then + option_upgradefrom_unit="$upgradefrom_id@${BASH_REMATCH[1]}" + fi + fi + fi + + test "$option_service" = "$option_upgradefrom_unit" \ + || info "upgrading from '$option_upgradefrom_unit$srvsuff'" \ + "to '$option_service$srvsuff'" + + service_configuration upgrade upgradefrom_data pgport \ + "$option_upgradefrom_unit" + test -n "$option_port" -a "$option_port" != "$pgport" \ + && warn "Old pgport $pgport has bigger priority than --pgport value." +fi + +# We expect that for upgrade - the previous stack was in working state (thus +# running on the default port). +test "$option_mode" = upgrade -a "$pgport" = default \ + && pgport=$PGPORT_DEF + +# This is mostly for 'initdb'. We assume that the default port is $PGPORT_DEF +# if not set explicitly for default service name 'postgresql'. +if test "$pgport" = default -a "$option_service" = "postgresql"; then + debug $"Using the default port '$PGPORT_DEF'" + pgport=$PGPORT_DEF +fi + +if test "$pgport" = default; then + # initdb case.. Note that this may be called by initscripts. If this gets + # called by legacy script, we can't help too much because systemd does not + # allow passing additional arguments to 'service XX initdb' command. + die $"For non-default unit names you must specify port by --port option." +fi + +[[ "$option_port" =~ ^[0-9]*$ ]] \ + || die $"port set to '$option_port', must be integer number" + +## LAST CHECK THE SETUP ## + +check_daemon_reload + +# These variables are read by underlying utilites, rather export them. +export PGDATA=$pgdata +export PGPORT=$pgport + +debug "final pgdata: $pgdata" +debug "final pgport: $pgport" + +script_result=0 + +test -w "/var/lib/pgsql" || { + # pg_upgrade binary needs to have write-able $PWD (and we use 'su -') + error $"The /var/lib/pgsql directory has wrong permissions." + error_q $"Please make sure the directory is writable by $USER." + exit 1 +} + +if /usr/bin/mountpoint -q "$pgdata" || /usr/bin/mountpoint -q "$(dirname "$pgdata")"; then + warn $"Note that either your data directory '$pgdata' or" + warn_q $"the parent directory '$(dirname "$pgdata")'" + warn_q $"is a direct mountpoint. This is usually a bad idea and your" + warn_q $"filesystem layout should ideally look like:" + warn_q $"/ROOT_OWNED_MOUNTPOINT/POSTGRES_OWNED_DIRECTORY/DATADIR." + warn_q $"See the upstream documentation for more info:" + warn_q $"http://www.postgresql.org/docs/10/static/creating-cluster.html" +fi + +# See how we were called. +case "$option_mode" in + initdb) + initdb + ;; + upgrade) + upgrade + ;; + *) + echo >&2 "$USAGE_STRING" + exit 2 +esac + +exit $script_result diff --git a/postgresql-setup-8.2.tar.gz b/postgresql-setup-8.2.tar.gz deleted file mode 100644 index 7ff1eceb2024502c4496e84c0c674529ac76978a..0000000000000000000000000000000000000000 Binary files a/postgresql-setup-8.2.tar.gz and /dev/null differ diff --git a/postgresql.service b/postgresql.service new file mode 100644 index 0000000000000000000000000000000000000000..57643a586e8202fa1e958d79e3124d6deeb2c1be --- /dev/null +++ b/postgresql.service @@ -0,0 +1,23 @@ +[Unit] +Description=PostgreSQL database server +After=network.target +[Service] +Type=notify + +User=postgres +Group=postgres +OOMScoreAdjust=-1000 +Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj +Environment=PG_OOM_ADJUST_VALUE=0 +Environment=PGDATA=/var/lib/pgsql/data + +ExecStartPre=/usr/libexec/postgresql-check-db-dir %N +ExecStart=/usr/bin/postmaster -D ${PGDATA} +ExecReload=/bin/kill -HUP $MAINPID +KillMode=mixed +KillSignal=SIGINT + +TimeoutSec=0 + +[Install] +WantedBy=multi-user.target diff --git a/postgresql.spec b/postgresql.spec index 318d902a581703a6b11a1d992312261f25b22550..bfc14f95124309336a4e748c801bee3c4f59612b 100644 --- a/postgresql.spec +++ b/postgresql.spec @@ -4,17 +4,21 @@ Name: postgresql Version: 10.5 -Release: 12 +Release: 13 Summary: PostgreSQL client programs License: PostgreSQL URL: http://www.postgresql.org/ Source0: https://ftp.postgresql.org/pub/source/v%{version}/postgresql-%{version}.tar.bz2 -Source1: https://ftp.postgresql.org/pub/source/v9.6.10/postgresql-9.6.10.tar.bz2 -Source2: https://github.com/devexp-db/postgresql-setup/releases/download/v8.2/postgresql-setup-8.2.tar.gz Source3: https://ftp.postgresql.org/pub/source/v%{version}/postgresql-%{version}.tar.bz2.sha256 -Source4: https://ftp.postgresql.org/pub/source/v9.6.10/postgresql-9.6.10.tar.bz2.sha256 Source5: postgresql.tmpfiles.d Source6: postgresql-bashprofile +# https://github.com/devexp-db/postgresql-setup/blob/master/postgresql-check-db-dir.in +Source7: postgresql-check-db-dir +# https://github.com/devexp-db/postgresql-setup/blob/master/bin/postgresql-setup.in +Source8: postgresql-setup +Source9: postgresql.service +# https://github.com/devexp-db/postgresql-setup/blob/master/share/postgresql-setup/library.sh.in +Source10: library.sh Patch0000: 0000-postgresql-var-run-socket.patch Patch0001: 0000-rpm-pgsql.patch @@ -85,14 +89,6 @@ Requires: %{name}-libs = %{version}-%{release} %{name}-server = %{version} Provides: libpq-devel = %{version}-%{release} libecpg-devel = %{version}-%{release} Provides: postgresql-server-devel = %{version}-%{release} -%package test-rpm-macros -Summary: Convenience RPM macros for build-time testing against PostgreSQL server -Requires: %{name}-server = %{version}-%{release} - -%description test-rpm-macros -This package is meant to be added as BuildRequires: dependency of other packages -that want to run build-time testsuite against running PostgreSQL server. - %package static Summary: Statically linked PostgreSQL libraries @@ -105,23 +101,6 @@ counterparts. %description devel This package provides Libraries and header files for postgresql. -%package upgrade -Summary: Support needed for upgrading a PostgreSQL database -Requires: %{name}-server = %{version}-%{release} %{name}-libs = %{version}-%{release} -Provides: bundled(postgresql-libs) = 9.6.10 - -%description upgrade -This package provides the pg_upgrade utility and supporting files needed -for upgrading a PostgreSQL database from the previous major version of -PostgreSQL. - -%package upgrade-devel -Summary: Support for build of extensions required for upgrade process -Requires: %{name}-upgrade = %{version}-%{release} - -%description upgrade-devel -This package provides the development files needed to compile C or C++ -applications which are necessary in upgrade process. %package plperl Summary: The Perl procedural language for PostgreSQL @@ -164,9 +143,8 @@ PostgreSQL database management system, including regression tests and benchmarks ( cd "$(dirname "%{SOURCE0}")" sha256sum -c %{SOURCE3} - sha256sum -c %{SOURCE4} ) -%setup -q -a 2 +%setup -q %patch0000 -p1 %patch0001 -p1 %patch6000 -p1 @@ -175,9 +153,6 @@ PostgreSQL database management system, including regression tests and benchmarks %patch6003 -p1 %patch6004 -p1 -tar xfj %{SOURCE1} -find . -type f -name .gitignore | xargs rm - %build if [ x"`id -u`" = x0 ]; then echo "postgresql's regression tests fail if run as root." @@ -186,14 +161,6 @@ if [ x"`id -u`" = x0 ]; then exit 1 fi -pushd postgresql-setup-8.2 - -%configure pgdocdir=%{_pkgdocdir} PGVERSION=%{version} pgsetup_cv_os_family=redhat \ - PGMAJORVERSION=10 NAME_DEFAULT_PREV_SERVICE=postgresql - -%make_build -popd - CFLAGS="${CFLAGS:-%optflags}" CFLAGS=`echo $CFLAGS|xargs -n 1|grep -v ffast-math|xargs -n 100` export CFLAGS @@ -259,46 +226,8 @@ run_testsuite "contrib" test "$test_failure" -eq 0 make all -C src/test/regress -pushd postgresql-9.6.10 - -upgrade_configure () -{ - PYTHON="${PYTHON-/usr/bin/python3}" \ - CFLAGS="$CFLAGS -fno-aggressive-loop-optimizations" ./configure \ - --build=%{_build} --host=%{_host} --prefix=%{_libdir}/pgsql/postgresql-9.6 \ - --disable-rpath --with-perl --with-tcl --with-tclconfig=%_libdir \ - --with-system-tzdata=/usr/share/zoneinfo "$@" -} - -export PYTHON=/usr/bin/python3 -upgrade_configure --with-python -%make_build -C src/pl/plpython all -cp src/pl/plpython/plpython3.so ./ -unset PYTHON -make distclean - -upgrade_configure --with-python -%make_build all -%make_build -C contrib all -popd - %install -pushd postgresql-setup-8.2 -%make_install -popd - -mv $RPM_BUILD_ROOT/%{_pkgdocdir}/README.rpm-dist ./ - -cat > $RPM_BUILD_ROOT%{_sysconfdir}/postgresql-setup/upgrade/postgresql.conf < $RPM_BUILD_ROOT%macrosdir/macros.%name-upgrade -%%postgresql_upgrade_prefix %{_libdir}/pgsql/postgresql-9.6 -EOF - +install -D %{SOURCE7} $RPM_BUILD_ROOT%{_libexecdir}/postgresql-check-db-dir +install %{SOURCE8} $RPM_BUILD_ROOT%{_bindir}/postgresql-setup +install -Dm 0644 %{SOURCE9} $RPM_BUILD_ROOT%{_unitdir}/postgresql.service +install -D %{SOURCE10} $RPM_BUILD_ROOT%{_datadir}/postgresql-setup/library.sh install -d $RPM_BUILD_ROOT%{_libdir}/pgsql/test cp -a src/test/regress $RPM_BUILD_ROOT%{_libdir}/pgsql/test @@ -397,9 +310,6 @@ find_lang_bins pltcl.lst pltcl %systemd_postun_with_restart postgresql.service -%check -make -C postgresql-setup-8.2 check - %clean @@ -423,7 +333,7 @@ make -C postgresql-setup-8.2 check %files help %doc doc/html doc/KNOWN_BUGS doc/MISSING_FEATURES doc/TODO -%doc HISTORY doc/bug.template README.rpm-dist +%doc HISTORY doc/bug.template %{_libdir}/pgsql/tutorial/ %{_mandir}/man1/* %{_mandir}/man3/* @@ -459,20 +369,15 @@ make -C postgresql-setup-8.2 check %{_datadir}/postgresql-setup/library.sh %{_tmpfilesdir}/postgresql.conf %{_libdir}/pgsql/{*_and_*,dict_snowball,euc2004_sjis2004,libpqwalreceiver,pg_prewarm,pgoutput,plpgsql}.so -%{_libexecdir}/initscripts/legacy-actions/postgresql/* %{_libexecdir}/postgresql-check-db-dir -%{_sbindir}/postgresql-new-systemd-unit %{_unitdir}/*postgresql*.service %dir %{_datadir}/pgsql/{extension,contrib} %dir %{_datadir}/postgresql-setup -%dir %{_libexecdir}/initscripts/legacy-actions/postgresql -%dir %{_sysconfdir}/postgresql-setup/upgrade %attr(700,postgres,postgres) %dir %{?_localstatedir}/lib/pgsql %attr(700,postgres,postgres) %dir %{?_localstatedir}/lib/pgsql/backups %attr(700,postgres,postgres) %dir %{?_localstatedir}/lib/pgsql/data %attr(755,postgres,postgres) %dir %{?_localstatedir}/run/postgresql %attr(700,postgres,postgres) %config(noreplace) %{?_localstatedir}/lib/pgsql/.bash_profile -%config %{_sysconfdir}/postgresql-setup/upgrade/*.conf %files devel -f devel.lst @@ -480,28 +385,11 @@ make -C postgresql-setup-8.2 check %{_bindir}/{ecpg,pg_config} %{_libdir}/{pgsql/pgxs/,pkgconfig/*.pc} %{_libdir}/{libecpg,libecpg_compat,libpgtypes,libpq}.so -%{macrosdir}/macros.%name %files static %{_libdir}/libpgcommon.a %{_libdir}/libpgport.a -%files test-rpm-macros -%{_datadir}/postgresql-setup/postgresql_pkg_tests.sh -%{macrosdir}/macros.%name-test - - -%files upgrade -%{_libdir}/pgsql/postgresql-9.6/{bin,lib,share} -%exclude %{_libdir}/pgsql/postgresql-9.6/bin/pg_config -%exclude %{_libdir}/pgsql/postgresql-9.6/lib/{pgxs,pkgconfig} - - -%files upgrade-devel -%{_libdir}/pgsql/postgresql-9.6/{include,bin/pg_config} -%{_libdir}/pgsql/postgresql-9.6/lib/{pkgconfig,pgxs} -%{macrosdir}/macros.%name-upgrade - %files plperl -f plperl.lst %{_datadir}/pgsql/extension/plperl* @@ -521,11 +409,15 @@ make -C postgresql-setup-8.2 check %attr(-,postgres,postgres) %{_libdir}/pgsql/test %changelog -* Tue Mar 10 2020 steven 10.5-12 +* Tue Apr 07 2020 daiqianwen - 10.5-13 +- Type: enhancement +- DESC: delete unseless tarball + +* Tue Mar 10 2020 steven - 10.5-12 - Type: enhancement - DESC: remove python2 -* Mon Mar 10 2020 yanzhihua 10.5-11 +* Mon Mar 10 2020 yanzhihua - 10.5-11 - Type: bug fix - ID: #I1AHMH - SUG: NA