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