logo

overlay

My (experimental) gentoo overlay

postgresql.init-9.3-r1 (4999B)


      1 #!/sbin/openrc-run
      2 # Copyright 1999-2018 Gentoo Foundation
      3 # Distributed under the terms of the GNU General Public License v2
      4 
      5 extra_started_commands="reload promote"
      6 
      7 PG_CTL="/usr/@LIBDIR@/postgresql-@SLOT@/bin/pg_ctl"
      8 
      9 description="PostgreSQL @SLOT@ -- the world's most advanced open source database --
     10 ${RC_SERVICE} is a wrapper around pg_ctl with additional administrative checks
     11 and convenience"
     12 
     13 get_config() {
     14     [ -f "${PGDATA%/}/postgresql.conf" ] || return 1
     15 
     16     eval echo $(sed -e 's:#.*::' "${PGDATA%/}/postgresql.conf" \
     17         | awk '$1 == "'$1'" { print ($2 == "=" ? $3 : $2) }')
     18 }
     19 
     20 depend() {
     21     use net
     22     provide postgresql
     23 
     24     if [ "$(get_config log_destination)" = "syslog" ]; then
     25         use logger
     26     fi
     27 }
     28 
     29 configured_port=$(get_config port)
     30 : ${configured_port:=${PGPORT}}
     31 
     32 checkconfig() {
     33     # Check that DATA_DIR has been set
     34     if [ -z "${DATA_DIR}" ] ; then
     35         eerror "DATA_DIR not set"
     36         eerror "HINT: Perhaps you need to update /etc/conf.d/postgresql-@SLOT@"
     37         return 1
     38     fi
     39 
     40     # Check that DATA_DIR exists
     41     if [ ! -d "${DATA_DIR}" ] ; then
     42         eerror "Directory not found: ${DATA_DIR}"
     43         eerror "HINT: Ensure that DATA_DIR points to the right path."
     44         eerror "HINT: Or perhaps you need to create the database cluster:"
     45         eerror "    emerge --config dev-db/postgresql:@SLOT@"
     46         return 1
     47     fi
     48 
     49     # Check for the existence of PostgreSQL's config files, and set the
     50     # proper mode and ownership.
     51     # Only three files should be checked as potentially other files
     52     # may be in PGDATA that should not be touched.
     53     local file
     54     for file in postgresql pg_hba pg_ident ; do
     55         file="${PGDATA%/}/${file}.conf"
     56         if [ -f "${file}" ] ; then
     57             checkpath -f -m 0600 -o postgres:postgres "${file}"
     58         else
     59             eerror "${file} not found"
     60             eerror "HINT: mv ${DATA_DIR%/}/*.conf ${PGDATA}"
     61             return 1
     62         fi
     63     done
     64 
     65     # Set the proper permission for the socket paths and create it if
     66     # it doesn't exist.
     67     set -f; IFS=','
     68     local s
     69     for s in ${PG_SOCKET_DIRECTORIES}; do
     70         checkpath -d -m 1775 -o root:postgres "${s}"
     71         if [ -e "${s%/}/.s.PGSQL.${configured_port}" ] ; then
     72             eerror "Socket conflict."
     73             eerror "A server is already listening on:"
     74             eerror "    ${s%/}/.s.PGSQL.${configured_port}"
     75             eerror "HINT: Change PGPORT to listen on a different socket."
     76             return 1
     77         fi
     78     done
     79     set +f; unset IFS
     80 }
     81 
     82 start() {
     83     checkconfig || return 1
     84 
     85     ebegin "Starting PostgreSQL @SLOT@"
     86 
     87     rm -f "${DATA_DIR%/}/postmaster.pid"
     88 
     89     su - postgres -c \
     90        "PGPORT=${configured_port} ${PG_EXTRA_ENV} ${PG_CTL} start \
     91            -s -w -t ${START_TIMEOUT} -l ${DATA_DIR%/}/postmaster.log \
     92            -D ${PGDATA} \
     93            -o '--data-directory=${DATA_DIR} \
     94                --unix-socket-directories=${PG_SOCKET_DIRECTORIES} \
     95                ${PGOPTS}'"
     96 
     97     local retval=$?
     98 
     99     if [ $retval -ne 0 ] ; then
    100         eerror "Check the log for a possible explanation of the above error."
    101         eerror "The log may be located at:"
    102         eerror "    ${DATA_DIR%/}/postmaster.log"
    103         eerror "Or wherever you configured PostgreSQL @SLOT@ to log."
    104     fi
    105 
    106     eend $retval
    107 }
    108 
    109 stop() {
    110     local seconds=$(( ${NICE_TIMEOUT} + ${RUDE_TIMEOUT} + ${FORCE_TIMEOUT} ))
    111     ebegin "Stopping PostgreSQL @SLOT@ (this can take up to ${seconds} seconds)"
    112 
    113     su - postgres -c \
    114        "${PG_CTL} stop -t ${NICE_TIMEOUT} -s -D ${DATA_DIR} -m smart"
    115     local retval=$?
    116 
    117     if [ "${RUDE_QUIT}" != "NO" -a ${retval} -ne 0 ] ; then
    118         einfo "Previous attempt failed. Trying RUDE_QUIT."
    119         su - postgres -c \
    120            "${PG_CTL} stop -t ${RUDE_TIMEOUT} -s -D ${DATA_DIR} -m fast"
    121         retval=$?
    122     fi
    123 
    124     if [ "${FORCE_QUIT}" = "YES" -a ${retval} -ne 0 ] ; then
    125         einfo "Previous step failed. Trying FORCE_QUIT."
    126         ewarn "A recover-run might be executed on next startup."
    127         su - postgres -c \
    128            "${PG_CTL} stop -t ${FORCE_TIMEOUT} -s -D ${DATA_DIR} -m immediate"
    129         retval=$?
    130     fi
    131 
    132     eend ${retval}
    133 }
    134 
    135 status() {
    136     ebegin "Checking PostgreSQL @SLOT@ status"
    137     su - postgres -c "${PG_CTL} status -D ${DATA_DIR}"
    138     eend $?
    139 }
    140 
    141 description_reload="Simply sends the postgres process a SIGHUP signal, causing
    142            it to reread its configuration files (postgresql.conf, pg_hba.conf,
    143            etc.). This allows changing of configuration-file options that do not
    144            require a complete restart to take effect."
    145 reload() {
    146     ebegin "Reloading PostgreSQL @SLOT@ configuration"
    147     su - postgres -c "${PG_CTL} reload -s -D ${DATA_DIR}"
    148     eend $?
    149 }
    150 
    151 description_promote="If the server is in standby, it is commanded to exit
    152             recovery and begin read-write operations."
    153 promote() {
    154     ebegin "Promoting PostgreSQL @SLOT@"
    155     su - postgres -c "${PG_CTL} promote -s -D ${DATA_DIR}"
    156     eend $?
    157 }