From b99b66aea3236e292e98faf388c860c1d09f95e4 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sun, 27 Oct 2024 05:47:13 +0800 Subject: [PATCH] frpc: add anonymous proxy config support --- net/frp/Makefile | 69 ++++++++++++++-------------- net/frp/files/frpc.config | 23 ++++++++++ net/frp/files/frpc.init | 80 +++++++++++++++++++++++++++++++++ net/frp/files/frpc.uci-defaults | 19 ++++++++ net/frp/files/frps.config | 16 +++++++ net/frp/files/frps.init | 78 ++++++++++++++++++++++++++++++++ net/frp/test.sh | 3 ++ 7 files changed, 254 insertions(+), 34 deletions(-) create mode 100644 net/frp/files/frpc.config create mode 100644 net/frp/files/frpc.init create mode 100644 net/frp/files/frpc.uci-defaults create mode 100644 net/frp/files/frps.config create mode 100644 net/frp/files/frps.init create mode 100644 net/frp/test.sh diff --git a/net/frp/Makefile b/net/frp/Makefile index fd4edf81..1e9c6224 100644 --- a/net/frp/Makefile +++ b/net/frp/Makefile @@ -1,68 +1,69 @@ -# -# Copyright (C) 2019 Xingwang Liao -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - include $(TOPDIR)/rules.mk PKG_NAME:=frp -PKG_VERSION:=0.53.2 +PKG_VERSION:=0.51.3 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/fatedier/frp/tar.gz/v${PKG_VERSION}? -PKG_HASH:=ff2a4f04e7732bc77730304e48f97fdd062be2b142ae34c518ab9b9d7a3b32ec +PKG_HASH:=83032399773901348c660d41c967530e794ab58172ccd070db89d5e50d915fef +PKG_MAINTAINER:=Richard Yu PKG_LICENSE:=Apache-2.0 PKG_LICENSE_FILES:=LICENSE -PKG_MAINTAINER:=Xingwang Liao -PKG_BUILD_DEPENDS:=golang/host upx/host +PKG_BUILD_DEPENDS:=golang/host PKG_BUILD_PARALLEL:=1 PKG_USE_MIPS16:=0 +PKG_BUILD_FLAGS:=no-mips16 GO_PKG:=github.com/fatedier/frp GO_PKG_BUILD_PKG:=github.com/fatedier/frp/cmd/... -GO_PKG_LDFLAGS:=-s -w - include $(INCLUDE_DIR)/package.mk include ../../lang/golang/golang-package.mk -define frp/templates +define Package/frp/install + $(INSTALL_DIR) $(1)/usr/bin/ + $(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/$(2) $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/etc/frp/$(2).d/ + $(INSTALL_DATA) $(PKG_BUILD_DIR)/conf/$(2)_full.ini $(1)/etc/frp/$(2).d/ + $(INSTALL_DIR) $(1)/etc/config/ + $(INSTALL_CONF) ./files/$(2).config $(1)/etc/config/$(2) + $(INSTALL_DIR) $(1)/etc/init.d/ + $(INSTALL_BIN) ./files/$(2).init $(1)/etc/init.d/$(2) + + if [ -r ./files/$(2).uci-defaults ]; then \ + $(INSTALL_DIR) $(1)/etc/uci-defaults; \ + $(INSTALL_DATA) ./files/$(2).uci-defaults $(1)/etc/uci-defaults/$(2); \ + fi +endef + +define Package/frp/template define Package/$(1) - TITLE:=A fast reverse proxy ($(1)) - URL:=https://github.com/fatedier/frp SECTION:=net CATEGORY:=Network SUBMENU:=Web Servers/Proxies - DEPENDS:=$$(GO_ARCH_DEPENDS) + TITLE:=$(1) - fast reverse proxy $(2) + URL:=https://github.com/fatedier/frp + DEPENDS:=$(GO_ARCH_DEPENDS) endef define Package/$(1)/description - frp is a fast reverse proxy to help you expose a local server behind a NAT or firewall - to the internet. As of now, it supports tcp & udp, as well as http and https protocols, - where requests can be forwarded to internal services by domain name. + $(1) is a fast reverse proxy $(2) to help you expose a local server behind + a NAT or firewall to the internet. + endef - This package contains the $(1). + define Package/$(1)/conffiles +/etc/config/$(1) endef define Package/$(1)/install - $$(call GoPackage/Package/Install/Bin,$$(PKG_INSTALL_DIR)) - - $$(INSTALL_DIR) $$(1)/usr/bin - $$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/usr/bin/$(1) $$(1)/usr/bin/ - - $(STAGING_DIR_HOST)/bin/upx --lzma --best $$(1)/usr/bin/$(1) || true + $(call Package/frp/install,$$(1),$(1)) endef endef -FRP_COMPONENTS:=frpc frps - -$(foreach component,$(FRP_COMPONENTS), \ - $(eval $(call frp/templates,$(component))) \ - $(eval $(call GoBinPackage,$(component))) \ - $(eval $(call BuildPackage,$(component))) \ -) +$(eval $(call Package/frp/template,frpc,client)) +$(eval $(call Package/frp/template,frps,server)) +$(eval $(call BuildPackage,frpc)) +$(eval $(call BuildPackage,frps)) diff --git a/net/frp/files/frpc.config b/net/frp/files/frpc.config new file mode 100644 index 00000000..492e224f --- /dev/null +++ b/net/frp/files/frpc.config @@ -0,0 +1,23 @@ +config init + option stdout 1 + option stderr 1 + option user frpc + option group frpc + option respawn 1 +# OS environments pass to frp for config file template, see +# https://github.com/fatedier/frp#configuration-file-template +# list env 'ENV_NAME=value' +# Config files include in temporary config file. +# list conf_inc '/etc/frp/frpc.d/frpc_full.ini' + +config conf 'common' + option server_addr 127.0.0.1 + option server_port 7000 +# List options with name="_" will be directly appended to config file +# list _ '# Key-A=Value-A' + +config conf 'ssh' + option type tcp + option local_ip 127.0.0.1 + option local_port 22 + option remote_port 6000 diff --git a/net/frp/files/frpc.init b/net/frp/files/frpc.init new file mode 100644 index 00000000..68fe43c4 --- /dev/null +++ b/net/frp/files/frpc.init @@ -0,0 +1,80 @@ +#!/bin/sh /etc/rc.common + +START=99 +USE_PROCD=1 + +NAME=frpc +PROG=/usr/bin/$NAME + +_err() { + echo "$*" >&2 + logger -p daemon.err -t "$NAME" "$*" +} + +config_cb() { + [ $# -eq 0 ] && return + + local type="$1" + local name="$2" + if [ "$type" = "conf" ]; then + echo "[$name]" >> "$conf_file" + option_cb() { + local option="$1" + local value="$2" + [ "$option" = "name" ] && \ + sed -i "s/$CONFIG_SECTION/$value/g" "$conf_file" || \ + echo "$option = $value" >> "$conf_file"; + } + list_cb() { + local name="$1" + local value="$2" + [ "$name" = "_" ] && echo "$value" >> "$conf_file" + } + else + [ "$type" = "init" ] && init_cfg="$name" + option_cb() { return 0; } + list_cb() { return 0; } + fi +} + +service_triggers() +{ + procd_add_reload_trigger "$NAME" +} + +start_service() { + local init_cfg=" " + local conf_file="/var/etc/$NAME.ini" + + > "$conf_file" + config_load "$NAME" + + local stdout stderr user group respawn env conf_inc + uci_validate_section "$NAME" init "$init_cfg" \ + 'stdout:bool:1' \ + 'stderr:bool:1' \ + 'user:string' \ + 'group:string' \ + 'respawn:bool:1' \ + 'env:list(string)' \ + 'conf_inc:list(string)' + + local err=$? + [ $err -ne 0 ] && { + _err "uci_validate_section returned $err" + return 1 + } + + [ -n "$conf_inc" ] && config_list_foreach "$init_cfg" conf_inc cat >> "$conf_file" + + procd_open_instance + procd_set_param command "$PROG" -c "$conf_file" + procd_set_param file $conf_file + procd_set_param stdout $stdout + procd_set_param stderr $stderr + [ -n "$user" ] && procd_set_param user "$user" + [ -n "$group" ] && procd_set_param group "$group" + [ $respawn -eq 1 ] && procd_set_param respawn + [ -n "$env" ] && config_list_foreach "$init_cfg" env "procd_append_param env" + procd_close_instance +} diff --git a/net/frp/files/frpc.uci-defaults b/net/frp/files/frpc.uci-defaults new file mode 100644 index 00000000..4883a2d8 --- /dev/null +++ b/net/frp/files/frpc.uci-defaults @@ -0,0 +1,19 @@ +#!/bin/sh + +. /lib/functions.sh + +upgrade() { + local section=$1 + local name + [ "$section" != "common" ] || return 0 + config_get name $section name + if [ -z "$name" ]; then + uci_set frpc "$section" name "$section" + uci_commit frpc + fi +} + +config_load frpc +config_foreach upgrade conf + +exit 0 diff --git a/net/frp/files/frps.config b/net/frp/files/frps.config new file mode 100644 index 00000000..ae0bffc2 --- /dev/null +++ b/net/frp/files/frps.config @@ -0,0 +1,16 @@ +config init + option stdout 1 + option stderr 1 + option user frps + option group frps + option respawn 1 +# OS environments pass to frp for config file template, see +# https://github.com/fatedier/frp#configuration-file-template +# list env 'ENV_NAME=value' +# Config files include in temporary config file. +# list conf_inc '/etc/frp/frps.d/frps_full.ini' + +config conf 'common' + option bind_port 7000 +# List options with name="_" will be directly appended to config file +# list _ '# Key-A=Value-A' diff --git a/net/frp/files/frps.init b/net/frp/files/frps.init new file mode 100644 index 00000000..38f714fb --- /dev/null +++ b/net/frp/files/frps.init @@ -0,0 +1,78 @@ +#!/bin/sh /etc/rc.common + +START=99 +USE_PROCD=1 + +NAME=frps +PROG=/usr/bin/$NAME + +_err() { + echo "$*" >&2 + logger -p daemon.err -t "$NAME" "$*" +} + +config_cb() { + [ $# -eq 0 ] && return + + local type="$1" + local name="$2" + if [ "$type" = "conf" ]; then + echo "[$name]" >> "$conf_file" + option_cb() { + local option="$1" + local value="$2" + echo "$option = $value" >> "$conf_file" + } + list_cb() { + local name="$1" + local value="$2" + [ "$name" = "_" ] && echo "$value" >> "$conf_file" + } + else + [ "$type" = "init" ] && init_cfg="$name" + option_cb() { return 0; } + list_cb() { return 0; } + fi +} + +service_triggers() +{ + procd_add_reload_trigger "$NAME" +} + +start_service() { + local init_cfg=" " + local conf_file="/var/etc/$NAME.ini" + + > "$conf_file" + config_load "$NAME" + + local stdout stderr user group respawn env conf_inc + uci_validate_section "$NAME" init "$init_cfg" \ + 'stdout:bool:1' \ + 'stderr:bool:1' \ + 'user:string' \ + 'group:string' \ + 'respawn:bool:1' \ + 'env:list(string)' \ + 'conf_inc:list(string)' + + local err=$? + [ $err -ne 0 ] && { + _err "uci_validate_section returned $err" + return 1 + } + + [ -n "$conf_inc" ] && config_list_foreach "$init_cfg" conf_inc cat >> "$conf_file" + + procd_open_instance + procd_set_param command "$PROG" -c "$conf_file" + procd_set_param file $conf_file + procd_set_param stdout $stdout + procd_set_param stderr $stderr + [ -n "$user" ] && procd_set_param user "$user" + [ -n "$group" ] && procd_set_param group "$group" + [ $respawn -eq 1 ] && procd_set_param respawn + [ -n "$env" ] && config_list_foreach "$init_cfg" env "procd_append_param env" + procd_close_instance +} diff --git a/net/frp/test.sh b/net/frp/test.sh new file mode 100644 index 00000000..1436d02d --- /dev/null +++ b/net/frp/test.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +$1 -v 2>&1 | grep -F "$PKG_VERSION"