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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.51 - (hide annotations) (download)
Fri Feb 22 13:44:41 2008 UTC (6 years, 4 months ago) by hollow
Branch: MAIN
Changes since 1.50: +43 -42 lines
add eclass debugging; remove redundant comments

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

  ViewVC Help
Powered by ViewVC 1.1.20