123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- #!/bin/bash
- #
- # install: Installation script
- #
- # Copyright (c) Embedthis Software LLC, 2003-2014. All Rights Reserved.
- #
- # Usage: install [configFile]
- #
- ################################################################################
- #
- # The configFile is of the format:
- # FMT=[rpm|deb|tar] # Package format to use
- # installbin=[YN] # Install binary package
- # runDaemon=[YN] # Run the program as a daemon
- # httpPort=portNumber # Http port to listen on
- # sslPort=portNumber # SSL port to listen on
- # username=username # User account for goahead
- # groupname=groupname # Group account for goahead
- # hostname=groupname # Serving host
- #
- HOME=`pwd`
- FMT=
- SITE=localhost
- PAGE=/index.html
- HOSTNAME=`hostname`
- COMPANY="${settings.company}"
- PRODUCT="${settings.name}"
- NAME="${settings.title}"
- VERSION="${settings.version}"
- OS="${platform.os}"
- CPU="${platform.arch}"
- DIST="${platform.dist}"
- ROOT_PREFIX="${prefixes.root}"
- BASE_PREFIX="${prefixes.base}"
- STATE_PREFIX="${prefixes.state}"
- APP_PREFIX="${prefixes.app}"
- VAPP_PREFIX="${prefixes.vapp}"
- BIN_PREFIX="${prefixes.bin}"
- SBIN_PREFIX="${prefixes.sbin}"
- ETC_PREFIX="${prefixes.etc}"
- INC_PREFIX="${prefixes.inc}"
- LIB_PREFIX="${prefixes.lib}"
- MAN_PREFIX="${prefixes.man}"
- WEB_PREFIX="${prefixes.web}"
- ABIN="${VAPP_PREFIX}/bin"
- AINC="${VAPP_PREFIX}/in"
- installbin=Y
- runDaemon=Y
- headless=${HEADLESS:-0}
- HTTP_PORT=80
- SSL_PORT=443
- PATH="$PATH:/sbin:/usr/sbin"
- unset CDPATH
- export CYGWIN=nodosfilewarning
- CYGWIN=nodosfilewarning
- ###############################################################################
- setup() {
- umask 022
- if [ $OS != windows -a `id -u` != "0" ] ; then
- echo "You must be root to install this product."
- exit 255
- fi
- #
- # Headless install
- #
- if [ $# -ge 1 ] ; then
- if [ ! -f $1 ] ; then
- echo "Could not find installation config file \"$1\"." 1>&2
- exit 255
- else
- . $1
- installFiles $FMT
-
- if [ "$installbin" = "Y" ] ; then
- appman stop disable uninstall >/dev/null 2>&1
- patchConfiguration
- appman install
- if [ "$runDaemon" = "Y" ] ; then
- appman enable start
- fi
- fi
- fi
- exit 0
- fi
- sleuthPackageFormat
- getAccountDetails
- [ "$headless" != 1 ] && echo -e "\n$NAME ${VERSION} Installation\n"
- }
- getAccountDetails() {
- local g u
- #
- # Select default username
- #
- for u in www-data _www nobody Administrator
- do
- grep "$u" /etc/passwd >/dev/null
- if [ $? = 0 ] ; then
- username=$u
- break
- fi
- done
- if [ "$username" = "" ] ; then
- echo "Can't find a suitable username in /etc/passwd for $PRODUCT" 1>&2
- exit 255
- fi
-
- #
- # Select default group name
- #
- for g in www-data _www nogroup nobody Administrators
- do
- grep "$g" /etc/group >/dev/null
- if [ $? = 0 ] ; then
- groupname=$g
- break
- fi
- done
- if [ "$groupname" = "" ] ; then
- echo "Can't find a suitable group in /etc/group for $PRODUCT" 1>&2
- exit 255
- fi
- }
- sleuthPackageFormat() {
- local name
- FMT=
- name=`createPackageName ${PRODUCT}-bin`
- if [ -x contents ] ; then
- FMT=tar
- else
- for f in deb rpm tgz ; do
- if [ -f ${name}.${f} ] ; then
- FMT=${f%.gz}
- break
- fi
- done
- fi
- if [ "$FMT" = "" ] ; then
- echo -e "\nYou may be be missing a necessary package file. "
- echo "Check that you have the correct $NAME package".
- exit 255
- fi
- }
- askUser() {
- local finished
- [ "$headless" != 1 ] && echo "Enter requested information or press <ENTER> to accept the default. "
- #
- # Confirm the configuration
- #
- finished=N
- while [ "$finished" = "N" ]
- do
- [ "$headless" != 1 ] && echo
- installbin=`yesno "Install binary package" "$installbin"`
- if [ "$installbin" = "Y" ] ; then
- runDaemon=`yesno "Start $PRODUCT automatically at system boot" $runDaemon`
- HTTP_PORT=`ask "Enter the HTTP port number" "$HTTP_PORT"`
- # SSL_PORT=`ask "Enter the SSL port number" "$SSL_PORT"`
- username=`ask "Enter the user account for $PRODUCT" "$username"`
- groupname=`ask "Enter the user group for $PRODUCT" "$groupname"`
- else
- runDaemon=N
- fi
-
- if [ "$headless" != 1 ] ; then
- echo -e "\nInstalling with this configuration:"
- echo -e " Install binary package: $installbin"
-
- if [ "$installbin" = "Y" ] ; then
- echo -e " Start automatically at system boot: $runDaemon"
- echo -e " HTTP port number: $HTTP_PORT"
- # echo -e " SSL port number: $SSL_PORT"
- echo -e " Username: $username"
- echo -e " Groupname: $groupname"
- fi
- echo
- fi
- finished=`yesno "Accept this configuration" "Y"`
- done
- [ "$headless" != 1 ] && echo
-
- if [ "$installbin" = "N" ] ; then
- echo -e "Nothing to install, exiting. "
- exit 0
- fi
- }
- createPackageName() {
- echo ${1}-${VERSION}-${DIST}-${OS}-${CPU}
- }
- #
- # Get a yes/no answer from the user. Usage: ans=`yesno "prompt" "default"`
- # Echos 1 for Y or 0 for N
- #
- yesno() {
- local ans
- if [ "$headless" = 1 ] ; then
- echo "Y"
- return
- fi
- echo -n "$1 [$2] : " 1>&2
- while [ 1 ]
- do
- read ans
- if [ "$ans" = "" ] ; then
- echo $2 ; break
- elif [ "$ans" = "Y" -o "$ans" = "y" ] ; then
- echo "Y" ; break
- elif [ "$ans" = "N" -o "$ans" = "n" ] ; then
- echo "N" ; break
- fi
- echo -e "\nMust enter a 'y' or 'n'\n " 1>&1
- done
- }
- #
- # Get input from the user. Usage: ans=`ask "prompt" "default"`
- # Returns the answer or default if <ENTER> is pressed
- #
- ask() {
- local ans
- default=$2
- if [ "$headless" = 1 ] ; then
- echo "$default"
- return
- fi
- echo -n "$1 [$default] : " 1>&2
- read ans
- if [ "$ans" = "" ] ; then
- echo $default
- fi
- echo $ans
- }
- removeOld() {
- if [ -x /usr/lib/goahead/bin/uninstall ] ; then
- goahead_HEADLESS=1 /usr/lib/goahead/bin/uninstall </dev/null 2>&1 >/dev/null
- fi
- }
- installFiles() {
- local dir pkg doins NAME upper target
- [ "$headless" != 1 ] && echo -e "\nExtracting files ...\n"
- for pkg in bin ; do
- doins=`eval echo \\$install${pkg}`
- if [ "$doins" = Y ] ; then
- upper=`echo $pkg | tr '[:lower:]' '[:upper:]'`
- suffix="-${pkg}"
- NAME=`createPackageName ${PRODUCT}${suffix}`.$FMT
- if [ "$runDaemon" != "Y" ] ; then
- export APPWEB_DONT_START=1
- fi
- if [ "$FMT" = "rpm" ] ; then
- [ "$headless" != 1 ] && echo -e "rpm -Uhv $NAME"
- rpm -Uhv $HOME/$NAME
- elif [ "$FMT" = "deb" ] ; then
- [ "$headless" != 1 ] && echo -e "dpkg -i $NAME"
- dpkg -i $HOME/$NAME >/dev/null
- elif [ "$FMT" = "tar" ] ; then
- target=/
- [ $OS = windows ] && target=`cygpath ${HOMEDRIVE}/`
- (cd contents ; tar cf - . | (cd $target && tar xBf -))
- fi
- fi
- done
- if [ -f /etc/redhat-release -a -x /usr/bin/chcon ] ; then
- if sestatus | grep enabled >/dev/nulll ; then
- for f in $ABIN/*.so ; do
- chcon /usr/bin/chcon -t texrel_shlib_t $f 2>&1 >/dev/null
- done
- fi
- fi
- [ "$headless" != 1 ] && echo -e "\nSetting file permissions ..."
- if [ $OS = windows ] ; then
- # Cygwin bug. Chmod fails to stick if not in current directory for paths with spaces
- home=`pwd` >/dev/null
- cd "$ETC_PREFIX" ; chmod -R g+r,o+r . ; find . -type d -exec chmod 755 "{}" \;
- cd "$APP_PREFIX" ; chmod -R g+r,o+r . ; find . -type d -exec chmod 755 "{}" \;
- cd "$WEB_PREFIX" ; chmod -R g+r,o+r . ; find . -type d -exec chmod 755 "{}" \;
- cd "$ABIN" ; chmod 755 *.dll *.exe
- cd "$ETC_PREFIX" ; chmod 777 . ; chown $username .
- cd "${home}" >/dev/null
- fi
- [ "$headless" != 1 ] && echo
- }
- patchConfiguration() {
- :
- }
- #
- # Not currently used
- #
- startBrowser() {
- if [ "$headless" = 1 ] ; then
- return
- fi
- #
- # Conservative delay to allow goahead to start and initialize
- #
- sleep 5
- [ "$headless" != 1 ] && echo -e "Starting browser to view the $NAME Home Page."
- if [ $OS = windows ] ; then
- cygstart --shownormal http://$SITE:$HTTP_PORT$PAGE
- elif [ $OS = macosx ] ; then
- open http://$SITE:$HTTP_PORT$PAGE >/dev/null 2>&1 &
- else
- for f in /usr/bin/htmlview /usr/bin/firefox /usr/bin/mozilla /usr/bin/konqueror
- do
- if [ -x ${f} ] ; then
- sudo -H -b ${f} http://$SITE:$HTTP_PORT$PAGE >/dev/null 2>&1 &
- break
- fi
- done
- fi
- }
- #
- # Main program for install script
- #
- setup $*
- askUser
- if [ "$installbin" = "Y" ] ; then
- [ "$headless" != 1 ] && echo "Disable existing service"
- appman stop disable uninstall >/dev/null 2>&1
- if [ $OS = windows ] ; then
- "$ABIN/goaheadMonitor" --stop >/dev/null 2>&1
- fi
- fi
- removeOld
- installFiles $FMT
- if [ "$installbin" = "Y" ] ; then
- "$ABIN/appman" stop disable uninstall >/dev/null 2>&1
- patchConfiguration
- "$ABIN/appman" install
- if [ "$runDaemon" = "Y" ] ; then
- "$ABIN/appman" enable
- "$ABIN/appman" start
- fi
- fi
- if [ $OS = windows ] ; then
- "$ABIN/goaheadMonitor" >/dev/null 2>&1 &
- fi
- if [ "$headless" != 1 ] ; then
- echo -e "$NAME installation successful."
- fi
- exit 0
|