#!/bin/sh

## This is a utility script to simplify the use of openHAB
## Intended to be used with a packaged install (.deb/.rpm)
## License information available at /usr/share/openhab/LICENSE.txt by default
echo ""
usage() {
 echo "Usage:  openhab-cli command [options]"
 echo ""
 echo "Possible commands:"
 echo "  backup [--full] [filename]   -- Stores the current configuration of openHAB."
 echo "  clean-cache                  -- Cleans the openHAB temporary folders."
 echo "  console                      -- Opens the openHAB console."
 echo "  info                         -- Displays distribution information."
 echo "  reset-ownership              -- Gives openHAB control of its own directories."
 echo "  restore [--textconfig] [--uiconfig] filename"
 echo "                               -- Restores openHAB configuration from a backup."
 echo "  showlogs                     -- Displays the log messages of openHAB."
 echo "  start [--debug]              -- Starts openHAB in the terminal."
 echo "  status                       -- Checks to see if openHAB is running."
 echo "  stop                         -- Stops any running instance of openHAB."
 echo ""
 exit 2
}

# Script requires options, list them if none given
if [ "$#" -eq "0" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
 usage
fi

# Some functions require root
checkRoot() {
 if [ "$(id -u)" -ne 0 ]; then
   optionName="$1"
   echo ""
   echo "This option needs to run as root! (e.g. use 'sudo openhab-cli $optionName')" >&2
   echo ""
   exit 1
 fi
}

# For testing if override functions exist
isFunction() {
 command -V "$1" 2>/dev/null | grep -qwi function
}

checkRunning() {
 if [ ! -z "$(pgrep -f "openhab.*java")" ]; then
   echo "openHAB is running! Please stop the process before continuing." >&2
   echo ""
   exit 1
 fi
}

confirmAction() {
 printf "\nOkay to Continue? [y/N]: "
 read -r answer
 case "$answer" in
 [Yy]*)
   ;;
 *)
   echo "Cancelling..."
   echo ""
   exit 0
   ;;
 esac
}

# Load the default directory paths and any possible custom ones set
if [ -r /etc/profile.d/openhab.sh ]; then
 . /etc/profile.d/openhab.sh
elif [ -r /etc/default/openhab ]; then
 . /etc/default/openhab
fi

# Load the override scripts to replace full commands
if [ -r /etc/openhab-cli/command-overrides.sh ]; then
 . /etc/openhab-cli/command-overrides.sh
fi

option="$1"
shift

# Select between options
case "$option" in

 "backup")
   # Run the pre-made backup script
   "$OPENHAB_RUNTIME/bin/backup" "$@"
   ;;

 "clean-cache")
   echo "This command will delete the temporary files within openHAB."
   echo "May resolve issues with addon installation and configuration."
   checkRoot "$option"
   checkRunning
   echo "The next start of openHAB will take a bit longer."
   confirmAction
   rm -rf "${OPENHAB_USERDATA:?}"/tmp
   rm -rf "${OPENHAB_USERDATA:?}"/cache
   rm -rf "${OPENHAB_USERDATA:?}"/marketplace
   ;;

 "console"|"client")
   # Check if override function exists
   if isFunction console_override; then
     console_override
   else
     "$OPENHAB_RUNTIME/bin/client" "$@"
   fi
   ;;

 "info")
   openHABVersion="$(awk '/openhab-distro/{print $3}' "$OPENHAB_USERDATA/etc/version.properties")"
   if test "${openHABVersion#*SNAPSHOT}" != "SNAPSHOT"; then
     buildNumber="($(awk '/build-no/{print $4}' "$OPENHAB_USERDATA/etc/version.properties"))"
   fi
   pid="$(pgrep -f "openhab.*java")"
   if [ -n "$pid" ]; then
     uid=$(awk '/^Uid:/{print $2}' "/proc/$pid/status")
     openHABUser="$(getent passwd "$uid" | awk -F: '{print $1}')"
     userStatus="(Active Process $pid)"
   elif [ -n "$OPENHAB_USER" ]; then
     openHABUser="$OPENHAB_USER"
     userStatus="(Environment Variable Set)"
   else
     openHABUser="$(ls -ld "$OPENHAB_HOME" | awk '{print $3}')"
     userStatus="(Owner of home directory)"
   fi
   groupsList="$(id -Gn "$openHABUser")"
   localIP="$(hostname -I | awk '{print $1}')"
   printf "%-12s %s %s\\n\\n" "Version:" "$openHABVersion" "$buildNumber"
   printf "%-12s %s %s\\n" "User:" "$openHABUser" "$userStatus"
   printf "%-12s %s\\n\\n" "User Groups:" "$groupsList"
   printf "%-12s %-16s | %-27s | %s\\n" "Directories:" "Folder Name" "Path" "User:Group"
   printf "%-12s %-16s | %-27s | %s\\n" " " "-----------" "----" "----------"
   for folderName in "OPENHAB_HOME" "OPENHAB_RUNTIME" "OPENHAB_USERDATA" "OPENHAB_CONF" "OPENHAB_LOGDIR" "OPENHAB_BACKUPS"
   do
     folderPath=$(printenv $folderName)
     if [ -d "$folderPath" ]; then
       folderUserGroup=$(ls -ld "$folderPath" | awk '{print $3 ":" $4}')
       printf "%-12s %-16s | %-27s | %s\\n" " " "$folderName" "$folderPath" "$folderUserGroup"
     fi
   done
   printf "\\n"
   printf "%-12s %s\\n" "URLs:" "http://$localIP:$OPENHAB_HTTP_PORT"
   printf  "%-12s %s\\n\\n" "" "https://$localIP:$OPENHAB_HTTPS_PORT"
   ;;

 "reset-ownership")
   # Check to see if an override function exists
   if isFunction reset-ownership_override; then
     reset-ownership_override
   else
     echo "This command gives openHAB control of its own directories."
     echo "May resolve permission errors during startup or configuration."
     checkRoot "$option"
     echo "openHAB directories will be owned by openhab:openhab"
     confirmAction
     # Recursively change each directory
     chown -R openhab:openhab "${OPENHAB_HOME:?}" "${OPENHAB_USERDATA:?}" "${OPENHAB_CONF:?}" "${OPENHAB_LOGDIR:?}"
   fi
   ;;


 "restart"|"start"|"status"|"stop")
   # Deamon scripts already exist, encourage the user to use them.
   if [ "$option" = "status" ];then
     optionVerb="find the status of"
   else
     optionVerb="$option"
   fi

   # Find the appropriate daemon tool
   if [ -x "/bin/systemctl" ] && [ -f "/usr/lib/systemd/system/openhab.service" ]; then
     echo "A systemd service configuration exists..."
     echo "Use 'sudo /bin/systemctl $option openhab.service' to $optionVerb an openHAB service"
     exit 1
   elif [ -x "/etc/init.d/openhab" ]; then
     echo "An init.d script exists..."
     if [ -x "$(which invoke-rc.d 2>/dev/null)" ]; then
       echo "Use 'sudo invoke-rc.d openhab $option' to $optionVerb an openHAB service."
     else
       echo "Use 'sudo /etc/init.d/openhab $option' to $optionVerb an openHAB service."
     fi
     exit 1
   fi

   # Then, do as asked with the 'manual' openHAB scripts...
   if [ "$option" = "start" ]; then
     checkRoot "$option"
     echo "Launching an instance in this terminal.."
     if [ "$1" = "--debug" ] || [ "$1" = "-d" ]; then
       "$OPENHAB_HOME/start_debug.sh"
     else
       "$OPENHAB_HOME/start.sh"
     fi

   # Karaf script will stop an instance or warn the user if nothing is running.
   elif [ "$option" = "stop" ]; then
     checkRoot "$option"
     echo "Stopping any instance of openHAB..."
     "$OPENHAB_RUNTIME/bin/stop"

   # If openHAB is running, echo the PID.
   elif [ "$option" = "status" ]; then
     existingPID="$(pgrep -f "openhab.*java")"
     if [ -z "$existingPID" ]; then
       echo "openHAB is not running."
     else
       existingTime="$(ps -o etime= -p "$existingPID")"
       echo "openHAB is running with PID: $existingPID and has been running for $existingTime"
     fi
   fi
   ;;

 "restore")
   # Run some basic checks before running the restore script
   checkRoot "$option"
   bText="0"
   bUI="0"
   args="$@"
   while [ "$1" != "" ]; do
     case $1 in
       -h | --help)
         usage
         exit 0
         ;;
       --textconfig)
         bText="1"
         ;;
       --uiconfig)
         bUI="1"
         ;;
       *)
         filename="$1"
         ;;
     esac
     shift
   done
   # no need to stop OH if only --textconfig
   if [ "$bText" = "0" -a "$bUI" = "0" -o "$bUI" = "1" ]; then
     checkRunning
   fi
   # The restore script asks the user to confirm so no need to do it here.
   if [ -f "$filename" ]; then
     echo "Started $OPENHAB_RUNTIME/bin/restore $args"
     "$OPENHAB_RUNTIME/bin/restore" $args
   else
     echo "Restore needs a valid backup file to continue."
     echo "  e.g. 'sudo openhab-cli restore backup.zip'"
   fi
   ;;

 "showlogs"|"logs")
   # Check if an override function exists
   if isFunction showlogs_override; then
     showlogs_override
   else
     # Tail all log files in the openHAB log directory
     tail -f "${OPENHAB_LOGDIR:?}"/*.log
   fi
   ;;

 *)
   # Default to showing available commands
   echo "Unrecognised command: $option"
   usage
   ;;
esac