#!/bin/sh
|
|
#
|
|
# safety wrapper for IBR-DTN daemon
|
|
#
|
|
# Tasks:
|
|
# * start IBR-DTN daemon
|
|
# * restart the daemon after a crash
|
|
# * if respawning to fast, then slow down with backoff
|
|
# * check for enough space on disk and delete bundles if necessary.
|
|
# * clean the blob directory on startup
|
|
#
|
|
|
|
DTND=/usr/sbin/dtnd
|
|
TMPCONF=/tmp/ibrdtn.config
|
|
UCI=/sbin/uci
|
|
|
|
getstate() {
|
|
$UCI -P/var/state -q get ibrdtn.$1
|
|
return $?
|
|
}
|
|
|
|
setstate() {
|
|
$UCI -P/var/state -q set ibrdtn.$1=$2
|
|
return $?
|
|
}
|
|
|
|
getconfig() {
|
|
$UCI -q get ibrdtn.$1
|
|
return $?
|
|
}
|
|
|
|
setconfig() {
|
|
$UCI -q set ibrdtn.$1=$2
|
|
return $?
|
|
}
|
|
|
|
# remove the old state file
|
|
/bin/rm /var/state/ibrdtn
|
|
|
|
# read uci configuration
|
|
BLOB_PATH=`getconfig storage.blobs`
|
|
BUNDLE_PATH=`getconfig storage.bundles`
|
|
CONTAINER_PATH=`getconfig storage.path`
|
|
CONTAINER_FILE=`getconfig storage.container`
|
|
LOG_FILE=`getconfig main.logfile`
|
|
ERR_FILE=`getconfig main.errfile`
|
|
DEBUG_LEVEL=`getconfig main.debug`
|
|
SAFEMODE=no
|
|
|
|
# run a system check
|
|
/bin/sh /usr/share/ibrdtn/systemcheck.sh
|
|
|
|
if [ $? -eq 0 ]; then
|
|
# mount container if specified
|
|
if [ -n "$CONTAINER_FILE" ] && [ -n "$CONTAINER_PATH" ]; then
|
|
/bin/sh /usr/share/ibrdtn/mountcontainer.sh
|
|
|
|
# if the mount of the container failed
|
|
# switch to safe mode!
|
|
if [ $? -gt 0 ]; then
|
|
SAFEMODE=yes
|
|
fi
|
|
fi
|
|
else
|
|
SAFEMODE=yes
|
|
fi
|
|
|
|
# create blob & bundle path
|
|
if [ -n "$BLOB_PATH" ]; then
|
|
/bin/mkdir -p $BLOB_PATH
|
|
|
|
# clean the blob directory on startup
|
|
/bin/rm -f $BLOB_PATH/file*
|
|
fi
|
|
|
|
if [ -n "$BUNDLE_PATH" ]; then
|
|
/bin/mkdir -p $BUNDLE_PATH
|
|
fi
|
|
|
|
LOGGING=""
|
|
if [ -n "$LOG_FILE" ]; then
|
|
LOGGING="$LOGGING > $LOG_FILE"
|
|
else
|
|
LOGGING="$LOGGING > /dev/null"
|
|
fi
|
|
|
|
if [ -n "$ERR_FILE" ]; then
|
|
LOGGING="$LOGGING 2> $ERR_FILE"
|
|
else
|
|
LOGGING="$LOGGING 2> /dev/null"
|
|
fi
|
|
|
|
if [ -z "$LOG_FILE" ] && [ -z "$ERR_FILE" ]; then
|
|
LOGGING="-q"
|
|
fi
|
|
|
|
# check for debugging option
|
|
if [ -n "$DEBUG_LEVEL" ]; then
|
|
DEBUG_ARGS="-v -d ${DEBUG_LEVEL}"
|
|
else
|
|
DEBUG_ARGS=""
|
|
fi
|
|
|
|
# create configuration
|
|
if [ "$SAFEMODE" == "yes" ]; then
|
|
/bin/sh /usr/share/ibrdtn/build-config.sh --safe-mode $TMPCONF
|
|
else
|
|
/bin/sh /usr/share/ibrdtn/build-config.sh $TMPCONF
|
|
fi
|
|
|
|
# set the crash counter to zero
|
|
CRASH=0
|
|
|
|
# run the daemon
|
|
setstate state running
|
|
|
|
while [ "`getstate state`" == "running" ]; do
|
|
# run a system check
|
|
/bin/sh /usr/share/ibrdtn/systemcheck.sh
|
|
|
|
# run in safe mode if the system check has failed
|
|
if [ $? -gt 0 ] && [ "$SAFEMODE" == "no" ]; then
|
|
SAFEMODE=yes
|
|
/usr/bin/logger -t "ibrdtn-safe-wrapper" -p 2 "system check failed! Switch to safe-mode settings."
|
|
/bin/sh /usr/share/ibrdtn/build-config.sh --safe-mode $TMPCONF
|
|
fi
|
|
|
|
# measure the running time
|
|
TIMESTART=`/bin/date +%s`
|
|
|
|
# run the daemon
|
|
echo "${DTND} ${DEBUG_ARGS} -c ${TMPCONF} ${LOGGING}" | /bin/sh
|
|
|
|
# measure the stopping time
|
|
TIMESTOP=`/bin/date +%s`
|
|
|
|
# calc the running time
|
|
let TIMERUN=$TIMESTOP-$TIMESTART
|
|
|
|
# reset the CRASH counter if there is one hour between the crashes
|
|
if [ $TIMERUN -ge 3600 ]; then
|
|
CRASH=0
|
|
fi
|
|
|
|
# check if the daemon is crashed
|
|
if [ "`getstate state`" == "running" ]; then
|
|
# if the crash counter is higher than 20 switch to safe-mode settings
|
|
if [ $CRASH -eq 20 ] && [ "$SAFEMODE" == "no" ]; then
|
|
SAFEMODE=yes
|
|
/usr/bin/logger -t "ibrdtn-safe-wrapper" -p 2 "IBR-DTN daemon crashed 20 times! Switch to safe-mode settings."
|
|
/bin/sh /usr/share/ibrdtn/build-config.sh --safe-mode $TMPCONF
|
|
fi
|
|
|
|
# increment the crash counter
|
|
let CRASH=$CRASH+1
|
|
|
|
# backoff wait timer
|
|
let WAIT=2**$CRASH
|
|
|
|
# set a upper limit for the wait time
|
|
if [ $WAIT -ge 1800 ]; then
|
|
WAIT=1800
|
|
fi
|
|
|
|
# log the crash
|
|
/usr/bin/logger -t "ibrdtn-safe-wrapper" -p 2 "IBR-DTN daemon crashed $CRASH times! Wait $WAIT seconds."
|
|
|
|
# wait sometime
|
|
/bin/sleep $WAIT
|
|
fi
|
|
done
|
|
|