blob: 6a0489013a721223e0a80a6aa814cae9afdca21f (
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
138
139
140
141
142
143
|
#!/sbin/openrc-run
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
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_paths=$(get_config unix_socket_directories)
: ${socket_paths:=/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 paths and create it if
# it doesn't exist.
set -f; IFS=','
local s
for s in ${socket_paths}; do
checkpath -d -m 1775 -o postgres: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
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 $?
}
|