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

Diff of /eclass/webapp.eclass

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

Revision 1.1 Revision 1.49
1# Copyright 1999-2003 Gentoo Technologies, Inc. 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.1 2003/10/07 21:54:46 stuart Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/webapp.eclass,v 1.49 2008/02/22 09:33:45 hollow Exp $
4# 4#
5# eclass/webapp.eclass 5# @ECLASS: webapp.eclass
6# @MAINTAINER:
7# web-apps@gentoo.org
6# Eclass for installing applications to run under a web server 8# @BLURB: functions for installing applications to run under a web server
7# 9# @DESCRIPTION:
10# The webapp eclass contains functions to handle web applications with
8# Part of the implementation of GLEP #11 11# webapp-config. Part of the implementation of GLEP #11
9#
10# Author(s) Stuart Herbert <stuart@gentoo.org>
11#
12# ------------------------------------------------------------------------
13#
14# Please do not make modifications to this file without checking with a
15# member of the web-apps herd first!
16#
17# ------------------------------------------------------------------------
18#
19# THIS IS A BETA RELEASE ONLY. ALL DETAILS ARE SUBJECT TO CHANGE BEFORE
20# WE ARE READY TO START PORTING EVERYTHING TO THIS ECLASS
21#
22# ------------------------------------------------------------------------
23 12
24ECLASS=webapp
25INHERITED="$INHERITED $ECLASS"
26#DEPEND="${DEPEND} net-www/apache"
27SLOT="${PVR}" 13SLOT="${PVR}"
28IUSE="$IUSE vhosts" 14IUSE="vhosts"
15DEPEND=">=app-admin/webapp-config-1.50.15"
16RDEPEND="${DEPEND}"
29 17
30if [ -f /usr/share/webapp-config/settings.sh ] ; then 18EXPORT_FUNCTIONS pkg_postinst pkg_setup src_install pkg_prerm
31 . /usr/share/webapp-config/settings.sh 19
20INSTALL_DIR="/${PN}"
21IS_UPGRADE=0
22IS_REPLACE=0
23
24INSTALL_CHECK_FILE="installed_by_webapp_eclass"
25
26ETC_CONFIG="${ROOT}/etc/vhosts/webapp-config"
27WEBAPP_CONFIG="${ROOT}/usr/sbin/webapp-config"
28WEBAPP_CLEANER="${ROOT}/usr/sbin/webapp-cleaner"
29
30# ==============================================================================
31# INTERNAL FUNCTIONS
32# ==============================================================================
33
34# Load the config file /etc/vhosts/webapp-config
35# Supports both the old bash version, and the new python version
36webapp_read_config() {
37 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!"
39 eval ${ENVVAR}
40 else
41 . ${ETC_CONFIG} || die "Unable to read ${ETC_CONFIG}"
32fi 42 fi
43}
33 44
34EXPORT_FUNCTIONS pkg_setup src_install
35
36# ------------------------------------------------------------------------
37# INTERNAL FUNCTION - USED BY THIS ECLASS ONLY
38#
39# Check whether a specified file exists within the image/ directory 45# Check whether a specified file exists in the given directory (`.' by default)
40# or not. 46# or not.
41#
42# @param $1 - file to look for
43# @return 0 on success, never returns on an error
44# ------------------------------------------------------------------------
45
46function webapp_checkfileexists () 47webapp_checkfileexists() {
47{ 48 local my_prefix
49
50 [ -n "${2}" ] && my_prefix="${2}/" || my_prefix=
51
48 if [ ! -e ${D}/$1 ]; then 52 if [ ! -e "${my_prefix}${1}" ]; then
49 msg="ebuild fault: file $1 not found in ${D}" 53 msg="ebuild fault: file '${1}' not found"
50 eerror "$msg" 54 eerror "$msg"
51 eerror "Please report this as a bug at http://bugs.gentoo.org/" 55 eerror "Please report this as a bug at http://bugs.gentoo.org/"
52 die "$msg" 56 die "$msg"
53 fi 57 fi
54} 58}
55 59
56# ------------------------------------------------------------------------ 60webapp_check_installedat() {
57# EXPORTED FUNCTION - FOR USE IN EBUILDS 61 ${WEBAPP_CONFIG} --show-installed -h localhost -d "${INSTALL_DIR}" 2> /dev/null
58# 62}
63
64webapp_strip_appdir() {
65 local my_stripped="${1}"
66 echo "${1}" | sed -e "s|${MY_APPDIR}/||g;"
67}
68
69webapp_strip_d() {
70 echo "${1}" | sed -e "s|${D}||g;"
71}
72
73webapp_strip_cwd() {
74 local my_stripped="${1}"
75 echo "${1}" | sed -e 's|/./|/|g;'
76}
77
78# ==============================================================================
79# PUBLIC FUNCTIONS
80# ==============================================================================
81
82# @FUNCTION: webapp_configfile
83# @USAGE: <file> [more files ...]
84# @DESCRIPTION:
85# Mark a file config-protected for a web-based application.
86webapp_configfile() {
87 local m=""
88 for m in "$@" ; do
89 webapp_checkfileexists "${m}" "${D}"
90
91 local MY_FILE="$(webapp_strip_appdir "${m}")"
92 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
93
94 elog "(config) ${MY_FILE}"
95 echo "${MY_FILE}" >> ${D}/${WA_CONFIGLIST}
96 done
97}
98
99# @FUNCTION: webapp_hook_script
100# @USAGE: <file>
101# @DESCRIPTION:
102# Install a script that will run after a virtual copy is created, and
103# before a virtual copy has been removed.
104webapp_hook_script() {
105 webapp_checkfileexists "${1}"
106
107 elog "(hook) ${1}"
108 cp "${1}" "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")" || die "Unable to install ${1} into ${D}/${MY_HOOKSCRIPTSDIR}/"
109 chmod 555 "${D}/${MY_HOOKSCRIPTSDIR}/$(basename "${1}")"
110}
111
112# @FUNCTION: webapp_postinst_txt
113# @USAGE: <lang> <file>
114# @DESCRIPTION:
115# Install a text file containing post-installation instructions.
116webapp_postinst_txt() {
117 webapp_checkfileexists "${2}"
118
119 elog "(info) ${2} (lang: ${1})"
120 cp "${2}" "${D}/${MY_APPDIR}/postinst-${1}.txt"
121}
122
123# @FUNCTION: webapp_postupgrade_txt
124# @USAGE: <lang> <file>
125# @DESCRIPTION:
126# Install a text file containing post-upgrade instructions.
127webapp_postupgrade_txt() {
128 webapp_checkfileexists "${2}"
129
130 elog "(info) ${2} (lang: ${1})"
131 cp "${2}" "${D}/${MY_APPDIR}/postupgrade-${1}.txt"
132}
133
134# @FUNCTION: webapp_serverowned
135# @USAGE: [-R] <file> [more files ...]
136# @DESCRIPTION:
59# Identify a file which must be owned by the webserver's user:group 137# Identify a file which must be owned by the webserver's user:group settings.
60# settings.
61#
62# The ownership of the file is NOT set until the application is installed 138# The ownership of the file is NOT set until the application is installed using
63# using the webapp-config tool. 139# the webapp-config tool. If -R is given directories are handled recursively.
64#
65# @param $1 - file to be owned by the webserver user:group combo
66#
67# ------------------------------------------------------------------------
68
69function webapp_serverowned () 140webapp_serverowned() {
70{ 141 local a=""
142 local m=""
143 if [ "${1}" = "-R" ]; then
144 shift
145 for m in "$@" ; do
146 for a in $(find ${D}/${m}); do
147 a=${a/${D}\/\///}
148 webapp_checkfileexists "${a}" "$D"
149 local MY_FILE="$(webapp_strip_appdir "${a}")"
150 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
151
152 elog "(server owned) ${MY_FILE}"
153 echo "${MY_FILE}" >> "${D}/${WA_SOLIST}"
154 done
155 done
156 else
157 for m in "$@" ; do
71 webapp_checkfileexists $1 158 webapp_checkfileexists "${m}" "$D"
72 echo "$1" >> $WA_SOLIST 159 local MY_FILE="$(webapp_strip_appdir "${m}")"
73} 160 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
74 161
75# ------------------------------------------------------------------------ 162 elog "(server owned) ${MY_FILE}"
76# EXPORTED FUNCTION - FOR USE IN EBUILDS 163 echo "${MY_FILE}" >> "${D}/${WA_SOLIST}"
77# 164 done
78# Identify a config file for a web-based application. 165 fi
79#
80# @param $1 - config file
81# ------------------------------------------------------------------------
82
83function webapp_configfile ()
84{
85 webapp_checkfileexists $1
86 echo "$1" >> $WA_CONFIGLIST
87} 166}
88 167
89# ------------------------------------------------------------------------ 168# @FUNCTION: webapp_server_configfile
90# EXPORTED FUNCTION - FOR USE IN EBUILDS 169# @USAGE: <server> <file> [new name]
91# 170# @DESCRIPTION:
92# Identify a script file (usually, but not always PHP or Perl) which is 171# Install a configuration file for the webserver. You need to specify a
93# 172# webapp-config supported <server>. if no new name is given `basename $2' is
94# Files in this list may be modified to #! the required CGI engine when 173# used by default. Note: this function will automagically prepend $1 to the
95# installed by webapp-config tool in the future. 174# front of your config file's name.
96# 175webapp_server_configfile() {
97# @param $1 - the cgi engine to use
98# @param $2 - the script file that could run under a cgi-bin
99#
100# ------------------------------------------------------------------------
101
102function webapp_runbycgibin ()
103{
104 webapp_checkfileexists $2 176 webapp_checkfileexists "${2}"
105 echo "$1 $2" >> $WA_RUNBYCGIBINLIST
106}
107 177
108# ------------------------------------------------------------------------ 178 # sort out what the name will be of the config file
109# EXPORTED FUNCTION - call from inside your ebuild's src_install AFTER 179
110# everything else has run 180 local my_file
111# 181
182 if [ -z "${3}" ]; then
183 my_file="${1}-$(basename "${2}")"
184 else
185 my_file="${1}-${3}"
186 fi
187
188 # warning:
189 #
190 # do NOT change the naming convention used here without changing all
191 # the other scripts that also rely upon these names
192
193 elog "(${1}) config file '${my_file}'"
194 cp "${2}" "${D}/${MY_SERVERCONFIGDIR}/${my_file}"
195}
196
197# @FUNCTION: webapp_sqlscript
198# @USAGE: <db> <file> [version]
199# @DESCRIPTION:
200# Install a SQL script that creates/upgrades a database schema for the web
201# application. Currently supported database engines are mysql and postgres.
202# If a version is given the script should upgrade the database schema from
203# the given version to $PVR.
204webapp_sqlscript() {
205 webapp_checkfileexists "${2}"
206
207 # create the directory where this script will go
208 #
209 # scripts for specific database engines go into their own subdirectory
210 # just to keep things readable on the filesystem
211
212 if [ ! -d "${D}/${MY_SQLSCRIPTSDIR}/${1}" ]; then
213 mkdir -p "${D}/${MY_SQLSCRIPTSDIR}/${1}" || die "unable to create directory ${D}/${MY_SQLSCRIPTSDIR}/${1}"
214 fi
215
216 # warning:
217 #
218 # do NOT change the naming convention used here without changing all
219 # the other scripts that also rely upon these names
220
221 # are we dealing with an 'upgrade'-type script?
222 if [ -n "${3}" ]; then
223 # yes we are
224 elog "(${1}) upgrade script from ${PN}-${PVR} to ${3}"
225 cp "${2}" "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql"
226 chmod 600 "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql"
227 else
228 # no, we are not
229 elog "(${1}) create script for ${PN}-${PVR}"
230 cp "${2}" "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql"
231 chmod 600 "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql"
232 fi
233}
234
235# ==============================================================================
236# EXPORTED FUNCTIONS
237# ==============================================================================
238
239# @FUNCTION: webapp_src_install
240# @DESCRIPTION:
241# You need to call this function in src_install() AFTER everything else has run.
112# For now, we just make sure that root owns everything, and that there 242# For now, we just make sure that root owns everything, and that there are no
113# are no setuid files. I'm sure this will change significantly before 243# setuid files.
114# the final version!
115# ------------------------------------------------------------------------
116
117function webapp_src_install () 244webapp_src_install() {
118{ 245 chown -R "${VHOST_DEFAULT_UID}:${VHOST_DEFAULT_GID}" "${D}/"
119 chown -R root:root ${D}/
120 chmod -R u-s ${D}/ 246 chmod -R u-s "${D}/"
121 chmod -R g-s ${D}/ 247 chmod -R g-s "${D}/"
122}
123 248
124# ------------------------------------------------------------------------ 249 keepdir "${MY_PERSISTDIR}"
125# EXPORTED FUNCTION - call from inside your ebuild's pkg_setup AFTER 250 fowners "root:0" "${MY_PERSISTDIR}"
126# everything else has run 251 fperms 755 "${MY_PERSISTDIR}"
127# 252
253 # to test whether or not the ebuild has correctly called this function
254 # we add an empty file to the filesystem
255 #
256 # we used to just set a variable in the shell script, but we can
257 # no longer rely on Portage calling both webapp_src_install() and
258 # webapp_pkg_postinst() within the same shell process
259
260 touch "${D}/${MY_APPDIR}/${INSTALL_CHECK_FILE}"
261}
262
263# @FUNCTION: webapp_pkg_setup
264# @DESCRIPTION:
265# You need to call this function in pkg_config() AFTER everything else has run.
128# If 'vhosts' USE flag is not set, auto-install this app 266# If 'vhosts' USE flag is not set, auto-install this app.
129#
130# ------------------------------------------------------------------------
131
132function webapp_pkg_setup () 267webapp_pkg_setup() {
133{ 268 # add sanity checks here
134 use vhosts || webapp-config -u root -d /var/www/localhost/htdocs/${PN}/ ${PN} 269
270 # special case - some ebuilds *do* need to overwride the SLOT
271 if [[ "${SLOT}+" != "${PVR}+" && "${WEBAPP_MANUAL_SLOT}" != "yes" ]]; then
272 die "Set WEBAPP_MANUAL_SLOT=\"yes\" if you need to SLOT manually"
273 fi
274
275 # pull in the shared configuration file
276
277 G_HOSTNAME="localhost"
278 webapp_read_config
279
280 # are we installing a webapp-config solution over the top of a
281 # non-webapp-config solution?
282
283 if ! use vhosts ; then
284 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}"
285 local my_output
286
287 if [ -d "${my_dir}" ] ; then
288 my_output="$(webapp_check_installedat)"
289
290 if [ "$?" != "0" ]; then
291 # okay, whatever is there, it isn't webapp-config-compatible
292 ewarn "You already have something installed in ${my_dir}"
293 ewarn
294 ewarn "Whatever is in ${my_dir}, it's not"
295 ewarn "compatible with webapp-config."
296 ewarn
297 ewarn "This ebuild may be overwriting important files."
298 ewarn
299 elif [ "$(echo ${my_output} | awk '{ print $1 }')" != "${PN}" ]; then
300 eerror "${my_dir} contains ${my_output}"
301 eerror "I cannot upgrade that"
302 die "Cannot upgrade contents of ${my_dir}"
303 fi
304 fi
305 fi
306}
307
308webapp_getinstalltype() {
309 # or are we upgrading?
310
311 if ! use vhosts ; then
312 # we only run webapp-config if vhosts USE flag is not set
313
314 local my_output
315
316 my_output="$(webapp_check_installedat)"
317
318 if [ "${?}" = "0" ] ; then
319 # something is already installed there
320 #
321 # make sure it isn't the same version
322
323 local my_pn="$(echo ${my_output} | awk '{ print $1 }')"
324 local my_pvr="$(echo ${my_output} | awk '{ print $2 }')"
325
326 REMOVE_PKG="${my_pn}-${my_pvr}"
327
328 if [ "${my_pn}" == "${PN}" ]; then
329 if [ "${my_pvr}" != "${PVR}" ]; then
330 elog "This is an upgrade"
331 IS_UPGRADE=1
332 else
333 elog "This is a re-installation"
334 IS_REPLACE=1
335 fi
336 else
337 elog "${my_output} is installed there"
338 fi
339 else
340 elog "This is an installation"
341 fi
342 fi
343}
344
345webapp_src_preinst() {
346 # create the directories that we need
347
348 dodir "${MY_HTDOCSDIR}"
349 dodir "${MY_HOSTROOTDIR}"
350 dodir "${MY_CGIBINDIR}"
351 dodir "${MY_ICONSDIR}"
352 dodir "${MY_ERRORSDIR}"
353 dodir "${MY_SQLSCRIPTSDIR}"
354 dodir "${MY_HOOKSCRIPTSDIR}"
355 dodir "${MY_SERVERCONFIGDIR}"
356}
357
358webapp_pkg_postinst() {
359 webapp_read_config
360
361 # sanity checks, to catch bugs in the ebuild
362
363 if [ ! -f "${ROOT}${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]; then
364 eerror
365 eerror "This ebuild did not call webapp_src_install() at the end"
366 eerror "of the src_install() function"
367 eerror
368 eerror "Please log a bug on http://bugs.gentoo.org"
369 eerror
370 eerror "You should use emerge -C to remove this package, as the"
371 eerror "installation is incomplete"
372 eerror
373 die "Ebuild did not call webapp_src_install() - report to http://bugs.gentoo.org"
374 fi
375
376 # if 'vhosts' is not set in your USE flags, we install a copy of
377 # this application in ${ROOT}/var/www/localhost/htdocs/${PN}/ for you
378
379 if ! use vhosts ; then
380 echo
381 elog "vhosts USE flag not set - auto-installing using webapp-config"
382
383 webapp_getinstalltype
384
385 G_HOSTNAME="localhost"
386 local my_mode=-I
387 webapp_read_config
388
389 if [ "${IS_REPLACE}" = "1" ]; then
390 elog "${PN}-${PVR} is already installed - replacing"
391 my_mode=-I
392 elif [ "${IS_UPGRADE}" = "1" ]; then
393 elog "${REMOVE_PKG} is already installed - upgrading"
394 my_mode=-U
395 else
396 elog "${PN}-${PVR} is not installed - using install mode"
397 fi
398
399 my_cmd="${WEBAPP_CONFIG} ${my_mode} -h localhost -u root -d ${INSTALL_DIR} ${PN} ${PVR}"
400 elog "Running ${my_cmd}"
401 ${my_cmd}
402
403 # run webapp-cleaner instead of emerge
404 echo
405 local cleaner="${WEBAPP_CLEANER} -p -C ${PN}"
406 einfo "Running ${cleaner}"
407 ${cleaner}
408 else
409 # vhosts flag is on
410 #
411 # let's tell the administrator what to do next
412
413 elog
414 elog "The 'vhosts' USE flag is switched ON"
415 elog "This means that Portage will not automatically run webapp-config to"
416 elog "complete the installation."
417 elog
418 elog "To install ${PN}-${PVR} into a virtual host, run the following command:"
419 elog
420 elog " webapp-config -I -h <host> -d ${PN} ${PN} ${PVR}"
421 elog
422 elog "For more details, see the webapp-config(8) man page"
423 fi
424
425 return 0
426}
427
428webapp_pkg_prerm() {
429 # remove any virtual installs that there are
430
431 local my_output
432 local x
433
434 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})"
435
436 if [ "${?}" != "0" ]; then
437 return
438 fi
439
440 if ! use vhosts ; then # remove any installed copies
441
442 for x in ${my_output} ; do
443 [ -f ${x}/.webapp ] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp"
444 if [ "${WEB_HOSTNAME}" -a "${WEB_INSTALLDIR}" ]; then
445 ${WEBAPP_CONFIG} -C -h ${WEB_HOSTNAME} -d ${WEB_INSTALLDIR}
446 fi
447 done
448 else # don't remove anything, but warn user. bug #136959
449
450 ewarn "Don't forget to use webapp-config to remove any copies of"
451 ewarn "${PN}-${PVR} installed in"
452 ewarn
453
454 for x in ${my_output} ; do
455 [ -f ${x}/.webapp ] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp"
456 ewarn " ${x}"
457 done
458 fi
459}

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.49

  ViewVC Help
Powered by ViewVC 1.1.20