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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.57 - (hide annotations) (download)
Fri Feb 22 14:59:07 2008 UTC (6 years, 5 months ago) by hollow
Branch: MAIN
Changes since 1.56: +52 -29 lines
fix #202895

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

  ViewVC Help
Powered by ViewVC 1.1.20