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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.50 - (hide annotations) (download)
Fri Feb 22 10:03:55 2008 UTC (6 years, 1 month ago) by hollow
Branch: MAIN
Changes since 1.49: +77 -57 lines
document missing parts

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

  ViewVC Help
Powered by ViewVC 1.1.20