#!/bin/bash # vim: set filetype=gentoo-init-d: # # Necessary environment variables: # SERVER_BASENAME, SERVER_BLOCK_BEFORE_START, SERVER_JAVA_OPTS extra_commands="prepare" extra_started_commands="console" INVALID=false NAME="${SVCNAME#*.}" if [[ -z "$NAME" ]] || [[ "$NAME" == "$SVCNAME" ]] ; then INVALID=true fi SERVER_EXEC="/usr/sbin/$SERVER_BASENAME" ETC_DIR="/etc/$SERVER_BASENAME" OPT_DIR="/opt/$SERVER_BASENAME" LOG_DIR="/var/log/$SERVER_BASENAME/$NAME" SERVER_DIR="/var/$SERVER_BASENAME/$NAME" SERVER_DIR_PLUGINS="/var/$SERVER_BASENAME/$NAME/plugins" SERVER_DIR_WORK="/var/lib/$SERVER_BASENAME/work/$NAME" GLOBAL_DIR_INTERMEDIATE="/var/lib/$SERVER_BASENAME/intermediate/overlay" GLOBAL_DIR_INTERMEDIATE_WORK="/var/lib/$SERVER_BASENAME/intermediate/work" PIDDIR="/var/run/$SERVER_BASENAME" PIDFILE="/var/run/$SERVER_BASENAME/$NAME.pid" depend() { if [[ $INVALID == false ]] ; then need net use mysql after teamspeak3-server if [[ $SERVER_BASENAME == sublime-proxy ]] ; then after $(find /etc/init.d -mindepth 1 -maxdepth 1 -type l -name 'sublime.*' -printf '%P\n') fi fi } umount_overlay() { pushd / &>/dev/null local ret1=0 if mountpoint -q "$SERVER_DIR" ; then umount --lazy --force "$SERVER_DIR" ret1=$? fi popd &>/dev/null #local ret2=0 #if mountpoint -q "$GLOBAL_DIR_INTERMEDIATE" ; then # umount --lazy --force "$GLOBAL_DIR_INTERMEDIATE" # ret2=$? #fi # Return a correct status #[[ $ret1 == 0 ]] && [[ $ret2 == 0 ]] } run_server() { ( umask 022 cd "${SERVER_DIR}" sudo -u sublime -- \ env \ INITD=true \ PIDFILE="$PIDFILE" \ SERVER_JAVA_OPTS="$SERVER_JAVA_OPTS" \ SERVER_BLOCK_BEFORE_START="$SERVER_BLOCK_BEFORE_START" \ "$SERVER_EXEC" \ "$NAME" "$@" ) } mount_overlay() { umount_overlay \ || return 1 pushd / &>/dev/null if ! mountpoint -q "$GLOBAL_DIR_INTERMEDIATE" ; then mount -t overlay \ -o lowerdir=/"$ETC_DIR",upperdir="$OPT_DIR",workdir="$GLOBAL_DIR_INTERMEDIATE_WORK" \ overlay "$GLOBAL_DIR_INTERMEDIATE" \ || { eerror "Could not mount global overlay stage"; return 1; } fi if ! mountpoint -q "$SERVER_DIR" ; then mount -t overlay \ -o lowerdir=/"$GLOBAL_DIR_INTERMEDIATE",upperdir="$SERVER_DIR",workdir="$SERVER_DIR_WORK" \ overlay "$SERVER_DIR" \ || { eerror "Could not mount server overlay stage"; return 1; } fi popd &>/dev/null } check_invalid() { # Exit if the $INVALID is true [[ $INVALID == true ]] && { eerror "To run $SERVER_BASENAME, you have to use a separate init.d script" return 1 } true } check_dirs() { # Create directories and set correct permissions checkpath -qd --owner root:root --mode 0700 \ "$SERVER_DIR_WORK" \ "$GLOBAL_DIR_INTERMEDIATE" \ "$GLOBAL_DIR_INTERMEDIATE_WORK" \ || { eerror "checkpath returned $?"; return 1; } checkpath -qd --owner sublime:sublime --mode 0700 \ "$SERVER_DIR" \ "$SERVER_DIR_PLUGINS" \ "$LOG_DIR" \ "$PIDDIR" \ "$PIDDIR/block" \ || { eerror "checkpath returned $?"; return 1; } # Link logs/ [[ -e "$SERVER_DIR/logs" ]] \ || ln -s "$LOG_DIR" "$SERVER_DIR/logs" \ || { eerror "Could not link '$LOG_DIR' to '$SERVER_DIR/logs'"; return 1; } } # Prepares a new server to be run do_prepare() { # Let the server create all other files now ebegin "Preparing $SERVER_BASENAME: $NAME" einfo "Please be patient, this is still java." run_server --prepare local ret=$? [[ $ret == 0 ]] && einfo "Successfully prepared server files." eend $ret } do_start() { ebegin "Starting $SERVER_BASENAME: $NAME" if ! start-stop-daemon \ --start \ --pidfile "$PIDFILE" \ --chdir "${SERVER_DIR}" \ --umask 022 \ --user sublime \ --env INITD=true \ --env PIDFILE="$PIDFILE" \ --env SERVER_JAVA_OPTS="$SERVER_JAVA_OPTS" \ --env SERVER_BLOCK_BEFORE_START="$SERVER_BLOCK_BEFORE_START" \ --exec "$SERVER_EXEC" -- \ "$NAME" --start then # Failure -> exit immediately eend $? else # Wait for pidfile to appear SECONDS_WAITED=0 MAX_SECONDS_WAIT=5 while [[ $SECONDS_WAITED -lt $MAX_SECONDS_WAIT ]] ; do [[ -e $PIDFILE ]] && break sleep 1 ((++SECONDS_WAITED)) done # Return OK (0) if we waited less than the maximum allowed amount of seconds [[ $SECONDS_WAITED -lt $MAX_SECONDS_WAIT ]] eend $? fi } do_stop() { ebegin "Stopping $SERVER_BASENAME: $NAME" run_server --stop eend $? } prepare_pre() { check_invalid \ || return 1 check_dirs \ || return 1 mount_overlay || { umount_overlay && return 1; } } prepare() { check_invalid \ || return 1 do_prepare || { umount_overlay && return 1; } } prepare_post() { check_invalid \ || return 1 umount_overlay } start_pre() { check_invalid \ || return 1 check_dirs \ || return 1 mount_overlay || { umount_overlay && return 1; } } start() { check_invalid \ || return 1 do_start || { umount_overlay && return 1; } } console() { check_invalid \ || return 1 run_server --attach } stop() { check_invalid \ || return 1 do_stop || { umount_overlay && return 1; } } stop_post() { check_invalid \ || return 1 umount_overlay || true }