## 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