#!/bin/sh /etc/rc.common
# Copyright (C) 2015 OpenWrt.org

START=50
STOP=10

USE_PROCD=1
PROG=/usr/lib/gnunet/libexec/gnunet-service-arm

GNUNET_HOME=/var/run/gnunet
LOGFILE=$GNUNET_HOME/gnunet.log
CONFIGFILE=$GNUNET_HOME/gnunet.conf
SUID_ROOT_HELPERS="exit nat-server nat-client transport-bluetooth transport-wlan vpn"

chmodown_execbin() {
	execname=/usr/lib/gnunet/libexec/gnunet-$1
	if [ -x $execname ]; then
		chmod $2 $execname
		[ "$3" ] && chown $3 $execname
	fi
}

fix_libexec_permissions() {
	[ -e /usr/share/gnunet/.permfix ] && return
	for helper in $SUID_ROOT_HELPERS; do
		chmodown_execbin helper-$helper u+s
	done
	chmodown_execbin helper-dns 4750 root:gnunetdns
	chmodown_execbin service-dns 2750 root:gnunetdns

	touch /usr/share/gnunet/.permfix
}

prepare_config() {
	if [ ! -e "$GNUNET_HOME" ]; then
		mkdir -p $GNUNET_HOME
		chown gnunet:gnunet $GNUNET_HOME
		chmod 0750 $GNUNET_HOME
	fi
	touch $CONFIGFILE
	chown root:gnunet $CONFIGFILE
	chmod 0640 $CONFIGFILE
	gnunet-config -c $CONFIGFILE -s PATHS -o GNUNET_HOME -V $GNUNET_HOME

	# minimal persistency in /etc/gnunet
	[ ! -d /etc/gnunet ] && {
		mkdir -p /etc/gnunet
		chown gnunet:gnunet /etc/gnunet
	}
	gnunet-config -c $CONFIGFILE -s PATHS -o GNUNET_CONFIG_HOME -V /etc/gnunet
	gnunet-config -c $CONFIGFILE -s PEER -o PRIVATE_KEY -V /etc/gnunet/private_key.ecc
	gnunet-config -c $CONFIGFILE -s identity -o EGODIR -V /etc/gnunet/identity/egos
	gnunet-config -c $CONFIGFILE -s revocation -o DATABASE -V /etc/gnunet/revocation.dat
	gnunet-config -c $CONFIGFILE -s nse -o PROOFFILE -V /etc/gnunet/proof.dat
	gnunet-config -c $CONFIGFILE -s namestore-sqlite -o FILENAME -V /etc/gnunet/namestore.sqlite

	# minimal datastore (todo: make this configurable)
	gnunet-config -c $CONFIGFILE -s datastore -o DATABASE -V heap
	gnunet-config -c $CONFIGFILE -s datastore -o QUOTA -V "4 MB"
	gnunet-config -c $CONFIGFILE -s fs -o CONTENT_PUSHING -V NO
	gnunet-config -c $CONFIGFILE -s fs -o CONTENT_CACHING -V NO

	# limit dhtcache memory usage to 4 MB
	gnunet-config -c $CONFIGFILE -s dhtcache -o QUOTA -V "4 MB"

	# enable dns2gns
	gnunet-config -c $CONFIGFILE -s dns2gns -o AUTOSTART -V YES
	gnunet-config -c $CONFIGFILE -s dns2gns -o FORCESTART -V YES

	# enable all installed transport plugins
	transport_plugins=$(gnunet-config -c $CONFIGFILE -s transport -o PLUGINS)
	for transplug in /usr/lib/gnunet/libgnunet_plugin_transport_*.so; do
		transplug=$( echo $transplug |
			sed -ne 's!^.*_transport_\(.*\)\.so$!\1!p' )
		[ -n "$( echo $transport_plugins | grep $transplug )" ] ||
			transport_plugins="$transport_plugins $transplug"
	done
	gnunet-config -c $CONFIGFILE -s transport -o PLUGINS -V "$transport_plugins"

	gnunet-config -c $CONFIGFILE -s pt -o FORCESTART -V YES
	gnunet-config -c $CONFIGFILE -s exit -o AUTOSTART -V YES
	gnunet-config -c $CONFIGFILE -s exit -o FORCESTART -V YES
	gnunet-config -c $CONFIGFILE -s exit -o EXIT_IPV4 -V YES
	# ssh and www services
#	gnunet-config -c $CONFIGFILE -s exit -o EXIT_RANGE_IPV4_POLICY -V "169.254.86.1:22;169.254.86.1:80;"
#	gnunet-config -c $CONFIGFILE -s ssh.gnunet. -o TCP_REDIRECTS -V "22:169.254.86.1:22"
#	gnunet-config -c $CONFIGFILE -s www.gnunet. -o TCP_REDIRECTS -V "80:169.254.86.1:80"
	# iperf (TCP) and echo (UDP) for battlemesh
	gnunet-config -c $CONFIGFILE -s exit -o EXIT_RANGE_IPV4_POLICY -V "169.254.86.1:7;169.254.86.1:5201;"
	gnunet-config -c $CONFIGFILE -s iperf.gnunet. -o TCP_REDIRECTS -V "5201:169.254.86.1:5201"
	gnunet-config -c $CONFIGFILE -s echo.gnunet. -o UDP_REDIRECTS -V "7:169.254.86.1:7"
}

start_service() {
	fix_libexec_permissions
	prepare_config

	procd_open_instance
	procd_set_param user gnunet
	procd_set_param command $PROG -c $CONFIGFILE -l $LOGFILE
	procd_set_param respawn
	procd_close_instance
}
