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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.54 - (hide annotations) (download)
Fri Feb 22 14:27:17 2008 UTC (6 years, 8 months ago) by hollow
Branch: MAIN
Changes since 1.53: +55 -63 lines
get rid of too much indention; consistency cleanup

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

  ViewVC Help
Powered by ViewVC 1.1.20