Skip to content

Instantly share code, notes, and snippets.

@mche
Last active November 15, 2018 11:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mche/08d0dc800c9e32cc92afc1dcbaec0470 to your computer and use it in GitHub Desktop.
Save mche/08d0dc800c9e32cc92afc1dcbaec0470 to your computer and use it in GitHub Desktop.
Gentoo openrc postgresql init
#!/sbin/openrc-run
# Copyright 1999-2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# Comma-separated list of directories that contain a unix
# socket. Created and controlled by the related initscript. The
# directories created will be owned root:postgres with mode 1775.
#
# /run/postgresql is the default directory.
#~ PG_SOCKET_DIRECTORIES="/tmp"
PGUSER="guest"
# Which port and socket to bind PostgreSQL
PGPORT="5432"
# How long to wait for server to start in seconds
START_TIMEOUT=10
# NICE_QUIT ignores new connections and wait for clients to disconnect from
# server before shutting down. NICE_TIMEOUT in seconds determines how long to
# wait for this to succeed.
NICE_TIMEOUT=60
# Forecfully disconnect clients from server and shut down. This is performed
# after NICE_QUIT. Terminated client connections have their open transactions
# rolled back.
# Set RUDE_QUIT to "NO" to disable. RUDE_TIMEOUT in seconds.
RUDE_QUIT="YES"
RUDE_TIMEOUT=30
# If the server still fails to shutdown, you can force it to quit by setting
# this to YES and a recover-run will execute on the next startup.
# Set FORCE_QUIT to "YES" to enable. FORCE_TIMEOUT in seconds.
FORCE_QUIT="NO"
FORCE_TIMEOUT=2
# Extra options to run postmaster with, e.g.:
# -N is the maximal number of client connections
# -B is the number of shared buffers and has to be at least 2x the value for -N
# Please read the man-page to postmaster for more options. Many of these
# options can be set directly in the configuration file.
#PGOPTS="-N 512 -B 1024"
# отключить TCP
PGOPTS=' -c listen_addresses="" '
# Pass extra environment variables. If you have to export environment variables
# for the database process, this can be done here.
# Don't forget to escape quotes.
#PG_EXTRA_ENV="PGPASSFILE=\"/path/to/.pgpass\""
##############################################################################
#
# The following values should not be arbitrarily changed.
#
# `emerge --config dev-db/postgresql:9.6' uses these values to
# determine where to create the data directory, where to place the
# configuration files, and any additional options to pass to initdb.
#
# The initscript also uses these variables to inform PostgreSQL where to find
# its data directory and configuration files.
#
##############################################################################
# Location of configuration files
PGDIR="/home/guest/postgresql"
# Where the data directory is located/to be created
DATA_DIR="${PGDIR}/data"
# Additional options to pass to initdb.
# See `man initdb' for available options.
##PG_INITDB_OPTS="--encoding=UTF8"
extra_commands="initdb"
extra_started_commands="reload promote"
PG_CTL="${PGDIR}/bin/pg_ctl"
description="PostgreSQL --- the world's most advanced open source database --
${RC_SERVICE} is a wrapper around pg_ctl with additional administrative checks
and convenience"
get_config() {
[ -f "${DATA_DIR%/}/postgresql.conf" ] || return 1
eval echo $(sed -e 's:#.*::' "${DATA_DIR%/}/postgresql.conf" \
| awk '$1 == "'$1'" { print ($2 == "=" ? $3 : $2) }')
}
depend() {
use net
provide postgresql
if [ "$(get_config log_destination)" = "syslog" ]; then
use logger
fi
}
configured_port=$(get_config port)
: ${configured_port:=${PGPORT}}
checkconfig() {
# Check that DATA_DIR has been set
if [ -z "${DATA_DIR}" ] ; then
eerror "DATA_DIR not set"
#~ eerror "HINT: Perhaps you need to update /etc/conf.d/postgresql-9.6"
return 1
fi
# Check that DATA_DIR exists
if [ ! -d "${DATA_DIR}" ] ; then
eerror "Directory not found: ${DATA_DIR}"
#~ eerror "HINT: Ensure that DATA_DIR points to the right path."
#~ eerror "HINT: Or perhaps you need to create the database cluster:"
#~ eerror " emerge --config dev-db/postgresql:9.6"
return 1
fi
# Check for the existence of PostgreSQL's config files, and set the
# proper mode and ownership.
# Only three files should be checked as potentially other files
# may be in PGDATA that should not be touched.
local file
for file in postgresql pg_hba pg_ident ; do
file="${DATA_DIR%/}/${file}.conf"
if [ -f "${file}" ] ; then
checkpath -f -m 0600 -o $PGUSER:$PGUSER "${file}"
else
eerror "${file} not found"
#~ eerror "HINT: mv ${DATA_DIR%/}/*.conf ${PGDATA}"
return 1
fi
done
# Set the proper permission for the socket paths and create it if
# it doesn't exist.
#~ set -f; IFS=','
#~ local s
#~ for s in ${PG_SOCKET_DIRECTORIES}; do
#~ checkpath -d -m 1775 -o root:postgres "${s}"
#~ if [ -e "${s%/}/.s.PGSQL.${configured_port}" ] ; then
#~ eerror "Socket conflict."
#~ eerror "A server is already listening on:"
#~ eerror " ${s%/}/.s.PGSQL.${configured_port}"
#~ eerror "HINT: Change PGPORT to listen on a different socket."
#~ return 1
#~ fi
#~ done
#~ set +f; unset IFS
}
start() {
checkconfig || return 1
ebegin "Starting PostgreSQL"
rm -f "${DATA_DIR%/}/postmaster.pid"
# PGPORT=${configured_port}
su - $PGUSER -c " ${PG_CTL} start \
-w -t ${START_TIMEOUT} -l ${DATA_DIR%/}/logfile -D ${DATA_DIR} -o '${PGOPTS}' "
local retval=$?
#~ if [ $retval -ne 0 ] ; then
#~ eerror "Check the log for a possible explanation of the above error."
#~ eerror "The log may be located at:"
#~ eerror " ${DATA_DIR%/}/postmaster.log"
#~ eerror "Or wherever you configured PostgreSQL 9.6 to log."
#~ fi
eend $retval
}
stop() {
local seconds=$(( ${NICE_TIMEOUT} + ${RUDE_TIMEOUT} + ${FORCE_TIMEOUT} ))
ebegin "Stopping PostgreSQL (this can take up to ${seconds} seconds)"
su - $PGUSER -c \
"${PG_CTL} stop -t ${NICE_TIMEOUT} -s -D ${DATA_DIR} -m smart"
local retval=$?
if [ "${RUDE_QUIT}" != "NO" -a ${retval} -ne 0 ] ; then
einfo "Previous attempt failed. Trying RUDE_QUIT."
su - $PGUSER -c \
"${PG_CTL} stop -t ${RUDE_TIMEOUT} -s -D ${DATA_DIR} -m fast"
retval=$?
fi
if [ "${FORCE_QUIT}" = "YES" -a ${retval} -ne 0 ] ; then
einfo "Previous step failed. Trying FORCE_QUIT."
ewarn "A recover-run might be executed on next startup."
su - $PGUSER -c \
"${PG_CTL} stop -t ${FORCE_TIMEOUT} -s -D ${DATA_DIR} -m immediate"
retval=$?
fi
eend ${retval}
}
status() {
ebegin "Checking PostgreSQL status"
su - $PGUSER -c "${PG_CTL} status -D ${DATA_DIR}"
eend $?
}
description_reload="Simply sends the postgres process a SIGHUP signal, causing
it to reread its configuration files (postgresql.conf, pg_hba.conf,
etc.). This allows changing of configuration-file options that do not
require a complete restart to take effect."
reload() {
ebegin "Reloading PostgreSQL configuration"
su - $PGUSER -c "${PG_CTL} reload -s -D ${DATA_DIR}"
eend $?
}
description_promote="If the server is in standby, it is commanded to exit
recovery and begin read-write operations."
promote() {
ebegin "Promoting PostgreSQL"
su - $PGUSER -c "${PG_CTL} promote -s -D ${DATA_DIR}"
eend $?
}
#~ PostgreSQL library and include directories. However, if you want to
#~ control it yourself, define the environment variables POSTGRES_INCLUDE
#~ and POSTGRES_LIB, or define just POSTGRES_HOME. Note that if you have
#~ compiled PostgreSQL with SSL support, you must define the POSTGRES_LIB
#~ environment variable and add "-lssl" to it, like this:
# export POSTGRES_LIB="/usr/local/pgsql/lib -lssl"
initdb() {
ebegin "Initing PostgreSQL cluster on ${DATA_DIR}"
su - $PGUSER -c "mkdir -p ${DATA_DIR}; ${PGDIR}/bin/initdb -D ${DATA_DIR} ${PG_INITDB_OPTS}"
local retval=$?
if [ $retval -eq 0 ] ; then
su - $PGUSER -c " echo 'export POSTGRES_HOME=\"${PGDIR}\" > ${PGDIR}/env;' \
echo 'export PATH=\"${PGDIR}/bin:$PATH\" ' >> ${PGDIR}/env; \
echo 'export LD_LIBRARY_PATH=\"${PGDIR}/lib:$LD_LIBRARY_PATH\" ' >> ${PGDIR}/env; \
echo 'export CPATH=\"${PGDIR}/include:$CPATH\" ' >> ${PGDIR}/env; \
echo 'export MANPATH=\"${PGDIR}/share/man:$MANPATH\" ' >> ${PGDIR}/env; "
echo "You can add >> source ${PGDIR}/env << to user's <${PGUSER}> ~/.bashrc or ~/.bash_profile or similar file"
echo "to have it all set to your paths"
echo "<export POSTGRES_HOME=\"${PGDIR}\"; cpanm --reinstall DBD::Pg> "
fi
eend ${retval}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment