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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.47 - (hide annotations) (download)
Sun Dec 31 19:16:31 2006 UTC (7 years, 10 months ago) by rl03
Branch: MAIN
Changes since 1.46: +9 -21 lines
No longer call emerge from the eclass. Bug #124440.

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

  ViewVC Help
Powered by ViewVC 1.1.20