summaryrefslogtreecommitdiff
blob: 35dd316e9604f8ee3d7b221273ef36e479b12ce7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/sbin/openrc-run
# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

extra_started_commands="reload"

get_config() {
    [ -f ${PGDATA%/}/postgresql.conf ] || return 1

    eval echo $(sed -e 's:#.*::' ${PGDATA%/}/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}}
socket_path=$(get_config unix_socket_directory)
: ${socket_path:=/run/postgresql}

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-@SLOT@"
        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:@SLOT@"
        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="${PGDATA%/}/${file}.conf"
        if [ -f ${file} ] ; then
            checkpath -f -m 0600 -o postgres:postgres ${file}
        else
            eerror "${file} not found"
            eerror "HINT: mv ${DATA_DIR%/}/*.conf ${PGDATA}"
            return 1
        fi
    done

    # Set the proper permission for the socket path and create it if
    # it doesn't exist.
    checkpath -d -m 1775 -o postgres:postgres ${socket_path}
    if [ -e ${socket_path%/}/.s.PGSQL.${configured_port} ] ; then
        eerror "Socket conflict."
        eerror "A server is already listening on:"
        eerror "    ${socket_path%/}/.s.PGSQL.${configured_port}"
        eerror "HINT: Change PGPORT to listen on a different socket."
        return 1
    fi
}

start() {
    checkconfig || return 1

    ebegin "Starting PostgreSQL"

    rm -f ${DATA_DIR%/}/postmaster.pid

    local extraenv
    local x
    for x in ${PG_EXTRA_ENV} ; do
        extraenv="${extraenv} --env ${x}"
    done

    start-stop-daemon --start \
        --user postgres \
        --env "PGPORT=${configured_port}" \
        ${extraenv} \
        --pidfile ${DATA_DIR%/}/postmaster.pid \
        --exec /usr/@LIBDIR@/postgresql-@SLOT@/bin/pg_ctl \
        -- start -s -w -t ${START_TIMEOUT} -l ${DATA_DIR%/}/postmaster.log \
                 -D ${PGDATA} -o "--data-directory=${DATA_DIR} ${PGOPTS}"
    local retval=$?

    if [ $retval -ne 0 ] ; then
        eerror "Check the log for a possible explanation of the above error. The log may be"
        eerror "    ${DATA_DIR%/}/postmaster.log"
        eerror "Or wherever you configured PostgreSQL @SLOT@ log messages to be sent."
        eend $retval
        return $retval
    fi

    eend $retval
}

stop() {
    local seconds=$(( ${NICE_TIMEOUT} + ${RUDE_TIMEOUT} + ${FORCE_TIMEOUT} ))
    ebegin "Stopping PostgreSQL (this can take up to ${seconds} seconds)"

    local retval
    local retries=SIGTERM/${NICE_TIMEOUT}

    if [ "${RUDE_QUIT}" != "NO" ] ; then
        einfo "RUDE_QUIT enabled."
        retries="${retries}/SIGINT/${RUDE_TIMEOUT}"
    fi
    if [ "${FORCE_QUIT}" = "YES" ] ; then
        einfo "FORCE_QUIT enabled."
        ewarn "A recover-run might be executed on next startup."
        retries="${retries}/SIGQUIT/${FORCE_TIMEOUT}"
    fi

    # Loops through nice, rude, and force quit in one go.
    start-stop-daemon --stop \
        --exec /usr/@LIBDIR@/postgresql-@SLOT@/bin/postgres \
        --retry ${retries} \
        --pidfile ${DATA_DIR%/}/postmaster.pid

    eend
}

reload() {
    ebegin "Reloading PostgreSQL configuration"
    kill -HUP $(head -n1 ${DATA_DIR%/}/postmaster.pid)
    eend $?
}