Server IP : 192.168.23.10 / Your IP : 18.191.144.15 Web Server : Apache System : Linux echo.premieradvertising.com 5.14.0-362.8.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Nov 7 14:54:22 EST 2023 x86_64 User : rrrallyteam ( 1049) PHP Version : 8.1.31 Disable Function : exec,passthru,shell_exec,system MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF Directory (0555) : /bin/ |
[ Home ] | [ C0mmand ] | [ Upload File ] |
---|
#!/usr/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." # Warning about possible glibc collation changes BZ#1668301 GLIBC_COLLATION_WARN_STRING="\ If you've just upgraded your database from a previous major version of Fedora or RHEL, please run reindexdb against your databases. Core library collation data may have changed and this will invalidate database indexes. For example, in Fedora 28 and RHEL 8 there have been extensive changes in glibc collations to support ISO 14651:2016 (Unicode 9.0.0 data) and your indexes may be affected: https://sourceware.org/ml/libc-announce/2018/msg00002.html" print_version() { echo "postgresql-setup 8.6" echo $"Built against PostgreSQL version 13.18." } 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/log" $RESTORECON "$pgdata/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. # Warn about possible glibc collation changes on success BZ#1668301 warn "$GLIBC_COLLATION_WARN_STRING" 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_port="s/^$sp*port$sp*=$sp*\([0-9]\+\).*/\1/p" local sed_expr_pgdata="s/^$sp*data_directory$sp*=\(.*\)/\1/p" conf_pgport=`sed -n "$sed_expr_port" $conffile | tail -1` conf_pgdata=`sed -n "$sed_expr_pgdata" $conffile | tail -1` test -n "$conf_pgport" && debug "postgresql.conf pgport: $conf_pgport" test -n "$conf_pgdata" && debug "postgresql.conf pgdata (data_directory): $conf_pgdata" } 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" } # <Compat> # 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 # </Compat> # 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 # Check for data_directory entry in config file # valid entry means that custom PGDATA path is present which is not supported # BZ (#1935301) if test -n "$conf_pgdata"; then error $"data_directory field in configuration file is not supported." error_q $"db datadir (PGDATA) needs to be specified exclusively in service/unit" error_q $"file as an Environment variable." error_q $"In order to use this script, please remove data_directory entry from" error_q $"configuration file and make sure that the default location" error_q $"(PGDATA) in .service file is valid." exit 1 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/13/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