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

Diff of /eclass/webapp.eclass

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

Revision 1.54 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.54 2008/02/22 14:27:17 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
78 echo "${1/#.\///}" 98 echo "${1/#.\///}"
79} 99}
80 100
81webapp_getinstalltype() { 101webapp_getinstalltype() {
82 debug-print-function $FUNCNAME $* 102 debug-print-function $FUNCNAME $*
83 use vhosts && return 103
104 if ! has vhosts ${IUSE} || use vhosts; then
105 return
106 fi
84 107
85 local my_output 108 local my_output
86 my_output="$(webapp_check_installedat)" 109 my_output="$(webapp_check_installedat)"
87 110
88 if [[ $? -eq 0 ]]; then 111 if [[ $? -eq 0 ]]; then
112 135
113# ============================================================================== 136# ==============================================================================
114# PUBLIC FUNCTIONS 137# PUBLIC FUNCTIONS
115# ============================================================================== 138# ==============================================================================
116 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
117# @FUNCTION: webapp_configfile 167# @FUNCTION: webapp_configfile
118# @USAGE: <file> [more files ...] 168# @USAGE: <file> [more files ...]
119# @DESCRIPTION: 169# @DESCRIPTION:
120# Mark a file config-protected for a web-based application. 170# Mark a file config-protected for a web-based application.
121webapp_configfile() { 171webapp_configfile() {
170 220
171 webapp_checkfileexists "${2}" 221 webapp_checkfileexists "${2}"
172 222
173 elog "(info) ${2} (lang: ${1})" 223 elog "(info) ${2} (lang: ${1})"
174 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}"
175} 237}
176 238
177# @FUNCTION: webapp_serverowned 239# @FUNCTION: webapp_serverowned
178# @USAGE: [-R] <file> [more files ...] 240# @USAGE: [-R] <file> [more files ...]
179# @DESCRIPTION: 241# @DESCRIPTION:
185 247
186 local a m 248 local a m
187 if [[ "${1}" == "-R" ]]; then 249 if [[ "${1}" == "-R" ]]; then
188 shift 250 shift
189 for m in "$@"; do 251 for m in "$@"; do
190 for a in $(find ${D}/${m}); do 252 find "${D}${m}" | while read a; do
191 a=${a/${D}\/\///}
192 webapp_checkfileexists "${a}" "$D"
193 local my_file="$(webapp_strip_appdir "${a}")" 253 a=$(webapp_strip_d "${a}")
194 my_file="$(webapp_strip_cwd "${my_file}")" 254 _webapp_serverowned "${a}"
195
196 elog "(server owned) ${my_file}"
197 echo "${my_file}" >> "${D}/${WA_SOLIST}"
198 done 255 done
199 done 256 done
200 else 257 else
201 for m in "$@"; do 258 for m in "$@"; do
202 webapp_checkfileexists "${m}" "$D" 259 _webapp_serverowned "${m}"
203 local my_file="$(webapp_strip_appdir "${m}")"
204 my_file="$(webapp_strip_cwd "${my_file}")"
205
206 elog "(server owned) ${my_file}"
207 echo "${my_file}" >> "${D}/${WA_SOLIST}"
208 done 260 done
209 fi 261 fi
210} 262}
211 263
212# @FUNCTION: webapp_server_configfile 264# @FUNCTION: webapp_server_configfile
267# 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.
268# For now we just create required webapp-config directories. 320# For now we just create required webapp-config directories.
269webapp_src_preinst() { 321webapp_src_preinst() {
270 debug-print-function $FUNCNAME $* 322 debug-print-function $FUNCNAME $*
271 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.
272 dodir "${MY_HTDOCSDIR}" 340 dodir "${MY_HTDOCSDIR}"
273 dodir "${MY_HOSTROOTDIR}" 341 dodir "${MY_HOSTROOTDIR}"
274 dodir "${MY_CGIBINDIR}" 342 dodir "${MY_CGIBINDIR}"
275 dodir "${MY_ICONSDIR}" 343 dodir "${MY_ICONSDIR}"
276 dodir "${MY_ERRORSDIR}" 344 dodir "${MY_ERRORSDIR}"
281 349
282# ============================================================================== 350# ==============================================================================
283# EXPORTED FUNCTIONS 351# EXPORTED FUNCTIONS
284# ============================================================================== 352# ==============================================================================
285 353
286# @FUNCTION: webapp_src_install
287# @DESCRIPTION:
288# This is the default src_install(). For now, we just make sure that root owns
289# everything, and that there are no setuid files.
290#
291# You need to call this function AFTER everything else has run in your custom
292# src_install().
293webapp_src_install() {
294 debug-print-function $FUNCNAME $*
295
296 chown -R "${VHOST_DEFAULT_UID}:${VHOST_DEFAULT_GID}" "${D}/"
297 chmod -R u-s "${D}/"
298 chmod -R g-s "${D}/"
299
300 keepdir "${MY_PERSISTDIR}"
301 fowners "root:0" "${MY_PERSISTDIR}"
302 fperms 755 "${MY_PERSISTDIR}"
303
304 # to test whether or not the ebuild has correctly called this function
305 # we add an empty file to the filesystem
306 #
307 # we used to just set a variable in the shell script, but we can
308 # no longer rely on Portage calling both webapp_src_install() and
309 # webapp_pkg_postinst() within the same shell process
310
311 touch "${D}/${MY_APPDIR}/${INSTALL_CHECK_FILE}"
312}
313
314# @FUNCTION: webapp_pkg_setup 354# @FUNCTION: webapp_pkg_setup
315# @DESCRIPTION: 355# @DESCRIPTION:
316# 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
317# 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
318# `${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.
320# 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
321# pkg_setup(). 361# pkg_setup().
322webapp_pkg_setup() { 362webapp_pkg_setup() {
323 debug-print-function $FUNCNAME $* 363 debug-print-function $FUNCNAME $*
324 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}"
372
325 # special case - some ebuilds *do* need to overwride the SLOT 373 # special case - some ebuilds *do* need to overwride the SLOT
326 if [[ "${SLOT}+" != "${PVR}+" && "${WEBAPP_MANUAL_SLOT}" != "yes" ]]; then 374 if [[ "${SLOT}+" != "${PVR}+" && "${WEBAPP_MANUAL_SLOT}" != "yes" ]]; then
327 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"
328 fi 376 fi
329 377
332 webapp_read_config 380 webapp_read_config
333 381
334 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}" 382 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}"
335 383
336 # if USE=vhosts is enabled OR no application is installed we're done here 384 # if USE=vhosts is enabled OR no application is installed we're done here
337 use vhosts || [[ ! -d "${my_dir}" ]] && return 385 if ! has vhosts ${IUSE} || use vhosts || [[ ! -d "${my_dir}" ]]; then
386 return
387 fi
338 388
339 local my_output 389 local my_output
340 my_output="$(webapp_check_installedat)" 390 my_output="$(webapp_check_installedat)"
341 391
342 if [[ $? -ne 0 ]]; then 392 if [[ $? -ne 0 ]]; then
343 # 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
344 ewarn "You already have something installed in ${my_dir}" 396 ewarn "You already have something installed in ${my_dir}"
345 ewarn 397 ewarn
346 ewarn "Whatever is in ${my_dir}, it's not" 398 ewarn "Whatever is in ${my_dir}, it's not"
347 ewarn "compatible with webapp-config." 399 ewarn "compatible with webapp-config."
348 ewarn 400 ewarn
349 ewarn "This ebuild may be overwriting important files." 401 ewarn "This ebuild may be overwriting important files."
350 ewarn 402 ewarn
403 echo
404 ebeep 10
351 elif [[ "$(echo ${my_output} | awk '{ print $1 }')" != "${PN}" ]]; then 405 elif [[ "$(echo ${my_output} | awk '{ print $1 }')" != "${PN}" ]]; then
352 eerror "${my_dir} contains ${my_output}" 406 echo
353 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
354 die "Cannot upgrade contents of ${my_dir}" 412 die "Cannot upgrade contents of ${my_dir}"
355 fi 413 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}"
356} 442}
357 443
358# @FUNCTION: webapp_pkg_postinst 444# @FUNCTION: webapp_pkg_postinst
359# @DESCRIPTION: 445# @DESCRIPTION:
360# 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
380 eerror "installation is incomplete" 466 eerror "installation is incomplete"
381 eerror 467 eerror
382 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"
383 fi 469 fi
384 470
471 if has vhosts ${IUSE}; then
385 if ! use vhosts; then 472 if ! use vhosts; then
386 echo 473 echo
387 elog "vhosts USE flag not set - auto-installing using webapp-config" 474 elog "vhosts USE flag not set - auto-installing using webapp-config"
388 475
389 webapp_getinstalltype
390
391 G_HOSTNAME="localhost" 476 G_HOSTNAME="localhost"
392 local my_mode=-I
393 webapp_read_config 477 webapp_read_config
394 478
479 local my_mode=-I
480 webapp_getinstalltype
481
395 if [[ "${IS_REPLACE}" == "1" ]]; then 482 if [[ "${IS_REPLACE}" == "1" ]]; then
396 elog "${PN}-${PVR} is already installed - replacing" 483 elog "${PN}-${PVR} is already installed - replacing"
397 my_mode=-I 484 my_mode=-I
398 elif [[ "${IS_UPGRADE}" == "1" ]]; then 485 elif [[ "${IS_UPGRADE}" == "1" ]]; then
399 elog "${REMOVE_PKG} is already installed - upgrading" 486 elog "${REMOVE_PKG} is already installed - upgrading"
400 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}
401 else 500 else
402 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"
403 fi 511 fi
404
405 my_cmd="${WEBAPP_CONFIG} ${my_mode} -h localhost -u root -d ${INSTALL_DIR} ${PN} ${PVR}"
406 elog "Running ${my_cmd}"
407 ${my_cmd}
408
409 echo
410 local cleaner="${WEBAPP_CLEANER} -p -C ${PN}"
411 einfo "Running ${cleaner}"
412 ${cleaner}
413 else 512 else
414 elog 513 elog
415 elog "The 'vhosts' USE flag is switched ON" 514 elog "This ebuild does not support the 'vhosts' USE flag."
416 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"
417 elog "complete the installation." 516 elog "complete the installation."
418 elog 517 elog
419 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:"
420 elog 519 elog
435 local my_output= 534 local my_output=
436 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})" 535 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})"
437 [[ $? -ne 0 ]] && return 536 [[ $? -ne 0 ]] && return
438 537
439 local x 538 local x
440 if ! use vhosts; then 539 if has vhosts ${IUSE} && ! use vhosts; then
441 540 echo "${my_output}" | while read x; do
442 for x in ${my_output}; do 541 if [[ -f "${x}"/.webapp ]]; then
443 [[ -f ${x}/.webapp ]] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp" 542 . "${x}"/.webapp
444 if [[ -n "${WEB_HOSTNAME}" && -n "${WEB_INSTALLDIR}" ]]; then 543 if [[ -n "${WEB_HOSTNAME}" && -n "${WEB_INSTALLDIR}" ]]; then
445 ${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"
446 fi 548 fi
447 done 549 done
448 else 550 elif [[ "${my_output}" != "" ]]; then
449 551 echo
552 ewarn
450 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"
451 ewarn "${PN}-${PVR} installed in" 554 ewarn "${PN}-${PVR} installed in"
452 ewarn 555 ewarn
453 556
454 for x in ${my_output}; do 557 echo "${my_output}" | while read x; do
455 [[ -f ${x}/.webapp ]] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp" 558 if [[ -f "${x}"/.webapp ]]; then
456 ewarn " ${x}" 559 ewarn " ${x}"
560 else
561 ewarn "Cannot find file ${x}/.webapp"
562 fi
457 done 563 done
564
565 ewarn
566 echo
458 fi 567 fi
459} 568}

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

  ViewVC Help
Powered by ViewVC 1.1.20