diff --git a/ibrcommon/Makefile b/ibrcommon/Makefile new file mode 100644 index 0000000..231258a --- /dev/null +++ b/ibrcommon/Makefile @@ -0,0 +1,49 @@ +# +# Copyright (C) 2006 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ibrcommon +PKG_VERSION_MAJOR:=0 +PKG_VERSION_MINOR:=6 +PKG_VERSION_MICRO:=0 + +PKG_VERSION:=$(PKG_VERSION_MAJOR).$(PKG_VERSION_MINOR).$(PKG_VERSION_MICRO) +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases + +PKG_INSTALL:=1 +PKG_FIXUP:=libtool +PKG_BUILD_DEPENDS:=libnl libopenssl + +include $(INCLUDE_DIR)/package.mk + +define Package/ibrcommon + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=+libstdcpp +libpthread +librt +libnl +libopenssl + TITLE:=IBR Common C++ Library +endef + +CONFIGURE_ARGS += \ + --with-openssl + +define Package/ibrcommon/description + A library with common functions for C++. +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1) + $(CP) $(PKG_INSTALL_DIR)/* $(1)/ +endef + +define Package/ibrcommon/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib$(PKG_NAME){.so,-$(PKG_VERSION_MAJOR).$(PKG_VERSION_MINOR).so.*} $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,ibrcommon)) diff --git a/ibrdtn-tools/Makefile b/ibrdtn-tools/Makefile new file mode 100644 index 0000000..d3ced72 --- /dev/null +++ b/ibrdtn-tools/Makefile @@ -0,0 +1,47 @@ +# +# Copyright (C) 2006 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ibrdtn-tools +PKG_VERSION_MAJOR:=0 +PKG_VERSION_MINOR:=6 +PKG_VERSION_MICRO:=0 + +PKG_VERSION:=$(PKG_VERSION_MAJOR).$(PKG_VERSION_MINOR).$(PKG_VERSION_MICRO) +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases + +PKG_INSTALL:=1 +PKG_BUILD_DEPENDS:=ibrdtn + +include $(INCLUDE_DIR)/package.mk + +define Package/ibrdtn-tools + SECTION:=net + CATEGORY:=Network + DEPENDS:=ibrdtn + TITLE:=DTN Tools +endef + +define Package/ibrdtn-tools/description + The IBR-DTN Tools include functionality for sending and receiving files (dtnsend/dtnrecv) + and a tools to ping a DTN node (dtnping). +endef + +define Package/ibrdtn-tools/install + $(INSTALL_DIR) $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnping $(1)/usr/bin/dtnping + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnsend $(1)/usr/bin/dtnsend + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnrecv $(1)/usr/bin/dtnrecv + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtninbox $(1)/usr/bin/dtninbox + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnoutbox $(1)/usr/bin/dtnoutbox + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtntrigger $(1)/usr/bin/dtntrigger + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtntracepath $(1)/usr/bin/dtntracepath +endef + +$(eval $(call BuildPackage,ibrdtn-tools)) diff --git a/ibrdtn/Makefile b/ibrdtn/Makefile new file mode 100644 index 0000000..04a2bf1 --- /dev/null +++ b/ibrdtn/Makefile @@ -0,0 +1,49 @@ +# +# Copyright (C) 2006 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ibrdtn +PKG_VERSION_MAJOR:=0 +PKG_VERSION_MINOR:=6 +PKG_VERSION_MICRO:=0 + +PKG_VERSION:=$(PKG_VERSION_MAJOR).$(PKG_VERSION_MINOR).$(PKG_VERSION_MICRO) +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases + +PKG_INSTALL:=1 +PKG_FIXUP:=libtool +PKG_BUILD_DEPENDS:=ibrcommon libopenssl + +include $(INCLUDE_DIR)/package.mk + +define Package/ibrdtn + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:=ibrcommon +libopenssl + TITLE:=IBR-DTN Library +endef + +define Package/ibrdtn/description + Base library for IBR-DTN daemon and tools. +endef + +CONFIGURE_ARGS += \ + --with-dtnsec + +define Build/InstallDev + $(INSTALL_DIR) $(1) + $(CP) $(PKG_INSTALL_DIR)/* $(1)/ +endef + +define Package/ibrdtn/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib$(PKG_NAME){.so,-$(PKG_VERSION_MAJOR).$(PKG_VERSION_MINOR).so.*} $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,ibrdtn)) diff --git a/ibrdtnd/Makefile b/ibrdtnd/Makefile new file mode 100644 index 0000000..a5f6bbe --- /dev/null +++ b/ibrdtnd/Makefile @@ -0,0 +1,57 @@ +# +# Copyright (C) 2006 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ibrdtnd +PKG_VERSION_MAJOR:=0 +PKG_VERSION_MINOR:=6 +PKG_VERSION_MICRO:=0 + +PKG_VERSION:=$(PKG_VERSION_MAJOR).$(PKG_VERSION_MINOR).$(PKG_VERSION_MICRO) +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases + +PKG_INSTALL:=1 +PKG_BUILD_DEPENDS:=ibrdtn libopenssl libsqlite3 + +include $(INCLUDE_DIR)/package.mk + +define Package/ibrdtnd + SECTION:=net + CATEGORY:=Network + DEPENDS:=ibrdtn +libopenssl +libsqlite3 + TITLE:=DTN Deamon +endef + +define Package/ibrdtnd/conffiles +/etc/config/ibrdtn +endef + +define Package/ibrdtnd/description + The implementation of the bundle protocol of the IBR (TU Braunschweig). +endef + +CONFIGURE_ARGS += \ + --with-dtnsec --with-sqlite + +define Package/ibrdtnd/install + $(INSTALL_DIR) $(1)/usr/sbin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dtnd $(1)/usr/sbin/ + $(INSTALL_BIN) files/safety-wrapper.sh $(1)/usr/sbin/dtnd-safety-wrapper.sh + $(INSTALL_DIR) $(1)/usr/share/ibrdtn/ + $(INSTALL_BIN) files/build-config.sh $(1)/usr/share/ibrdtn/build-config.sh + $(INSTALL_BIN) files/mkcontainer.sh $(1)/usr/share/ibrdtn/mkcontainer.sh + $(INSTALL_BIN) files/mountcontainer.sh $(1)/usr/share/ibrdtn/mountcontainer.sh + $(INSTALL_BIN) files/systemcheck.sh $(1)/usr/share/ibrdtn/systemcheck.sh + $(INSTALL_DIR) $(1)/etc/init.d/ + $(INSTALL_BIN) files/ibrdtn.init $(1)/etc/init.d/ibrdtn + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) files/ibrdtn.uci $(1)/etc/config/ibrdtn +endef + +$(eval $(call BuildPackage,ibrdtnd)) diff --git a/ibrdtnd/files/build-config.sh b/ibrdtnd/files/build-config.sh new file mode 100644 index 0000000..1a87c3b --- /dev/null +++ b/ibrdtnd/files/build-config.sh @@ -0,0 +1,136 @@ +#!/bin/sh +# +# convert uci configuration into daemon specific format +# + +UCI=/sbin/uci + +create_file() { + echo "# -- DO NOT EDIT THIS FILE --" > $1 + echo "# automatic generated configuration file for IBR-DTN daemon" >> $1 + echo "#" >> $1 +} + +add_param() { + VALUE=`$UCI -q get $2` + + if [ $? == 0 ]; then + echo "$3 = $VALUE" >> $1 + fi +} + +getconfig() { + $UCI -q get ibrdtn.$1 + return $? +} + +if [ "$1" == "--safe-mode" ]; then + SAFEMODE=yes + CONFFILE=$2 +else + SAFEMODE=no + CONFFILE=$1 +fi + +# create the file and write some header info +create_file $CONFFILE + +add_param $CONFFILE "ibrdtn.main.uri" "local_uri" +add_param $CONFFILE "ibrdtn.main.timezone" "timezone" +add_param $CONFFILE "ibrdtn.main.routing" "routing" + +if [ "$SAFEMODE" == "yes" ]; then + if [ -n "`getconfig safemode.forwarding`" ]; then + add_param $CONFFILE "ibrdtn.safemode.forwarding" "routing_forwarding" + else + add_param $CONFFILE "ibrdtn.main.forwarding" "routing_forwarding" + fi + + if [ -n "`getconfig safemode.maxblock`" ]; then + add_param $CONFFILE "ibrdtn.safemode.maxblock" "limit_blocksize" + else + add_param $CONFFILE "ibrdtn.main.blocksize" "limit_blocksize" + fi + + if [ -n "`getconfig safemode.storage`" ]; then + add_param $CONFFILE "ibrdtn.safemode.storage" "limit_storage" + else + add_param $CONFFILE "ibrdtn.storage.limit" "limit_storage" + fi +else + add_param $CONFFILE "ibrdtn.main.forwarding" "routing_forwarding" + add_param $CONFFILE "ibrdtn.main.blocksize" "limit_blocksize" + add_param $CONFFILE "ibrdtn.storage.limit" "limit_storage" + add_param $CONFFILE "ibrdtn.storage.blobs" "blob_path" + add_param $CONFFILE "ibrdtn.storage.bundles" "storage_path" + add_param $CONFFILE "ibrdtn.storage.engine" "storage" +fi + +add_param $CONFFILE "ibrdtn.statistic.type" "statistic_type" +add_param $CONFFILE "ibrdtn.statistic.interval" "statistic_interval" +add_param $CONFFILE "ibrdtn.statistic.file" "statistic_file" +add_param $CONFFILE "ibrdtn.statistic.address" "statistic_address" +add_param $CONFFILE "ibrdtn.statistic.port" "statistic_port" + +add_param $CONFFILE "ibrdtn.discovery.address" "discovery_address" +add_param $CONFFILE "ibrdtn.discovery.timeout" "discovery_timeout" + +add_param $CONFFILE "ibrdtn.security.level" "security_level" +add_param $CONFFILE "ibrdtn.security.bab_key" "security_bab_default_key" +add_param $CONFFILE "ibrdtn.security.key_path" "security_path" + + +# iterate through all network interfaces +iter=0 +netinterfaces= +while [ 1 == 1 ]; do + $UCI -q get "ibrdtn.@network[$iter]" > /dev/null + if [ $? == 0 ]; then + netinterfaces="${netinterfaces} lan${iter}" + add_param $CONFFILE "ibrdtn.@network[$iter].type" "net_lan${iter}_type" + add_param $CONFFILE "ibrdtn.@network[$iter].interface" "net_lan${iter}_interface" + add_param $CONFFILE "ibrdtn.@network[$iter].port" "net_lan${iter}_port" + add_param $CONFFILE "ibrdtn.@network[$iter].discovery" "net_lan${iter}_discovery" + else + break + fi + + let iter=iter+1 +done + +# write list of network interfaces +echo "net_interfaces =$netinterfaces" >> $CONFFILE + +# iterate through all static routes +iter=0 +while [ 1 == 1 ]; do + $UCI -q get "ibrdtn.@static-route[$iter]" > /dev/null + if [ $? == 0 ]; then + PATTERN=`$UCI -q get "ibrdtn.@static-route[$iter].pattern"` + DESTINATION=`$UCI -q get "ibrdtn.@static-route[$iter].destination"` + let NUMBER=iter+1 + echo "route$NUMBER = $PATTERN $DESTINATION" >> $CONFFILE + else + break + fi + + let iter=iter+1 +done + +#iterate through all static connections +iter=0 +while [ 1 == 1 ]; do + $UCI -q get "ibrdtn.@static-connection[$iter]" > /dev/null + if [ $? == 0 ]; then + let NUMBER=iter+1 + add_param $CONFFILE "ibrdtn.@static-connection[$iter].uri" "static${NUMBER}_uri" + add_param $CONFFILE "ibrdtn.@static-connection[$iter].address" "static${NUMBER}_address" + add_param $CONFFILE "ibrdtn.@static-connection[$iter].port" "static${NUMBER}_port" + add_param $CONFFILE "ibrdtn.@static-connection[$iter].protocol" "static${NUMBER}_proto" + add_param $CONFFILE "ibrdtn.@static-connection[$iter].immediately" "static${NUMBER}_immediately" + else + break + fi + + let iter=iter+1 +done diff --git a/ibrdtnd/files/ibrdtn.init b/ibrdtnd/files/ibrdtn.init new file mode 100644 index 0000000..71c8609 --- /dev/null +++ b/ibrdtnd/files/ibrdtn.init @@ -0,0 +1,71 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2007 OpenWrt.org + +START=90 + +start() { + # check if the daemon is disabled + if [ "`/sbin/uci -P/var/state -q get ibrdtn.disable`" == "1" ]; then + /bin/echo "dtnd is disabled" + return + fi + + /bin/echo -n "running dtnd ..." + + # startup the safety-wrapper for the daemon + /usr/sbin/dtnd-safety-wrapper.sh & + + # store the pid of the process in uci states + /sbin/uci -P/var/state -q set ibrdtn.safetypid=`echo $!` + + /bin/echo " done" +} + +stop() { + # check if the daemon is disabled + if [ "`/sbin/uci -P/var/state -q get ibrdtn.disable`" == "1" ]; then + /bin/echo "dtnd is disabled" + return + fi + + /bin/echo -n "stopping dtnd ..." + + # set state to None, this indicates a clear shutdown to the safety-wrapper. + /sbin/uci -P/var/state -q set ibrdtn.state=None + + # stop the safety-wrapper + if [ -n "`/sbin/uci -P/var/state -q get ibrdtn.safetypid`" ]; then + /usr/bin/kill `/sbin/uci -P/var/state -q get ibrdtn.safetypid` 2> /dev/null >/dev/null + fi + + # finally kill really all safety-wrapper! + /bin/sleep 2 + /usr/bin/killall -9 dtnd-safety-wrapper.sh + + # send a kill signal to the daemon + /usr/bin/killall dtnd 2> /dev/null >/dev/null + + # wait for some time + TIMEOUT=0; + + # check if the daemon is running + while [ -n "`ps ax | grep dtnd | grep -v grep`" ]; do + # check if the daemon is still running + if [ $TIMEOUT -ge 10 ]; then + /bin/echo " killing" + # kill all processes of dtnd + /usr/bin/killall -9 dtnd 2> /dev/null >/dev/null + return + fi + + # increment timeout + TIMEOUT=`expr $TIMEOUT + 1` + + echo -n "." + + # wait some time + /bin/sleep 1 + done + + echo " done" +} diff --git a/ibrdtnd/files/ibrdtn.uci b/ibrdtnd/files/ibrdtn.uci new file mode 100644 index 0000000..574314d --- /dev/null +++ b/ibrdtnd/files/ibrdtn.uci @@ -0,0 +1,145 @@ +##################################### +# IBR-DTN daemon # +##################################### + +config 'daemon' 'main' + # The local eid of the dtn node. Default is the hostname. +# option uri dtn://node.dtn + + # timezone offset in hours +# option timezone +1 + + # logfile for standard output + option logfile /tmp/ibrdtn.log + option errfile /tmp/ibrdtn.err + + # debug level +# option debug 20 + + # block size limit +# option blocksize 512M + + +# +# If something bad happened, the safe mode will be activated. +# These are the restrictions for safe mode only. +# +config 'daemon' 'safemode' + option forwarding no + option storage 64M + option maxblock 16M + + +##################################### +# storage configuration # +##################################### + +config 'daemon' 'storage' + # possible engines are: simple, sqlite + option engine simple + option blobs /tmp/ibrdtn/blobs + option bundles /tmp/ibrdtn/bundles +# option container /tmp/ibrdtn/container.img +# option path /tmp/ibrdtn/container +# option limit 1G + + +##################################### +# statistic logging # +##################################### + +config 'daemon' 'statistic' + # types: stdout | syslog | plain | csv | stat | udp + option type stat + option interval 2 + option file /tmp/ibrdtn.stats +# option address 127.0.0.1 +# option port 1234 + + +##################################### +# routing configuration # +##################################### + +# +# In the "default" the daemon only delivers bundles to neighbors and static +# available nodes. The alternative module "epidemic" spread all bundles to +# all available neighbors. +# +config 'daemon' 'main' + # values: default | epidemic | flooding + option routing default +# option forwarding no + +# +# static routing rules +# - a rule is a regex pattern +# - format is +# +#config 'static-route' +# list pattern ^dtn://[[:alpha:]].moon.dtn/[[:alpha:]] +# option destination dtn://router.dtn + + +##################################### +# static connections +##################################### + +#config 'static-connection' +# option uri dtn://node-five.dtn +# option address 10.0.0.5 +# option port 4556 +# option protocol tcp +# option immediately yes + +#config 'static-connection' +# option uri dtn://node-ten +# option address 10.0.0.10 +# option port 4556 +# option protocol udp +# option immediately no + + +##################################### +# convergence layer configuration # +##################################### + +# +# You can specify an address to listen to for discovery announcements. +# Multicast addresses are supported. If no address is specified the default +# broadcast address is used. +# +config 'daemon' 'discovery' + option address 225.0.12.5 +# option timeout 5 + +config 'network' + option type tcp + option interface eth0 + option port 4556 +# option discovery yes + +#config 'network' +# option type tcp +# option interface wlan0 +# option port 4556 +# option discovery no + + +##################################### +# bundle security protocol # +##################################### + +# +# the level specifies the security constains +# +# 0 = no constrains (default) +# 1 = accept only BAB authenticated bundles +# 2 = accept only encrypted bundles +# 3 = accept only BAB authenticated and encrypted bundles +# + +config 'daemon' 'security' + option level 0 + option bab_key /path/to/default-bab-key.mac + option key_path /path/to/security-keys diff --git a/ibrdtnd/files/mkcontainer.sh b/ibrdtnd/files/mkcontainer.sh new file mode 100644 index 0000000..5718111 --- /dev/null +++ b/ibrdtnd/files/mkcontainer.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# +# This script creates a bundle storage of a given size. +# +# $1 = container file +# $2 = size of the container in MB +# + +help_message() { + echo "usage: " + echo " $0 " +} + +if [ $# -le 1 ]; then + help_message + exit 1 +fi + +CONTAINER=$(cd "$(dirname "$1")"; pwd)/$(basename $1) +SIZE=$2 + +# check if the container already exists +if [ -f $CONTAINER ]; then + echo "Aborted! The specified container already exists." + exit 1 +fi + +# create the container +echo -n "creating the container file..." +/bin/dd if=/dev/zero of=$CONTAINER bs=1M count=$SIZE >/dev/null 2>/dev/null +echo " done" + +# create file system +echo -n "initializing ext3 filesystem for the container..." +/usr/sbin/mkfs.ext3 -q -F $CONTAINER > /dev/null +echo " done" + +# final hint +echo "The container is now ready. To use it with IBR-DTN set the container with:" +echo "# uci set ibrdtn.storage.container=$CONTAINER" +echo "# uci set ibrdtn.storage.container_size=$SIZE" + +exit 0 diff --git a/ibrdtnd/files/mountcontainer.sh b/ibrdtnd/files/mountcontainer.sh new file mode 100644 index 0000000..c292c1a --- /dev/null +++ b/ibrdtnd/files/mountcontainer.sh @@ -0,0 +1,118 @@ +#!/bin/sh +# + +CONTAINER=`/sbin/uci -q get ibrdtn.storage.container` +CPATH=`/sbin/uci -q get ibrdtn.storage.path` + +check_var() { + if [ -z "$1" ]; then + echo "$2" + exit 1 + fi +} + +check_path() { + if [ ! -d "$1" ]; then + echo "$2" + return 1 + fi +} + +check_file() { + if [ ! -f "$1" ]; then + echo "$2" + exit 1 + fi +} + +container_mount() { + CONTAINER=`/sbin/uci -q get ibrdtn.storage.container` + CPATH=`/sbin/uci -q get ibrdtn.storage.path` + + # try to mount the container + /bin/mount -o loop $CONTAINER $CPATH + + return $? +} + +container_reinitialize() { + SIZE=`/sbin/uci get -q ibrdtn.storage.container_size` + CONTAINER=`/sbin/uci -q get ibrdtn.storage.container` + + # try to rebuild the container + if [ -n "$SIZE" ]; then + /bin/rm -f $CONTAINER + /usr/share/ibrdtn/mkcontainer.sh $CONTAINER $SIZE + + if [ $? -eq 0 ]; then + container_mount + return $? + fi + + return 1 + fi + + return 1 +} + +check_var $CONTAINER "Storage container not set in uci.\nuse: uci set ibrdtn.storage.container=" +check_var $CPATH "Storage container mount path not set in uci.\nuse: uci set ibrdtn.storage.path=" + +check_path $CPATH "Storage container mount path does not exist." +if [ $? -gt 0 ]; then + /bin/mkdir -p $CPATH + + if [ $? -gt 0 ]; then + echo "can not create container mount path." + exit 1 + fi +fi + +if [ "$1" == "-u" ]; then + /bin/umount $CPATH + exit 0 +fi + +if [ -n "`/bin/mount | grep $CPATH`" ]; then + echo "Container already mounted" + exit 0 +fi + +if [ ! -f "$CONTAINER" ]; then + echo "Storage container file $CONTAINER does not exist." + container_reinitialize + exit $? +fi + +# try to mount the container +container_mount + +if [ $? -gt 0 ]; then + echo -n "can not mount container file. checking... " + /usr/sbin/e2fsck -p $CONTAINER + + if [ $? -gt 0 ]; then + echo " error" + echo "Container file $CONTAINER broken. Try to reinitialize the container." + container_reinitialize + + if [ $? -eq 0 ]; then + echo "container ready!" + exit 0 + else + exit 1 + fi + fi + echo "done" + + container_mount + + if [ $? -gt 0 ]; then + echo "mount failed!" + exit 1 + fi +fi + +echo "container ready!" +exit 0 + diff --git a/ibrdtnd/files/safety-wrapper.sh b/ibrdtnd/files/safety-wrapper.sh new file mode 100644 index 0000000..e07ebe7 --- /dev/null +++ b/ibrdtnd/files/safety-wrapper.sh @@ -0,0 +1,172 @@ +#!/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="-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 + diff --git a/ibrdtnd/files/systemcheck.sh b/ibrdtnd/files/systemcheck.sh new file mode 100644 index 0000000..cf72a2e --- /dev/null +++ b/ibrdtnd/files/systemcheck.sh @@ -0,0 +1,64 @@ +#!/bin/sh +# +# + +check_mounted() { + DIR=$1 + while [ "$DIR" != "/" ]; do + if [ -n "`mount | grep "$DIR"`" ]; then + return 0 + fi + + DIR=`dirname $DIR` + done + return 1 +} + +check_writable() { + CHECKFILE="$1/.container-lock" + /bin/touch $CHECKFILE + + if [ $? -gt 0 ]; then + return 1; + fi + + /bin/echo "0123456789" >> $CHECKFILE + + if [ $? -gt 0 ]; then + return 2; + fi + + /bin/rm $CHECKFILE + + if [ $? -gt 0 ]; then + return 3; + fi +} + +# get the path for the container +CONTAINER=`uci -q get ibrdtn.storage.container` + +if [ -z "$CONTAINER" ]; then + exit 0 +fi + +CONTAINER_PATH=`dirname $CONTAINER` + +if [ -n "$CONTAINER_PATH" ]; then + # check if the container is on a mounted device + check_mounted $CONTAINER_PATH + + if [ $? -gt 0 ]; then + # failed + exit 1 + fi + + # check if the device is writable + check_writable $CONTAINER_PATH + + if [ $? -gt 0 ]; then + # failed + exit 1 + fi +fi +