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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.49 - (hide annotations) (download)
Fri Feb 22 09:33:45 2008 UTC (6 years, 1 month ago) by hollow
Branch: MAIN
Changes since 1.48: +83 -173 lines
convert to standard documentation syntax

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.49 # $Header: /var/cvsroot/gentoo-x86/eclass/webapp.eclass,v 1.48 2007/01/03 20:16:39 rl03 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 stuart 1.1 # or not.
47 hollow 1.49 webapp_checkfileexists() {
48 stuart 1.9 local my_prefix
49    
50 stuart 1.37 [ -n "${2}" ] && my_prefix="${2}/" || my_prefix=
51 stuart 1.9
52 stuart 1.37 if [ ! -e "${my_prefix}${1}" ]; then
53     msg="ebuild fault: file '${1}' not found"
54 stuart 1.1 eerror "$msg"
55     eerror "Please report this as a bug at http://bugs.gentoo.org/"
56     die "$msg"
57     fi
58     }
59    
60 hollow 1.49 webapp_check_installedat() {
61 stuart 1.37 ${WEBAPP_CONFIG} --show-installed -h localhost -d "${INSTALL_DIR}" 2> /dev/null
62 stuart 1.3 }
63    
64 hollow 1.49 webapp_strip_appdir() {
65 stuart 1.37 local my_stripped="${1}"
66     echo "${1}" | sed -e "s|${MY_APPDIR}/||g;"
67 stuart 1.3 }
68    
69 hollow 1.49 webapp_strip_d() {
70 stuart 1.37 echo "${1}" | sed -e "s|${D}||g;"
71 stuart 1.3 }
72    
73 hollow 1.49 webapp_strip_cwd() {
74 stuart 1.37 local my_stripped="${1}"
75     echo "${1}" | sed -e 's|/./|/|g;'
76 stuart 1.1 }
77    
78 hollow 1.49 # ==============================================================================
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.
86     webapp_configfile() {
87 rl03 1.39 local m=""
88     for m in "$@" ; do
89     webapp_checkfileexists "${m}" "${D}"
90 stuart 1.27
91 wrobel 1.40 local MY_FILE="$(webapp_strip_appdir "${m}")"
92     MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
93 stuart 1.3
94 rl03 1.43 elog "(config) ${MY_FILE}"
95 rl03 1.39 echo "${MY_FILE}" >> ${D}/${WA_CONFIGLIST}
96     done
97 stuart 1.1 }
98    
99 hollow 1.49 # @FUNCTION: webapp_hook_script
100     # @USAGE: <file>
101     # @DESCRIPTION:
102 stuart 1.18 # Install a script that will run after a virtual copy is created, and
103 hollow 1.49 # before a virtual copy has been removed.
104     webapp_hook_script() {
105 stuart 1.37 webapp_checkfileexists "${1}"
106 stuart 1.18
107 rl03 1.43 elog "(hook) ${1}"
108 wrobel 1.40 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 stuart 1.18 }
111    
112 hollow 1.49 # @FUNCTION: webapp_postinst_txt
113     # @USAGE: <lang> <file>
114     # @DESCRIPTION:
115 stuart 1.5 # Install a text file containing post-installation instructions.
116 hollow 1.49 webapp_postinst_txt() {
117 stuart 1.37 webapp_checkfileexists "${2}"
118 stuart 1.5
119 rl03 1.43 elog "(info) ${2} (lang: ${1})"
120 stuart 1.37 cp "${2}" "${D}/${MY_APPDIR}/postinst-${1}.txt"
121 stuart 1.5 }
122    
123 hollow 1.49 # @FUNCTION: webapp_postupgrade_txt
124     # @USAGE: <lang> <file>
125     # @DESCRIPTION:
126 stuart 1.31 # Install a text file containing post-upgrade instructions.
127 hollow 1.49 webapp_postupgrade_txt() {
128 stuart 1.37 webapp_checkfileexists "${2}"
129 stuart 1.31
130 rl03 1.43 elog "(info) ${2} (lang: ${1})"
131 stuart 1.37 cp "${2}" "${D}/${MY_APPDIR}/postupgrade-${1}.txt"
132 stuart 1.3 }
133    
134 hollow 1.49 # @FUNCTION: webapp_serverowned
135     # @USAGE: [-R] <file> [more files ...]
136     # @DESCRIPTION:
137     # Identify a file which must be owned by the webserver's user:group settings.
138     # The ownership of the file is NOT set until the application is installed using
139     # the webapp-config tool. If -R is given directories are handled recursively.
140     webapp_serverowned() {
141 rl03 1.39 local a=""
142     local m=""
143 wrobel 1.40 if [ "${1}" = "-R" ]; then
144 rl03 1.39 shift
145     for m in "$@" ; do
146     for a in $(find ${D}/${m}); do
147     a=${a/${D}\/\///}
148     webapp_checkfileexists "${a}" "$D"
149 wrobel 1.40 local MY_FILE="$(webapp_strip_appdir "${a}")"
150     MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
151 rl03 1.39
152 rl03 1.43 elog "(server owned) ${MY_FILE}"
153 rl03 1.39 echo "${MY_FILE}" >> "${D}/${WA_SOLIST}"
154     done
155     done
156     else
157     for m in "$@" ; do
158     webapp_checkfileexists "${m}" "$D"
159 wrobel 1.40 local MY_FILE="$(webapp_strip_appdir "${m}")"
160     MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
161 rl03 1.39
162 rl03 1.43 elog "(server owned) ${MY_FILE}"
163 rl03 1.39 echo "${MY_FILE}" >> "${D}/${WA_SOLIST}"
164     done
165     fi
166 stuart 1.3 }
167    
168 hollow 1.49 # @FUNCTION: webapp_server_configfile
169     # @USAGE: <server> <file> [new name]
170     # @DESCRIPTION:
171     # Install a configuration file for the webserver. You need to specify a
172     # webapp-config supported <server>. if no new name is given `basename $2' is
173     # used by default. Note: this function will automagically prepend $1 to the
174     # front of your config file's name.
175     webapp_server_configfile() {
176 stuart 1.37 webapp_checkfileexists "${2}"
177 stuart 1.18
178     # sort out what the name will be of the config file
179    
180     local my_file
181    
182 stuart 1.37 if [ -z "${3}" ]; then
183 wrobel 1.40 my_file="${1}-$(basename "${2}")"
184 stuart 1.18 else
185 stuart 1.37 my_file="${1}-${3}"
186 stuart 1.18 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 swegener 1.38
193 rl03 1.43 elog "(${1}) config file '${my_file}'"
194 stuart 1.37 cp "${2}" "${D}/${MY_SERVERCONFIGDIR}/${my_file}"
195 stuart 1.18 }
196    
197 hollow 1.49 # @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.
204     webapp_sqlscript() {
205 stuart 1.37 webapp_checkfileexists "${2}"
206 stuart 1.3
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 stuart 1.37 if [ ! -d "${D}/${MY_SQLSCRIPTSDIR}/${1}" ]; then
213     mkdir -p "${D}/${MY_SQLSCRIPTSDIR}/${1}" || die "unable to create directory ${D}/${MY_SQLSCRIPTSDIR}/${1}"
214 stuart 1.3 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 swegener 1.38
221 stuart 1.3 # are we dealing with an 'upgrade'-type script?
222 stuart 1.37 if [ -n "${3}" ]; then
223 stuart 1.3 # yes we are
224 rl03 1.43 elog "(${1}) upgrade script from ${PN}-${PVR} to ${3}"
225 stuart 1.37 cp "${2}" "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql"
226     chmod 600 "${D}${MY_SQLSCRIPTSDIR}/${1}/${3}_to_${PVR}.sql"
227 stuart 1.3 else
228     # no, we are not
229 rl03 1.43 elog "(${1}) create script for ${PN}-${PVR}"
230 stuart 1.37 cp "${2}" "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql"
231     chmod 600 "${D}/${MY_SQLSCRIPTSDIR}/${1}/${PVR}_create.sql"
232 stuart 1.3 fi
233 stuart 1.1 }
234    
235 hollow 1.49 # ==============================================================================
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.
242     # For now, we just make sure that root owns everything, and that there are no
243     # setuid files.
244     webapp_src_install() {
245 stuart 1.22 chown -R "${VHOST_DEFAULT_UID}:${VHOST_DEFAULT_GID}" "${D}/"
246     chmod -R u-s "${D}/"
247     chmod -R g-s "${D}/"
248    
249     keepdir "${MY_PERSISTDIR}"
250 flameeyes 1.41 fowners "root:0" "${MY_PERSISTDIR}"
251 stuart 1.22 fperms 755 "${MY_PERSISTDIR}"
252 stuart 1.15
253 stuart 1.19 # 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 stuart 1.22 touch "${D}/${MY_APPDIR}/${INSTALL_CHECK_FILE}"
261 stuart 1.1 }
262    
263 hollow 1.49 # @FUNCTION: webapp_pkg_setup
264     # @DESCRIPTION:
265     # You need to call this function in pkg_config() AFTER everything else has run.
266     # If 'vhosts' USE flag is not set, auto-install this app.
267     webapp_pkg_setup() {
268 stuart 1.15 # add sanity checks here
269    
270 rl03 1.44 # 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 stuart 1.15 fi
274    
275 stuart 1.8 # pull in the shared configuration file
276    
277 stuart 1.18 G_HOSTNAME="localhost"
278 stuart 1.37 webapp_read_config
279 stuart 1.18
280 swegener 1.34 # are we installing a webapp-config solution over the top of a
281 stuart 1.18 # non-webapp-config solution?
282    
283     if ! use vhosts ; then
284 stuart 1.37 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}"
285 stuart 1.18 local my_output
286    
287 stuart 1.37 if [ -d "${my_dir}" ] ; then
288     my_output="$(webapp_check_installedat)"
289 stuart 1.18
290     if [ "$?" != "0" ]; then
291     # okay, whatever is there, it isn't webapp-config-compatible
292 swegener 1.45 ewarn "You already have something installed in ${my_dir}"
293 stuart 1.18 ewarn
294 stuart 1.37 ewarn "Whatever is in ${my_dir}, it's not"
295 stuart 1.18 ewarn "compatible with webapp-config."
296     ewarn
297 stuart 1.20 ewarn "This ebuild may be overwriting important files."
298     ewarn
299 stuart 1.37 elif [ "$(echo ${my_output} | awk '{ print $1 }')" != "${PN}" ]; then
300     eerror "${my_dir} contains ${my_output}"
301 stuart 1.18 eerror "I cannot upgrade that"
302 stuart 1.37 die "Cannot upgrade contents of ${my_dir}"
303 stuart 1.18 fi
304     fi
305     fi
306 stuart 1.14 }
307 stuart 1.6
308 hollow 1.49 webapp_getinstalltype() {
309 stuart 1.14 # 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 stuart 1.37 my_output="$(webapp_check_installedat)"
317 stuart 1.14
318 stuart 1.37 if [ "${?}" = "0" ] ; then
319 stuart 1.14 # something is already installed there
320     #
321     # make sure it isn't the same version
322    
323 stuart 1.37 local my_pn="$(echo ${my_output} | awk '{ print $1 }')"
324     local my_pvr="$(echo ${my_output} | awk '{ print $2 }')"
325 stuart 1.14
326     REMOVE_PKG="${my_pn}-${my_pvr}"
327    
328 stuart 1.37 if [ "${my_pn}" == "${PN}" ]; then
329     if [ "${my_pvr}" != "${PVR}" ]; then
330 rl03 1.43 elog "This is an upgrade"
331 stuart 1.14 IS_UPGRADE=1
332     else
333 rl03 1.43 elog "This is a re-installation"
334 stuart 1.14 IS_REPLACE=1
335     fi
336 stuart 1.18 else
337 rl03 1.43 elog "${my_output} is installed there"
338 stuart 1.14 fi
339 stuart 1.18 else
340 rl03 1.43 elog "This is an installation"
341 stuart 1.14 fi
342     fi
343 stuart 1.9 }
344 stuart 1.3
345 hollow 1.49 webapp_src_preinst() {
346 stuart 1.3 # create the directories that we need
347    
348 stuart 1.22 dodir "${MY_HTDOCSDIR}"
349     dodir "${MY_HOSTROOTDIR}"
350     dodir "${MY_CGIBINDIR}"
351     dodir "${MY_ICONSDIR}"
352     dodir "${MY_ERRORSDIR}"
353     dodir "${MY_SQLSCRIPTSDIR}"
354 stuart 1.25 dodir "${MY_HOOKSCRIPTSDIR}"
355 stuart 1.26 dodir "${MY_SERVERCONFIGDIR}"
356 stuart 1.3 }
357    
358 hollow 1.49 webapp_pkg_postinst() {
359 stuart 1.37 webapp_read_config
360 stuart 1.21
361 stuart 1.15 # sanity checks, to catch bugs in the ebuild
362    
363 stuart 1.37 if [ ! -f "${ROOT}${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]; then
364 stuart 1.15 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 stuart 1.10 # if 'vhosts' is not set in your USE flags, we install a copy of
377 stuart 1.37 # this application in ${ROOT}/var/www/localhost/htdocs/${PN}/ for you
378 swegener 1.38
379 stuart 1.10 if ! use vhosts ; then
380 stuart 1.14 echo
381 rl03 1.43 elog "vhosts USE flag not set - auto-installing using webapp-config"
382 stuart 1.11
383 stuart 1.14 webapp_getinstalltype
384    
385 stuart 1.10 G_HOSTNAME="localhost"
386     local my_mode=-I
387 stuart 1.37 webapp_read_config
388 stuart 1.10
389 stuart 1.37 if [ "${IS_REPLACE}" = "1" ]; then
390 rl03 1.43 elog "${PN}-${PVR} is already installed - replacing"
391 stuart 1.27 my_mode=-I
392 stuart 1.37 elif [ "${IS_UPGRADE}" = "1" ]; then
393 rl03 1.43 elog "${REMOVE_PKG} is already installed - upgrading"
394 stuart 1.14 my_mode=-U
395 stuart 1.11 else
396 rl03 1.43 elog "${PN}-${PVR} is not installed - using install mode"
397 stuart 1.10 fi
398 swegener 1.38
399 stuart 1.37 my_cmd="${WEBAPP_CONFIG} ${my_mode} -h localhost -u root -d ${INSTALL_DIR} ${PN} ${PVR}"
400 rl03 1.43 elog "Running ${my_cmd}"
401 stuart 1.37 ${my_cmd}
402 stuart 1.14
403 rl03 1.47 # run webapp-cleaner instead of emerge
404     echo
405     local cleaner="${WEBAPP_CLEANER} -p -C ${PN}"
406     einfo "Running ${cleaner}"
407     ${cleaner}
408 stuart 1.18 else
409     # vhosts flag is on
410     #
411     # let's tell the administrator what to do next
412    
413 rl03 1.43 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 stuart 1.10 fi
424 stuart 1.11
425     return 0
426 stuart 1.2 }
427 stuart 1.18
428 hollow 1.49 webapp_pkg_prerm() {
429 stuart 1.18 # remove any virtual installs that there are
430    
431     local my_output
432     local x
433    
434 stuart 1.37 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})"
435 stuart 1.18
436 stuart 1.37 if [ "${?}" != "0" ]; then
437 stuart 1.18 return
438     fi
439    
440 rl03 1.48 if ! use vhosts ; then # remove any installed copies
441 stuart 1.18
442 rl03 1.48 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 stuart 1.18
450 rl03 1.48 ewarn "Don't forget to use webapp-config to remove any copies of"
451     ewarn "${PN}-${PVR} installed in"
452     ewarn
453 stuart 1.18
454 rl03 1.48 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 stuart 1.18 }

  ViewVC Help
Powered by ViewVC 1.1.20