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

Contents of /eclass/webapp.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.28 - (hide annotations) (download)
Sat Jul 17 15:21:01 2004 UTC (10 years, 2 months ago) by stuart
Branch: MAIN
Changes since 1.27: +2 -2 lines
Temporary workaround for portage CATEGORY bug

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

  ViewVC Help
Powered by ViewVC 1.1.20