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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.43 - (show annotations) (download)
Mon Jul 10 00:52:34 2006 UTC (8 years, 4 months ago) by rl03
Branch: MAIN
Changes since 1.42: +30 -30 lines
webapp.eclass: einfo->elog

1 # Copyright 1999-2006 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/webapp.eclass,v 1.42 2006/06/15 07:01:01 stuart Exp $
4 #
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 # Renat Lumpau <rl03@gentoo.org>
12 # Gunnar Wrobel <wrobel@gentoo.org>
13 #
14 # ------------------------------------------------------------------------
15 #
16 # The master copy of this eclass is held in our subversion repository.
17 # http://svn.gnqs.org/projects/vhost-tools/browser/
18 #
19 # 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 # of webapp-config.
22 #
23 # ------------------------------------------------------------------------
24
25 SLOT="${PVR}"
26 IUSE="vhosts"
27 DEPEND="app-admin/webapp-config"
28 RDEPEND="${DEPEND}"
29
30 EXPORT_FUNCTIONS pkg_postinst pkg_setup src_install pkg_prerm
31
32 INSTALL_DIR="/${PN}"
33 IS_UPGRADE=0
34 IS_REPLACE=0
35
36 INSTALL_CHECK_FILE="installed_by_webapp_eclass"
37
38 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
60 # ------------------------------------------------------------------------
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 # @param $2 - prefix directory to use
68 # @return 0 on success, never returns on an error
69 # ------------------------------------------------------------------------
70
71 function webapp_checkfileexists ()
72 {
73 local my_prefix
74
75 [ -n "${2}" ] && my_prefix="${2}/" || my_prefix=
76
77 if [ ! -e "${my_prefix}${1}" ]; then
78 msg="ebuild fault: file '${1}' not found"
79 eerror "$msg"
80 eerror "Please report this as a bug at http://bugs.gentoo.org/"
81 die "$msg"
82 fi
83 }
84
85 # ------------------------------------------------------------------------
86 # INTERNAL FUNCTION - USED BY THIS ECLASS ONLY
87 # ------------------------------------------------------------------------
88
89 function webapp_check_installedat
90 {
91 local my_output
92
93 ${WEBAPP_CONFIG} --show-installed -h localhost -d "${INSTALL_DIR}" 2> /dev/null
94 }
95
96 # ------------------------------------------------------------------------
97 # INTERNAL FUNCTION - USED BY THIS ECLASS ONLY
98 #
99 # ------------------------------------------------------------------------
100
101 function webapp_strip_appdir ()
102 {
103 local my_stripped="${1}"
104 echo "${1}" | sed -e "s|${MY_APPDIR}/||g;"
105 }
106
107 function webapp_strip_d ()
108 {
109 echo "${1}" | sed -e "s|${D}||g;"
110 }
111
112 function webapp_strip_cwd ()
113 {
114 local my_stripped="${1}"
115 echo "${1}" | sed -e 's|/./|/|g;'
116 }
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 local m=""
129 for m in "$@" ; do
130 webapp_checkfileexists "${m}" "${D}"
131
132 local MY_FILE="$(webapp_strip_appdir "${m}")"
133 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
134
135 elog "(config) ${MY_FILE}"
136 echo "${MY_FILE}" >> ${D}/${WA_CONFIGLIST}
137 done
138 }
139
140 # ------------------------------------------------------------------------
141 # EXPORTED FUNCTION - FOR USE IN EBUILDS
142 #
143 # 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 webapp_checkfileexists "${1}"
152
153 elog "(hook) ${1}"
154 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 }
157
158 # ------------------------------------------------------------------------
159 # EXPORTED FUNCTION - FOR USE IN EBUILDS
160 #
161 # 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 function webapp_postinst_txt ()
168 {
169 webapp_checkfileexists "${2}"
170
171 elog "(info) ${2} (lang: ${1})"
172 cp "${2}" "${D}/${MY_APPDIR}/postinst-${1}.txt"
173 }
174
175 # ------------------------------------------------------------------------
176 # EXPORTED FUNCTION - FOR USE IN EBUILDS
177 #
178 # Install a text file containing post-upgrade instructions.
179 #
180 # @param $1 - language code (use 'en' for now)
181 # @param $2 - the file to install
182 # ------------------------------------------------------------------------
183
184 function webapp_postupgrade_txt ()
185 {
186 webapp_checkfileexists "${2}"
187
188 elog "(info) ${2} (lang: ${1})"
189 cp "${2}" "${D}/${MY_APPDIR}/postupgrade-${1}.txt"
190 }
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 #
201 # @param $1 - file to be owned by the webserver user:group combo
202 #
203 # ------------------------------------------------------------------------
204
205 function webapp_serverowned ()
206 {
207 local a=""
208 local m=""
209 if [ "${1}" = "-R" ]; then
210 shift
211 for m in "$@" ; do
212 for a in $(find ${D}/${m}); do
213 a=${a/${D}\/\///}
214 webapp_checkfileexists "${a}" "$D"
215 local MY_FILE="$(webapp_strip_appdir "${a}")"
216 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
217
218 elog "(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 local MY_FILE="$(webapp_strip_appdir "${m}")"
226 MY_FILE="$(webapp_strip_cwd "${MY_FILE}")"
227
228 elog "(server owned) ${MY_FILE}"
229 echo "${MY_FILE}" >> "${D}/${WA_SOLIST}"
230 done
231 fi
232 }
233
234 # ------------------------------------------------------------------------
235 # EXPORTED FUNCTION - FOR USE IN EBUILDS
236 #
237 # @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 function webapp_server_configfile ()
249 {
250 webapp_checkfileexists "${2}"
251
252 # sort out what the name will be of the config file
253
254 local my_file
255
256 if [ -z "${3}" ]; then
257 my_file="${1}-$(basename "${2}")"
258 else
259 my_file="${1}-${3}"
260 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
267 elog "(${1}) config file '${my_file}'"
268 cp "${2}" "${D}/${MY_SERVERCONFIGDIR}/${my_file}"
269 }
270
271 # ------------------------------------------------------------------------
272 # EXPORTED FUNCTION - FOR USE IN EBUILDS
273 #
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 webapp_checkfileexists "${2}"
286
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 if [ ! -d "${D}/${MY_SQLSCRIPTSDIR}/${1}" ]; then
293 mkdir -p "${D}/${MY_SQLSCRIPTSDIR}/${1}" || die "unable to create directory ${D}/${MY_SQLSCRIPTSDIR}/${1}"
294 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
301 # are we dealing with an 'upgrade'-type script?
302 if [ -n "${3}" ]; then
303 # yes we are
304 elog "(${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 else
308 # no, we are not
309 elog "(${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 fi
313 }
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 # are no setuid files.
321 # ------------------------------------------------------------------------
322
323 function webapp_src_install ()
324 {
325 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 fowners "root:0" "${MY_PERSISTDIR}"
331 fperms 755 "${MY_PERSISTDIR}"
332
333 # 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 touch "${D}/${MY_APPDIR}/${INSTALL_CHECK_FILE}"
341 }
342
343 # ------------------------------------------------------------------------
344 # EXPORTED FUNCTION - call from inside your ebuild's pkg_config AFTER
345 # 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 # add sanity checks here
354
355 if [ "${SLOT}+" != "${PVR}+" ]; then
356 # special case - some ebuilds *do* need to overwride the SLOT
357 if [ "${WEBAPP_MANUAL_SLOT}" != "yes" ]; then
358 die "ebuild sets SLOT, overrides webapp.eclass"
359 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 fi
366 fi
367
368 # pull in the shared configuration file
369
370 G_HOSTNAME="localhost"
371 webapp_read_config
372
373 # are we installing a webapp-config solution over the top of a
374 # non-webapp-config solution?
375
376 if ! use vhosts ; then
377 local my_dir="${ROOT}${VHOST_ROOT}/${MY_HTDOCSBASE}/${PN}"
378 local my_output
379
380 if [ -d "${my_dir}" ] ; then
381 my_output="$(webapp_check_installedat)"
382
383 if [ "$?" != "0" ]; then
384 # okay, whatever is there, it isn't webapp-config-compatible
385 ewarn "You already have something installed in ${my_dir}"
386 ewarn
387 ewarn "Whatever is in ${my_dir}, it's not"
388 ewarn "compatible with webapp-config."
389 ewarn
390 ewarn "This ebuild may be overwriting important files."
391 ewarn
392 elif [ "$(echo ${my_output} | awk '{ print $1 }')" != "${PN}" ]; then
393 eerror "${my_dir} contains ${my_output}"
394 eerror "I cannot upgrade that"
395 die "Cannot upgrade contents of ${my_dir}"
396 fi
397 fi
398 fi
399 }
400
401 function webapp_getinstalltype ()
402 {
403 # 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 my_output="$(webapp_check_installedat)"
411
412 if [ "${?}" = "0" ] ; then
413 # something is already installed there
414 #
415 # make sure it isn't the same version
416
417 local my_pn="$(echo ${my_output} | awk '{ print $1 }')"
418 local my_pvr="$(echo ${my_output} | awk '{ print $2 }')"
419
420 REMOVE_PKG="${my_pn}-${my_pvr}"
421
422 if [ "${my_pn}" == "${PN}" ]; then
423 if [ "${my_pvr}" != "${PVR}" ]; then
424 elog "This is an upgrade"
425 IS_UPGRADE=1
426 else
427 elog "This is a re-installation"
428 IS_REPLACE=1
429 fi
430 else
431 elog "${my_output} is installed there"
432 fi
433 else
434 elog "This is an installation"
435 fi
436 fi
437 }
438
439 function webapp_src_preinst ()
440 {
441 # create the directories that we need
442
443 dodir "${MY_HTDOCSDIR}"
444 dodir "${MY_HOSTROOTDIR}"
445 dodir "${MY_CGIBINDIR}"
446 dodir "${MY_ICONSDIR}"
447 dodir "${MY_ERRORSDIR}"
448 dodir "${MY_SQLSCRIPTSDIR}"
449 dodir "${MY_HOOKSCRIPTSDIR}"
450 dodir "${MY_SERVERCONFIGDIR}"
451 }
452
453 function webapp_pkg_postinst ()
454 {
455 webapp_read_config
456
457 # sanity checks, to catch bugs in the ebuild
458
459 if [ ! -f "${ROOT}${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]; then
460 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 # if 'vhosts' is not set in your USE flags, we install a copy of
473 # this application in ${ROOT}/var/www/localhost/htdocs/${PN}/ for you
474
475 if ! use vhosts ; then
476 echo
477 elog "vhosts USE flag not set - auto-installing using webapp-config"
478
479 webapp_getinstalltype
480
481 G_HOSTNAME="localhost"
482 local my_mode=-I
483 webapp_read_config
484
485 if [ "${IS_REPLACE}" = "1" ]; then
486 elog "${PN}-${PVR} is already installed - replacing"
487 my_mode=-I
488 elif [ "${IS_UPGRADE}" = "1" ]; then
489 elog "${REMOVE_PKG} is already installed - upgrading"
490 my_mode=-U
491 else
492 elog "${PN}-${PVR} is not installed - using install mode"
493 fi
494
495 my_cmd="${WEBAPP_CONFIG} ${my_mode} -h localhost -u root -d ${INSTALL_DIR} ${PN} ${PVR}"
496 elog "Running ${my_cmd}"
497 ${my_cmd}
498
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 if [ "${IS_UPGRADE}" = "1" ] ; then
511 elog "Removing old version ${REMOVE_PKG}"
512
513 emerge -C "${REMOVE_PKG}"
514 fi
515 else
516 # vhosts flag is on
517 #
518 # let's tell the administrator what to do next
519
520 elog
521 elog "The 'vhosts' USE flag is switched ON"
522 elog "This means that Portage will not automatically run webapp-config to"
523 elog "complete the installation."
524 elog
525 elog "To install ${PN}-${PVR} into a virtual host, run the following command:"
526 elog
527 elog " webapp-config -I -h <host> -d ${PN} ${PN} ${PVR}"
528 elog
529 elog "For more details, see the webapp-config(8) man page"
530 fi
531
532 return 0
533 }
534
535 function webapp_pkg_prerm ()
536 {
537 # remove any virtual installs that there are
538
539 local my_output
540 local x
541
542 my_output="$(${WEBAPP_CONFIG} --list-installs ${PN} ${PVR})"
543
544 if [ "${?}" != "0" ]; then
545 return
546 fi
547
548 for x in ${my_output} ; do
549 [ -f ${x}/.webapp ] && . ${x}/.webapp || ewarn "Cannot find file ${x}/.webapp"
550
551 if [ -z "${WEB_HOSTNAME}" -o -z "${WEB_INSTALLDIR}" ]; then
552 ewarn "Don't forget to use webapp-config to remove the copy of"
553 ewarn "${PN}-${PVR} installed in"
554 ewarn
555 ewarn " ${x}"
556 ewarn
557 else
558 # we have enough information to remove the virtual copy ourself
559
560 ${WEBAPP_CONFIG} -C -h ${WEB_HOSTNAME} -d ${WEB_INSTALLDIR}
561
562 # if the removal fails - we carry on anyway!
563 fi
564 done
565 }

  ViewVC Help
Powered by ViewVC 1.1.20