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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.30 - (hide annotations) (download)
Tue May 10 22:55:17 2005 UTC (9 years, 7 months ago) by beu
Branch: MAIN
Changes since 1.29: +2 -2 lines
Up required version of webapp-config to a minimum of 1.10-r14.

1 vapier 1.24 # Copyright 1999-2004 Gentoo Foundation
2 stuart 1.1 # Distributed under the terms of the GNU General Public License v2
3 beu 1.30 # $Header: /var/cvsroot/gentoo-x86/eclass/webapp.eclass,v 1.29 2004/07/22 14:07:01 stuart Exp $
4 stuart 1.1 #
5     # eclass/webapp.eclass
6     # Eclass for installing applications to run under a web server
7     #
8     # Part of the implementation of GLEP #11
9     #
10     # Author(s) Stuart Herbert <stuart@gentoo.org>
11     #
12     # ------------------------------------------------------------------------
13     #
14 stuart 1.18 # The master copy of this eclass is held in Stu's subversion repository.
15     #
16     # If you make changes to this file and don't tell Stu, chances are that
17     # your changes will be overwritten the next time Stu releases a new version
18     # of webapp-config.
19 stuart 1.1 #
20     # ------------------------------------------------------------------------
21    
22     ECLASS=webapp
23     INHERITED="$INHERITED $ECLASS"
24     SLOT="${PVR}"
25     IUSE="$IUSE vhosts"
26 beu 1.30 DEPEND="$DEPEND >=net-www/webapp-config-1.10-r14 app-portage/gentoolkit"
27 stuart 1.1
28 stuart 1.18 EXPORT_FUNCTIONS pkg_postinst pkg_setup src_install pkg_prerm
29 stuart 1.1
30 stuart 1.14 INSTALL_DIR="/$PN"
31     IS_UPGRADE=0
32     IS_REPLACE=0
33    
34 stuart 1.19 INSTALL_CHECK_FILE="installed_by_webapp_eclass"
35    
36 stuart 1.21 ETC_CONFIG="/etc/vhosts/webapp-config"
37    
38 stuart 1.1 # ------------------------------------------------------------------------
39     # INTERNAL FUNCTION - USED BY THIS ECLASS ONLY
40     #
41     # Check whether a specified file exists within the image/ directory
42     # or not.
43     #
44     # @param $1 - file to look for
45 stuart 1.3 # @param $2 - prefix directory to use
46 stuart 1.1 # @return 0 on success, never returns on an error
47     # ------------------------------------------------------------------------
48    
49     function webapp_checkfileexists ()
50     {
51 stuart 1.9 local my_prefix
52    
53     [ -n "$2" ] && my_prefix="$2/" || my_prefix=
54    
55 stuart 1.22 if [ ! -e "${my_prefix}$1" ]; then
56 stuart 1.23 msg="ebuild fault: file '$1' not found"
57 stuart 1.1 eerror "$msg"
58     eerror "Please report this as a bug at http://bugs.gentoo.org/"
59     die "$msg"
60     fi
61     }
62    
63     # ------------------------------------------------------------------------
64 stuart 1.3 # INTERNAL FUNCTION - USED BY THIS ECLASS ONLY
65     # ------------------------------------------------------------------------
66    
67 stuart 1.14 function webapp_check_installedat
68     {
69     local my_output
70    
71 stuart 1.22 /usr/sbin/webapp-config --show-installed -h localhost -d "$INSTALL_DIR" 2> /dev/null
72 stuart 1.14 }
73    
74     # ------------------------------------------------------------------------
75     # INTERNAL FUNCTION - USED BY THIS ECLASS ONLY
76     # ------------------------------------------------------------------------
77    
78 stuart 1.3 function webapp_import_config ()
79     {
80     if [ -z "${MY_HTDOCSDIR}" ]; then
81     . /etc/conf.d/webapp-config
82     fi
83    
84     if [ -z "${MY_HTDOCSDIR}" ]; then
85     libsh_edie "/etc/conf.d/webapp-config not imported"
86     fi
87     }
88    
89     # ------------------------------------------------------------------------
90     # INTERNAL FUNCTION - USED BY THIS ECLASS ONLY
91 stuart 1.1 #
92     # ------------------------------------------------------------------------
93    
94 stuart 1.3 function webapp_strip_appdir ()
95     {
96 stuart 1.14 local my_stripped="$1"
97 stuart 1.11 echo "$1" | sed -e "s|${MY_APPDIR}/||g;"
98 stuart 1.3 }
99    
100     function webapp_strip_d ()
101     {
102     echo "$1" | sed -e "s|${D}||g;"
103     }
104    
105     function webapp_strip_cwd ()
106 stuart 1.1 {
107 stuart 1.14 local my_stripped="$1"
108 stuart 1.3 echo "$1" | sed -e 's|/./|/|g;'
109 stuart 1.1 }
110    
111     # ------------------------------------------------------------------------
112     # EXPORTED FUNCTION - FOR USE IN EBUILDS
113     #
114     # Identify a config file for a web-based application.
115     #
116     # @param $1 - config file
117     # ------------------------------------------------------------------------
118    
119     function webapp_configfile ()
120     {
121 stuart 1.3 webapp_checkfileexists "$1" "$D"
122 stuart 1.27
123 stuart 1.22 local MY_FILE="`webapp_strip_appdir \"$1\"`"
124 stuart 1.29 MY_FILE="`webapp_strip_cwd \"$MY_FILE\"`"
125 stuart 1.3
126     einfo "(config) $MY_FILE"
127 stuart 1.23 echo "$MY_FILE" >> ${D}${WA_CONFIGLIST}
128 stuart 1.1 }
129    
130     # ------------------------------------------------------------------------
131     # EXPORTED FUNCTION - FOR USE IN EBUILDS
132     #
133 stuart 1.18 # Install a script that will run after a virtual copy is created, and
134     # before a virtual copy has been removed
135     #
136     # @param $1 - the script to run
137     # ------------------------------------------------------------------------
138    
139     function webapp_hook_script ()
140     {
141 stuart 1.23 webapp_checkfileexists "$1"
142 stuart 1.18
143     einfo "(hook) $1"
144     cp "$1" "${D}${MY_HOOKSCRIPTSDIR}/`basename $1`" || die "Unable to install $1 into ${D}${MY_HOOKSCRIPTSDIR}/"
145     chmod 555 "${D}${MY_HOOKSCRIPTSDIR}/`basename $1`"
146     }
147    
148     # ------------------------------------------------------------------------
149     # EXPORTED FUNCTION - FOR USE IN EBUILDS
150     #
151 stuart 1.5 # Install a text file containing post-installation instructions.
152     #
153     # @param $1 - language code (use 'en' for now)
154     # @param $2 - the file to install
155     # ------------------------------------------------------------------------
156    
157     function webapp_postinst_txt
158     {
159     webapp_checkfileexists "$2"
160    
161     einfo "(rtfm) $2 (lang: $1)"
162 stuart 1.8 cp "$2" "${D}${MY_APPDIR}/postinst-$1.txt"
163 stuart 1.5 }
164    
165     # ------------------------------------------------------------------------
166     # EXPORTED FUNCTION - FOR USE IN EBUILDS
167     #
168 stuart 1.1 # Identify a script file (usually, but not always PHP or Perl) which is
169     #
170     # Files in this list may be modified to #! the required CGI engine when
171     # installed by webapp-config tool in the future.
172     #
173     # @param $1 - the cgi engine to use
174     # @param $2 - the script file that could run under a cgi-bin
175     #
176     # ------------------------------------------------------------------------
177    
178     function webapp_runbycgibin ()
179     {
180 stuart 1.3 webapp_checkfileexists "$2" "$D"
181 stuart 1.22 local MY_FILE="`webapp_strip_appdir \"$2\"`"
182     MY_FILE="`webapp_strip_cwd \"$MY_FILE\"`"
183 stuart 1.3
184     einfo "(cgi-bin) $1 - $MY_FILE"
185 stuart 1.22 echo "\"$1\" \"$MY_FILE\"" >> "${D}${WA_RUNBYCGIBINLIST}"
186 stuart 1.3 }
187    
188     # ------------------------------------------------------------------------
189     # EXPORTED FUNCTION - FOR USE IN EBUILDS
190     #
191     # Identify a file which must be owned by the webserver's user:group
192     # settings.
193     #
194     # The ownership of the file is NOT set until the application is installed
195     # using the webapp-config tool.
196     #
197     # @param $1 - file to be owned by the webserver user:group combo
198     #
199     # ------------------------------------------------------------------------
200    
201     function webapp_serverowned ()
202     {
203     webapp_checkfileexists "$1" "$D"
204 stuart 1.22 local MY_FILE="`webapp_strip_appdir \"$1\"`"
205 stuart 1.29 MY_FILE="`webapp_strip_cwd \"$MY_FILE\"`"
206 stuart 1.3
207     einfo "(server owned) $MY_FILE"
208 stuart 1.23 echo "$MY_FILE" >> "${D}${WA_SOLIST}"
209 stuart 1.3 }
210    
211     # ------------------------------------------------------------------------
212     # EXPORTED FUNCTION - FOR USE IN EBUILDS
213     #
214 stuart 1.18 # @param $1 - the webserver to install the config file for
215     # (one of apache1, apache2, cherokee)
216     # @param $2 - the config file to install
217     # @param $3 - new name for the config file (default is `basename $2`)
218     # this is an optional parameter
219     #
220     # NOTE:
221     # this function will automagically prepend $1 to the front of your
222     # config file's name
223     # ------------------------------------------------------------------------
224    
225 stuart 1.26 function webapp_server_configfile ()
226 stuart 1.18 {
227     webapp_checkfileexists "$2"
228    
229     # sort out what the name will be of the config file
230    
231     local my_file
232    
233     if [ -z "$3" ]; then
234 stuart 1.22 my_file="$1-`basename $2`"
235 stuart 1.18 else
236 stuart 1.22 my_file="$1-$3"
237 stuart 1.18 fi
238    
239     # warning:
240     #
241     # do NOT change the naming convention used here without changing all
242     # the other scripts that also rely upon these names
243    
244     einfo "($1) config file '$my_file'"
245     cp "$2" "${D}${MY_SERVERCONFIGDIR}/${my_file}"
246     }
247    
248     # ------------------------------------------------------------------------
249     # EXPORTED FUNCTION - FOR USE IN EBUILDS
250 stuart 1.3 #
251     # @param $1 - the db engine that the script is for
252     # (one of: mysql|postgres)
253     # @param $2 - the sql script to be installed
254     # @param $3 - the older version of the app that this db script
255     # will upgrade from
256     # (do not pass this option if your SQL script only creates
257     # a new db from scratch)
258     # ------------------------------------------------------------------------
259    
260     function webapp_sqlscript ()
261     {
262     webapp_checkfileexists "$2"
263    
264     # create the directory where this script will go
265     #
266     # scripts for specific database engines go into their own subdirectory
267     # just to keep things readable on the filesystem
268    
269 stuart 1.8 if [ ! -d "${D}${MY_SQLSCRIPTSDIR}/$1" ]; then
270     mkdir -p "${D}${MY_SQLSCRIPTSDIR}/$1" || libsh_die "unable to create directory ${D}${MY_SQLSCRIPTSDIR}/$1"
271 stuart 1.3 fi
272    
273     # warning:
274     #
275     # do NOT change the naming convention used here without changing all
276     # the other scripts that also rely upon these names
277    
278     # are we dealing with an 'upgrade'-type script?
279     if [ -n "$3" ]; then
280     # yes we are
281     einfo "($1) upgrade script from ${PN}-${PVR} to $3"
282 stuart 1.22 cp "$2" "${D}${MY_SQLSCRIPTSDIR}/$1/${3}_to_${PVR}.sql"
283 stuart 1.3 else
284     # no, we are not
285     einfo "($1) create script for ${PN}-${PVR}"
286 stuart 1.22 cp "$2" "${D}${MY_SQLSCRIPTSDIR}/$1/${PVR}_create.sql"
287 stuart 1.3 fi
288 stuart 1.1 }
289    
290     # ------------------------------------------------------------------------
291     # EXPORTED FUNCTION - call from inside your ebuild's src_install AFTER
292     # everything else has run
293     #
294     # For now, we just make sure that root owns everything, and that there
295     # are no setuid files. I'm sure this will change significantly before
296     # the final version!
297     # ------------------------------------------------------------------------
298    
299     function webapp_src_install ()
300     {
301 stuart 1.22 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:root" "${MY_PERSISTDIR}"
307     fperms 755 "${MY_PERSISTDIR}"
308 stuart 1.15
309 stuart 1.19 # 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 stuart 1.22 touch "${D}/${MY_APPDIR}/${INSTALL_CHECK_FILE}"
317 stuart 1.1 }
318    
319     # ------------------------------------------------------------------------
320 stuart 1.3 # EXPORTED FUNCTION - call from inside your ebuild's pkg_config AFTER
321 stuart 1.1 # everything else has run
322     #
323     # If 'vhosts' USE flag is not set, auto-install this app
324     #
325     # ------------------------------------------------------------------------
326    
327     function webapp_pkg_setup ()
328     {
329 stuart 1.15 # add sanity checks here
330    
331     if [ "$SLOT+" != "${PVR}+" ]; then
332     die "ebuild sets SLOT, overrides webapp.eclass"
333     fi
334    
335 stuart 1.8 # pull in the shared configuration file
336    
337 stuart 1.18 G_HOSTNAME="localhost"
338 stuart 1.22 . "${ETC_CONFIG}" || die "Unable to open file ${ETC_CONFIG}"
339 stuart 1.18
340     # are we installing a webapp-config solution over the top of a
341     # non-webapp-config solution?
342    
343     if ! use vhosts ; then
344     local my_dir="$VHOST_ROOT/$MY_HTDOCSBASE/$PN"
345     local my_output
346    
347     if [ -d "$my_dir" ] ; then
348     einfo "You already have something installed in $my_dir"
349     einfo "Are you trying to install over the top of something I cannot upgrade?"
350    
351     my_output="`webapp_check_installedat`"
352    
353     if [ "$?" != "0" ]; then
354    
355     # okay, whatever is there, it isn't webapp-config-compatible
356     ewarn
357     ewarn "Whatever is in $my_dir, it's not"
358     ewarn "compatible with webapp-config."
359     ewarn
360 stuart 1.20 ewarn "This ebuild may be overwriting important files."
361     ewarn
362 stuart 1.18 elif [ "`echo $my_output | awk '{ print $1 }'`" != "$PN" ]; then
363     eerror "$my_dir contains $my_output"
364     eerror "I cannot upgrade that"
365     die "Cannot upgrade contents of $my_dir"
366     else
367     einfo
368     einfo "I can upgrade the contents of $my_dir"
369     einfo
370     fi
371     fi
372     fi
373 stuart 1.14 }
374 stuart 1.6
375 stuart 1.18 function webapp_someunusedfunction ()
376 stuart 1.14 {
377 stuart 1.3 # are we emerging something that is already installed?
378    
379 stuart 1.8 if [ -d "${D}${MY_APPROOT}/${MY_APPSUFFIX}" ]; then
380 stuart 1.3 # yes we are
381     ewarn "Removing existing copy of ${PN}-${PVR}"
382 stuart 1.8 rm -rf "${D}${MY_APPROOT}/${MY_APPSUFFIX}"
383 stuart 1.3 fi
384 stuart 1.18 }
385 stuart 1.14
386 stuart 1.18 function webapp_getinstalltype ()
387     {
388 stuart 1.14 # or are we upgrading?
389    
390     if ! use vhosts ; then
391     # we only run webapp-config if vhosts USE flag is not set
392    
393     local my_output
394    
395     my_output="`webapp_check_installedat`"
396    
397     if [ "$?" = "0" ] ; then
398     # something is already installed there
399     #
400     # make sure it isn't the same version
401    
402     local my_pn="`echo $my_output | awk '{ print $1 }'`"
403     local my_pvr="`echo $my_output | awk '{ print $2 }'`"
404    
405     REMOVE_PKG="${my_pn}-${my_pvr}"
406    
407     if [ "$my_pn" == "$PN" ]; then
408     if [ "$my_pvr" != "$PVR" ]; then
409     einfo "This is an upgrade"
410     IS_UPGRADE=1
411     else
412     einfo "This is a re-installation"
413     IS_REPLACE=1
414     fi
415 stuart 1.18 else
416     einfo "$my_ouptut is installed there"
417 stuart 1.14 fi
418 stuart 1.18 else
419     einfo "This is an installation"
420 stuart 1.14 fi
421     fi
422 stuart 1.9 }
423 stuart 1.3
424 stuart 1.9 function webapp_src_preinst ()
425     {
426 stuart 1.3 # create the directories that we need
427    
428 stuart 1.22 dodir "${MY_HTDOCSDIR}"
429     dodir "${MY_HOSTROOTDIR}"
430     dodir "${MY_CGIBINDIR}"
431     dodir "${MY_ICONSDIR}"
432     dodir "${MY_ERRORSDIR}"
433     dodir "${MY_SQLSCRIPTSDIR}"
434 stuart 1.25 dodir "${MY_HOOKSCRIPTSDIR}"
435 stuart 1.26 dodir "${MY_SERVERCONFIGDIR}"
436 stuart 1.3 }
437    
438 stuart 1.5 function webapp_pkg_postinst ()
439 stuart 1.3 {
440 stuart 1.22 . "${ETC_CONFIG}"
441 stuart 1.21
442 stuart 1.15 # sanity checks, to catch bugs in the ebuild
443    
444 stuart 1.22 if [ ! -f "${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]; then
445 stuart 1.15 eerror
446     eerror "This ebuild did not call webapp_src_install() at the end"
447     eerror "of the src_install() function"
448     eerror
449     eerror "Please log a bug on http://bugs.gentoo.org"
450     eerror
451     eerror "You should use emerge -C to remove this package, as the"
452     eerror "installation is incomplete"
453     eerror
454     die "Ebuild did not call webapp_src_install() - report to http://bugs.gentoo.org"
455     fi
456    
457 stuart 1.10 # if 'vhosts' is not set in your USE flags, we install a copy of
458     # this application in /var/www/localhost/htdocs/${PN}/ for you
459 stuart 1.11
460 stuart 1.10 if ! use vhosts ; then
461 stuart 1.14 echo
462 stuart 1.11 einfo "vhosts USE flag not set - auto-installing using webapp-config"
463    
464 stuart 1.14 webapp_getinstalltype
465    
466 stuart 1.10 G_HOSTNAME="localhost"
467 stuart 1.22 . "${ETC_CONFIG}"
468 stuart 1.10
469     local my_mode=-I
470    
471 stuart 1.14 if [ "$IS_REPLACE" = "1" ]; then
472     einfo "${PN}-${PVR} is already installed - replacing"
473 stuart 1.27 my_mode=-I
474 stuart 1.14 elif [ "$IS_UPGRADE" = "1" ]; then
475     einfo "$REMOVE_PKG is already installed - upgrading"
476     my_mode=-U
477 stuart 1.11 else
478     einfo "${PN}-${PVR} is not installed - using install mode"
479 stuart 1.10 fi
480    
481 stuart 1.14 my_cmd="/usr/sbin/webapp-config $my_mode -h localhost -u root -d $INSTALL_DIR ${PN} ${PVR}"
482 stuart 1.11 einfo "Running $my_cmd"
483     $my_cmd
484 stuart 1.14
485     # remove the old version
486     #
487     # why do we do this? well ...
488     #
489     # normally, emerge -u installs a new version and then removes the
490     # old version. however, if the new version goes into a different
491     # slot to the old version, then the old version gets left behind
492     #
493     # if USE=-vhosts, then we want to remove the old version, because
494     # the user is relying on portage to do the magical thing for it
495    
496     if [ "$IS_UPGRADE" = "1" ] ; then
497     einfo "Removing old version $REMOVE_PKG"
498    
499 stuart 1.28 emerge -C "$REMOVE_PKG"
500 stuart 1.14 fi
501 stuart 1.18 else
502     # vhosts flag is on
503     #
504     # let's tell the administrator what to do next
505    
506     einfo
507     einfo "The 'vhosts' USE flag is switched ON"
508     einfo "This means that Portage will not automatically run webapp-config to"
509     einfo "complete the installation."
510     einfo
511     einfo "To install $PN-$PVR into a virtual host, run the following command:"
512     einfo
513     einfo " webapp-config -I -h <host> -d $PN $PN $PVR"
514     einfo
515     einfo "For more details, see the webapp-config(8) man page"
516 stuart 1.10 fi
517 stuart 1.11
518     return 0
519 stuart 1.2 }
520 stuart 1.18
521     function webapp_pkg_prerm ()
522     {
523     # remove any virtual installs that there are
524    
525     local my_output
526     local x
527    
528     my_output="`webapp-config --list-installs $PN $PVR`"
529    
530     if [ "$?" != "0" ]; then
531     return
532     fi
533    
534     # the changes to IFS here are necessary to ensure that we can cope
535     # with directories that contain spaces in the file names
536    
537     # OLD_IFS="$IFS"
538     # IFS=" "
539    
540     for x in $my_output ; do
541     # IFS="$OLD_IFS"
542    
543     [ -f $x/.webapp ] && . $x/.webapp || ewarn "Cannot find file $x/.webapp"
544    
545     if [ -z "WEB_HOSTNAME" -o -z "WEB_INSTALLDIR" ]; then
546     ewarn "Don't forget to use webapp-config to remove the copy of"
547     ewarn "${PN}-${PVR} installed in"
548     ewarn
549     ewarn " $x"
550     ewarn
551     else
552     # we have enough information to remove the virtual copy ourself
553    
554     webapp-config -C -h ${WEB_HOSTNAME} -d ${WEB_INSTALLDIR}
555    
556     # if the removal fails - we carry on anyway!
557     fi
558     # IFS=" "
559     done
560    
561     # IFS="$OLD_IFS"
562     }

  ViewVC Help
Powered by ViewVC 1.1.20