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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.58 - (hide annotations) (download)
Fri Feb 22 15:33:32 2008 UTC (6 years, 10 months ago) by hollow
Branch: MAIN
Changes since 1.57: +28 -1 lines
add need_httpd_* functions wrt #208584

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

  ViewVC Help
Powered by ViewVC 1.1.20