V5 Omada Controller Linux - improved launch script
When installing on Debian I found the jsvc and openjdk library paths are broken. There are some workarounds but it's a bit of a hack. On some other distros the jsvc package isn't available at all.
Honestly, I'm not really sure why there is a need for this - in my testing i found that java responds gracefully to a standard pkill and closes down the controller without any fuss.
To that end, here's a modified version of control.sh that manages the service without the need for the jsvc package, plus a few other tweaks to make it a little more friendly
#!/bin/bash
#
# startup script for TP-Link's EAP Controller.
#
### BEGIN INIT INFO
# Provides: omada
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Omada Controller
# Description: TP-Link's Omada Controller.
### END INIT INFO
NAME="omada"
DESC="Omada Controller"
OMADA_HOME=$(dirname $(dirname $(readlink -f $0)))
LOG_DIR="${OMADA_HOME}/logs"
WORK_DIR="${OMADA_HOME}/work"
DATA_DIR="${OMADA_HOME}/data"
PROPERTY_DIR="${OMADA_HOME}/properties"
AUTOBACKUP_DIR="${DATA_DIR}/autobackup"
JRE_HOME="$( readlink -f "$( which java )" | sed "s:bin/.*$::" )"
JAVA_TOOL="${JRE_HOME}/bin/java"
JAVA_OPTS="-server -Xms128m -Xmx1024m -XX:MaxHeapFreeRatio=60 -XX:MinHeapFreeRatio=30 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_DIR}/java_heapdump.hprof -cp ${OMADA_HOME}/lib/*:${OMADA_HOME}/properties"
MAIN_CLASS="com.tplink.smb.omada.starter.OmadaLinuxMain"
OMADA_USER=${OMADA_USER:-root}
OMADA_GROUP=$(id -gn ${OMADA_USER})
PID_FILE="/var/run/${NAME}.pid"
MY_IP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')
[ -z $MY_IP ] && MY_IP=127.0.0.1
cd ${OMADA_HOME}/bin
help() {
echo "usage: $0 help"
echo " $0 (start|stop|status)"
cat <<EOF
help - this screen
start - start the service(s)
stop - stop the service(s)
status - show the status of the service(s)
EOF
}
# root permission check
check_root_perms() {
[ $(id -ru) != 0 ] && { echo "You must be root to execute this script. Exit." 1>&2; exit 1; }
}
# check if ${OMADA_USER} has the permission to ${DATA_DIR} ${LOG_DIR} ${WORK_DIR}
check_omada_user() {
OMADA_UID=$(id -u ${OMADA_USER})
[ 0 != $? ] && {
echo "Failed to start ${DESC}. Please create user ${OMADA_USER} user"
exit 1
}
if [ ${OMADA_UID} -ne $(stat ${DATA_DIR} -Lc %u) ]; then
echo "Failed to start ${DESC}. Please chown -R ${OMADA_USER} ${DATA_DIR} ${LOG_DIR} ${WORK_DIR}"
exit 1
fi
[ -e "${LOG_DIR}" ] && [ ${OMADA_UID} -ne $(stat ${LOG_DIR} -Lc %u) ] && {
echo "Failed to start ${DESC}. Please chown -R ${OMADA_USER} ${LOG_DIR}"
exit 1
}
[ -e "${WORK_DIR}" ] && [ ${OMADA_UID} -ne $(stat ${WORK_DIR} -Lc %u) ] && {
echo "Failed to start ${DESC}. Please chown -R ${OMADA_USER} ${WORK_DIR}"
exit 1
}
}
# root permission check
check_root_perms
# curl
CURL=$(command -v curl)
if [ -z ${CURL} ] || [ ! -x ${CURL} ]; then
echo "${DESC}: curl not found, please install curl!"
exit 1
fi
# return: 1,running; 0, not running;
is_running() {
# ps -U root -u root u | grep eap | grep -v grep >/dev/null
JAVA_PID=$(pgrep -f ${MAIN_CLASS})
[ -z "$JAVA_PID" ] && {
return 0
}
return 1
}
[ ! -f ${PROPERTY_DIR}/omada.properties ] || HTTP_PORT=$(grep "^[^#;]" ${PROPERTY_DIR}/omada.properties | sed -n 's/manage.http.port=\([0-9]\+\)/\1/p' | sed -r 's/\r//')
HTTP_PORT=${HTTP_PORT:-8088}
#---------------------------------------------------
# return: 1,running; 0, not running;
is_in_service() {
http_code=$(curl -I -m 10 -o /dev/null -s -w %{http_code} http://localhost:${HTTP_PORT}/actuator/linux/check)
if [ "${http_code}" != "200" ]; then
return 0
else
return 1
fi
}
start() {
is_running
if [ 1 == $? ]; then
echo "${DESC} is already running on PID ${JAVA_PID}. You can visit http://${MY_IP}:${HTTP_PORT} on this host to manage the wireless network."
exit
fi
# check if ${OMADA_USER} has the permission to ${DATA_DIR} ${LOG_DIR} ${WORK_DIR}
[ "root" != ${OMADA_USER} ] && {
echo "check ${OMADA_USER}"
check_omada_user
}
[ -e "${LOG_DIR}" ] || {
mkdir -m 755 ${LOG_DIR} 2>/dev/null && chown -R ${OMADA_USER}:${OMADA_GROUP} ${LOG_DIR}
}
rm -f "${LOG_DIR}/startup.log"
touch "${LOG_DIR}/startup.log" 2>/dev/null && chown ${OMADA_USER}:${OMADA_GROUP} "${LOG_DIR}/startup.log"
[ -e "$WORK_DIR" ] || {
mkdir -m 755 ${WORK_DIR} 2>/dev/null && chown -R ${OMADA_USER}:${OMADA_GROUP} ${WORK_DIR}
}
[ -e "$AUTOBACKUP_DIR" ] || {
mkdir -m 755 ${AUTOBACKUP_DIR} 2>/dev/null && chown -R ${OMADA_USER}:${OMADA_GROUP} ${AUTOBACKUP_DIR}
}
$JAVA_TOOL $JAVA_OPTS $MAIN_CLASS 2>&1 >$LOG_DIR/startup.log &
JAVA_PID=$!
if [ -z $JAVA_PID ]; then
echo "Start failed."
exit
fi
echo -n "Starting ${DESC} on PID $JAVA_PID. Please wait."
count=0
while true
do
is_in_service
if [ 1 == $? ]; then
break
else
sleep 1
echo -n "."
count=`expr $count + 1`
if [ $count -gt 300 ]; then
break
fi
fi
done
echo "."
is_in_service
if [ 1 == $? ]; then
echo "Started successfully."
echo You can visit http://${MY_IP}:${HTTP_PORT} on this host to manage the wireless network.
else
echo "Start failed."
fi
}
stop() {
is_running
if [ 0 == $? ]; then
echo "${DESC} not running."
exit
fi
echo -n "Stopping ${DESC} on PID $JAVA_PID"
kill $JAVA_PID
count=0
while true
do
is_running
if [ 0 == $? ]; then
break
else
sleep 1
count=`expr $count + 1`
echo -n "."
if [ $count -gt 30 ]; then
break
fi
fi
done
echo ""
is_running
if [ 0 == $? ]; then
echo "Stop successfully."
else
echo "Stop failed. going to kill it."
pkill -f ${MAIN_CLASS}
fi
}
status() {
is_running
if [ 0 == $? ]; then
echo "${DESC} is not running."
else
echo "${DESC} is running on PID $JAVA_PID. You can visit http://${MY_IP}:${HTTP_PORT} on this host to manage the wireless network."
fi
}
# parameter check
if [ $# != 1 ]
then
help
exit
elif [[ $1 != "start" && $1 != "stop" && $1 != "status" ]]
then
help
exit
fi
if [ $1 == "start" ]; then
start
elif [ $1 == "stop" ]; then
stop
elif [ $1 == "status" ]; then
status
fi