#!/bin/bash
#
LFA4ULSBIN=/usr/bin/lfa4uls
LFA4ULSCONFDIR=/etc/uls/lfa4uls.d
#
### BEGIN INIT INFO
# Provides:       lfa4uls
# Required-Start:
# Should-Start: $network nfs
# Required-Stop:
# Should-Stop: $network nfs
# Default-Start: 2 3 5
# Default-Stop:
# Description:    Startet den ULS-Logfileadapter
### END INIT INFO
#
#
if [[ ! -f "$2" ]]
 then
  if [[ ! -d "$LFA4ULSCONFDIR" ]]
   then
    echo "$LFA4ULSCONFDIR not found."
    exit 0
  elif [[ `ls $LFA4ULSCONFDIR/*.conf 2>/dev/null | wc -l` -eq 0 ]]
   then
    echo "No logfiles configured."
    exit 0
  fi
fi
#
#
start()
{ echo
  echo "Config File: $1"
  unset LFA4ULSCONF LFA4ULSPARAMS LFA4ULSUSER LFA4ULSLANG LFA4ULSPIDFILE DONTSTART
  if . "$1"
   then
    if [[ -n "$DONTSTART" ]]
     then
      echo " is marked as DONTSTART"
      return 0
    fi
    if [[ -z "$LFA4ULSCONF" ]]
     then
      C=""
    else
      C="-c $LFA4ULSCONF"
    fi
    if [[ -z "$LFA4ULSLANG" ]]
     then
      L=""
    else
      L="LANG=$LFA4ULSLANG"
    fi
    if [[ -z "$LFA4ULSPIDFILE" ]]
     then
      if [[ -z "$LFA4ULSUSER" ]]
       then
        LFA4ULSPIDFILE="/var/run/`echo $1 | sed 's|/|_|g'`.pid"
      else
        LFA4ULSPIDFILE="/var/tmp/lfa4ulspidfile`echo $1 | sed 's|/|_|g'`.pid"
      fi
    fi
    if [[ -f "$LFA4ULSPIDFILE" ]]
     then
       TPID=`cat "$LFA4ULSPIDFILE"`
       PID=`/bin/ps -ef | /usr/bin/awk '$2 == "'$TPID'"{print $2}'`
       if [[ ! -z "$PID" ]]
        then
         echo " already running"
         return 0
      fi
      rm "$LFA4ULSPIDFILE"
    fi
    if [[ -z "$LFA4ULSUSER" ]]
     then
      eval $L $LFA4ULSBIN -Dp "$LFA4ULSPIDFILE" $C $LFA4ULSPARAMS
    else
      su -c "$L $LFA4ULSBIN -Dp \"$LFA4ULSPIDFILE\" $C $LFA4ULSPARAMS" $LFA4ULSUSER
    fi
    echo " started"
  else
    echo " not started"
    return 1
  fi
}

stop()
{ echo
  echo "Config File: $1"
  unset LFA4ULSCONF LFA4ULSPARAMS LFA4ULSPIDFILE
  . "$1"
  if [[ -z "$LFA4ULSPIDFILE" ]]
   then
    if [[ -z "$LFA4ULSUSER" ]]
     then
      LFA4ULSPIDFILE="/var/run/`echo $1 | sed 's|/|_|g'`.pid"
    else
      LFA4ULSPIDFILE="/var/tmp/lfa4ulspidfile`echo $1 | sed 's|/|_|g'`.pid"
    fi
  fi
  if [[ -f "$LFA4ULSPIDFILE" ]]
   then
    TPID=$(<"$LFA4ULSPIDFILE")
    if [[ -d "/proc/$TPID" ]]
     then
      kill $TPID
      Z=0
      while pgrep -P $TPID >/dev/null
       do
        Z=$(($Z + 1))
        if [[ $Z -gt 10 ]]
         then
          pkill -P $TPID
          return 1
        fi
        sleep 1
      done
    fi
  else
    echo "Pidfile $LFA4ULSPIDFILE not found"
  fi
}

reload()
{ echo
  echo "Config File: $1"
  unset LFA4ULSCONF LFA4ULSPARAMS LFA4ULSPIDFILE DONTSTART
  . "$1"
  if [[ -n "$DONTSTART" ]]
   then
    echo " is marked as DONTSTART"
    return 0
  fi
  if [[ -z "$LFA4ULSPIDFILE" ]]
   then
    if [[ -z "$LFA4ULSUSER" ]]
     then
      LFA4ULSPIDFILE="/var/run/`echo $1 | sed 's|/|_|g'`.pid"
    else
      LFA4ULSPIDFILE="/var/tmp/lfa4ulspidfile`echo $1 | sed 's|/|_|g'`.pid"
    fi
  fi
  if [[ -f "$LFA4ULSPIDFILE" ]]
   then
    TPID=`cat "$LFA4ULSPIDFILE"`
    PID=`/bin/ps -ef | /usr/bin/awk '$2 == "'$TPID'"{print $2}'`
    if [[ ! -z "$PID" ]]
     then
      kill -HUP $PID
    fi
  else
    echo "Pidfile $LFA4ULSPIDFILE not found"
  fi
}

restart()
{ stop "$1"
  sleep 1
  start "$1"
}

status()
{ echo -n "Config File: $1  "
  unset LFA4ULSCONF LFA4ULSPARAMS LFA4ULSPIDFILE DONTSTART
  . "$1"
  if [[ -n "$DONTSTART" ]]
   then
    echo " is marked as DONTSTART"
    return 0
  fi
  if [[ -z "$LFA4ULSPIDFILE" ]]
   then
    if [[ -z "$LFA4ULSUSER" ]]
     then
      LFA4ULSPIDFILE="/var/run/`echo $1 | sed 's|/|_|g'`.pid"
    else
      LFA4ULSPIDFILE="/var/tmp/lfa4ulspidfile`echo $1 | sed 's|/|_|g'`.pid"
    fi
  fi
  if [[ -f "$LFA4ULSPIDFILE" ]]
   then
    TPID=`cat "$LFA4ULSPIDFILE"`
    PID=`/bin/ps -ef | /usr/bin/awk '$2 == "'$TPID'"{print $2}'`
    if [[ ! -z "$PID" ]]
     then
      echo " running"
      return 0
    else
      echo " dead"
    fi
  else
    echo "Pidfile $LFA4ULSPIDFILE not found"
  fi
  return 1
}

case "$1" in
  start)
        if [[ -z "$2" ]]
         then
          echo "lfa4uls: ..."
          for i in `ls $LFA4ULSCONFDIR/*.conf`
           do
            start "$i"
          done
        else
          if [[ -f "$2" ]]
           then
            start "$2"
          elif [[ -f "$LFA4ULSCONFDIR/$2.conf" ]]
           then
            start "$LFA4ULSCONFDIR/$2.conf"
          else
            echo "Configfile $2 not found."
          fi
        fi
        ;;
  stop)
        if [[ -z "$2" ]]
         then
          echo "lfa4uls: ..."
          for i in `ls $LFA4ULSCONFDIR/*.conf`
           do
            stop "$i"
          done
          echo stopped
          echo "Calling flush_test_values..."
          /usr/bin/flush_test_values -S
        else
          if [[ -f "$2" ]]
           then
            stop "$2"
          elif [[ -f "$LFA4ULSCONFDIR/$2.conf" ]]
           then
            stop "$LFA4ULSCONFDIR/$2.conf"
          else
            echo "Configfile $2 not found."
          fi
        fi
        ;;
  restart)
        if [[ -z "$2" ]]
         then
          echo "lfa4uls: ..."
          for i in `ls $LFA4ULSCONFDIR/*.conf`
           do
            restart "$i"
          done
        else
          if [[ -f "$2" ]]
           then
            restart "$2"
          elif [[ -f "$LFA4ULSCONFDIR/$2.conf" ]]
           then
            restart "$LFA4ULSCONFDIR/$2.conf"
          else
            echo "Configfile $2 not found."
          fi
        fi
	;;
  reload)
        if [[ -z "$2" ]]
         then
          echo "lfa4uls: ..."
          for i in `ls $LFA4ULSCONFDIR/*.conf`
           do
            reload "$i"
          done
          echo reloaded
        else
          if [[ -f "$2" ]]
           then
            reload "$2"
          elif [[ -f "$LFA4ULSCONFDIR/$2.conf" ]]
           then
            reload "$LFA4ULSCONFDIR/$2.conf"
          else
            echo "Configfile $2 not found."
          fi
        fi
	;;
  status)
	rc_status=0
        if [[ -z "$2" ]]
         then
          for i in `ls $LFA4ULSCONFDIR/*.conf`
           do
            status "$i"
	    RET=$?
	    if [[ $RET -gt 0 ]]
	     then
	      rc_status=$RET
            fi
          done
        else
          if [[ -f "$2" ]]
           then
            status "$2"
	    RET=$?
	    if [[ $RET -gt 0 ]]
	     then
	      rc_status=$RET
            fi
          elif [[ -f "$LFA4ULSCONFDIR/$2.conf" ]]
           then
            status "$LFA4ULSCONFDIR/$2.conf"
	    RET=$?
	    if [[ $RET -gt 0 ]]
	     then
	      rc_status=$RET
            fi
          else
            echo "Configfile $2 not found."
            exit 3
          fi
        fi
	exit $rc_status
        ;;
   *)
        echo "Usage: $0 start | stop | restart | status"
        exit 1
        ;;
esac
