tunneldigger: add package for establishing L2TPv3 tunnels over UDP

In the previous commit we already added tunneldigger-broker. Add the
corresponding client.

This PR is just a refactoring of the already existing opkg package from
wlanslovenija [0].

[0] - https://github.com/wlanslovenija/firmware-packages-opkg/tree/master/net/tunneldigger

Signed-off-by: Nick Hainke <vincent@systemli.org>
This commit is contained in:
Nick Hainke 2023-06-08 14:34:09 +02:00
parent 8298ce8234
commit bd2b4f311a
3 changed files with 132 additions and 0 deletions

57
net/tunneldigger/Makefile Normal file
View File

@ -0,0 +1,57 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=tunneldigger
PKG_RELEASE:=1
PKG_SOURCE_URL:=https://github.com/wlanslovenija/tunneldigger.git
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=4f72b30578ac3dbc5482f4a54054bf870355bdf5
PKG_MIRROR_HASH:=babc71c757b757026f63e298bd4bd0edceae220827fff5cfad0af3f04ed529c7
PKG_MAINTAINER:=Nick Hainke <vincent@systemli.org>
PKG_LICENSE:=AGPL-3.0
PKG_LICENSE_FILES:=COPYING
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk
CMAKE_SOURCE_SUBDIR:=client
define Package/tunneldigger
SECTION:=net
CATEGORY:=Network
DEPENDS:= \
+kmod-l2tp \
+kmod-l2tp-ip \
+kmod-l2tp-eth \
+libnl-tiny \
+libpthread \
+librt
TITLE:=L2TPv3 tunneling via UDP
URL:=https://github.com/wlanslovenija/tunneldigger
endef
TARGET_CFLAGS += \
-I$(STAGING_DIR)/usr/include/libnl-tiny \
-I$(STAGING_DIR)/usr/include \
-DLIBNL_TINY
define Package/tunneldigger/description
Tunneldigger is a simple VPN tunneling solution based on the Linux kernel
support for L2TPv3 tunnels over UDP.
endef
define Package/tunneldigger/conffiles
/etc/config/tunneldigger
endef
define Package/tunneldigger/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/tunneldigger $(1)/usr/bin/tunneldigger
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/tunneldigger.init $(1)/etc/init.d/tunneldigger
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DATA) ./files/config.default $(1)/etc/config/tunneldigger
endef
$(eval $(call BuildPackage,tunneldigger))

View File

@ -0,0 +1,8 @@
config broker
list address 'x.y.z.w:8942'
list address 'x.y.z.w:53'
list address 'x.y.z.w:123'
option uuid 'abcd'
option interface 'l2tp0'
option limit_bw_down '1024'
option enabled '0'

View File

@ -0,0 +1,67 @@
#!/bin/sh /etc/rc.common
. $IPKG_INSTROOT/lib/functions/network.sh
USE_PROCD=1
START=90
tunnel_id=1
missing() {
echo "Not starting tunneldigger - missing $1" >&2
}
parse_broker() {
local section="$1"
config_get_bool enabled "$section" enabled 1
config_get addresses "$section" address
config_get uuid "$section" uuid
config_get interface "$section" interface
config_get limit_bw_down "$section" limit_bw_down
config_get hook_script "$section" hook_script
config_get bind_interface "$section" bind_interface
[ $enabled -eq 0 ] && return
local broker_opts=""
for address in $addresses; do
append broker_opts "-b ${address}"
done
[ ! -z "${limit_bw_down}" ] && append broker_opts "-L ${limit_bw_down}"
[ ! -z "${hook_script}" ] && append broker_opts "-s ${hook_script}"
[ ! -z "${bind_interface}" ] && {
# Resolve logical interface name.
unset _bind_interface
network_get_device _bind_interface "${bind_interface}" || _bind_interface="${bind_interface}"
append broker_opts "-I ${_bind_interface}"
}
if [ -z "$uuid" ]; then
missing uuid
return
elif [ -z "$interface" ]; then
missing interface
return
fi
procd_open_instance "tunneldigger_${tunnel_id}"
procd_set_param command "/usr/bin/tunneldigger"
procd_append_param command -f
procd_append_param command -u "${uuid}"
procd_append_param command -i "${interface}"
procd_append_param command -t "${tunnel_id}"
procd_append_param command ${broker_opts}
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
let tunnel_id++
}
start_service() {
config_load tunneldigger
config_foreach parse_broker broker
}