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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.42 - (hide annotations) (download)
Thu Jun 15 07:01:01 2006 UTC (8 years, 4 months ago) by stuart
Branch: MAIN
Changes since 1.41: +2 -9 lines
Make the eclass less chatty when all is good

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

  ViewVC Help
Powered by ViewVC 1.1.20