From 23983d7a66b1cd97e9f688ec6b3e5fedb3679a6a Mon Sep 17 00:00:00 2001 From: Moritz Warning Date: Wed, 4 Jan 2017 18:26:21 +0100 Subject: [PATCH] zerotier: add initial package Signed-off-by: Moritz Warning --- net/zerotier/Config.in | 24 ++++++ net/zerotier/Makefile | 85 +++++++++++++++++++ net/zerotier/files/zerotier.config | 7 ++ net/zerotier/files/zerotier.init | 71 ++++++++++++++++ ...ng-under-MUSL-libc-e.g.-Alpine-Linux.patch | 44 ++++++++++ net/zerotier/patches/0002-fix-build.patch | 36 ++++++++ .../0003-workaround_to_avoid_seg_faults.patch | 27 ++++++ .../0005-use-internal-miniupnpc-and-natpmp | 35 ++++++++ 8 files changed, 329 insertions(+) create mode 100644 net/zerotier/Config.in create mode 100644 net/zerotier/Makefile create mode 100644 net/zerotier/files/zerotier.config create mode 100644 net/zerotier/files/zerotier.init create mode 100644 net/zerotier/patches/0001-Fix-for-running-under-MUSL-libc-e.g.-Alpine-Linux.patch create mode 100644 net/zerotier/patches/0002-fix-build.patch create mode 100644 net/zerotier/patches/0003-workaround_to_avoid_seg_faults.patch create mode 100644 net/zerotier/patches/0005-use-internal-miniupnpc-and-natpmp diff --git a/net/zerotier/Config.in b/net/zerotier/Config.in new file mode 100644 index 000000000..dd6f2caab --- /dev/null +++ b/net/zerotier/Config.in @@ -0,0 +1,24 @@ +menu "Configuration" + depends on PACKAGE_zerotier + +config ZEROTIER_ENABLE_DEBUG + bool "Build in debug mode" + depends on PACKAGE_zerotier + default n + +config ZEROTIER_USE_MINIUPNPC + bool "Build with MiniUPnPc" + depends on PACKAGE_zerotier + default n + +config ZEROTIER_ENABLE_NETWORK_CONTROLLER + bool "Build with network controller" + depends on PACKAGE_zerotier + default n + +config ZEROTIER_ENABLE_SELFTEST + bool "Build a self test program" + depends on PACKAGE_zerotier + default n + +endmenu diff --git a/net/zerotier/Makefile b/net/zerotier/Makefile new file mode 100644 index 000000000..4b58ef0cd --- /dev/null +++ b/net/zerotier/Makefile @@ -0,0 +1,85 @@ +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=zerotier +PKG_VERSION:=1.1.14 +PKG_RELEASE:=4 + +PKG_LICENSE:=GPL-3.0 + +PKG_SOURCE:=$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/zerotier/ZeroTierOne/archive/ +PKG_SOURCE_SUBDIR:=ZeroTierOne-$(PKG_VERSION) +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR) +PKG_MD5SUM:=5e381f0864797886b3b3bf20beb49bba + +PKG_BUILD_DEPENDS:=uclibcxx +PKG_BUILD_PARALLEL:=1 +include $(INCLUDE_DIR)/package.mk + +define Package/zerotier + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libpthread +kmod-tun +ip +ZEROTIER_ENABLE_NETWORK_CONTROLLER:libsqlite3 +ZEROTIER_USE_MINIUPNPC:libminiupnpc +ZEROTIER_USE_MINIUPNPC:libnatpmp + TITLE:=Create flat virtual Ethernet networks of almost unlimited size + URL:=https://www.zerotier.com + SUBMENU:=VPN + MAINTAINER:=Moritz Warning +endef + +define Package/zerotier/description + ZeroTier creates a global provider-independent virtual private cloud network. +endef + +define Package/zerotier/config + source "$(SOURCE)/Config.in" +endef + +ifeq ($(CONFIG_ZEROTIER_ENABLE_NETWORK_CONTROLLER),y) +MAKE_FLAGS += ZT_ENABLE_NETWORK_CONTROLLER=1 +MAKE_FLAGS += LDLIBS+=" -lsqlite3 " +endif + +ifeq ($(CONFIG_ZEROTIER_USE_MINIUPNPC),y) +MAKE_FLAGS += ZT_USE_MINIUPNPC=1 +endif + +ifeq ($(CONFIG_ZEROTIER_ENABLE_DEBUG),y) +TARGET_CXXFLAGS += -DZT_TRACE -ggdb3 +endif + +MAKE_FLAGS += \ + DEFS="" \ + LDFLAGS+=" -L$(STAGING_DIR)/usr/lib/uClibc++ -pthread " \ + LDLIBS+=" -fno-builtin -nodefaultlibs -Wl,-Bstatic -luClibc++ -Wl,-Bdynamic -lpthread -lm -lc -lsupc++ -lc -lgcc -lgcc_eh -lgcc_s -lssp_nonshared " \ + CXXFLAGS+=" -fno-builtin -nostdinc++ -I$(STAGING_DIR)/usr/include/uClibc++ -DGCC_HASCLASSVISIBILITY -Wall -fPIE -fvisibility=hidden " + +define Build/Compile + $(call Build/Compile/Default,one) +ifeq ($(CONFIG_ZEROTIER_ENABLE_SELFTEST),y) + $(call Build/Compile/Default,selftest) +endif +endef + +define Package/zerotier/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/zerotier-one $(1)/usr/bin/ + $(LN) zerotier-one $(1)/usr/bin/zerotier-cli + $(LN) zerotier-one $(1)/usr/bin//zerotier-idtool + +ifeq ($(CONFIG_ZEROTIER_ENABLE_SELFTEST),y) + $(INSTALL_BIN) $(PKG_BUILD_DIR)/zerotier-selftest $(1)/usr/bin/ +endif + + $(INSTALL_DIR) $(1)/etc/init.d/ + $(INSTALL_BIN) files/zerotier.init $(1)/etc/init.d/zerotier + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) files/zerotier.config $(1)/etc/config/zerotier +endef + +$(eval $(call BuildPackage,zerotier)) + diff --git a/net/zerotier/files/zerotier.config b/net/zerotier/files/zerotier.config new file mode 100644 index 000000000..d9c33de27 --- /dev/null +++ b/net/zerotier/files/zerotier.config @@ -0,0 +1,7 @@ + +config zerotier sample_config + option enabled 1 + option interface 'wan' # restart ZT when wan status changed + #option port '9993' + option secret 'generate' # generate secret on first start + list join '8056c2e21c000001' # a public network called Earth diff --git a/net/zerotier/files/zerotier.init b/net/zerotier/files/zerotier.init new file mode 100644 index 000000000..dd1832771 --- /dev/null +++ b/net/zerotier/files/zerotier.init @@ -0,0 +1,71 @@ +#!/bin/sh /etc/rc.common + +START=90 + +USE_PROCD=1 + +LIST_SEP=" +" +ZT_COMMAND=/usr/bin/zerotier-one + +section_enabled() { + config_get_bool enabled "$1" 'enabled' 0 + [ $enabled -gt 0 ] +} + +start_instance() { + local cfg="$1" + local port secret interface + local ARGS="" + + section_enabled "$cfg" || return 1 + + mkdir -p /var/lib/zerotier-one/networks.d/ + + config_get_bool port $cfg 'port' + config_get secret $cfg 'secret' + config_get interface $cfg 'interface' + + if [ -n "$port" ]; then + ARGS="$ARGS -p$port" + fi + + if [ "$secret" = "generate" ]; then + echo "Generate secret - please wait..." + local tmp="/tmp/zt.$cfg.secret" + zerotier-idtool generate "$tmp" > /dev/null + secret="$(cat $tmp)" + rm "$tmp" + + uci set zerotier.$cfg.secret="$secret" + uci commit zerotier + fi + + if [ -n "$secret" ]; then + echo "$secret" > /var/lib/zerotier-one/identity.secret + #make sure there is not previous dentity.public + rm -f /var/lib/zerotier-one/identity.public + fi + + add_join() { + #an (empty) config file will cause ZT to join a network + touch /var/lib/zerotier-one/networks.d/$1.conf + } + + config_list_foreach $cfg 'join' add_join + + procd_open_instance + procd_add_reload_interface_trigger "$interface" + procd_set_param command $ZT_COMMAND $ARGS + procd_set_param nice -10 + procd_close_instance +} + +service_triggers() { + procd_add_reload_trigger zerotier +} + +start_service() { + config_load 'zerotier' + config_foreach start_instance 'zerotier' +} diff --git a/net/zerotier/patches/0001-Fix-for-running-under-MUSL-libc-e.g.-Alpine-Linux.patch b/net/zerotier/patches/0001-Fix-for-running-under-MUSL-libc-e.g.-Alpine-Linux.patch new file mode 100644 index 000000000..119491fd9 --- /dev/null +++ b/net/zerotier/patches/0001-Fix-for-running-under-MUSL-libc-e.g.-Alpine-Linux.patch @@ -0,0 +1,44 @@ +From 830250759cd4c14ca2ae5ddf24f0a0427f258622 Mon Sep 17 00:00:00 2001 +From: Adam Ierymenko +Date: Tue, 26 Jul 2016 16:36:20 -0700 +Subject: [PATCH 1/2] Fix for running under MUSL libc (e.g. Alpine Linux) + +--- + osdep/Thread.hpp | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/osdep/Thread.hpp b/osdep/Thread.hpp +index 7fb38d8..4f90dc0 100644 +--- a/osdep/Thread.hpp ++++ b/osdep/Thread.hpp +@@ -125,6 +125,10 @@ public: + throw() + { + memset(&_tid,0,sizeof(_tid)); ++ pthread_attr_init(&_tattr); ++#ifdef __LINUX__ ++ pthread_attr_setstacksize(&_tattr,8388608); // for MUSL libc and others, has no effect in normal glibc environments ++#endif + _started = false; + } + +@@ -157,7 +161,7 @@ public: + { + Thread t; + t._started = true; +- if (pthread_create(&t._tid,(const pthread_attr_t *)0,&___zt_threadMain,instance)) ++ if (pthread_create(&t._tid,&t._tattr,&___zt_threadMain,instance)) + throw std::runtime_error("pthread_create() failed, unable to create thread"); + return t; + } +@@ -184,6 +188,7 @@ public: + + private: + pthread_t _tid; ++ pthread_attr_t _tattr; + volatile bool _started; + }; + +-- +2.9.0 + diff --git a/net/zerotier/patches/0002-fix-build.patch b/net/zerotier/patches/0002-fix-build.patch new file mode 100644 index 000000000..8ca9bc8d6 --- /dev/null +++ b/net/zerotier/patches/0002-fix-build.patch @@ -0,0 +1,36 @@ +From 333bbabc6dfad0553fb63d560ab6442a50cc9e52 Mon Sep 17 00:00:00 2001 +From: Moritz Warning +Date: Fri, 22 Jul 2016 23:27:31 +0200 +Subject: [PATCH 2/2] fix build + +--- + make-linux.mk | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +Index: ZeroTierOne-1.1.14/make-linux.mk +=================================================================== +--- ZeroTierOne-1.1.14.orig/make-linux.mk ++++ ZeroTierOne-1.1.14/make-linux.mk +@@ -39,19 +39,19 @@ include objects.mk + + # On Linux we auto-detect the presence of some libraries and if present we + # link against the system version. This works with our package build images. +-ifeq ($(wildcard /usr/include/lz4.h),) ++ifeq ($(wildcard $(STAGING_DIR)/usr/include/lz4.h),) + OBJS+=ext/lz4/lz4.o + else + LDLIBS+=-llz4 + DEFS+=-DZT_USE_SYSTEM_LZ4 + endif +-ifeq ($(wildcard /usr/include/http_parser.h),) ++ifeq ($(wildcard $(STAGING_DIR)/usr/include/http_parser.h),) + OBJS+=ext/http-parser/http_parser.o + else + LDLIBS+=-lhttp_parser + DEFS+=-DZT_USE_SYSTEM_HTTP_PARSER + endif +-ifeq ($(wildcard /usr/include/json-parser/json.h),) ++ifeq ($(wildcard $(STAGING_DIR)/usr/include/json-parser/json.h),) + OBJS+=ext/json-parser/json.o + else + LDLIBS+=-ljsonparser diff --git a/net/zerotier/patches/0003-workaround_to_avoid_seg_faults.patch b/net/zerotier/patches/0003-workaround_to_avoid_seg_faults.patch new file mode 100644 index 000000000..e27f872e9 --- /dev/null +++ b/net/zerotier/patches/0003-workaround_to_avoid_seg_faults.patch @@ -0,0 +1,27 @@ +From 21f4958bd48cae59b478b1b3445e00fa4fb18991 Mon Sep 17 00:00:00 2001 +From: muebau +Date: Fri, 5 Aug 2016 19:22:45 +0200 +Subject: [PATCH] OpenWRT workaround to avoid seg faults + +--- + service/OneService.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/service/OneService.cpp b/service/OneService.cpp +index 13820f5..9ba3238 100644 +--- a/service/OneService.cpp ++++ b/service/OneService.cpp +@@ -862,8 +862,8 @@ public: + } + + // Start two background threads to handle expensive ops out of line +- Thread::start(_node); +- Thread::start(_node); ++ //Thread::start(_node); ++ //Thread::start(_node); + + _nextBackgroundTaskDeadline = 0; + uint64_t clockShouldBe = OSUtils::now(); +-- +2.7.4 + diff --git a/net/zerotier/patches/0005-use-internal-miniupnpc-and-natpmp b/net/zerotier/patches/0005-use-internal-miniupnpc-and-natpmp new file mode 100644 index 000000000..8fe92847c --- /dev/null +++ b/net/zerotier/patches/0005-use-internal-miniupnpc-and-natpmp @@ -0,0 +1,35 @@ +Index: ZeroTierOne-1.1.14/make-linux.mk +=================================================================== +--- ZeroTierOne-1.1.14.orig/make-linux.mk ++++ ZeroTierOne-1.1.14/make-linux.mk +@@ -64,7 +64,7 @@ ifeq ($(ZT_USE_MINIUPNPC),1) + DEFS+=-DZT_USE_MINIUPNPC + + # Auto-detect libminiupnpc at least v2.0 +- MINIUPNPC_IS_NEW_ENOUGH=$(shell grep -sqr '.*define.*MINIUPNPC_VERSION.*"2.."' /usr/include/miniupnpc/miniupnpc.h && echo 1) ++ MINIUPNPC_IS_NEW_ENOUGH=$(shell grep -sqr '.*define.*MINIUPNPC_VERSION.*"2.."' $(STAGING_DIR)/usr/include/miniupnpc/miniupnpc.h && echo 1) + ifeq ($(MINIUPNPC_IS_NEW_ENOUGH),1) + DEFS+=-DZT_USE_SYSTEM_MINIUPNPC + LDLIBS+=-lminiupnpc +@@ -74,7 +74,7 @@ ifeq ($(ZT_USE_MINIUPNPC),1) + endif + + # Auto-detect libnatpmp +- ifeq ($(wildcard /usr/include/natpmp.h),) ++ ifeq ($(wildcard $(STAGING_DIR)/usr/include/natpmp.h),) + OBJS+=ext/libnatpmp/natpmp.o ext/libnatpmp/getgateway.o + else + LDLIBS+=-lnatpmp +Index: ZeroTierOne-1.1.14/osdep/PortMapper.cpp +=================================================================== +--- ZeroTierOne-1.1.14.orig/osdep/PortMapper.cpp ++++ ZeroTierOne-1.1.14/osdep/PortMapper.cpp +@@ -180,7 +180,7 @@ public: + struct IGDdatas data; + + int upnpError = 0; +- UPNPDev *devlist = upnpDiscoverAll(5000,(const char *)0,(const char *)0,0,0,2,&upnpError); ++ UPNPDev *devlist = upnpDiscoverAll(5000,(const char *)0,(const char *)0,0,0,&upnpError); + if (devlist) { + + #ifdef ZT_PORTMAPPER_TRACE