From 6c536e3c19fc9d9b044145633998beafe0e0e180 Mon Sep 17 00:00:00 2001
From: xinyangli <lixinyang411@gmail.com>
Date: Wed, 22 May 2024 11:44:24 +0800
Subject: [PATCH] dae: copied from immortalwrt

---
 net/dae/Makefile         | 127 +++++++++++++++++++++++++++++++++++++++
 net/dae/files/dae.config |   7 +++
 net/dae/files/dae.init   |  56 +++++++++++++++++
 net/dae/test.sh          |   7 +++
 4 files changed, 197 insertions(+)
 create mode 100644 net/dae/Makefile
 create mode 100644 net/dae/files/dae.config
 create mode 100644 net/dae/files/dae.init
 create mode 100644 net/dae/test.sh

diff --git a/net/dae/Makefile b/net/dae/Makefile
new file mode 100644
index 0000000..af2575c
--- /dev/null
+++ b/net/dae/Makefile
@@ -0,0 +1,127 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (C) 2023 ImmortalWrt.org
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=dae
+PKG_VERSION:=0.5.1
+PKG_RELEASE:=3
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
+PKG_SOURCE_URL:=https://github.com/daeuniverse/dae/releases/download/v$(PKG_VERSION)/dae-full-src.zip?
+PKG_HASH:=aad00888f7f3e8fae916297fede68d067894b5534148d261122bde2e7bba0b98
+
+PKG_LICENSE:=AGPL-3.0-only
+PKG_LICENSE_FILE:=LICENSE
+PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
+
+PKG_BUILD_DEPENDS:=golang/host bpf-headers
+PKG_BUILD_PARALLEL:=1
+PKG_BUILD_FLAGS:=no-mips16
+
+GO_PKG:=github.com/daeuniverse/dae
+GO_PKG_LDFLAGS_X:= \
+	$(GO_PKG)/cmd.Version=$(PKG_VERSION) \
+	$(GO_PKG)/common/consts.MaxMatchSetLen_=64
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/bpf.mk
+include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk
+
+UNZIP_CMD:=unzip -q -d $(PKG_BUILD_DIR) $(DL_DIR)/$(PKG_SOURCE)
+
+define Package/dae/Default
+  SECTION:=net
+  CATEGORY:=Network
+  SUBMENU:=Web Servers/Proxies
+  URL:=https://github.com/daeuniverse/dae
+endef
+
+define Package/dae
+  $(call Package/dae/Default)
+  TITLE:=A lightweight and high-performance transparent proxy solution
+  # You need enable KERNEL_DEBUG_INFO_BTF and KERNEL_BPF_EVENTS
+  DEPENDS:=$(GO_ARCH_DEPENDS) $(BPF_DEPENDS)  \
+    +ca-bundle +kmod-sched-core +kmod-sched-bpf +kmod-xdp-sockets-diag \
+    +kmod-veth
+endef
+
+define Package/dae-geoip
+  $(call Package/dae/Default)
+  TITLE:=geoip for dae
+  DEPENDS:=+dae +v2ray-geoip
+  PKGARCH:=all
+endef
+
+define Package/dae-geosite
+  $(call Package/dae/Default)
+  TITLE:=geosite for dae
+  DEPENDS:=+dae +v2ray-geosite
+  PKGARCH:=all
+endef
+
+define Package/dae/description
+  dae, means goose, is a lightweight and high-performance transparent
+  proxy solution.
+
+  In order to improve the traffic diversion performance as much as possible,
+  dae runs the transparent proxy and traffic diversion suite in the linux
+  kernel by eBPF. Therefore, we have the opportunity to make the direct
+  traffic bypass the forwarding by proxy application and achieve true direct
+  traffic through. Under such a magic trick, there is almost no performance
+  loss and additional resource consumption for direct traffic.
+endef
+
+define Package/dae/conffiles
+/etc/dae/config.dae
+/etc/config/dae
+endef
+
+DAE_CFLAGS:= \
+	-O2 -Wall -Werror \
+	-DMAX_MATCH_SET_LEN=64 \
+	-I$(BPF_HEADERS_DIR)/tools/lib \
+	-I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/asm/mach-generic
+
+define Build/Compile
+	( \
+		$(GO_GENERAL_BUILD_CONFIG_VARS) \
+		$(GO_PKG_BUILD_CONFIG_VARS) \
+		$(GO_PKG_BUILD_VARS) \
+		BPF_CLANG="$(CLANG)" \
+		BPF_STRIP_FLAG="-strip=$(LLVM_STRIP)" \
+		BPF_CFLAGS="$(DAE_CFLAGS)" \
+		BPF_TARGET="bpfel,bpfeb" \
+		go generate $(PKG_BUILD_DIR)/control/control.go ; \
+		$(call GoPackage/Build/Compile) ; \
+	)
+endef
+
+define Package/dae/install
+	$(call GoPackage/Package/Install/Bin,$(1))
+
+	$(INSTALL_DIR) $(1)/etc/dae/
+	$(INSTALL_CONF) $(PKG_BUILD_DIR)/example.dae $(1)/etc/dae/
+
+	$(INSTALL_DIR) $(1)/etc/config
+	$(INSTALL_CONF) $(CURDIR)/files/dae.config $(1)/etc/config/dae
+
+	$(INSTALL_DIR) $(1)/etc/init.d
+	$(INSTALL_BIN) $(CURDIR)/files/dae.init $(1)/etc/init.d/dae
+endef
+
+define Package/dae-geoip/install
+	$(INSTALL_DIR) $(1)/usr/share/dae
+	$(LN) ../v2ray/geoip.dat $(1)/usr/share/dae/geoip.dat
+endef
+
+define Package/dae-geosite/install
+	$(INSTALL_DIR) $(1)/usr/share/dae
+	$(LN) ../v2ray/geosite.dat $(1)/usr/share/dae/geosite.dat
+endef
+
+$(eval $(call GoBinPackage,dae))
+$(eval $(call BuildPackage,dae))
+$(eval $(call BuildPackage,dae-geoip))
+$(eval $(call BuildPackage,dae-geosite))
diff --git a/net/dae/files/dae.config b/net/dae/files/dae.config
new file mode 100644
index 0000000..7575e2f
--- /dev/null
+++ b/net/dae/files/dae.config
@@ -0,0 +1,7 @@
+
+config dae 'config'
+	option enabled '0'
+	option config_file '/etc/dae/config.dae'
+	option log_maxbackups '1'
+	option log_maxsize '1'
+
diff --git a/net/dae/files/dae.init b/net/dae/files/dae.init
new file mode 100644
index 0000000..4e63c7e
--- /dev/null
+++ b/net/dae/files/dae.init
@@ -0,0 +1,56 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2023 Tianling Shen <cnsztl@immortalwrt.org>
+
+USE_PROCD=1
+START=99
+
+extra_command "hot_reload" "Hot-reload service"
+
+CONF="dae"
+PROG="/usr/bin/dae"
+LOG_DIR="/var/log/dae"
+
+start_service() {
+	config_load "$CONF"
+
+	local enabled
+	config_get_bool enabled "config" "enabled" "0"
+	[ "$enabled" -eq "1" ] || return 1
+
+	local config_file
+	config_get config_file "config" "config_file" "/etc/dae/config.dae"
+
+	"$PROG" validate -c "$config_file" || return 1
+
+	local log_maxbackups log_maxsize
+	config_get log_maxbackups "config" "log_maxbackups" "1"
+	config_get log_maxsize "config" "log_maxsize" "1"
+
+	procd_open_instance "$CONF"
+	procd_set_param command "$PROG" run
+	procd_append_param command --config "$config_file"
+	procd_append_param command --disable-timestamp
+	procd_append_param command --logfile "$LOG_DIR/dae.log"
+	procd_append_param command --logfile-maxbackups "$log_maxbackups"
+	procd_append_param command --logfile-maxsize "$log_maxsize"
+
+	procd_set_param limits core="unlimited"
+	procd_set_param limits nofile="1000000 1000000"
+	procd_set_param respawn
+	# procd_set_param stdout 1
+	procd_set_param stderr 1
+
+	procd_close_instance
+}
+
+stop_service() {
+	rm -rf "$LOG_DIR"
+}
+
+service_triggers() {
+	procd_add_reload_trigger "$CONF"
+}
+
+hot_reload() {
+	"$PROG" reload "$(cat /var/run/dae.pid)"
+}
diff --git a/net/dae/test.sh b/net/dae/test.sh
new file mode 100644
index 0000000..3348120
--- /dev/null
+++ b/net/dae/test.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+case "$1" in
+	"dae")
+		dae --version | grep "$PKG_VERSION"
+		;;
+esac