diff --git a/luci-app-natter2/Makefile b/luci-app-natter2/Makefile new file mode 100755 index 000000000..947c37ddf --- /dev/null +++ b/luci-app-natter2/Makefile @@ -0,0 +1,15 @@ +# Copyright (C) 2020-2024 Hyy2001X + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-natter2 +PKG_VERSION:=1.0 +PKG_RELEASE:=1 + +LUCI_TITLE:=LuCI Support for Natter v2.0.0-rc1 +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+natter2 + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-natter2/README.md b/luci-app-natter2/README.md new file mode 100755 index 000000000..0af235387 --- /dev/null +++ b/luci-app-natter2/README.md @@ -0,0 +1,3 @@ +# luci-app-natter2 + +项目地址: https://github.com/MikeWang000000/Natter diff --git a/luci-app-natter2/luasrc/controller/natter2.lua b/luci-app-natter2/luasrc/controller/natter2.lua new file mode 100755 index 000000000..b6b0dddd8 --- /dev/null +++ b/luci-app-natter2/luasrc/controller/natter2.lua @@ -0,0 +1,21 @@ +module("luci.controller.natter2",package.seeall) + +function index() + if not nixio.fs.access("/etc/config/natter2")then + return + end + entry({"admin","network","natter2"},alias("admin","network","natter2","base"),_("Natter v2"),99).dependent=true + entry({"admin","network","natter2","base"},cbi("natter2/base"),_("Base Settings"),10).leaf=true + entry({"admin","network","natter2","instances"},cbi("natter2/instances")).leaf=true + entry({"admin","network","natter2","log"},form("natter2/log"),_("Log"),20).leaf=true + entry({"admin","network","natter2","print_log"},call("print_log")).leaf=true + entry({"admin","network","natter2","del_log"},call("del_log")).leaf=true +end + +function print_log() + luci.http.write(luci.sys.exec("sh /usr/share/luci-app-natter2/log.sh print")) +end + +function del_log() + luci.http.write(luci.sys.exec("sh /usr/share/luci-app-natter2/log.sh del")) +end diff --git a/luci-app-natter2/luasrc/model/cbi/natter2/base.lua b/luci-app-natter2/luasrc/model/cbi/natter2/base.lua new file mode 100755 index 000000000..e72ef51bf --- /dev/null +++ b/luci-app-natter2/luasrc/model/cbi/natter2/base.lua @@ -0,0 +1,73 @@ +m = Map("natter2", translate("Natter v2"), +translate("Expose your port behind full-cone NAT to the Internet") +.. [[

]] +.. translate("Project") +.. [[]] +) + +s = m:section(TypedSection, "base") +s.addremove = false +s.anonymous = true + +local function check_file(e) + return luci.sys.exec('ls "%s" 2> /dev/null' % e) ~= "" and true or false +end + +enable = s:option(Flag, "enable", translate("Enable")) +enable.default = 0 + +if check_file("/tmp/natter2_nat_type") then + natter_nat_type_tcp = luci.sys.exec ("grep TCP /tmp/natter2_nat_type") + natter_nat_type_udp = luci.sys.exec ("grep UDP /tmp/natter2_nat_type") + nat_check = s:option (Button, "nat_check", translate("Check NAT Status"), translate("Proxy programs may affect NAT types") .. "

" .. natter_nat_type_tcp .. "

" .. natter_nat_type_udp) +else + nat_check = s:option (Button, "nat_check", translate("Check NAT Status")) +end + +nat_check.inputtitle = translate("Exec") +nat_check.write = function() + luci.sys.call ("sh /usr/share/luci-app-natter2/nat-check.sh") + luci.http.redirect(luci.dispatcher.build_url("admin", "network", "natter2", "base")) +end + +tmp_path = s:option(Value, "tmp_path", translate("Tmp Path")) +tmp_path.default = "/tmp/natter2" +tmp_path.placeholder = "/tmp/natter2" +tmp_path.rmempty = false + +s = m:section(TypedSection, "instances", translate("Instances"), translate("Setting up multiple instances")) +s.anonymous = true +s.addremove = true +s.template = "cbi/tblsection" +s.extedit = luci.dispatcher.build_url("admin", "network", "natter2", "instances", "%s") +function s.create(...) + local e=TypedSection.create(...) + if e then + luci.http.redirect(s.extedit%e) + return + end +end + +enable_instance = s:option(Flag, "enable_instance", translate("Enable")) +enable_instance.default = 1 +enable_instance.width = "5%" + +remark = s:option(DummyValue,"remark",translate("Remark")) +remark.width = "5%" + +protocol = s:option(DummyValue,"protocol",translate("Protocol")) +remark.width = "5%" + +tmp_public_port = s:option(DummyValue, "tmp_public_port", translate("Public Port")) +remark.width = "5%" + +target_address = s:option(DummyValue, "target_address", translate("Target Address")) +remark.width = "5%" + +target_port = s:option(DummyValue, "target_port", translate("Target Port")) +remark.width = "5%" + +notify_path = s:option(DummyValue, "notify_path", translate("Notify Script Path")) +remark.width = "5%" + +return m diff --git a/luci-app-natter2/luasrc/model/cbi/natter2/instances.lua b/luci-app-natter2/luasrc/model/cbi/natter2/instances.lua new file mode 100755 index 000000000..fa053646b --- /dev/null +++ b/luci-app-natter2/luasrc/model/cbi/natter2/instances.lua @@ -0,0 +1,119 @@ +m = Map("natter2",translate("Instances Settings"), +translate("") +.. [[]] +.. translate("Instructions") +.. [[]]) +m.redirect=luci.dispatcher.build_url("admin","network","natter2") + +s = m:section(NamedSection,arg[1],"instances","") +s.addremove = false +s.dynamic = false + +local function check_binary(e) + return luci.sys.exec('which "%s" 2> /dev/null' % e) ~= "" and true or false +end + +enable_instance = s:option(Flag,"enable_instance",translate("Enable")) + +local e = luci.sys.exec("cut -d '-' -f1 /proc/sys/kernel/random/uuid 2> /dev/null") +id = s:option(Value,"id",translate("ID")) +id.default = e + +remark = s:option(Value,"remark",translate("Remark")) +remark.rmempty=false + +protocol = s:option(ListValue,"protocol",translate("Protocol")) +protocol:value('tcp',translate("TCP")) +protocol:value('udp',translate("UDP")) +protocol.default = 'tcp' + +enable_stun_server = s:option(Flag, "enable_stun_server", translate("Enable Stun Server"), translate("Using customized STUN server")) +stun_server = s:option(DynamicList, "stun_server", translate("STUN Server")) +stun_server.rmempty = true +stun_server:depends({enable_stun_server = "1"}) + +enable_keepalive_server = s:option(Flag, "enable_keepalive_server", translate("Enable Keepalive Server"), translate("Using customized Keepalive server")) +keepalive_server = s:option(Value, "keepalive_server", translate("Keepalive Server")) +keepalive_server.rmempty = true +keepalive_server:depends({enable_keepalive_server = "1"}) + +interval = s:option(Value,"interval",translate("Interval (Seconds)"),translate("The number of seconds between keepalive")) +interval.default = 15 +interval.datatype = "uinteger" + +enable_bonding = s:option(Flag,"enable_bonding",translate("Enable Bonding Options")) +enable_bonding.rmempty = true +bonding_interface = s:option(Value, "bonding_interface", translate("Bonding Interface")) +bonding_interface.rmempty = true +bonding_interface.default = '0.0.0.0' +bonding_interface:depends({enable_bonding = "1"}) + +bonding_port = s:option(Value, "bonding_port", translate("Bonding Port")) +bonding_port.rmempty = true +bonding_port.default = '0' +bonding_port:depends({enable_bonding = "1"}) + +enable_forwarding = s:option(Flag,"enable_forwarding",translate("Enable Forwarding Options"),translate("Forwarding to internal devices")) + +forwarding_method = s:option(ListValue,"forwarding_method",translate("Forwarding Method"), +translate("") +.. [[]] +.. translate("Instructions for forwarding method") +.. [[]]) +forwarding_method:value('socket',translate("socket (Integrated)")) +if check_binary("iptables") then + forwarding_method:value('iptables',translate("iptables (Kernel)")) +end +if check_binary("nftables") then + forwarding_method:value('nftables',translate("nftables (Kernel)")) +end +if check_binary("socat") then + forwarding_method:value('socat',translate("socat")) +end +if check_binary("gost") then + forwarding_method:value('gost',translate("gost")) +end +forwarding_method.default = 'socket' +forwarding_method:depends({enable_forwarding = "1"}) + +target_address = s:option(Value, "target_address", translate("Target Address")) +target_address.datatype = "ipmask4" +luci.sys.net.ipv4_hints( +function(ip, name) + target_address:value(ip, "%s (%s)" %{ ip, name }) +end) +target_address:depends({enable_forwarding = "1"}) + +target_port = s:option(Value, "target_port", translate("Target Port")) +target_port.datatype = "port" +target_port:depends({enable_forwarding = "1"}) + +enable_forwarding_retry = s:option(Flag,"enable_forwarding_retry",translate("Enable Forwarding Retry"),translate("Retry until the target port is open")) +enable_forwarding_retry:depends({enable_forwarding = "1"}) +enable_forwarding_retry.default = 1 +enable_forwarding_retry.rmempty = false + +enable_quit = s:option(Flag,"enable_quit",translate("Enable Quit"),translate("Exit immediately when the mapping address changes")) +enable_quit.default = "0" + +delay = s:option(Value,"delay",translate("Start delay (Seconds)"),translate("Time to wait before starting this instance")) +delay.default = 0 +delay.datatype = "uinteger" +delay.rmempty = false + +log_level = s:option(ListValue,"log_level",translate("Log Level")) +log_level:value('normal',translate("Normal")) +log_level:value('verbose',translate("Verbose")) + +enable_notify = s:option(Flag,"enable_notify",translate("Enable Notify Script")) +enable_notify.rmempty = false +notify_path = s:option(Value, "notify_path", translate("Notify Script Path"), +translate("") +.. [[]] +.. translate("Instructions for using the notification script") +.. [[]]) +notify_path.rmempty = true +notify_path.default = "/usr/share/luci-app-natter2/notify-example.sh" +notify_path:depends({enable_notify = "1"}) + +return m diff --git a/luci-app-natter2/luasrc/model/cbi/natter2/log.lua b/luci-app-natter2/luasrc/model/cbi/natter2/log.lua new file mode 100755 index 000000000..14e27ccb6 --- /dev/null +++ b/luci-app-natter2/luasrc/model/cbi/natter2/log.lua @@ -0,0 +1,5 @@ +log=SimpleForm("natter2") +log.reset=false +log.submit=false +log:append(Template("natter2/natter_log")) +return log diff --git a/luci-app-natter2/luasrc/view/natter2/natter_log.htm b/luci-app-natter2/luasrc/view/natter2/natter_log.htm new file mode 100755 index 000000000..8ea55f4a1 --- /dev/null +++ b/luci-app-natter2/luasrc/view/natter2/natter_log.htm @@ -0,0 +1,29 @@ + + +
+ + +
diff --git a/luci-app-natter2/po/zh-cn/natter2.po b/luci-app-natter2/po/zh-cn/natter2.po new file mode 100755 index 000000000..56fb0a7eb --- /dev/null +++ b/luci-app-natter2/po/zh-cn/natter2.po @@ -0,0 +1,143 @@ +msgid "Natter v2" +msgstr "Natter v2" + +msgid "Base Settings" +msgstr "基础设置" + +msgid "Log" +msgstr "日志" + +msgid "Expose your port behind full-cone NAT to the Internet" +msgstr "将 FullCone NAT (NAT 1) 后的端口,打洞暴露至互联网" + +msgid "Project" +msgstr "项目地址" + +msgid "Enable" +msgstr "启用" + +msgid "Check NAT Status" +msgstr "NAT 类型检测" + +msgid "Proxy programs may affect NAT types" +msgstr "代理程序可能会影响 NAT 类型" + +msgid "Tmp Path" +msgstr "临时路径" + +msgid "Instances" +msgstr "实例" + +msgid "Setting up multiple instances" +msgstr "设置多个实例" + +msgid "Remark" +msgstr "备注" + +msgid "Public Port" +msgstr "公开端口" + +msgid "Target Address" +msgstr "目标地址" + +msgid "Target Port" +msgstr "目标端口" + +msgid "Notify Script Path" +msgstr "通知脚本路径" + +msgid "Enable Stun Server" +msgstr "自定义 STUN 服务器" + +msgid "STUN Server" +msgstr "STUN 服务器" + +msgid "Enable Keepalive Server" +msgstr "自定义保活服务器" + +msgid "Keepalive Server" +msgstr "保活服务器" + +msgid "Interval (Seconds)" +msgstr "保活间隔(秒)" + +msgid "The number of seconds between keepalive" +msgstr "每次保活的间隔秒数" + +msgid "Enable Bonding Options" +msgstr "启用绑定" + +msgid "Bonding Interface" +msgstr "绑定接口" + +msgid "Bonding Port" +msgstr "绑定端口" + +msgid "Enable Forwarding Options" +msgstr "启用转发" + +msgid "Forwarding to internal devices" +msgstr "转发至内部设备" + +msgid "Forwarding Method" +msgstr "转发方式" + +msgid "Instructions for forwarding method" +msgstr "转发方式说明" + +msgid "socket (Integrated)" +msgstr "Socket(内置)" + +msgid "iptables (Kernel)" +msgstr "iptables(内核级)" + +msgid "nftables (Kernel)" +msgstr "nftables(内核级 新版)" + +msgid "Target Address" +msgstr "目标地址" + +msgid "Target Port" +msgstr "目标端口" + +msgid "Enable Forwarding Retry" +msgstr "自动重试" + +msgid "Retry until the target port is open" +msgstr "重试直至目标端口开放" + +msgid "Enable Quit" +msgstr "自动退出" + +msgid "Exit immediately when the mapping address changes" +msgstr "映射地址改变时立即退出" + +msgid "Time to wait before starting this instance" +msgstr "启动该实例前等待的时间" + +msgid "Enable Notify Script" +msgstr "启用通知脚本" + +msgid "Instructions for using the notification script" +msgstr "通知脚本说明" + +msgid "Start delay (Seconds)" +msgstr "启动延时(秒)" + +msgid "Log Level" +msgstr "日志级别" + +msgid "Normal" +msgstr "正常" + +msgid "Verbose" +msgstr "详细" + +msgid "Instructions" +msgstr "使用说明" + +msgid "Using customized STUN server" +msgstr "使用自定义的 STUN 服务器" + +msgid "Using customized Keepalive server" +msgstr "使用自定义的保活服务器" diff --git a/luci-app-natter2/po/zh_Hans/natter2.po b/luci-app-natter2/po/zh_Hans/natter2.po new file mode 100755 index 000000000..56fb0a7eb --- /dev/null +++ b/luci-app-natter2/po/zh_Hans/natter2.po @@ -0,0 +1,143 @@ +msgid "Natter v2" +msgstr "Natter v2" + +msgid "Base Settings" +msgstr "基础设置" + +msgid "Log" +msgstr "日志" + +msgid "Expose your port behind full-cone NAT to the Internet" +msgstr "将 FullCone NAT (NAT 1) 后的端口,打洞暴露至互联网" + +msgid "Project" +msgstr "项目地址" + +msgid "Enable" +msgstr "启用" + +msgid "Check NAT Status" +msgstr "NAT 类型检测" + +msgid "Proxy programs may affect NAT types" +msgstr "代理程序可能会影响 NAT 类型" + +msgid "Tmp Path" +msgstr "临时路径" + +msgid "Instances" +msgstr "实例" + +msgid "Setting up multiple instances" +msgstr "设置多个实例" + +msgid "Remark" +msgstr "备注" + +msgid "Public Port" +msgstr "公开端口" + +msgid "Target Address" +msgstr "目标地址" + +msgid "Target Port" +msgstr "目标端口" + +msgid "Notify Script Path" +msgstr "通知脚本路径" + +msgid "Enable Stun Server" +msgstr "自定义 STUN 服务器" + +msgid "STUN Server" +msgstr "STUN 服务器" + +msgid "Enable Keepalive Server" +msgstr "自定义保活服务器" + +msgid "Keepalive Server" +msgstr "保活服务器" + +msgid "Interval (Seconds)" +msgstr "保活间隔(秒)" + +msgid "The number of seconds between keepalive" +msgstr "每次保活的间隔秒数" + +msgid "Enable Bonding Options" +msgstr "启用绑定" + +msgid "Bonding Interface" +msgstr "绑定接口" + +msgid "Bonding Port" +msgstr "绑定端口" + +msgid "Enable Forwarding Options" +msgstr "启用转发" + +msgid "Forwarding to internal devices" +msgstr "转发至内部设备" + +msgid "Forwarding Method" +msgstr "转发方式" + +msgid "Instructions for forwarding method" +msgstr "转发方式说明" + +msgid "socket (Integrated)" +msgstr "Socket(内置)" + +msgid "iptables (Kernel)" +msgstr "iptables(内核级)" + +msgid "nftables (Kernel)" +msgstr "nftables(内核级 新版)" + +msgid "Target Address" +msgstr "目标地址" + +msgid "Target Port" +msgstr "目标端口" + +msgid "Enable Forwarding Retry" +msgstr "自动重试" + +msgid "Retry until the target port is open" +msgstr "重试直至目标端口开放" + +msgid "Enable Quit" +msgstr "自动退出" + +msgid "Exit immediately when the mapping address changes" +msgstr "映射地址改变时立即退出" + +msgid "Time to wait before starting this instance" +msgstr "启动该实例前等待的时间" + +msgid "Enable Notify Script" +msgstr "启用通知脚本" + +msgid "Instructions for using the notification script" +msgstr "通知脚本说明" + +msgid "Start delay (Seconds)" +msgstr "启动延时(秒)" + +msgid "Log Level" +msgstr "日志级别" + +msgid "Normal" +msgstr "正常" + +msgid "Verbose" +msgstr "详细" + +msgid "Instructions" +msgstr "使用说明" + +msgid "Using customized STUN server" +msgstr "使用自定义的 STUN 服务器" + +msgid "Using customized Keepalive server" +msgstr "使用自定义的保活服务器" diff --git a/luci-app-natter2/root/etc/config/natter2 b/luci-app-natter2/root/etc/config/natter2 new file mode 100755 index 000000000..862201da5 --- /dev/null +++ b/luci-app-natter2/root/etc/config/natter2 @@ -0,0 +1,4 @@ + +config base + option tmp_path '/tmp/natter2' + option enable '0' diff --git a/luci-app-natter2/root/etc/init.d/natter2 b/luci-app-natter2/root/etc/init.d/natter2 new file mode 100755 index 000000000..0ca9a5aa0 --- /dev/null +++ b/luci-app-natter2/root/etc/init.d/natter2 @@ -0,0 +1,125 @@ +#!/bin/sh /etc/rc.common + +START=98 +script_path="/usr/share/natter2/natter.py" + +start_service() { + local basic_list="enable tmp_path" + local instance_list="enable_instance id remark protocol enable_stun_server \ + stun_server enable_keepalive_server keepalive_server \ + interval enable_bonding bonding_interface bonding_port \ + enable_forwarding forwarding_method target_address target_port \ + enable_forwarding_retry enable_quit delay log_level enable_notify \ + notify_path" + for i in $basic_list + do + local eval $i="$(uci_get_by_type base 0 $i)" + done ; unset i + if [ "$enable" == 1 ] + then + mkdir -p ${tmp_path} + mkdir -p /var/etc/natter2 + for u in $(seq 0 $(($(uci show natter2 2> /dev/null | egrep '@instances\[[0-9]\]+=instances' | wc -l) - 1))) + do + for i in $instance_list + do + local eval $i="$(uci_get_by_type instances $u $i)" + echo "$i : $(uci_get_by_type instances $u $i)" + done ; unset i + + [ "$enable_instance" != 1 ] && continue + script_command="" + + [ "$protocol" == udp ] && script_command="$script_command -u" + + if [ "$enable_stun_server" == 1 ] + then + for i in $stun_server + do + script_command="$script_command -s $i" + done ; unset i + fi + + [ "$enable_keepalive_server" == 1 ] && script_command="$script_command -h $keepalive_server" + [ "$interval" ] && script_command="$script_command -k $interval" + + if [ "$enable_bonding" == 1 ] + then + [ "$bonding_interface" ] && script_command="$script_command -i $bonding_interface" + [ "$bonding_port" ] && script_command="$script_command -b $bonding_port" + fi + + if [ "$enable_forwarding" == 1 ] + then + [ "$forwarding_method" ] && script_command="$script_command -m $forwarding_method" + [ "$target_address" ] && script_command="$script_command -t $target_address" + [ "$target_port" ] && script_command="$script_command -p $target_port" + [ "$enable_forwarding_retry" == 1 ] && script_command="$script_command -r" + fi + + [ "$enable_quit" == 1 ] && script_command="$script_command -q" + + [ "$log_level" == "verbose" ] && script_command="$script_command -v" + + if [ "$enable_notify" == 1 ] + then + echo "$notify_path" > /var/etc/natter2/${id}-notify + var_file=/var/etc/natter2/${id}-${u}-1 + else + var_file=/var/etc/natter2/${id}-${u}-0 + fi + + log_file=${tmp_path}/natter2-${id}.log + + cp -a /usr/share/luci-app-natter2/notify-base.sh $var_file + chmod +x $var_file + + echo "log_file: $log_file" + echo "var_file: $var_file" + + sleep $delay + for i in $(ps -efww | grep "$script_path" | grep -v grep | grep -v $$ | grep "$id" | awk '{print $1}') + do + kill -9 "$i" 2> /dev/null + done + + nohup $(command -v python) "$script_path" $script_command -e $var_file > "$log_file" 2>&1 & + + for i in $instance_list + do + unset $(echo $i) + done ; unset i + unset script_command + done ; unset u + else + stop_service + fi +} + +stop_service() { + echo "Stopping Natter2 ..." + for i in $(ps -efww | grep "$script_path" | grep -v grep | grep -v $$ | awk '{print $1}') + do + kill -9 "$i" 2> /dev/null + done + rm -r "$tmp_path" 2> /dev/null + for u in $(seq 0 $(($(uci show natter2 2> /dev/null | egrep '@instances\[[0-9]\]+=instances' | wc -l) - 1))) + do + uci set natter2.@instances[$u].tmp_public_port="" + uci commit natter2 + done +} + +restart() { + stop_service + start_service +} + +service_triggers() { + procd_add_reload_trigger "natter2" +} + +uci_get_by_type() { + local ret=$(uci get natter2.@$1[$2].$3 2>/dev/null) + echo ${ret:=$4} +} diff --git a/luci-app-natter2/root/etc/uci-defaults/luci-natter2 b/luci-app-natter2/root/etc/uci-defaults/luci-natter2 new file mode 100755 index 000000000..1fac60d8e --- /dev/null +++ b/luci-app-natter2/root/etc/uci-defaults/luci-natter2 @@ -0,0 +1,10 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@natter2[-1] + add ucitrack natter2 + set ucitrack.@natter2[-1].init=natter2 + commit ucitrack +EOF + +exit 0 diff --git a/luci-app-natter2/root/usr/share/luci-app-natter2/log.sh b/luci-app-natter2/root/usr/share/luci-app-natter2/log.sh new file mode 100755 index 000000000..240a8ada3 --- /dev/null +++ b/luci-app-natter2/root/usr/share/luci-app-natter2/log.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +log_path=$(uci get natter2.@base[0].tmp_path 2> /dev/null) + +for i in $(ls -1 ${log_path} | grep natter2 | grep .log) +do + case $1 in + print) + echo -e "\n======> $i <======" + tail -n 30 ${log_path}/$i 2> /dev/null + echo -e "======> END of $i <======" + ;; + del) + echo > ${log_path}/$i + ;; + esac +done + +exit 0 diff --git a/luci-app-natter2/root/usr/share/luci-app-natter2/nat-check.sh b/luci-app-natter2/root/usr/share/luci-app-natter2/nat-check.sh new file mode 100755 index 000000000..c3d8ee71e --- /dev/null +++ b/luci-app-natter2/root/usr/share/luci-app-natter2/nat-check.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +script_file='/usr/share/natter2/natter-check/natter-check.py' +tmp_path=$(uci get natter2.@base[0].tmp_path) +[ ! "$tmp_path" ] && tmp_path="/tmp/natter2" + +mkdir -p $tmp_path +rm -f /tmp/natter2_nat_type +rm -f $tmp_path/natter2_nat_type.tmp +python3 $script_file | egrep 'Checking TCP|Checking UDP' > $tmp_path/natter2_nat_type.tmp +TCP=$(awk -F '[:]+' '/TCP/{print $2}' $tmp_path/natter2_nat_type.tmp | sed 's/\[//g;s/\]//g') +UDP=$(awk -F '[:]+' '/UDP/{print $2}' $tmp_path/natter2_nat_type.tmp | sed 's/\[//g;s/\]//g') +rm -f $tmp_path/natter2_nat_type.tmp +[ ! "$TCP" ] && TCP="未知" +[ ! "$UDP" ] && UDP="未知" + +echo "TCP: NAT $TCP" > /tmp/natter2_nat_type +echo "UDP: NAT $UDP" >> /tmp/natter2_nat_type diff --git a/luci-app-natter2/root/usr/share/luci-app-natter2/notify-base.sh b/luci-app-natter2/root/usr/share/luci-app-natter2/notify-base.sh new file mode 100755 index 000000000..687e0a174 --- /dev/null +++ b/luci-app-natter2/root/usr/share/luci-app-natter2/notify-base.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +protocol="$1"; private_ip="$2"; private_port="$3"; public_ip="$4"; public_port="$5" + +script_name=$(basename $0) +script_path=$(dirname $0) +instance_id=$(echo $script_name | cut -d '-' -f1) +instance_num=$(echo $script_name | cut -d '-' -f2) +instance_isnotify=$(echo $script_name | cut -d '-' -f3) + +# echo script_path:$script_path +# echo script_name:$script_name +# echo instance_id:$instance_id +# echo instance_num:$instance_num +# echo instance_isnotify:$instance_isnotify + +uci set natter2.@instances[$instance_num].tmp_public_port="$public_port" +uci commit natter2 + +if [ "$instance_isnotify" == 1 ] +then + notify_path=$(cat $script_path/${instance_id}-notify) + if [ -f "${notify_path}" ] + then + chmod +x ${notify_path} + ${notify_path} $1 $2 $3 $4 $5 + fi +fi diff --git a/luci-app-natter2/root/usr/share/luci-app-natter2/notify-example.sh b/luci-app-natter2/root/usr/share/luci-app-natter2/notify-example.sh new file mode 100755 index 000000000..d9f3c22a9 --- /dev/null +++ b/luci-app-natter2/root/usr/share/luci-app-natter2/notify-example.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# 参数序号 参数说明 参数格式 +# 1 传输层协议 tcp, udp 二者之一 +# 2 内部 IP 点分十进制 IPv4 地址 +# 3 内部端口 1 - 65535 的整数 +# 4 外部 IP 点分十进制 IPv4 地址 +# 5 外部端口 1 - 65535 的整数 + +protocol="$1"; private_ip="$2"; private_port="$3"; public_ip="$4"; public_port="$5" + +echo $1 $2 $3 $4 $5 diff --git a/luci-app-natter2/root/usr/share/rpcd/acl.d/luci-app-natter2.json b/luci-app-natter2/root/usr/share/rpcd/acl.d/luci-app-natter2.json new file mode 100644 index 000000000..db0c15123 --- /dev/null +++ b/luci-app-natter2/root/usr/share/rpcd/acl.d/luci-app-natter2.json @@ -0,0 +1,11 @@ +{ + "luci-app-natter2": { + "description": "Grant UCI access for luci-app-natter2", + "read": { + "uci": [ "natter2" ] + }, + "write": { + "uci": [ "natter2" ] + } + } +} diff --git a/natter2/Makefile b/natter2/Makefile new file mode 100755 index 000000000..2d7831c68 --- /dev/null +++ b/natter2/Makefile @@ -0,0 +1,40 @@ +# Copyright (C) 2020-2024 Hyy2001X + +include $(TOPDIR)/rules.mk + +PKG_NAME:=natter2 +PKG_VERSION=2.0.0-rc1 +PKG_RELEASE:=$(AUTORELEASE) +PKG_SOURCE_VERSION:=ba7385de8edf869486f01b724780497939eccd24 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION) +PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/MikeWang000000/Natter/tar.gz/$(PKG_SOURCE_VERSION)? +PKG_HASH:=skip + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + TITLE:=Open Port under FullCone NAT (NAT 1) + URL:=https://github.com/MikeWang000000/Natter + DEPENDS:=+python3-light +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + tar -zxvf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME) + $(INSTALL_BIN) $(PKG_BUILD_DIR)/Natter-$(PKG_SOURCE_VERSION)/natter.py $(1)/usr/share/$(PKG_NAME)/natter.py + $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/natter-check + $(INSTALL_BIN) $(PKG_BUILD_DIR)/Natter-$(PKG_SOURCE_VERSION)/natter-check/natter-check.py $(1)/usr/share/$(PKG_NAME)/natter-check/natter-check.py +endef + +$(eval $(call BuildPackage,$(PKG_NAME)))