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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.53 - (show annotations) (download)
Fri Feb 22 14:06:05 2008 UTC (6 years, 1 month ago) by hollow
Branch: MAIN
Changes since 1.52: +30 -36 lines
use bash keyword for tests; minor cleanups

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

  ViewVC Help
Powered by ViewVC 1.1.20