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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.31 - (hide annotations) (download)
Mon May 30 21:44:17 2005 UTC (9 years, 3 months ago) by stuart
Branch: MAIN
Changes since 1.30: +27 -15 lines
Version bump to match webapp-config v1.11

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 stuart 1.31 # $Header: /var/cvsroot/gentoo-x86/eclass/webapp.eclass,v 1.30 2005/05/10 22:55:17 beu 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 stuart 1.31 DEPEND="$DEPEND net-www/webapp-config 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 stuart 1.31 function webapp_postinst_txt ()
158 stuart 1.5 {
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.31 # Install a text file containing post-upgrade instructions.
169 stuart 1.1 #
170 stuart 1.31 # @param $1 - language code (use 'en' for now)
171     # @param $2 - the file to install
172     # ------------------------------------------------------------------------
173    
174     function webapp_postupgrade_txt ()
175     {
176     webapp_checkfileexists "$2"
177    
178     einfo "(rtfm) $2 (lang: $1)"
179     cp "$2" "${D}${MY_APPDIR}/postupgrade-$1.txt"
180     }
181    
182     # ------------------------------------------------------------------------
183     # DEPRECATED FUNCTION
184 stuart 1.1 #
185 stuart 1.31 # It never worked anyway
186 stuart 1.1
187     function webapp_runbycgibin ()
188     {
189 stuart 1.31 if [ -n "$WARN_RUNBYCGIBIN" ] ; then
190     return
191     fi
192 stuart 1.3
193 stuart 1.31 ewarn "This ebuild uses webapp.eclass's webapp_runbycgibin, which is now"
194     ewarn "deprecated. Please file a bug about this in Bugzilla."
195     WARN_RUNBYCGIBIN=1
196 stuart 1.3 }
197    
198     # ------------------------------------------------------------------------
199     # EXPORTED FUNCTION - FOR USE IN EBUILDS
200     #
201     # Identify a file which must be owned by the webserver's user:group
202     # settings.
203     #
204     # The ownership of the file is NOT set until the application is installed
205     # using the webapp-config tool.
206     #
207     # @param $1 - file to be owned by the webserver user:group combo
208     #
209     # ------------------------------------------------------------------------
210    
211     function webapp_serverowned ()
212     {
213     webapp_checkfileexists "$1" "$D"
214 stuart 1.22 local MY_FILE="`webapp_strip_appdir \"$1\"`"
215 stuart 1.29 MY_FILE="`webapp_strip_cwd \"$MY_FILE\"`"
216 stuart 1.3
217     einfo "(server owned) $MY_FILE"
218 stuart 1.23 echo "$MY_FILE" >> "${D}${WA_SOLIST}"
219 stuart 1.3 }
220    
221     # ------------------------------------------------------------------------
222     # EXPORTED FUNCTION - FOR USE IN EBUILDS
223     #
224 stuart 1.18 # @param $1 - the webserver to install the config file for
225     # (one of apache1, apache2, cherokee)
226     # @param $2 - the config file to install
227     # @param $3 - new name for the config file (default is `basename $2`)
228     # this is an optional parameter
229     #
230     # NOTE:
231     # this function will automagically prepend $1 to the front of your
232     # config file's name
233     # ------------------------------------------------------------------------
234    
235 stuart 1.26 function webapp_server_configfile ()
236 stuart 1.18 {
237     webapp_checkfileexists "$2"
238    
239     # sort out what the name will be of the config file
240    
241     local my_file
242    
243     if [ -z "$3" ]; then
244 stuart 1.22 my_file="$1-`basename $2`"
245 stuart 1.18 else
246 stuart 1.22 my_file="$1-$3"
247 stuart 1.18 fi
248    
249     # warning:
250     #
251     # do NOT change the naming convention used here without changing all
252     # the other scripts that also rely upon these names
253    
254     einfo "($1) config file '$my_file'"
255     cp "$2" "${D}${MY_SERVERCONFIGDIR}/${my_file}"
256     }
257    
258     # ------------------------------------------------------------------------
259     # EXPORTED FUNCTION - FOR USE IN EBUILDS
260 stuart 1.3 #
261     # @param $1 - the db engine that the script is for
262     # (one of: mysql|postgres)
263     # @param $2 - the sql script to be installed
264     # @param $3 - the older version of the app that this db script
265     # will upgrade from
266     # (do not pass this option if your SQL script only creates
267     # a new db from scratch)
268     # ------------------------------------------------------------------------
269    
270     function webapp_sqlscript ()
271     {
272     webapp_checkfileexists "$2"
273    
274     # create the directory where this script will go
275     #
276     # scripts for specific database engines go into their own subdirectory
277     # just to keep things readable on the filesystem
278    
279 stuart 1.8 if [ ! -d "${D}${MY_SQLSCRIPTSDIR}/$1" ]; then
280     mkdir -p "${D}${MY_SQLSCRIPTSDIR}/$1" || libsh_die "unable to create directory ${D}${MY_SQLSCRIPTSDIR}/$1"
281 stuart 1.3 fi
282    
283     # warning:
284     #
285     # do NOT change the naming convention used here without changing all
286     # the other scripts that also rely upon these names
287    
288     # are we dealing with an 'upgrade'-type script?
289     if [ -n "$3" ]; then
290     # yes we are
291     einfo "($1) upgrade script from ${PN}-${PVR} to $3"
292 stuart 1.22 cp "$2" "${D}${MY_SQLSCRIPTSDIR}/$1/${3}_to_${PVR}.sql"
293 stuart 1.31 chmod 600 "${D}${MY_SQLSCRIPTSDIR}/$1/${3}_to_${PVR}.sql"
294 stuart 1.3 else
295     # no, we are not
296     einfo "($1) create script for ${PN}-${PVR}"
297 stuart 1.22 cp "$2" "${D}${MY_SQLSCRIPTSDIR}/$1/${PVR}_create.sql"
298 stuart 1.31 chmod 600 "${D}${MY_SQLSCRIPTSDIR}/$1/${PVR}_create.sql"
299 stuart 1.3 fi
300 stuart 1.1 }
301    
302     # ------------------------------------------------------------------------
303     # EXPORTED FUNCTION - call from inside your ebuild's src_install AFTER
304     # everything else has run
305     #
306     # For now, we just make sure that root owns everything, and that there
307     # are no setuid files. I'm sure this will change significantly before
308     # the final version!
309     # ------------------------------------------------------------------------
310    
311     function webapp_src_install ()
312     {
313 stuart 1.22 chown -R "${VHOST_DEFAULT_UID}:${VHOST_DEFAULT_GID}" "${D}/"
314     chmod -R u-s "${D}/"
315     chmod -R g-s "${D}/"
316    
317     keepdir "${MY_PERSISTDIR}"
318     fowners "root:root" "${MY_PERSISTDIR}"
319     fperms 755 "${MY_PERSISTDIR}"
320 stuart 1.15
321 stuart 1.19 # to test whether or not the ebuild has correctly called this function
322     # we add an empty file to the filesystem
323     #
324     # we used to just set a variable in the shell script, but we can
325     # no longer rely on Portage calling both webapp_src_install() and
326     # webapp_pkg_postinst() within the same shell process
327    
328 stuart 1.22 touch "${D}/${MY_APPDIR}/${INSTALL_CHECK_FILE}"
329 stuart 1.1 }
330    
331     # ------------------------------------------------------------------------
332 stuart 1.3 # EXPORTED FUNCTION - call from inside your ebuild's pkg_config AFTER
333 stuart 1.1 # everything else has run
334     #
335     # If 'vhosts' USE flag is not set, auto-install this app
336     #
337     # ------------------------------------------------------------------------
338    
339     function webapp_pkg_setup ()
340     {
341 stuart 1.15 # add sanity checks here
342    
343     if [ "$SLOT+" != "${PVR}+" ]; then
344     die "ebuild sets SLOT, overrides webapp.eclass"
345     fi
346    
347 stuart 1.8 # pull in the shared configuration file
348    
349 stuart 1.18 G_HOSTNAME="localhost"
350 stuart 1.22 . "${ETC_CONFIG}" || die "Unable to open file ${ETC_CONFIG}"
351 stuart 1.18
352     # are we installing a webapp-config solution over the top of a
353     # non-webapp-config solution?
354    
355     if ! use vhosts ; then
356     local my_dir="$VHOST_ROOT/$MY_HTDOCSBASE/$PN"
357     local my_output
358    
359     if [ -d "$my_dir" ] ; then
360     einfo "You already have something installed in $my_dir"
361     einfo "Are you trying to install over the top of something I cannot upgrade?"
362    
363     my_output="`webapp_check_installedat`"
364    
365     if [ "$?" != "0" ]; then
366    
367     # okay, whatever is there, it isn't webapp-config-compatible
368     ewarn
369     ewarn "Whatever is in $my_dir, it's not"
370     ewarn "compatible with webapp-config."
371     ewarn
372 stuart 1.20 ewarn "This ebuild may be overwriting important files."
373     ewarn
374 stuart 1.18 elif [ "`echo $my_output | awk '{ print $1 }'`" != "$PN" ]; then
375     eerror "$my_dir contains $my_output"
376     eerror "I cannot upgrade that"
377     die "Cannot upgrade contents of $my_dir"
378     else
379     einfo
380     einfo "I can upgrade the contents of $my_dir"
381     einfo
382     fi
383     fi
384     fi
385 stuart 1.14 }
386 stuart 1.6
387 stuart 1.18 function webapp_someunusedfunction ()
388 stuart 1.14 {
389 stuart 1.3 # are we emerging something that is already installed?
390    
391 stuart 1.8 if [ -d "${D}${MY_APPROOT}/${MY_APPSUFFIX}" ]; then
392 stuart 1.3 # yes we are
393     ewarn "Removing existing copy of ${PN}-${PVR}"
394 stuart 1.8 rm -rf "${D}${MY_APPROOT}/${MY_APPSUFFIX}"
395 stuart 1.3 fi
396 stuart 1.18 }
397 stuart 1.14
398 stuart 1.18 function webapp_getinstalltype ()
399     {
400 stuart 1.14 # or are we upgrading?
401    
402     if ! use vhosts ; then
403     # we only run webapp-config if vhosts USE flag is not set
404    
405     local my_output
406    
407     my_output="`webapp_check_installedat`"
408    
409     if [ "$?" = "0" ] ; then
410     # something is already installed there
411     #
412     # make sure it isn't the same version
413    
414     local my_pn="`echo $my_output | awk '{ print $1 }'`"
415     local my_pvr="`echo $my_output | awk '{ print $2 }'`"
416    
417     REMOVE_PKG="${my_pn}-${my_pvr}"
418    
419     if [ "$my_pn" == "$PN" ]; then
420     if [ "$my_pvr" != "$PVR" ]; then
421     einfo "This is an upgrade"
422     IS_UPGRADE=1
423     else
424     einfo "This is a re-installation"
425     IS_REPLACE=1
426     fi
427 stuart 1.18 else
428     einfo "$my_ouptut is installed there"
429 stuart 1.14 fi
430 stuart 1.18 else
431     einfo "This is an installation"
432 stuart 1.14 fi
433     fi
434 stuart 1.9 }
435 stuart 1.3
436 stuart 1.9 function webapp_src_preinst ()
437     {
438 stuart 1.3 # create the directories that we need
439    
440 stuart 1.22 dodir "${MY_HTDOCSDIR}"
441     dodir "${MY_HOSTROOTDIR}"
442     dodir "${MY_CGIBINDIR}"
443     dodir "${MY_ICONSDIR}"
444     dodir "${MY_ERRORSDIR}"
445     dodir "${MY_SQLSCRIPTSDIR}"
446 stuart 1.25 dodir "${MY_HOOKSCRIPTSDIR}"
447 stuart 1.26 dodir "${MY_SERVERCONFIGDIR}"
448 stuart 1.3 }
449    
450 stuart 1.5 function webapp_pkg_postinst ()
451 stuart 1.3 {
452 stuart 1.22 . "${ETC_CONFIG}"
453 stuart 1.21
454 stuart 1.15 # sanity checks, to catch bugs in the ebuild
455    
456 stuart 1.22 if [ ! -f "${MY_APPDIR}/${INSTALL_CHECK_FILE}" ]; then
457 stuart 1.15 eerror
458     eerror "This ebuild did not call webapp_src_install() at the end"
459     eerror "of the src_install() function"
460     eerror
461     eerror "Please log a bug on http://bugs.gentoo.org"
462     eerror
463     eerror "You should use emerge -C to remove this package, as the"
464     eerror "installation is incomplete"
465     eerror
466     die "Ebuild did not call webapp_src_install() - report to http://bugs.gentoo.org"
467     fi
468    
469 stuart 1.10 # if 'vhosts' is not set in your USE flags, we install a copy of
470     # this application in /var/www/localhost/htdocs/${PN}/ for you
471 stuart 1.11
472 stuart 1.10 if ! use vhosts ; then
473 stuart 1.14 echo
474 stuart 1.11 einfo "vhosts USE flag not set - auto-installing using webapp-config"
475    
476 stuart 1.14 webapp_getinstalltype
477    
478 stuart 1.10 G_HOSTNAME="localhost"
479 stuart 1.22 . "${ETC_CONFIG}"
480 stuart 1.10
481     local my_mode=-I
482    
483 stuart 1.14 if [ "$IS_REPLACE" = "1" ]; then
484     einfo "${PN}-${PVR} is already installed - replacing"
485 stuart 1.27 my_mode=-I
486 stuart 1.14 elif [ "$IS_UPGRADE" = "1" ]; then
487     einfo "$REMOVE_PKG is already installed - upgrading"
488     my_mode=-U
489 stuart 1.11 else
490     einfo "${PN}-${PVR} is not installed - using install mode"
491 stuart 1.10 fi
492    
493 stuart 1.14 my_cmd="/usr/sbin/webapp-config $my_mode -h localhost -u root -d $INSTALL_DIR ${PN} ${PVR}"
494 stuart 1.11 einfo "Running $my_cmd"
495     $my_cmd
496 stuart 1.14
497     # remove the old version
498     #
499     # why do we do this? well ...
500     #
501     # normally, emerge -u installs a new version and then removes the
502     # old version. however, if the new version goes into a different
503     # slot to the old version, then the old version gets left behind
504     #
505     # if USE=-vhosts, then we want to remove the old version, because
506     # the user is relying on portage to do the magical thing for it
507    
508     if [ "$IS_UPGRADE" = "1" ] ; then
509     einfo "Removing old version $REMOVE_PKG"
510    
511 stuart 1.28 emerge -C "$REMOVE_PKG"
512 stuart 1.14 fi
513 stuart 1.18 else
514     # vhosts flag is on
515     #
516     # let's tell the administrator what to do next
517    
518     einfo
519     einfo "The 'vhosts' USE flag is switched ON"
520     einfo "This means that Portage will not automatically run webapp-config to"
521     einfo "complete the installation."
522     einfo
523     einfo "To install $PN-$PVR into a virtual host, run the following command:"
524     einfo
525     einfo " webapp-config -I -h <host> -d $PN $PN $PVR"
526     einfo
527     einfo "For more details, see the webapp-config(8) man page"
528 stuart 1.10 fi
529 stuart 1.11
530     return 0
531 stuart 1.2 }
532 stuart 1.18
533     function webapp_pkg_prerm ()
534     {
535     # remove any virtual installs that there are
536    
537     local my_output
538     local x
539    
540     my_output="`webapp-config --list-installs $PN $PVR`"
541    
542     if [ "$?" != "0" ]; then
543     return
544     fi
545    
546     # the changes to IFS here are necessary to ensure that we can cope
547     # with directories that contain spaces in the file names
548    
549     # OLD_IFS="$IFS"
550     # IFS=" "
551    
552     for x in $my_output ; do
553     # IFS="$OLD_IFS"
554    
555     [ -f $x/.webapp ] && . $x/.webapp || ewarn "Cannot find file $x/.webapp"
556    
557     if [ -z "WEB_HOSTNAME" -o -z "WEB_INSTALLDIR" ]; then
558     ewarn "Don't forget to use webapp-config to remove the copy of"
559     ewarn "${PN}-${PVR} installed in"
560     ewarn
561     ewarn " $x"
562     ewarn
563     else
564     # we have enough information to remove the virtual copy ourself
565    
566     webapp-config -C -h ${WEB_HOSTNAME} -d ${WEB_INSTALLDIR}
567    
568     # if the removal fails - we carry on anyway!
569     fi
570     # IFS=" "
571     done
572    
573     # IFS="$OLD_IFS"
574     }

  ViewVC Help
Powered by ViewVC 1.1.20