Last active
September 30, 2020 02:26
-
-
Save cam8001/585bc721b25c80e185b83269fdb62e4a to your computer and use it in GitHub Desktop.
Corrretto JAVA_HOME on Ubuntu 16.04. Replace /etc/init.d/unifi with this!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# /etc/init.d/UniFi -- startup script for Ubiquiti UniFi | |
# | |
# | |
### BEGIN INIT INFO | |
# Provides: unifi | |
# Required-Start: $local_fs $remote_fs $network | |
# Required-Stop: $local_fs $remote_fs $network | |
# Default-Start: 2 3 4 5 | |
# Default-Stop: 0 1 6 | |
# Short-Description: Ubiquiti UniFi | |
# Description: Ubiquiti UniFi Controller | |
### END INIT INFO | |
set_java_home () { | |
JAVA_HOME='/usr/lib/jvm/java-1.8.0-amazon-corretto' | |
} | |
dir_symlink_fix() { | |
local DSTDIR=$1 | |
local SYMLINK=$2 | |
local MYUSER=$3 | |
local MYGROUP=$4 | |
local MYMODE=$5 | |
local UNIFI_CORE_ENABLED=$6 | |
[ -d ${DSTDIR} ] || install -o ${MYUSER} -g ${MYGROUP} -m ${MYMODE} -d ${DSTDIR} | |
if [ "${UNIFI_CORE_ENABLED}" = "true" ]; then | |
# Ensure directory has correct user/group owner. | |
local OWNER_USER="$(stat -c '%U' ${DSTDIR})" | |
local OWNER_GROUP="$(stat -c '%G' ${DSTDIR})" | |
[ "${OWNER_USER}" = "${MYUSER}" -a "${OWNER_GROUP}" = "${MYGROUP}" ] || chown ${MYUSER}:${MYGROUP} -R ${DSTDIR} | |
fi | |
[ -d ${SYMLINK} -a ! -L ${SYMLINK} ] && mv ${SYMLINK} `mktemp -u ${SYMLINK}.XXXXXXXX` | |
[ "$(readlink ${SYMLINK})" = "${DSTDIR}" ] || (rm -f ${SYMLINK} && ln -sf ${DSTDIR} ${SYMLINK}) | |
} | |
file_symlink_fix() { | |
local DSTFILE=$1 | |
local SYMLINK=$2 | |
if [ -f ${DSTFILE} ]; then | |
[ -f ${SYMLINK} -a ! -L ${SYMLINK} ] && mv ${SYMLINK} `mktemp -u ${SYMLINK}.XXXXXXXX` | |
[ "$(readlink ${SYMLINK})" = "${DSTFILE}" ] || (rm -f ${SYMLINK} && ln -sf ${DSTFILE} ${SYMLINK}) | |
fi | |
} | |
manual_stop_unifi() { | |
local MYDIR=$1 | |
local MYUSER=$2 | |
local MYGROUP=$3 | |
local MYMODE=$4 | |
TMP_UNIFI_STOP=$(mktemp) | |
rm -f ${MYDIR}/launcher.looping | |
install -o ${MYUSER} -g ${MYGROUP} -m ${MYMODE} ${TMP_UNIFI_STOP} ${MYDIR}/server.stop | |
rm -f ${TMP_UNIFI_STOP} | |
} | |
NAME="unifi" | |
DESC="Ubiquiti UniFi Controller" | |
BASEDIR="/usr/lib/unifi" | |
MAINCLASS="com.ubnt.ace.Launcher" | |
PATH=/bin:/usr/bin:/sbin:/usr/sbin | |
UMASK=027 | |
FILE_MODE=$(printf '%x' $((0x7777 - 0x${UMASK} & 0x0666))) | |
DIR_MODE=$(printf '%x' $((0x7777 - 0x${UMASK} & 0x0777))) | |
[ -f /etc/default/rcS ] && . /etc/default/rcS | |
. /lib/lsb/init-functions | |
MONGOPORT=27117 | |
CODEPATH=${BASEDIR} | |
DATALINK=${BASEDIR}/data | |
LOGLINK=${BASEDIR}/logs | |
RUNLINK=${BASEDIR}/run | |
JAVA_ENTROPY_GATHER_DEVICE= | |
JVM_MAX_HEAP_SIZE=1024M | |
JVM_INIT_HEAP_SIZE= | |
UNIFI_JVM_EXTRA_OPTS= | |
ENABLE_UNIFI=yes | |
JVM_EXTRA_OPTS= | |
JSVC_EXTRA_OPTS= | |
[ -f /etc/default/${NAME} ] && . /etc/default/${NAME} | |
[ "x${ENABLE_UNIFI}" != "xyes" ] && exit 0 | |
DATADIR=${UNIFI_DATA_DIR:-/var/lib/${NAME}} | |
LOGDIR=${UNIFI_LOG_DIR:-/var/log/${NAME}} | |
RUNDIR=${UNIFI_RUN_DIR:-/var/run/${NAME}} | |
UNIFI_CORE_ENABLED=${UNIFI_CORE_ENABLED:-"false"} | |
JVM_EXTRA_OPTS="${JVM_EXTRA_OPTS} -Dunifi.datadir=${DATADIR} -Dunifi.logdir=${LOGDIR} -Dunifi.rundir=${RUNDIR} -Dunifi.core.enabled=${UNIFI_CORE_ENABLED}" | |
PIDFILE="/var/run/${NAME}.pid" | |
if [ ! -z "${JAVA_ENTROPY_GATHER_DEVICE}" ]; then | |
JVM_EXTRA_OPTS="${JVM_EXTRA_OPTS} -Djava.security.egd=${JAVA_ENTROPY_GATHER_DEVICE}" | |
fi | |
if [ ! -z "${JVM_MAX_HEAP_SIZE}" ]; then | |
JVM_EXTRA_OPTS="${JVM_EXTRA_OPTS} -Xmx${JVM_MAX_HEAP_SIZE}" | |
fi | |
if [ ! -z "${JVM_INIT_HEAP_SIZE}" ]; then | |
JVM_EXTRA_OPTS="${JVM_EXTRA_OPTS} -Xms${JVM_INIT_HEAP_SIZE}" | |
fi | |
if [ ! -z "${UNIFI_JVM_EXTRA_OPTS}" ]; then | |
JVM_EXTRA_OPTS="${JVM_EXTRA_OPTS} ${UNIFI_JVM_EXTRA_OPTS}" | |
fi | |
JVM_OPTS="${JVM_EXTRA_OPTS} -Djava.awt.headless=true -Dfile.encoding=UTF-8" | |
[ "x${JAVA_HOME}" != "x" ] || set_java_home | |
# JSVC - for running java apps as services | |
JSVC=$(command -v jsvc) | |
if [ -z ${JSVC} -o ! -x ${JSVC} ]; then | |
log_failure_msg "${DESC}: jsvc is missing!" | |
exit 1 | |
fi | |
UNIFI_USER=${UNIFI_USER:-unifi} | |
UNIFI_GROUP=$(id -gn ${UNIFI_USER}) | |
umask ${UMASK} | |
# fix path for ace | |
dir_symlink_fix ${DATADIR} ${DATALINK} ${UNIFI_USER} ${UNIFI_GROUP} ${DIR_MODE} ${UNIFI_CORE_ENABLED} | |
dir_symlink_fix ${LOGDIR} ${LOGLINK} ${UNIFI_USER} ${UNIFI_GROUP} ${DIR_MODE} ${UNIFI_CORE_ENABLED} | |
dir_symlink_fix ${RUNDIR} ${RUNLINK} ${UNIFI_USER} ${UNIFI_GROUP} ${DIR_MODE} ${UNIFI_CORE_ENABLED} | |
[ -z "${UNIFI_SSL_KEYSTORE}" ] || file_symlink_fix ${UNIFI_SSL_KEYSTORE} ${DATALINK}/keystore | |
MONGOLOCK="${DATADIR}/db/mongod.lock" | |
# check whether jsvc requires -cwd option | |
${JSVC} -java-home ${JAVA_HOME} -cwd / -help >/dev/null 2>&1 | |
if [ $? -eq 0 ] ; then | |
JSVC_OPTS="${JSVC_OPTS} -cwd ${BASEDIR}" | |
fi | |
UNIFI_UID=$(id -u ${UNIFI_USER}) | |
DATADIR_UID=$(stat ${DATADIR} -Lc %u) | |
if [ ${UNIFI_UID} -ne ${DATADIR_UID} ]; then | |
msg="${NAME} cannot start. Please create ${UNIFI_USER} user, and chown -R ${UNIFI_USER} ${DATADIR} ${LOGDIR} ${RUNDIR}" | |
logger $msg | |
echo $msg >&2 | |
exit 1 | |
fi | |
#JSVC_OPTS="-debug" | |
JSVC_OPTS="${JSVC_OPTS}\ | |
-home ${JAVA_HOME} \ | |
-cp /usr/share/java/commons-daemon.jar:${BASEDIR}/lib/ace.jar \ | |
-pidfile ${PIDFILE} \ | |
-procname ${NAME} \ | |
-outfile SYSLOG \ | |
-errfile SYSLOG \ | |
-umask ${UMASK} \ | |
-user ${UNIFI_USER} \ | |
${JSVC_EXTRA_OPTS} \ | |
${JVM_OPTS}" | |
[ -f /etc/default/rcS ] && . /etc/default/rcS | |
. /lib/lsb/init-functions | |
cd ${BASEDIR} | |
is_not_running() { | |
start-stop-daemon --test --start --pidfile "${PIDFILE}" \ | |
--startas "${JAVA_HOME}/bin/java" >/dev/null | |
RC=$? | |
return ${RC} | |
} | |
case "$1" in | |
start) | |
log_daemon_msg "Starting ${DESC}" "${NAME}" | |
[ ! -f ${DATADIR}/system.properties ] || api_port=$(grep "^[^#;]" ${DATADIR}/system.properties | sed -n 's/unifi.http.port=\([0-9]\+\)/\1/p') | |
api_port=${api_port:-8080} | |
if is_not_running; then | |
${JSVC} ${JSVC_OPTS} ${MAINCLASS} start | |
sleep 1 | |
if is_not_running; then | |
log_end_msg 1 | |
else | |
MAX_WAIT=60 | |
http_code=$(curl -s --connect-timeout 1 -o /dev/null -w "%{http_code}" http://localhost:${api_port}/status) | |
for i in `seq 1 ${MAX_WAIT}` ; do | |
if [ "${http_code}" != "200" ]; then | |
sleep 1 | |
http_code=$(curl -s --connect-timeout 1 -o /dev/null -w "%{http_code}" http://localhost:${api_port}/status) | |
else | |
break | |
fi | |
done | |
if [ "${http_code}" != "200" ]; then | |
log_end_msg 1 | |
else | |
log_end_msg 0 | |
fi | |
fi | |
else | |
log_progress_msg "(already running)" | |
log_end_msg 1 | |
fi | |
;; | |
stop) | |
log_daemon_msg "Stopping ${DESC}" "${NAME}" | |
if is_not_running; then | |
log_progress_msg "(not running)" | |
log_end_msg 0 | |
exit 0 | |
fi | |
IS_STOPPED=0 | |
MAX_WAIT=10 | |
${JSVC} ${JSVC_OPTS} -stop ${MAINCLASS} stop | |
for i in `seq 1 ${MAX_WAIT}` ; do | |
sleep 1 | |
if [ -z "$(pgrep -f ${BASEDIR}/lib/ace.jar)" ]; then | |
IS_STOPPED=1 | |
break | |
fi | |
${JSVC} ${JSVC_OPTS} -stop ${MAINCLASS} stop | |
done | |
if [ ${IS_STOPPED} -ge 1 ] ; then | |
log_end_msg 0 | |
exit 0 | |
fi | |
# if jsvc can't stop it | |
[ -z "$(pgrep -f ${BASEDIR}/lib/ace.jar)" ] || manual_stop_unifi ${RUNDIR} ${UNIFI_USER} ${UNIFI_GROUP} ${FILE_MODE} | |
for i in `seq 1 ${MAX_WAIT}` ; do | |
sleep 1 | |
if [ -z "$(pgrep -f ${BASEDIR}/lib/ace.jar)" ]; then | |
IS_STOPPED=1 | |
break | |
fi | |
done | |
if [ ${IS_STOPPED} -ge 1 ] ; then | |
log_end_msg 0 | |
exit 0 | |
fi | |
# force stop | |
pkill -f ${BASEDIR}/lib/ace.jar || true | |
sleep 2 | |
if [ -f ${MONGOLOCK} ]; then | |
mongo localhost:${MONGOPORT} --eval "db.getSiblingDB('admin').shutdownServer()" >/dev/null 2>&1 || true | |
fi | |
log_end_msg 0 | |
;; | |
status) | |
status_of_proc -p ${PIDFILE} unifi unifi && exit 0 || exit $? | |
;; | |
restart|reload|force-reload) | |
if ! is_not_running ; then | |
if which invoke-rc.d >/dev/null 2>&1; then | |
invoke-rc.d ${NAME} stop | |
else | |
/etc/init.d/${NAME} stop | |
fi | |
fi | |
if which invoke-rc.d >/dev/null 2>&1; then | |
invoke-rc.d ${NAME} start | |
else | |
/etc/init.d/${NAME} start | |
fi | |
;; | |
*) | |
log_success_msg "Usage: $0 {start|stop|restart|reload|force-reload}" | |
exit 1 | |
;; | |
esac | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment