/[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.51
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.51 2008/02/22 13:44:41 hollow 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
21IS_UPGRADE=0 21IS_UPGRADE=0
22IS_REPLACE=0 22IS_REPLACE=0
23 23
24INSTALL_CHECK_FILE="installed_by_webapp_eclass" 24INSTALL_CHECK_FILE="installed_by_webapp_eclass"
25 25
26ETC_CONFIG="${ROOT}/etc/vhosts/webapp-config" 26ETC_CONFIG="${ROOT}etc/vhosts/webapp-config"
27WEBAPP_CONFIG="${ROOT}/usr/sbin/webapp-config" 27WEBAPP_CONFIG="${ROOT}usr/sbin/webapp-config"
28WEBAPP_CLEANER="${ROOT}/usr/sbin/webapp-cleaner" 28WEBAPP_CLEANER="${ROOT}usr/sbin/webapp-cleaner"
29 29
30# ============================================================================== 30# ==============================================================================
31# INTERNAL FUNCTIONS 31# INTERNAL FUNCTIONS
32# ============================================================================== 32# ==============================================================================
33 33
34# Load the config file /etc/vhosts/webapp-config 34# Load the config file /etc/vhosts/webapp-config
35# Supports both the old bash version, and the new python version 35# Supports both the old bash version, and the new python version
36webapp_read_config() { 36webapp_read_config() {
37 debug-print-function $FUNCNAME $*
38
37 if has_version '>=app-admin/webapp-config-1.50'; then 39 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!" 40 ENVVAR=$(${WEBAPP_CONFIG} --query ${PN} ${PVR}) || die "Could not read settings from webapp-config!"
39 eval ${ENVVAR} 41 eval ${ENVVAR}
40 else 42 else
41 . ${ETC_CONFIG} || die "Unable to read ${ETC_CONFIG}" 43 . ${ETC_CONFIG} || die "Unable to read ${ETC_CONFIG}"
42 fi 44 fi
43} 45}
44 46
45# Check whether a specified file exists in the given directory (`.' by default) 47# Check whether a specified file exists in the given directory (`.' by default)
46webapp_checkfileexists() { 48webapp_checkfileexists() {
49 debug-print-function $FUNCNAME $*
50
47 local my_prefix 51 local my_prefix
48 52
49 [ -n "${2}" ] && my_prefix="${2}/" || my_prefix= 53 [ -n "${2}" ] && my_prefix="${2}/" || my_prefix=
50 54
51 if [ ! -e "${my_prefix}${1}" ]; then 55 if [ ! -e "${my_prefix}${1}" ]; then
55 die "$msg" 59 die "$msg"
56 fi 60 fi
57} 61}
58 62
59webapp_check_installedat() { 63webapp_check_installedat() {
64 debug-print-function $FUNCNAME $*
60 ${WEBAPP_CONFIG} --show-installed -h localhost -d "${INSTALL_DIR}" 2> /dev/null 65 ${WEBAPP_CONFIG} --show-installed -h localhost -d "${INSTALL_DIR}" 2> /dev/null
61} 66}
62 67
63webapp_strip_appdir() { 68webapp_strip_appdir() {
64 local my_stripped="${1}" 69 debug-print-function $FUNCNAME $*
65 echo "${1}" | sed -e "s|${MY_APPDIR}/||g;" 70 echo "${1}" | sed -e "s|${MY_APPDIR}/||g;"
66} 71}
67 72
68webapp_strip_d() { 73webapp_strip_d() {
74 debug-print-function $FUNCNAME $*
69 echo "${1}" | sed -e "s|${D}||g;" 75 echo "${1}" | sed -e "s|${D}||g;"
70} 76}
71 77
72webapp_strip_cwd() { 78webapp_strip_cwd() {
73 local my_stripped="${1}" 79 debug-print-function $FUNCNAME $*
74 echo "${1}" | sed -e 's|/./|/|g;' 80 echo "${1}" | sed -e 's|/./|/|g;'
75} 81}
76 82
77webapp_getinstalltype() { 83webapp_getinstalltype() {
78 # or are we upgrading? 84 debug-print-function $FUNCNAME $*
79 85
80 if ! use vhosts ; then 86 if ! use vhosts ; then
81 # we only run webapp-config if vhosts USE flag is not set
82
83 local my_output 87 local my_output
84 88
85 my_output="$(webapp_check_installedat)" 89 my_output="$(webapp_check_installedat)"
86 90
87 if [ "${?}" = "0" ] ; then 91 if [ "${?}" = "0" ] ; then
88 # something is already installed there 92 # something is already installed there
89 #
90 # make sure it isn't the same version 93 # make sure it isn't the same version
91 94
92 local my_pn="$(echo ${my_output} | awk '{ print $1 }')" 95 local my_pn="$(echo ${my_output} | awk '{ print $1 }')"
93 local my_pvr="$(echo ${my_output} | awk '{ print $2 }')" 96 local my_pvr="$(echo ${my_output} | awk '{ print $2 }')"
94 97
118# @FUNCTION: webapp_configfile 121# @FUNCTION: webapp_configfile
119# @USAGE: <file> [more files ...] 122# @USAGE: <file> [more files ...]
120# @DESCRIPTION: 123# @DESCRIPTION:
121# Mark a file config-protected for a web-based application. 124# Mark a file config-protected for a web-based application.
122webapp_configfile() { 125webapp_configfile() {
126 debug-print-function $FUNCNAME $*
127
123 local m="" 128 local m=""
124 for m in "$@" ; do 129 for m in "$@" ; do
125 webapp_checkfileexists "${m}" "${D}" 130 webapp_checkfileexists "${m}" "${D}"
126 131
127 local MY_FILE="$(webapp_strip_appdir "${m}")" 132 local MY_FILE="$(webapp_strip_appdir "${m}")"
136# @USAGE: <file> 141# @USAGE: <file>
137# @DESCRIPTION: 142# @DESCRIPTION:
138# Install a script that will run after a virtual copy is created, and 143# Install a script that will run after a virtual copy is created, and
139# before a virtual copy has been removed. 144# before a virtual copy has been removed.
140webapp_hook_script() { 145webapp_hook_script() {
146 debug-print-function $FUNCNAME $*
147
141 webapp_checkfileexists "${1}" 148 webapp_checkfileexists "${1}"
142 149
143 elog "(hook) ${1}" 150 elog "(hook) ${1}"
144 cp "${1}" "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")" || die "Unable to install ${1} into ${D}/${MY_HOOKSCRIPTSDIR}/" 151 cp "${1}" "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")" || die "Unable to install ${1} into ${D}/${MY_HOOKSCRIPTSDIR}/"
145 chmod 555 "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")" 152 chmod 555 "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")"
148# @FUNCTION: webapp_postinst_txt 155# @FUNCTION: webapp_postinst_txt
149# @USAGE: <lang> <file> 156# @USAGE: <lang> <file>
150# @DESCRIPTION: 157# @DESCRIPTION:
151# Install a text file containing post-installation instructions. 158# Install a text file containing post-installation instructions.
152webapp_postinst_txt() { 159webapp_postinst_txt() {
160 debug-print-function $FUNCNAME $*
161
153 webapp_checkfileexists "${2}" 162 webapp_checkfileexists "${2}"
154 163
155 elog "(info) ${2} (lang: ${1})" 164 elog "(info) ${2} (lang: ${1})"
156 cp "${2}" "${D}/${MY_APPDIR}/postinst-${1}.txt" 165 cp "${2}" "${D}/${MY_APPDIR}/postinst-${1}.txt"
157} 166}
159# @FUNCTION: webapp_postupgrade_txt 168# @FUNCTION: webapp_postupgrade_txt
160# @USAGE: <lang> <file> 169# @USAGE: <lang> <file>
161# @DESCRIPTION: 170# @DESCRIPTION:
162# Install a text file containing post-upgrade instructions. 171# Install a text file containing post-upgrade instructions.
163webapp_postupgrade_txt() { 172webapp_postupgrade_txt() {
173 debug-print-function $FUNCNAME $*
174
164 webapp_checkfileexists "${2}" 175 webapp_checkfileexists "${2}"
165 176
166 elog "(info) ${2} (lang: ${1})" 177 elog "(info) ${2} (lang: ${1})"
167 cp "${2}" "${D}/${MY_APPDIR}/postupgrade-${1}.txt" 178 cp "${2}" "${D}/${MY_APPDIR}/postupgrade-${1}.txt"
168} 179}
172# @DESCRIPTION: 183# @DESCRIPTION:
173# Identify a file which must be owned by the webserver's user:group settings. 184# 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 185# 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. 186# the webapp-config tool. If -R is given directories are handled recursively.
176webapp_serverowned() { 187webapp_serverowned() {
188 debug-print-function $FUNCNAME $*
189
177 local a="" 190 local a=""
178 local m="" 191 local m=""
179 if [ "${1}" = "-R" ]; then 192 if [ "${1}" = "-R" ]; then
180 shift 193 shift
181 for m in "$@" ; do 194 for m in "$@" ; do
207# Install a configuration file for the webserver. You need to specify a 220# 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 221# 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 222# used by default. Note: this function will automagically prepend $1 to the
210# front of your config file's name. 223# front of your config file's name.
211webapp_server_configfile() { 224webapp_server_configfile() {
225 debug-print-function $FUNCNAME $*
226
212 webapp_checkfileexists "${2}" 227 webapp_checkfileexists "${2}"
213 228
214 # sort out what the name will be of the config file 229 # 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 # 230 #
226 # do NOT change the naming convention used here without changing all 231 # do NOT change the naming convention used here without changing all
227 # the other scripts that also rely upon these names 232 # the other scripts that also rely upon these names
233
234 local my_file
235 if [ -z "${3}" ]; then
236 my_file="${1}-$(basename "${2}")"
237 else
238 my_file="${1}-${3}"
239 fi
228 240
229 elog "(${1}) config file '${my_file}'" 241 elog "(${1}) config file '${my_file}'"
230 cp "${2}" "${D}/${MY_SERVERCONFIGDIR}/${my_file}" 242 cp "${2}" "${D}/${MY_SERVERCONFIGDIR}/${my_file}"
231} 243}
232 244
236# Install a SQL script that creates/upgrades a database schema for the web 248# Install a SQL script that creates/upgrades a database schema for the web
237# application. Currently supported database engines are mysql and postgres. 249# application. Currently supported database engines are mysql and postgres.
238# If a version is given the script should upgrade the database schema from 250# If a version is given the script should upgrade the database schema from
239# the given version to $PVR. 251# the given version to $PVR.
240webapp_sqlscript() { 252webapp_sqlscript() {
253 debug-print-function $FUNCNAME $*
254
241 webapp_checkfileexists "${2}" 255 webapp_checkfileexists "${2}"
242
243 # create the directory where this script will go
244 #
245 # scripts for specific database engines go into their own subdirectory
246 # just to keep things readable on the filesystem
247 256
248 if [ ! -d "${D}/${MY_SQLSCRIPTSDIR}/${1}" ]; then 257 if [ ! -d "${D}/${MY_SQLSCRIPTSDIR}/${1}" ]; then
249 mkdir -p "${D}/${MY_SQLSCRIPTSDIR}/${1}" || die "unable to create directory ${D}/${MY_SQLSCRIPTSDIR}/${1}" 258 mkdir -p "${D}/${MY_SQLSCRIPTSDIR}/${1}" || die "unable to create directory ${D}/${MY_SQLSCRIPTSDIR}/${1}"
250 fi 259 fi
251 260
252 # warning: 261 # WARNING:
253 # 262 #
254 # do NOT change the naming convention used here without changing all 263 # do NOT change the naming convention used here without changing all
255 # the other scripts that also rely upon these names 264 # the other scripts that also rely upon these names
256 265
257 # are we dealing with an 'upgrade'-type script?
258 if [ -n "${3}" ]; then 266 if [ -n "${3}" ]; then
259 # yes we are
260 elog "(${1}) upgrade script from ${PN}-${PVR} to ${3}" 267 elog "(${1}) upgrade script from ${PN}-${PVR} to ${3}"
261 cp "${2}" "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql" 268 cp "${2}" "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql"
262 chmod 600 "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql" 269 chmod 600 "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql"
263 else 270 else
264 # no, we are not
265 elog "(${1}) create script for ${PN}-${PVR}" 271 elog "(${1}) create script for ${PN}-${PVR}"
266 cp "${2}" "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql" 272 cp "${2}" "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql"
267 chmod 600 "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql" 273 chmod 600 "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql"
268 fi 274 fi
269} 275}
271# @FUNCTION: webapp_src_preinst 277# @FUNCTION: webapp_src_preinst
272# @DESCRIPTION: 278# @DESCRIPTION:
273# You need to call this function in src_install() BEFORE anything else has run. 279# You need to call this function in src_install() BEFORE anything else has run.
274# For now we just create required webapp-config directories. 280# For now we just create required webapp-config directories.
275webapp_src_preinst() { 281webapp_src_preinst() {
282 debug-print-function $FUNCNAME $*
283
276 dodir "${MY_HTDOCSDIR}" 284 dodir "${MY_HTDOCSDIR}"
277 dodir "${MY_HOSTROOTDIR}" 285 dodir "${MY_HOSTROOTDIR}"
278 dodir "${MY_CGIBINDIR}" 286 dodir "${MY_CGIBINDIR}"
279 dodir "${MY_ICONSDIR}" 287 dodir "${MY_ICONSDIR}"
280 dodir "${MY_ERRORSDIR}" 288 dodir "${MY_ERRORSDIR}"
293# everything, and that there are no setuid files. 301# everything, and that there are no setuid files.
294# 302#
295# You need to call this function AFTER everything else has run in your custom 303# You need to call this function AFTER everything else has run in your custom
296# src_install(). 304# src_install().
297webapp_src_install() { 305webapp_src_install() {
306 debug-print-function $FUNCNAME $*
307
298 chown -R "${VHOST_DEFAULT_UID}:${VHOST_DEFAULT_GID}" "${D}/" 308 chown -R "${VHOST_DEFAULT_UID}:${VHOST_DEFAULT_GID}" "${D}/"
299 chmod -R u-s "${D}/" 309 chmod -R u-s "${D}/"
300 chmod -R g-s "${D}/" 310 chmod -R g-s "${D}/"
301 311
302 keepdir "${MY_PERSISTDIR}" 312 keepdir "${MY_PERSISTDIR}"
320# `${ROOT}/var/www/localhost/htdocs/${PN}/' if USE=vhosts is not set. 330# `${ROOT}/var/www/localhost/htdocs/${PN}/' if USE=vhosts is not set.
321# 331#
322# You need to call this function BEFORE anything else has run in your custom 332# You need to call this function BEFORE anything else has run in your custom
323# pkg_setup(). 333# pkg_setup().
324webapp_pkg_setup() { 334webapp_pkg_setup() {
325 # add sanity checks here 335 debug-print-function $FUNCNAME $*
326 336
327 # special case - some ebuilds *do* need to overwride the SLOT 337 # special case - some ebuilds *do* need to overwride the SLOT
328 if [[ "${SLOT}+" != "${PVR}+" && "${WEBAPP_MANUAL_SLOT}" != "yes" ]]; then 338 if [[ "${SLOT}+" != "${PVR}+" && "${WEBAPP_MANUAL_SLOT}" != "yes" ]]; then
329 die "Set WEBAPP_MANUAL_SLOT=\"yes\" if you need to SLOT manually" 339 die "Set WEBAPP_MANUAL_SLOT=\"yes\" if you need to SLOT manually"
330 fi 340 fi
331 341
332 # pull in the shared configuration file 342 # pull in the shared configuration file
333
334 G_HOSTNAME="localhost" 343 G_HOSTNAME="localhost"
335 webapp_read_config 344 webapp_read_config
336 345
337 # are we installing a webapp-config solution over the top of a 346 # are we installing a webapp-config solution over the top of a
338 # non-webapp-config solution? 347 # non-webapp-config solution?
339
340 if ! use vhosts ; then 348 if ! use vhosts ; then
341 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}" 349 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}"
342 local my_output 350 local my_output
343 351
344 if [ -d "${my_dir}" ] ; then 352 if [ -d "${my_dir}" ] ; then
369# display a short notice how to install this application with webapp-config. 377# display a short notice how to install this application with webapp-config.
370# 378#
371# You need to call this function AFTER everything else has run in your custom 379# You need to call this function AFTER everything else has run in your custom
372# pkg_postinst(). 380# pkg_postinst().
373webapp_pkg_postinst() { 381webapp_pkg_postinst() {
382 debug-print-function $FUNCNAME $*
383
374 webapp_read_config 384 webapp_read_config
375 385
376 # sanity checks, to catch bugs in the ebuild 386 # sanity checks, to catch bugs in the ebuild
377
378 if [ ! -f "${ROOT}${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]; then 387 if [ ! -f "${ROOT}${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]; then
379 eerror 388 eerror
380 eerror "This ebuild did not call webapp_src_install() at the end" 389 eerror "This ebuild did not call webapp_src_install() at the end"
381 eerror "of the src_install() function" 390 eerror "of the src_install() function"
382 eerror 391 eerror
386 eerror "installation is incomplete" 395 eerror "installation is incomplete"
387 eerror 396 eerror
388 die "Ebuild did not call webapp_src_install() - report to http://bugs.gentoo.org" 397 die "Ebuild did not call webapp_src_install() - report to http://bugs.gentoo.org"
389 fi 398 fi
390 399
391 # if 'vhosts' is not set in your USE flags, we install a copy of
392 # this application in ${ROOT}/var/www/localhost/htdocs/${PN}/ for you
393
394 if ! use vhosts ; then 400 if ! use vhosts ; then
395 echo 401 echo
396 elog "vhosts USE flag not set - auto-installing using webapp-config" 402 elog "vhosts USE flag not set - auto-installing using webapp-config"
397 403
398 webapp_getinstalltype 404 webapp_getinstalltype
413 419
414 my_cmd="${WEBAPP_CONFIG} ${my_mode} -h localhost -u root -d ${INSTALL_DIR} ${PN} ${PVR}" 420 my_cmd="${WEBAPP_CONFIG} ${my_mode} -h localhost -u root -d ${INSTALL_DIR} ${PN} ${PVR}"
415 elog "Running ${my_cmd}" 421 elog "Running ${my_cmd}"
416 ${my_cmd} 422 ${my_cmd}
417 423
418 # run webapp-cleaner instead of emerge
419 echo 424 echo
420 local cleaner="${WEBAPP_CLEANER} -p -C ${PN}" 425 local cleaner="${WEBAPP_CLEANER} -p -C ${PN}"
421 einfo "Running ${cleaner}" 426 einfo "Running ${cleaner}"
422 ${cleaner} 427 ${cleaner}
423 else 428 else
424 # vhosts flag is on
425 #
426 # let's tell the administrator what to do next
427
428 elog 429 elog
429 elog "The 'vhosts' USE flag is switched ON" 430 elog "The 'vhosts' USE flag is switched ON"
430 elog "This means that Portage will not automatically run webapp-config to" 431 elog "This means that Portage will not automatically run webapp-config to"
431 elog "complete the installation." 432 elog "complete the installation."
432 elog 433 elog
442 443
443# @FUNCTION: webapp_pkg_prerm 444# @FUNCTION: webapp_pkg_prerm
444# @DESCRIPTION: 445# @DESCRIPTION:
445# This is the default pkg_prerm() for this eclass. If USE=vhosts is not set 446# 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 447# remove all installed copies of this web application. Otherwise instruct the
447# user to manually remove those copies. 448# user to manually remove those copies. See bug #136959.
448webapp_pkg_prerm() { 449webapp_pkg_prerm() {
449 # remove any virtual installs that there are 450 debug-print-function $FUNCNAME $*
450 451
451 local my_output 452 local my_output
452 local x 453 local x
453 454
454 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})" 455 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})"
455 456
456 if [ "${?}" != "0" ]; then 457 if [ "${?}" != "0" ]; then
457 return 458 return
458 fi 459 fi
459 460
460 if ! use vhosts ; then # remove any installed copies 461 if ! use vhosts ; then
461 462
462 for x in ${my_output} ; do 463 for x in ${my_output} ; do
463 [ -f ${x}/.webapp ] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp" 464 [ -f ${x}/.webapp ] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp"
464 if [ "${WEB_HOSTNAME}" -a "${WEB_INSTALLDIR}" ]; then 465 if [ "${WEB_HOSTNAME}" -a "${WEB_INSTALLDIR}" ]; then
465 ${WEBAPP_CONFIG} -C -h ${WEB_HOSTNAME} -d ${WEB_INSTALLDIR} 466 ${WEBAPP_CONFIG} -C -h ${WEB_HOSTNAME} -d ${WEB_INSTALLDIR}
466 fi 467 fi
467 done 468 done
468 else # don't remove anything, but warn user. bug #136959 469 else
469 470
470 ewarn "Don't forget to use webapp-config to remove any copies of" 471 ewarn "Don't forget to use webapp-config to remove any copies of"
471 ewarn "${PN}-${PVR} installed in" 472 ewarn "${PN}-${PVR} installed in"
472 ewarn 473 ewarn
473 474

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

  ViewVC Help
Powered by ViewVC 1.1.20