/[gentoo-x86]/eclass/webapp.eclass
Gentoo

Diff of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.50 Revision 1.66
1# Copyright 1999-2006 Gentoo Foundation 1# Copyright 1999-2006 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/webapp.eclass,v 1.50 2008/02/22 10:03:55 hollow Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/webapp.eclass,v 1.66 2011/05/19 12:05:13 scarabeus Exp $
4# 4
5# @ECLASS: webapp.eclass 5# @ECLASS: webapp.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# web-apps@gentoo.org 7# web-apps@gentoo.org
8# @BLURB: functions for installing applications to run under a web server 8# @BLURB: functions for installing applications to run under a web server
9# @DESCRIPTION: 9# @DESCRIPTION:
10# The webapp eclass contains functions to handle web applications with 10# The webapp eclass contains functions to handle web applications with
11# webapp-config. Part of the implementation of GLEP #11 11# webapp-config. Part of the implementation of GLEP #11
12 12
13# @ECLASS-VARIABLE: WEBAPP_DEPEND
14# @DESCRIPTION:
15# An ebuild should use WEBAPP_DEPEND if a custom DEPEND needs to be built, most
16# notably in combination with WEBAPP_OPTIONAL.
17WEBAPP_DEPEND=">=app-admin/webapp-config-1.50.15"
18
19# @ECLASS-VARIABLE: WEBAPP_NO_AUTO_INSTALL
20# @DESCRIPTION:
21# An ebuild sets this to `yes' if an automatic installation and/or upgrade is
22# not possible. The ebuild should overwrite pkg_postinst() and explain the
23# reason for this BEFORE calling webapp_pkg_postinst().
24
25# @ECLASS-VARIABLE: WEBAPP_OPTIONAL
26# @DESCRIPTION:
27# An ebuild sets this to `yes' to make webapp support optional, in which case
28# you also need to take care of USE-flags and dependencies.
29
30if [[ "${WEBAPP_OPTIONAL}" != "yes" ]]; then
31 [[ "${WEBAPP_NO_AUTO_INSTALL}" == "yes" ]] || IUSE="vhosts"
13SLOT="${PVR}" 32 SLOT="${PVR}"
14IUSE="vhosts" 33 DEPEND="${WEBAPP_DEPEND}"
15DEPEND=">=app-admin/webapp-config-1.50.15"
16RDEPEND="${DEPEND}" 34 RDEPEND="${DEPEND}"
35fi
17 36
18EXPORT_FUNCTIONS pkg_postinst pkg_setup src_install pkg_prerm 37EXPORT_FUNCTIONS pkg_postinst pkg_setup src_install pkg_prerm
19 38
20INSTALL_DIR="/${PN}" 39INSTALL_DIR="/${PN}"
21IS_UPGRADE=0 40IS_UPGRADE=0
22IS_REPLACE=0 41IS_REPLACE=0
23 42
24INSTALL_CHECK_FILE="installed_by_webapp_eclass" 43INSTALL_CHECK_FILE="installed_by_webapp_eclass"
44SETUP_CHECK_FILE="setup_by_webapp_eclass"
25 45
26ETC_CONFIG="${ROOT}/etc/vhosts/webapp-config" 46ETC_CONFIG="${ROOT}etc/vhosts/webapp-config"
27WEBAPP_CONFIG="${ROOT}/usr/sbin/webapp-config" 47WEBAPP_CONFIG="${ROOT}usr/sbin/webapp-config"
28WEBAPP_CLEANER="${ROOT}/usr/sbin/webapp-cleaner" 48WEBAPP_CLEANER="${ROOT}usr/sbin/webapp-cleaner"
29 49
30# ============================================================================== 50# ==============================================================================
31# INTERNAL FUNCTIONS 51# INTERNAL FUNCTIONS
32# ============================================================================== 52# ==============================================================================
33 53
34# Load the config file /etc/vhosts/webapp-config 54# Load the config file /etc/vhosts/webapp-config
35# Supports both the old bash version, and the new python version 55# Supports both the old bash version, and the new python version
36webapp_read_config() { 56webapp_read_config() {
57 debug-print-function $FUNCNAME $*
58
37 if has_version '>=app-admin/webapp-config-1.50'; then 59 if has_version '>=app-admin/webapp-config-1.50'; then
38 ENVVAR=$(${WEBAPP_CONFIG} --query ${PN} ${PVR}) || die "Could not read settings from webapp-config!" 60 ENVVAR=$(${WEBAPP_CONFIG} --query ${PN} ${PVR}) || die "Could not read settings from webapp-config!"
39 eval ${ENVVAR} 61 eval ${ENVVAR}
40 else 62 else
41 . ${ETC_CONFIG} || die "Unable to read ${ETC_CONFIG}" 63 . ${ETC_CONFIG} || die "Unable to read ${ETC_CONFIG}"
42 fi 64 fi
43} 65}
44 66
45# Check whether a specified file exists in the given directory (`.' by default) 67# Check whether a specified file exists in the given directory (`.' by default)
46webapp_checkfileexists() { 68webapp_checkfileexists() {
47 local my_prefix 69 debug-print-function $FUNCNAME $*
48 70
49 [ -n "${2}" ] && my_prefix="${2}/" || my_prefix= 71 local my_prefix=${2:+${2}/}
50 72
51 if [ ! -e "${my_prefix}${1}" ]; then 73 if [[ ! -e "${my_prefix}${1}" ]]; then
52 msg="ebuild fault: file '${1}' not found" 74 msg="ebuild fault: file '${1}' not found"
53 eerror "$msg" 75 eerror "$msg"
54 eerror "Please report this as a bug at http://bugs.gentoo.org/" 76 eerror "Please report this as a bug at http://bugs.gentoo.org/"
55 die "$msg" 77 die "$msg"
56 fi 78 fi
57} 79}
58 80
59webapp_check_installedat() { 81webapp_check_installedat() {
82 debug-print-function $FUNCNAME $*
60 ${WEBAPP_CONFIG} --show-installed -h localhost -d "${INSTALL_DIR}" 2> /dev/null 83 ${WEBAPP_CONFIG} --show-installed -h localhost -d "${INSTALL_DIR}" 2> /dev/null
61} 84}
62 85
63webapp_strip_appdir() { 86webapp_strip_appdir() {
64 local my_stripped="${1}" 87 debug-print-function $FUNCNAME $*
65 echo "${1}" | sed -e "s|${MY_APPDIR}/||g;" 88 echo "${1#${MY_APPDIR}/}"
66} 89}
67 90
68webapp_strip_d() { 91webapp_strip_d() {
69 echo "${1}" | sed -e "s|${D}||g;" 92 debug-print-function $FUNCNAME $*
93 echo "${1#${D}}"
70} 94}
71 95
72webapp_strip_cwd() { 96webapp_strip_cwd() {
73 local my_stripped="${1}" 97 debug-print-function $FUNCNAME $*
74 echo "${1}" | sed -e 's|/./|/|g;' 98 echo "${1/#.\///}"
75} 99}
76 100
77webapp_getinstalltype() { 101webapp_getinstalltype() {
78 # or are we upgrading? 102 debug-print-function $FUNCNAME $*
79 103
80 if ! use vhosts ; then 104 if ! has vhosts ${IUSE} || use vhosts; then
81 # we only run webapp-config if vhosts USE flag is not set 105 return
106 fi
82 107
83 local my_output 108 local my_output
84
85 my_output="$(webapp_check_installedat)" 109 my_output="$(webapp_check_installedat)"
86 110
87 if [ "${?}" = "0" ] ; then 111 if [[ $? -eq 0 ]]; then
88 # something is already installed there 112 # something is already installed there
89 #
90 # make sure it isn't the same version 113 # make sure it isn't the same version
91 114
92 local my_pn="$(echo ${my_output} | awk '{ print $1 }')" 115 local my_pn="$(echo ${my_output} | awk '{ print $1 }')"
93 local my_pvr="$(echo ${my_output} | awk '{ print $2 }')" 116 local my_pvr="$(echo ${my_output} | awk '{ print $2 }')"
94 117
95 REMOVE_PKG="${my_pn}-${my_pvr}" 118 REMOVE_PKG="${my_pn}-${my_pvr}"
96 119
97 if [ "${my_pn}" == "${PN}" ]; then 120 if [[ "${my_pn}" == "${PN}" ]]; then
98 if [ "${my_pvr}" != "${PVR}" ]; then 121 if [[ "${my_pvr}" != "${PVR}" ]]; then
99 elog "This is an upgrade" 122 elog "This is an upgrade"
100 IS_UPGRADE=1 123 IS_UPGRADE=1
101 else
102 elog "This is a re-installation"
103 IS_REPLACE=1
104 fi
105 else 124 else
106 elog "${my_output} is installed there" 125 elog "This is a re-installation"
126 IS_REPLACE=1
107 fi 127 fi
108 else 128 else
109 elog "This is an installation" 129 elog "${my_output} is installed there"
110 fi 130 fi
131 else
132 elog "This is an installation"
111 fi 133 fi
112} 134}
113 135
114# ============================================================================== 136# ==============================================================================
115# PUBLIC FUNCTIONS 137# PUBLIC FUNCTIONS
116# ============================================================================== 138# ==============================================================================
117 139
140# @FUNCTION: need_httpd
141# @DESCRIPTION:
142# Call this function AFTER your ebuilds DEPEND line if any of the available
143# webservers are able to run this application.
144need_httpd() {
145 DEPEND="${DEPEND}
146 || ( virtual/httpd-basic virtual/httpd-cgi virtual/httpd-fastcgi )"
147}
148
149# @FUNCTION: need_httpd_cgi
150# @DESCRIPTION:
151# Call this function AFTER your ebuilds DEPEND line if any of the available
152# CGI-capable webservers are able to run this application.
153need_httpd_cgi() {
154 DEPEND="${DEPEND}
155 || ( virtual/httpd-cgi virtual/httpd-fastcgi )"
156}
157
158# @FUNCTION: need_httpd_fastcgi
159# @DESCRIPTION:
160# Call this function AFTER your ebuilds DEPEND line if any of the available
161# FastCGI-capabale webservers are able to run this application.
162need_httpd_fastcgi() {
163 DEPEND="${DEPEND}
164 virtual/httpd-fastcgi"
165}
166
118# @FUNCTION: webapp_configfile 167# @FUNCTION: webapp_configfile
119# @USAGE: <file> [more files ...] 168# @USAGE: <file> [more files ...]
120# @DESCRIPTION: 169# @DESCRIPTION:
121# Mark a file config-protected for a web-based application. 170# Mark a file config-protected for a web-based application.
122webapp_configfile() { 171webapp_configfile() {
172 debug-print-function $FUNCNAME $*
173
123 local m="" 174 local m
124 for m in "$@" ; do 175 for m in "$@"; do
125 webapp_checkfileexists "${m}" "${D}" 176 webapp_checkfileexists "${m}" "${D}"
126 177
127 local MY_FILE="$(webapp_strip_appdir "${m}")" 178 local my_file="$(webapp_strip_appdir "${m}")"
128 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")" 179 my_file="$(webapp_strip_cwd "${my_file}")"
129 180
130 elog "(config) ${MY_FILE}" 181 elog "(config) ${my_file}"
131 echo "${MY_FILE}" >> ${D}/${WA_CONFIGLIST} 182 echo "${my_file}" >> ${D}/${WA_CONFIGLIST}
132 done 183 done
133} 184}
134 185
135# @FUNCTION: webapp_hook_script 186# @FUNCTION: webapp_hook_script
136# @USAGE: <file> 187# @USAGE: <file>
137# @DESCRIPTION: 188# @DESCRIPTION:
138# Install a script that will run after a virtual copy is created, and 189# Install a script that will run after a virtual copy is created, and
139# before a virtual copy has been removed. 190# before a virtual copy has been removed.
140webapp_hook_script() { 191webapp_hook_script() {
192 debug-print-function $FUNCNAME $*
193
141 webapp_checkfileexists "${1}" 194 webapp_checkfileexists "${1}"
142 195
143 elog "(hook) ${1}" 196 elog "(hook) ${1}"
144 cp "${1}" "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")" || die "Unable to install ${1} into ${D}/${MY_HOOKSCRIPTSDIR}/" 197 cp "${1}" "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")" || die "Unable to install ${1} into ${D}/${MY_HOOKSCRIPTSDIR}/"
145 chmod 555 "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")" 198 chmod 555 "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")"
148# @FUNCTION: webapp_postinst_txt 201# @FUNCTION: webapp_postinst_txt
149# @USAGE: <lang> <file> 202# @USAGE: <lang> <file>
150# @DESCRIPTION: 203# @DESCRIPTION:
151# Install a text file containing post-installation instructions. 204# Install a text file containing post-installation instructions.
152webapp_postinst_txt() { 205webapp_postinst_txt() {
206 debug-print-function $FUNCNAME $*
207
153 webapp_checkfileexists "${2}" 208 webapp_checkfileexists "${2}"
154 209
155 elog "(info) ${2} (lang: ${1})" 210 elog "(info) ${2} (lang: ${1})"
156 cp "${2}" "${D}/${MY_APPDIR}/postinst-${1}.txt" 211 cp "${2}" "${D}/${MY_APPDIR}/postinst-${1}.txt"
157} 212}
159# @FUNCTION: webapp_postupgrade_txt 214# @FUNCTION: webapp_postupgrade_txt
160# @USAGE: <lang> <file> 215# @USAGE: <lang> <file>
161# @DESCRIPTION: 216# @DESCRIPTION:
162# Install a text file containing post-upgrade instructions. 217# Install a text file containing post-upgrade instructions.
163webapp_postupgrade_txt() { 218webapp_postupgrade_txt() {
219 debug-print-function $FUNCNAME $*
220
164 webapp_checkfileexists "${2}" 221 webapp_checkfileexists "${2}"
165 222
166 elog "(info) ${2} (lang: ${1})" 223 elog "(info) ${2} (lang: ${1})"
167 cp "${2}" "${D}/${MY_APPDIR}/postupgrade-${1}.txt" 224 cp "${2}" "${D}/${MY_APPDIR}/postupgrade-${1}.txt"
225}
226
227# helper for webapp_serverowned()
228_webapp_serverowned() {
229 debug-print-function $FUNCNAME $*
230
231 webapp_checkfileexists "${1}" "${D}"
232 local my_file="$(webapp_strip_appdir "${1}")"
233 my_file="$(webapp_strip_cwd "${my_file}")"
234
235 elog "(server owned) ${my_file}"
236 echo "${my_file}" >> "${D}/${WA_SOLIST}"
168} 237}
169 238
170# @FUNCTION: webapp_serverowned 239# @FUNCTION: webapp_serverowned
171# @USAGE: [-R] <file> [more files ...] 240# @USAGE: [-R] <file> [more files ...]
172# @DESCRIPTION: 241# @DESCRIPTION:
173# Identify a file which must be owned by the webserver's user:group settings. 242# Identify a file which must be owned by the webserver's user:group settings.
174# The ownership of the file is NOT set until the application is installed using 243# The ownership of the file is NOT set until the application is installed using
175# the webapp-config tool. If -R is given directories are handled recursively. 244# the webapp-config tool. If -R is given directories are handled recursively.
176webapp_serverowned() { 245webapp_serverowned() {
246 debug-print-function $FUNCNAME $*
247
177 local a="" 248 local a m
178 local m=""
179 if [ "${1}" = "-R" ]; then 249 if [[ "${1}" == "-R" ]]; then
180 shift 250 shift
181 for m in "$@" ; do 251 for m in "$@"; do
182 for a in $(find ${D}/${m}); do 252 find "${D}${m}" | while read a; do
183 a=${a/${D}\/\///}
184 webapp_checkfileexists "${a}" "$D"
185 local MY_FILE="$(webapp_strip_appdir "${a}")" 253 a=$(webapp_strip_d "${a}")
186 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")" 254 _webapp_serverowned "${a}"
187
188 elog "(server owned) ${MY_FILE}"
189 echo "${MY_FILE}" >> "${D}/${WA_SOLIST}"
190 done 255 done
191 done 256 done
192 else 257 else
193 for m in "$@" ; do 258 for m in "$@"; do
194 webapp_checkfileexists "${m}" "$D" 259 _webapp_serverowned "${m}"
195 local MY_FILE="$(webapp_strip_appdir "${m}")"
196 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
197
198 elog "(server owned) ${MY_FILE}"
199 echo "${MY_FILE}" >> "${D}/${WA_SOLIST}"
200 done 260 done
201 fi 261 fi
202} 262}
203 263
204# @FUNCTION: webapp_server_configfile 264# @FUNCTION: webapp_server_configfile
207# Install a configuration file for the webserver. You need to specify a 267# Install a configuration file for the webserver. You need to specify a
208# webapp-config supported <server>. if no new name is given `basename $2' is 268# webapp-config supported <server>. if no new name is given `basename $2' is
209# used by default. Note: this function will automagically prepend $1 to the 269# used by default. Note: this function will automagically prepend $1 to the
210# front of your config file's name. 270# front of your config file's name.
211webapp_server_configfile() { 271webapp_server_configfile() {
272 debug-print-function $FUNCNAME $*
273
212 webapp_checkfileexists "${2}" 274 webapp_checkfileexists "${2}"
213 275
214 # sort out what the name will be of the config file 276 # WARNING:
215
216 local my_file
217
218 if [ -z "${3}" ]; then
219 my_file="${1}-$(basename "${2}")"
220 else
221 my_file="${1}-${3}"
222 fi
223
224 # warning:
225 # 277 #
226 # do NOT change the naming convention used here without changing all 278 # do NOT change the naming convention used here without changing all
227 # the other scripts that also rely upon these names 279 # the other scripts that also rely upon these names
280
281 local my_file="${1}-${3:-$(basename "${2}")}"
228 282
229 elog "(${1}) config file '${my_file}'" 283 elog "(${1}) config file '${my_file}'"
230 cp "${2}" "${D}/${MY_SERVERCONFIGDIR}/${my_file}" 284 cp "${2}" "${D}/${MY_SERVERCONFIGDIR}/${my_file}"
231} 285}
232 286
236# Install a SQL script that creates/upgrades a database schema for the web 290# Install a SQL script that creates/upgrades a database schema for the web
237# application. Currently supported database engines are mysql and postgres. 291# application. Currently supported database engines are mysql and postgres.
238# If a version is given the script should upgrade the database schema from 292# If a version is given the script should upgrade the database schema from
239# the given version to $PVR. 293# the given version to $PVR.
240webapp_sqlscript() { 294webapp_sqlscript() {
295 debug-print-function $FUNCNAME $*
296
241 webapp_checkfileexists "${2}" 297 webapp_checkfileexists "${2}"
242 298
243 # create the directory where this script will go 299 dodir "${MY_SQLSCRIPTSDIR}/${1}"
244 #
245 # scripts for specific database engines go into their own subdirectory
246 # just to keep things readable on the filesystem
247 300
248 if [ ! -d "${D}/${MY_SQLSCRIPTSDIR}/${1}" ]; then 301 # WARNING:
249 mkdir -p "${D}/${MY_SQLSCRIPTSDIR}/${1}" || die "unable to create directory ${D}/${MY_SQLSCRIPTSDIR}/${1}"
250 fi
251
252 # warning:
253 # 302 #
254 # do NOT change the naming convention used here without changing all 303 # do NOT change the naming convention used here without changing all
255 # the other scripts that also rely upon these names 304 # the other scripts that also rely upon these names
256 305
257 # are we dealing with an 'upgrade'-type script?
258 if [ -n "${3}" ]; then 306 if [[ -n "${3}" ]]; then
259 # yes we are
260 elog "(${1}) upgrade script from ${PN}-${PVR} to ${3}" 307 elog "(${1}) upgrade script for ${PN}-${3} to ${PVR}"
261 cp "${2}" "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql" 308 cp "${2}" "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql"
262 chmod 600 "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql" 309 chmod 600 "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql"
263 else 310 else
264 # no, we are not
265 elog "(${1}) create script for ${PN}-${PVR}" 311 elog "(${1}) create script for ${PN}-${PVR}"
266 cp "${2}" "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql" 312 cp "${2}" "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql"
267 chmod 600 "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql" 313 chmod 600 "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql"
268 fi 314 fi
269} 315}
271# @FUNCTION: webapp_src_preinst 317# @FUNCTION: webapp_src_preinst
272# @DESCRIPTION: 318# @DESCRIPTION:
273# You need to call this function in src_install() BEFORE anything else has run. 319# You need to call this function in src_install() BEFORE anything else has run.
274# For now we just create required webapp-config directories. 320# For now we just create required webapp-config directories.
275webapp_src_preinst() { 321webapp_src_preinst() {
322 debug-print-function $FUNCNAME $*
323
324 # sanity checks, to catch bugs in the ebuild
325 if [[ ! -f "${T}/${SETUP_CHECK_FILE}" ]]; then
326 eerror
327 eerror "This ebuild did not call webapp_pkg_setup() at the beginning"
328 eerror "of the pkg_setup() function"
329 eerror
330 eerror "Please log a bug on http://bugs.gentoo.org"
331 eerror
332 eerror "You should use emerge -C to remove this package, as the"
333 eerror "installation is incomplete"
334 eerror
335 die "Ebuild did not call webapp_pkg_setup() - report to http://bugs.gentoo.org"
336 fi
337
338 # Hint, see the webapp_read_config() function to find where these are
339 # defined.
276 dodir "${MY_HTDOCSDIR}" 340 dodir "${MY_HTDOCSDIR}"
277 dodir "${MY_HOSTROOTDIR}" 341 dodir "${MY_HOSTROOTDIR}"
278 dodir "${MY_CGIBINDIR}" 342 dodir "${MY_CGIBINDIR}"
279 dodir "${MY_ICONSDIR}" 343 dodir "${MY_ICONSDIR}"
280 dodir "${MY_ERRORSDIR}" 344 dodir "${MY_ERRORSDIR}"
285 349
286# ============================================================================== 350# ==============================================================================
287# EXPORTED FUNCTIONS 351# EXPORTED FUNCTIONS
288# ============================================================================== 352# ==============================================================================
289 353
290# @FUNCTION: webapp_src_install
291# @DESCRIPTION:
292# This is the default src_install(). For now, we just make sure that root owns
293# everything, and that there are no setuid files.
294#
295# You need to call this function AFTER everything else has run in your custom
296# src_install().
297webapp_src_install() {
298 chown -R "${VHOST_DEFAULT_UID}:${VHOST_DEFAULT_GID}" "${D}/"
299 chmod -R u-s "${D}/"
300 chmod -R g-s "${D}/"
301
302 keepdir "${MY_PERSISTDIR}"
303 fowners "root:0" "${MY_PERSISTDIR}"
304 fperms 755 "${MY_PERSISTDIR}"
305
306 # to test whether or not the ebuild has correctly called this function
307 # we add an empty file to the filesystem
308 #
309 # we used to just set a variable in the shell script, but we can
310 # no longer rely on Portage calling both webapp_src_install() and
311 # webapp_pkg_postinst() within the same shell process
312
313 touch "${D}/${MY_APPDIR}/${INSTALL_CHECK_FILE}"
314}
315
316# @FUNCTION: webapp_pkg_setup 354# @FUNCTION: webapp_pkg_setup
317# @DESCRIPTION: 355# @DESCRIPTION:
318# The default pkg_setup() for this eclass. This will gather required variables 356# The default pkg_setup() for this eclass. This will gather required variables
319# from webapp-config and check if there is an application installed to 357# from webapp-config and check if there is an application installed to
320# `${ROOT}/var/www/localhost/htdocs/${PN}/' if USE=vhosts is not set. 358# `${ROOT}/var/www/localhost/htdocs/${PN}/' if USE=vhosts is not set.
321# 359#
322# You need to call this function BEFORE anything else has run in your custom 360# You need to call this function BEFORE anything else has run in your custom
323# pkg_setup(). 361# pkg_setup().
324webapp_pkg_setup() { 362webapp_pkg_setup() {
325 # add sanity checks here 363 debug-print-function $FUNCNAME $*
364
365 # to test whether or not the ebuild has correctly called this function
366 # we add an empty file to the filesystem
367 #
368 # we used to just set a variable in the shell script, but we can
369 # no longer rely on Portage calling both webapp_pkg_setup() and
370 # webapp_src_install() within the same shell process
371 touch "${T}/${SETUP_CHECK_FILE}"
326 372
327 # special case - some ebuilds *do* need to overwride the SLOT 373 # special case - some ebuilds *do* need to overwride the SLOT
328 if [[ "${SLOT}+" != "${PVR}+" && "${WEBAPP_MANUAL_SLOT}" != "yes" ]]; then 374 if [[ "${SLOT}+" != "${PVR}+" && "${WEBAPP_MANUAL_SLOT}" != "yes" ]]; then
329 die "Set WEBAPP_MANUAL_SLOT=\"yes\" if you need to SLOT manually" 375 die "Set WEBAPP_MANUAL_SLOT=\"yes\" if you need to SLOT manually"
330 fi 376 fi
331 377
332 # pull in the shared configuration file 378 # pull in the shared configuration file
333
334 G_HOSTNAME="localhost" 379 G_HOSTNAME="localhost"
335 webapp_read_config 380 webapp_read_config
336 381
337 # are we installing a webapp-config solution over the top of a
338 # non-webapp-config solution?
339
340 if ! use vhosts ; then
341 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}" 382 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}"
383
384 # if USE=vhosts is enabled OR no application is installed we're done here
385 if ! has vhosts ${IUSE} || use vhosts || [[ ! -d "${my_dir}" ]]; then
386 return
387 fi
388
342 local my_output 389 local my_output
343
344 if [ -d "${my_dir}" ] ; then
345 my_output="$(webapp_check_installedat)" 390 my_output="$(webapp_check_installedat)"
346 391
347 if [ "$?" != "0" ]; then 392 if [[ $? -ne 0 ]]; then
348 # okay, whatever is there, it isn't webapp-config-compatible 393 # okay, whatever is there, it isn't webapp-config-compatible
394 echo
395 ewarn
349 ewarn "You already have something installed in ${my_dir}" 396 ewarn "You already have something installed in ${my_dir}"
350 ewarn 397 ewarn
351 ewarn "Whatever is in ${my_dir}, it's not" 398 ewarn "Whatever is in ${my_dir}, it's not"
352 ewarn "compatible with webapp-config." 399 ewarn "compatible with webapp-config."
353 ewarn 400 ewarn
354 ewarn "This ebuild may be overwriting important files." 401 ewarn "This ebuild may be overwriting important files."
355 ewarn 402 ewarn
403 echo
404 ebeep 10
356 elif [ "$(echo ${my_output} | awk '{ print $1 }')" != "${PN}" ]; then 405 elif [[ "$(echo ${my_output} | awk '{ print $1 }')" != "${PN}" ]]; then
357 eerror "${my_dir} contains ${my_output}" 406 echo
358 eerror "I cannot upgrade that" 407 eerror "You already have ${my_output} installed in ${my_dir}"
408 eerror
409 eerror "I cannot upgrade a different application"
410 eerror
411 echo
359 die "Cannot upgrade contents of ${my_dir}" 412 die "Cannot upgrade contents of ${my_dir}"
360 fi
361 fi 413 fi
362 fi 414
415}
416
417# @FUNCTION: webapp_src_install
418# @DESCRIPTION:
419# This is the default src_install(). For now, we just make sure that root owns
420# everything, and that there are no setuid files.
421#
422# You need to call this function AFTER everything else has run in your custom
423# src_install().
424webapp_src_install() {
425 debug-print-function $FUNCNAME $*
426
427 # to test whether or not the ebuild has correctly called this function
428 # we add an empty file to the filesystem
429 #
430 # we used to just set a variable in the shell script, but we can
431 # no longer rely on Portage calling both webapp_src_install() and
432 # webapp_pkg_postinst() within the same shell process
433 touch "${D}/${MY_APPDIR}/${INSTALL_CHECK_FILE}"
434
435 chown -R "${VHOST_DEFAULT_UID}:${VHOST_DEFAULT_GID}" "${D}/"
436 chmod -R u-s "${D}/"
437 chmod -R g-s "${D}/"
438
439 keepdir "${MY_PERSISTDIR}"
440 fowners "root:0" "${MY_PERSISTDIR}"
441 fperms 755 "${MY_PERSISTDIR}"
363} 442}
364 443
365# @FUNCTION: webapp_pkg_postinst 444# @FUNCTION: webapp_pkg_postinst
366# @DESCRIPTION: 445# @DESCRIPTION:
367# The default pkg_postinst() for this eclass. This installs the web application to 446# The default pkg_postinst() for this eclass. This installs the web application to
369# display a short notice how to install this application with webapp-config. 448# display a short notice how to install this application with webapp-config.
370# 449#
371# You need to call this function AFTER everything else has run in your custom 450# You need to call this function AFTER everything else has run in your custom
372# pkg_postinst(). 451# pkg_postinst().
373webapp_pkg_postinst() { 452webapp_pkg_postinst() {
453 debug-print-function $FUNCNAME $*
454
374 webapp_read_config 455 webapp_read_config
375 456
376 # sanity checks, to catch bugs in the ebuild 457 # sanity checks, to catch bugs in the ebuild
377
378 if [ ! -f "${ROOT}${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]; then 458 if [[ ! -f "${ROOT}${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]]; then
379 eerror 459 eerror
380 eerror "This ebuild did not call webapp_src_install() at the end" 460 eerror "This ebuild did not call webapp_src_install() at the end"
381 eerror "of the src_install() function" 461 eerror "of the src_install() function"
382 eerror 462 eerror
383 eerror "Please log a bug on http://bugs.gentoo.org" 463 eerror "Please log a bug on http://bugs.gentoo.org"
386 eerror "installation is incomplete" 466 eerror "installation is incomplete"
387 eerror 467 eerror
388 die "Ebuild did not call webapp_src_install() - report to http://bugs.gentoo.org" 468 die "Ebuild did not call webapp_src_install() - report to http://bugs.gentoo.org"
389 fi 469 fi
390 470
391 # if 'vhosts' is not set in your USE flags, we install a copy of 471 if has vhosts ${IUSE}; then
392 # this application in ${ROOT}/var/www/localhost/htdocs/${PN}/ for you
393
394 if ! use vhosts ; then 472 if ! use vhosts; then
395 echo 473 echo
396 elog "vhosts USE flag not set - auto-installing using webapp-config" 474 elog "vhosts USE flag not set - auto-installing using webapp-config"
397 475
398 webapp_getinstalltype
399
400 G_HOSTNAME="localhost" 476 G_HOSTNAME="localhost"
401 local my_mode=-I
402 webapp_read_config 477 webapp_read_config
403 478
479 local my_mode=-I
480 webapp_getinstalltype
481
404 if [ "${IS_REPLACE}" = "1" ]; then 482 if [[ "${IS_REPLACE}" == "1" ]]; then
405 elog "${PN}-${PVR} is already installed - replacing" 483 elog "${PN}-${PVR} is already installed - replacing"
406 my_mode=-I 484 my_mode=-I
407 elif [ "${IS_UPGRADE}" = "1" ]; then 485 elif [[ "${IS_UPGRADE}" == "1" ]]; then
408 elog "${REMOVE_PKG} is already installed - upgrading" 486 elog "${REMOVE_PKG} is already installed - upgrading"
409 my_mode=-U 487 my_mode=-U
488 else
489 elog "${PN}-${PVR} is not installed - using install mode"
490 fi
491
492 my_cmd="${WEBAPP_CONFIG} ${my_mode} -h localhost -u root -d ${INSTALL_DIR} ${PN} ${PVR}"
493 elog "Running ${my_cmd}"
494 ${my_cmd}
495
496 echo
497 local cleaner="${WEBAPP_CLEANER} -p -C ${PN}"
498 einfo "Running ${cleaner}"
499 ${cleaner}
410 else 500 else
411 elog "${PN}-${PVR} is not installed - using install mode" 501 elog
502 elog "The 'vhosts' USE flag is switched ON"
503 elog "This means that Portage will not automatically run webapp-config to"
504 elog "complete the installation."
505 elog
506 elog "To install ${PN}-${PVR} into a virtual host, run the following command:"
507 elog
508 elog " webapp-config -I -h <host> -d ${PN} ${PN} ${PVR}"
509 elog
510 elog "For more details, see the webapp-config(8) man page"
412 fi 511 fi
413
414 my_cmd="${WEBAPP_CONFIG} ${my_mode} -h localhost -u root -d ${INSTALL_DIR} ${PN} ${PVR}"
415 elog "Running ${my_cmd}"
416 ${my_cmd}
417
418 # run webapp-cleaner instead of emerge
419 echo
420 local cleaner="${WEBAPP_CLEANER} -p -C ${PN}"
421 einfo "Running ${cleaner}"
422 ${cleaner}
423 else 512 else
424 # vhosts flag is on
425 #
426 # let's tell the administrator what to do next
427
428 elog 513 elog
429 elog "The 'vhosts' USE flag is switched ON" 514 elog "This ebuild does not support the 'vhosts' USE flag."
430 elog "This means that Portage will not automatically run webapp-config to" 515 elog "This means that Portage will not automatically run webapp-config to"
431 elog "complete the installation." 516 elog "complete the installation."
432 elog 517 elog
433 elog "To install ${PN}-${PVR} into a virtual host, run the following command:" 518 elog "To install ${PN}-${PVR} into a virtual host, run the following command:"
434 elog 519 elog
435 elog " webapp-config -I -h <host> -d ${PN} ${PN} ${PVR}" 520 elog " webapp-config -I -h <host> -d ${PN} ${PN} ${PVR}"
436 elog 521 elog
437 elog "For more details, see the webapp-config(8) man page" 522 elog "For more details, see the webapp-config(8) man page"
438 fi 523 fi
439
440 return 0
441} 524}
442 525
443# @FUNCTION: webapp_pkg_prerm 526# @FUNCTION: webapp_pkg_prerm
444# @DESCRIPTION: 527# @DESCRIPTION:
445# This is the default pkg_prerm() for this eclass. If USE=vhosts is not set 528# This is the default pkg_prerm() for this eclass. If USE=vhosts is not set
446# remove all installed copies of this web application. Otherwise instruct the 529# remove all installed copies of this web application. Otherwise instruct the
447# user to manually remove those copies. 530# user to manually remove those copies. See bug #136959.
448webapp_pkg_prerm() { 531webapp_pkg_prerm() {
449 # remove any virtual installs that there are 532 debug-print-function $FUNCNAME $*
450 533
451 local my_output 534 local my_output=
535 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})"
536 [[ $? -ne 0 ]] && return
537
452 local x 538 local x
453 539 if has vhosts ${IUSE} && ! use vhosts; then
454 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})" 540 echo "${my_output}" | while read x; do
455 541 if [[ -f "${x}"/.webapp ]]; then
456 if [ "${?}" != "0" ]; then 542 . "${x}"/.webapp
457 return
458 fi
459
460 if ! use vhosts ; then # remove any installed copies
461
462 for x in ${my_output} ; do
463 [ -f ${x}/.webapp ] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp"
464 if [ "${WEB_HOSTNAME}" -a "${WEB_INSTALLDIR}" ]; then 543 if [[ -n "${WEB_HOSTNAME}" && -n "${WEB_INSTALLDIR}" ]]; then
465 ${WEBAPP_CONFIG} -C -h ${WEB_HOSTNAME} -d ${WEB_INSTALLDIR} 544 ${WEBAPP_CONFIG} -C -h ${WEB_HOSTNAME} -d ${WEB_INSTALLDIR}
545 fi
546 else
547 ewarn "Cannot find file ${x}/.webapp"
466 fi 548 fi
467 done 549 done
468 else # don't remove anything, but warn user. bug #136959 550 elif [[ "${my_output}" != "" ]]; then
469 551 echo
552 ewarn
470 ewarn "Don't forget to use webapp-config to remove any copies of" 553 ewarn "Don't forget to use webapp-config to remove any copies of"
471 ewarn "${PN}-${PVR} installed in" 554 ewarn "${PN}-${PVR} installed in"
472 ewarn 555 ewarn
473 556
474 for x in ${my_output} ; do 557 echo "${my_output}" | while read x; do
475 [ -f ${x}/.webapp ] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp" 558 if [[ -f "${x}"/.webapp ]]; then
476 ewarn " ${x}" 559 ewarn " ${x}"
560 else
561 ewarn "Cannot find file ${x}/.webapp"
562 fi
477 done 563 done
564
565 ewarn
566 echo
478 fi 567 fi
479} 568}

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.66

  ViewVC Help
Powered by ViewVC 1.1.20