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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.51 - (show annotations) (download)
Fri Feb 22 13:44:41 2008 UTC (6 years, 4 months ago) by hollow
Branch: MAIN
Changes since 1.50: +43 -42 lines
add eclass debugging; remove redundant comments

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

  ViewVC Help
Powered by ViewVC 1.1.20