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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.49 - (show annotations) (download)
Fri Feb 22 09:33:45 2008 UTC (6 years, 5 months ago) by hollow
Branch: MAIN
Changes since 1.48: +83 -173 lines
convert to standard documentation syntax

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

  ViewVC Help
Powered by ViewVC 1.1.20