You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

172 lines
3.7 KiB

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