OFBiz/Opentaps service wrapper/startup script.

I was recently tasked with putting together a service wrapper for opentaps, unfortunately the official service wrapper and third party solutions are quite basic and generally just execute startofbiz.sh without anyway to legitimately determine whether the service is correctly running and responding to web requests. Executing the startofbiz.sh shell script simply reports “starting ofbiz”, it’s up to you from that point to determine whether or not the start succeeded, I wanted something more robust than this. This company in particular generates significant income on their website and heavily utilizes opentaps, some of the users executing this script would be junior level administrators therefore it was import for this script to take a lot of the guess work on what opentaps/ofbiz is doing during the start/stop phase.

The Script
Note: There are two versions of this script (I’ll be posting the other soon), one wraps around the existing stop/start scripts for opentaps/ofbiz. The other completely replaces it. Both achieve the same result.

Details: We essentially use CURL to determine whether the service is running, CURL will make a header request, if the header request delivers the desired results, it’s online and responding. Else, it’s offline. Depending on your server performance you may need to adjust the connect-timeout, but in virtually every case the default (2) should suffice.

Features:

  • debugging (optional): Features a simple ‘debug’ mode that after start, opens the console.log in more.
  • cache clear (optional): Allows the script to drop the Linux memory cache after stopping opentaps/ofbiz.
  • runuser: Allows you to run the service as any user (including root, however not recommended).
  • chkconfig: chkconfig-able (CentOS/RHEL) easily add service to start-up services. (i.e: chkconfig otaps on)
  • emailing (on): On failure or error, the script will send an e-mail with information regarding the failure.
  • error handling: Has built in error handling for most functions, will add to this shortly with traps.
  • configurable: Script can easily be edited, most values are definable.
  • distribution independent: Designed to work on any Linux distribution (tested on: CentOS/RHEL/Debian).

Functions:

  1. stats: The ‘stats’ option reports some information regarding a running opentaps/ofbiz instance. (active connections, memory usage, cpu use, runtime)
  2. start: Starts opentaps/ofbiz, utilizes curl to determine when the application is fully operational.
  3. stop: Stops opentaps/ofbiz utilizes curl to determine when the application is offline.
  4. status: Reports whether opentaps/ofbiz is running and reports the pid.
  5. restart: Simply calls the stop and start functions, allows for proper restarting.

Installation

(Assumes you’re using RHEL/CentOS)

  1. Copy the code listed below.  Or download script: otaps.sh
  2. Change into /etc/init.d (cd /etc/init.d)
  3. Open up new file in nano/vi  (nano otaps.sh)
  4. Paste all code, then save file.
  5. Edit the configurable options at the top of the script.
  6. Make file executable (chmod ug+x test.sh)
  7. Ensure it’s working properly (service otaps) should report the script usage.
  8. To enable startup/shutdown for current runlevel:  chkconfig otaps on
  9. Test & Enjoy (please report bugs/suggestions if any)
#!/bin/sh
# chkconfig: - 95 20
# description: Open Taps / OFbiz service wrapper/control script.
# Tested on:  CentOS/RHEL/Fedora
# Author:  Russ Thompson @ viGeek.net
# Objective:  Method to bring up opentaps/ofbiz instance and ensure it's fully operational via curl.

# Functions
# start - starts opentaps/ofbiz
# stop - stops opentaps/ofbiz
# restart - restarts opentaps.
# status - gets opentaps/ofbiz run status.  Aslo reports connections.
# stats - Gets number of active connections, memory usage, CPU usage, runtime etc.

# Source function library
. /etc/rc.d/init.d/functions

# Define runuser (root not recommended).  Ensure open taps/ofbiz path chowned to this user.
RUSER="svc-user"

# Set pidfile (not used in this version)
PFILE="/var/run/otaps.pid"

# OpenTaps/OFBiz installation path.
OPATH="/usr/local/opentaps"

# E-mail parameters (we e-mail on errors, failed starts etc)
EADDY="rthompson@reddit.com"
ESUB="$(hostname -s) E-mail subject message"
EFILE="tmpfile.txt"

# Host IP Address & PORT (We use this to curl to ensure instance is fully started).  Must be seperated by colon.
HIPP="69.178.69.69:8080"

# Define JAVA path (not needed if variables are exported for user).
export PATH=/opt/jdk1.6.0/bin:$PATH
export JAVA_HOME="/opt/jdk1.6.0/"
JAVA=$JAVA_HOME/bin/java

# Counter (Must be 0)
COUNTER="0"

# DEBUG (simply opens console.log after start, uses more)
DEBUG="0"

# Drop Linux memory cache after stop? May help with application performance after multiple restarts.
# Not recommended in shared environments, use at your own risk, test first.
DCACHE="0"

mail_send () {
/bin/mail -s "$ESUB" "$EADDY" < $EFILE
rm -f $EFILE
}

start() {
 if [[ -z "$(curl --connect-timeout 2 -m 1 --silent -f -I http://$HIPP | grep Apache-Coyote)" ]] ; then
# Opentaps/OFBiz is not running.  Let's bring it up.
        cd $OPATH ; if [ ! $PWD == $OPATH ] ; then echo -e "Failed to change directories on line $LINENO" | tee -a $EFILE ; mail_send ; exit 1 ; fi
        echo -e "\033[1mOpentaps/OFBiz service is currently down, bringing online...\033[0m"
        runuser -m $RUSER ./startofbiz.sh >> /dev/null
          while [[ -z "$(curl --connect-timeout 2 -m 1 --silent -f -I http://$HIPP | grep Apache-Coyote)" ]] ; do
          sleep 2
          let COUNTER+=1
             if [ $COUNTER == 30 ] ;then
                 # It has taken one minute to bring up, suspect failure, send e-mail.
                 echo -e "$(hostname) OFBiz/Opentaps failed to start in 60 seconds" | tee -a $EFILE
                 mail_send
                 exit 1
             fi
    echo -e "caught $COUNTER" >> test1.txt
          echo -n "."
          done
          echo -e "\033[0;32mOK\033[0m"
      if [ $DEBUG -eq "1" ] ; then cat /usr/local/opentaps/runtime/logs/console.log | more ; fi
 else
 echo -e "\033[1mOpentaps/OFBiz is already running....\033[0m"
 fi
}

stop() {
 if [[ -n "$(curl --connect-timeout 2 -m 1 --silent -f -I http://$HIPP | grep Apache-Coyote)" ]] ; then
    # Opentaps/OFBiz is running.... Let's stop it...
        cd $OPATH ; if [ ! $PWD == $OPATH ] ; then echo -e "Failed to change directories on line $LINENO" | tee -a $EFILE ; mail_send ; exit 1 ; fi
        echo -e "\033[1mOpentaps/OFBiz service is currently online, taking offline...\033[0m"
        runuser -m $RUSER ./stopofbiz.sh >> /dev/null
          while [[ -n "$(curl --connect-timeout 2 -m 1 --silent -f -I http://$HIPP | grep Apache-Coyote)" ]] ; do
            echo -n "."
            sleep 2
            let COUNTER+=1
               if [ $COUNTER == 30 ] ;then
              # It has taken one minute to bring up, suspect failure, send e-mail.
                   echo -e "$(hostname) OFBiz/Opentaps failed to stop in 60 seconds" | tee -a $EFILE
                   mail_send
                   exit 1
                  fi
          done
          echo -e "Result:  \033[0;32mOK\033[0m"
      if [ $DCACHE -eq "1" ] ; then sync; echo 3 > /proc/sys/vm/drop_caches | more ; fi
 else
   echo -e "\033[1mOpentaps/OFBiz is already stopped, please start....\033[0m"
 fi
}

ostatus() {
  STAT=$(ps -ef |grep "ofbiz.jar" | grep -v "grep" | awk '{ print $2}')
  if [[ -n $STAT ]] ; then
    echo -e "\033[1mOFBiz/Opentaps is running with pid:\033[0m \033[0;32m $STAT \033[0m"
    echo -e "\033[1mCurrent connection total:\033[0m" $(netstat -an |grep $(echo '$HIPP' | cut -d ":" -f2) | wc -l)
  else
    echo -e "\033[4;31mOFBiz/Opentaps service is OFFLINE\033[0m"
  fi
}

ostats() {
  STAT=$(ps -ef |grep "ofbiz.jar" | grep -v "grep" | awk '{ print $2}')
  if [[ -n $STAT ]] ; then
    echo -e "\033[1mOFBiz/Putting together open taps report for pid:\033[0m \033[0;32m $STAT \033[0m"
    echo -e "\033[1mCurrent connection total:\033[0m $(netstat -an |grep $(echo '$HIPP' | cut -d ":" -f2) | wc -l)"
    echo -e "\033[1mTotal process $STAT memory usage:\033[0m $(ps aux | grep $STAT | grep -v "grep" | awk '{ s += $6 } END { print s/1024, "Mb"}')"
    echo -e "\033[1mCurrent CPU utilization (percent):\033[0m  $(ps -eo %mem,cmd|sort -k2 -r | grep ofbiz | cut -d " " -f1)"
    echo -e "\033[1mThe process started on:\033[0m $(ls -ld /proc/$STAT | awk '{print $6,$7,$8}')"
  else
    echo -e "\033[4;31mOFBiz/Opentaps service is OFFLINE\033[0m"
  fi
}


case $1 in

start)
  start
;;
stop)
  stop
;;
restart)
  stop
  start
;;
status)
  ostatus
;;
stats)
  ostats
;;
  *)
    echo $"Usage: $0 {start|stop|restart|status|stats}"
    exit 1

# Cleanup
esac
exit 0

Leave a Reply

What is 9 + 12 ?
Please leave these two fields as-is:
IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)