diff --git a/luci-app-easytier/luasrc/model/cbi/easytier.lua b/luci-app-easytier/luasrc/model/cbi/easytier.lua
index 46311f6..d7d3396 100644
--- a/luci-app-easytier/luasrc/model/cbi/easytier.lua
+++ b/luci-app-easytier/luasrc/model/cbi/easytier.lua
@@ -4,9 +4,9 @@ local nixio = require "nixio"
m = Map("easytier")
m.description = translate('一个简单、安全、去中心化的内网穿透 VPN 组网方案,使用 Rust 语言和 Tokio 框架实现。 项目地址:github.com/EasyTier/EasyTier 官网文档 QQ群 菜鸟教程')
--- easytier
m:section(SimpleSection).template = "easytier/easytier_status"
+-- easytier-core
s=m:section(TypedSection, "easytier", translate("EasyTier配置"))
s.addremove=false
s.anonymous=true
@@ -28,14 +28,14 @@ btncq.write = function()
end
etcmd = s:taboption("general",ListValue, "etcmd", translate("启动方式"),
- translate("默认使用命令行方式启动,也可以使用配置文件启动或WEB网页配置
切换启动方式后将以指定的方式启动,请谨慎选择"))
+ translate("官方Web控制台:easytier.cn/web
官方配置文件生成器:easytier.cn/web/index.html#/config_generator
注意配置RPC端口为15888"))
etcmd.default = "etcmd"
etcmd:value("etcmd",translate("命令行"))
etcmd:value("config",translate("配置文件"))
-etcmd:value("web",translate("WEB配置"))
+etcmd:value("web",translate("Web配置"))
et_config = s:taboption("general",TextValue, "et_config", translate("配置文件"),
- translate("配置文件在/etc/easytier/config.toml
命令行的启动参数和此配置文件的参数并不同步,请自行修改
配置文件介绍:点此查看"))
+ translate("配置文件在/etc/easytier/config.toml
命令行的启动参数和此配置文件的参数不会同步
注意填写tun网卡名和端口用以自动防火墙放行"))
et_config.rows = 18
et_config.wrap = "off"
et_config:depends("etcmd", "config")
@@ -53,8 +53,8 @@ et_config.write = function(self, section, value)
nixio.fs.writefile(file, value:gsub("\r\n", "\n"))
end
-web_config = s:taboption("general", Value, "web_config", translate("WEB服务器地址"),
- translate("WEB配置服务器地址。(-w 参数)
自建WEB服务器 输入格式:udp://服务器地址:22020/账户名
官方WEB服务器 输入格式:账户名
官方WEB服务器配置:点此"))
+web_config = s:taboption("general", Value, "web_config", translate("Web服务器地址"),
+ translate("Web配置服务器地址。(-w 参数)
自建Web服务器 输入格式:udp://服务器地址:22020/账户名
官方Web服务器 输入格式:账户名
官方Web控制台:easytier.cn/web"))
web_config.placeholder = "admin"
web_config:depends("etcmd", "web")
@@ -63,9 +63,10 @@ network_name = s:taboption("general", Value, "network_name", translate("网络
network_name.password = true
network_name.placeholder = "test"
network_name:depends("etcmd", "etcmd")
+network_name:depends("etcmd", "web")
network_secret = s:taboption("general", Value, "network_secret", translate("网络密钥"),
- translate("用于验证此节点是否属于 VPN 网络的网络密钥(--network-secret 参数)"))
+ translate("网络密钥,用于验证此节点是否属于 VPN 网络(--network-secret 参数)"))
network_secret.password = true
network_secret.placeholder = "test"
network_secret:depends("etcmd", "etcmd")
@@ -83,10 +84,9 @@ ipaddr:depends("etcmd", "etcmd")
peeradd = s:taboption("general",DynamicList, "peeradd", translate("对等节点"),
translate("初始连接的对等节点,和下方参数作用一样 (-p 参数)
公共服务器可用状态查询:点此查询"))
peeradd.placeholder = "tcp://public.easytier.top:11010"
-peeradd:value("tcp://public.easytier.top:11010", translate("官方公共服务器-广东河源-tcp://public.easytier.top:11010"))
-peeradd:value("tcp://43.136.45.249:11010", translate("广州V4-tcp://43.136.45.249:11010"))
+peeradd:value("tcp://public.easytier.top:11010", translate("官方服务器-广东河源-tcp://public.easytier.top:11010"))
+peeradd:value("tcp://turn.hb.629957.xyz:11010", translate("湖北十堰电信V4-tcp://turn.hb.629957.xyz:11010"))
peeradd:value("tcp://et.ie12vps.xyz:11010", translate("南京V4/V6-tcp://et.ie12vps.xyz:11010"))
-peeradd:value("tcp://minebg.top:11010", translate("广州V4-tcp://minebg.top:11010"))
peeradd:value("tcp://ah.nkbpal.cn:11010", translate("安徽电信V4-tcp://ah.nkbpal.cn:11010"))
peeradd:value("udp://ah.nkbpal.cn:11010", translate("安徽电信V4-udp://ah.nkbpal.cn:11010"))
peeradd:value("wss://ah.nkbpal.cn:11012", translate("安徽电信V4-wss://ah.nkbpal.cn:11012"))
@@ -109,7 +109,7 @@ external_node = s:taboption("general", Value, "external_node", translate("共享
translate("使用公共共享节点来发现对等节点,和上方参数作用一样 (-e 参数)"))
external_node.default = ""
external_node.placeholder = "tcp://public.easytier.top:11010"
-external_node:value("tcp://public.easytier.top:11010", translate("官方公共服务器-广东河源-tcp://public.easytier.top:11010"))
+external_node:value("tcp://public.easytier.top:11010", translate("官方服务器-广东河源-tcp://public.easytier.top:11010"))
external_node:depends("etcmd", "etcmd")
proxy_network = s:taboption("general",DynamicList, "proxy_network", translate("子网代理"),
@@ -121,8 +121,9 @@ mapped_listeners = s:taboption("privacy",DynamicList, "mapped_listeners", transl
mapped_listeners:depends("listenermode", "ON")
rpc_portal = s:taboption("privacy", Value, "rpc_portal", translate("门户地址端口"),
- translate("用于管理的 RPC 门户地址。0 表示随机端口,12345 表示监听本地主机的 12345 端口,0.0.0.0:12345 表示在所有接口上监听 12345 端口。默认值为 0,首选 15888 (-r 参数)"))
+ translate("用于管理的 RPC 门户地址。0 表示随机端口,12345 表示监听本地主机的 12345 端口,0.0.0.0:12345 表示在所有接口上监听 12345 端口。
默认值为 0,建议选 15888 防止无法获取状态信息 (-r 参数)"))
rpc_portal.placeholder = "15888"
+rpc_portal.default = "15888"
rpc_portal.datatype = "range(1,65535)"
rpc_portal:depends("etcmd", "etcmd")
@@ -134,33 +135,33 @@ listenermode.default = "OFF"
listenermode:depends("etcmd", "etcmd")
listener6 = s:taboption("general",Flag, "listener6", translate("同时监听IPV6"),
- translate("默认只监听IPV4,对等节点只能使用IPV4连接,启用后将同时监听IPV6,例如 -l tcp://[::]:11010"))
+ translate("默认只监听IPV4,对等节点只能使用IPV4连接,启用后将同时监听IPV6端口"))
listener6:depends("listenermode", "ON")
listener6:depends("etcmd", "etcmd")
tcp_port = s:taboption("general",Value, "tcp_port", translate("tcp/udp端口"),
- translate("tcp/udp协议,端口号:11010,表示 tcp/udp 将在 11010 上监听
如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行"))
+ translate("tcp/udp协议,端口号:11010,表示 tcp/udp 将在 11010 上监听
如果是配置文件Web配置请填写一样的监听端口用于防火墙放行"))
tcp_port.datatype = "range(1,65535)"
tcp_port.default = "11010"
tcp_port:depends("listenermode", "ON")
tcp_port:depends("etcmd", "web")
ws_port = s:taboption("general",Value, "ws_port", translate("ws端口"),
- translate("ws协议,端口号:11011,表示 ws 将在 11011 上监听
如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行"))
+ translate("ws协议,端口号:11011,表示 ws 将在 11011 上监听
如果是配置文件Web配置请填写一样的监听端口用于防火墙放行"))
ws_port.datatype = "range(1,65535)"
ws_port.default = "11011"
ws_port:depends("listenermode", "ON")
ws_port:depends("etcmd", "web")
wss_port = s:taboption("general",Value, "wss_port", translate("wss端口"),
- translate("wss协议,端口号:11012,表示 wss 将在 11012 上监听
如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行"))
+ translate("wss协议,端口号:11012,表示 wss 将在 11012 上监听
如果是配置文件Web配置请填写一样的监听端口用于防火墙放行"))
wss_port.datatype = "range(1,65535)"
wss_port.default = "11012"
wss_port:depends("listenermode", "ON")
wss_port:depends("etcmd", "web")
wg_port = s:taboption("general",Value, "wg_port", translate("wg端口"),
- translate("wireguard协议,端口号:11011,表示 wg 将在 11011 上监听
如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行"))
+ translate("wireguard协议,端口号:11011,表示 wg 将在 11011 上监听
如果是配置文件Web配置请填写一样的监听端口用于防火墙放行"))
wg_port.datatype = "range(1,65535)"
wg_port.placeholder = "11011"
wg_port:depends("listenermode", "ON")
@@ -179,9 +180,10 @@ desvice_name.default = device_name
desvice_name:depends("etcmd", "etcmd")
instance_name = s:taboption("privacy",Value, "instance_name", translate("实例名称"),
- translate("用于在同一台机器中标识此 VPN 节点的实例名称 (--instance-name 参数)"))
+ translate("用于在同一台机器中标识此 VPN 节点的实例名称,启用日志需要填写,web配置时填一样的instance_name名称 (-m 参数)"))
instance_name.placeholder = "default"
instance_name:depends("etcmd", "etcmd")
+instance_name:depends("etcmd", "web")
vpn_portal = s:taboption("privacy",Value, "vpn_portal", translate("VPN门户URL"),
translate("定义 VPN 门户的 URL,允许其他 VPN 客户端连接。
示例:wg://0.0.0.0:11011/10.14.14.0/24,表示 VPN 门户是一个在 vpn.example.com:11010 上监听的 WireGuard 服务器,并且 VPN 客户端位于 10.14.14.0/24 网络中(--vpn-portal 参数)"))
@@ -242,14 +244,16 @@ exit_nodes:depends("etcmd", "etcmd")
smoltcp = s:taboption("privacy",Flag, "smoltcp", translate("使用用户态协议栈"),
translate("为子网代理启用smoltcp堆栈(--use-smoltcp 参数)"))
-smoltcp.rmempty = false
smoltcp:depends("etcmd", "etcmd")
no_tun = s:taboption("privacy",Flag, "no_tun", translate("无tun模式"),
translate("不创建TUN设备,可以使用子网代理访问节点( --no-tun 参数)"))
-no_tun.rmempty = false
no_tun:depends("etcmd", "etcmd")
+proxy_forward = s:taboption("privacy",Flag, "proxy_forward", translate("禁用内置NAT"),
+ translate("通过系统内核转发子网代理数据包,禁用内置NAT( --proxy-forward-by-system 参数)"))
+proxy_forward:depends("etcmd", "etcmd")
+
manual_routes = s:taboption("privacy",DynamicList, "manual_routes", translate("路由CIDR"),
translate("手动分配路由CIDR,将禁用子网代理和从对等节点传播的wireguard路由。(--manual-routes 参数)"))
manual_routes.placeholder = "192.168.0.0/16"
@@ -257,7 +261,6 @@ manual_routes:depends("etcmd", "etcmd")
relay_network = s:taboption("privacy",Flag, "relay_network", translate("转发白名单网络的流量"),
translate("仅转发白名单网络的流量,默认允许所有网络"))
-relay_network.rmempty = false
relay_network:depends("etcmd", "etcmd")
whitelist = s:taboption("privacy",DynamicList, "whitelist", translate("白名单网络"),
@@ -272,45 +275,37 @@ socks_port:depends("etcmd", "etcmd")
disable_p2p = s:taboption("privacy",Flag, "disable_p2p", translate("禁用P2P"),
translate("禁用P2P通信,只通过-p指定的节点转发数据包 ( --disable-p2p 参数)"))
-disable_p2p.rmempty = false
disable_p2p:depends("etcmd", "etcmd")
disable_udp = s:taboption("privacy",Flag, "disable_udp", translate("禁用UDP"),
translate("禁用UDP打洞功能( --disable-udp-hole-punching 参数)"))
-disable_udp.rmempty = false
disable_udp:depends("etcmd", "etcmd")
relay_all = s:taboption("privacy",Flag, "relay_all", translate("允许转发"),
translate("转发所有对等节点的RPC数据包,即使对等节点不在转发网络白名单中。
这可以帮助白名单外网络中的对等节点建立P2P连接。( -relay-all-peer-rpc 参数)"))
-relay_all.rmempty = false
relay_all:depends("etcmd", "etcmd")
bind_device = s:taboption("privacy",Flag, "bind_device", translate("仅使用物理网卡"),
translate("将连接器的套接字绑定到物理设备以避免路由问题。
比如子网代理网段与某节点的网段冲突,绑定物理设备后可以与该节点正常通信。( --bind-device 参数)"))
-bind_device.rmempty = false
-bind_device.default = "1"
+bind_device.default = "0"
bind_device:depends("etcmd", "etcmd")
kcp_proxy = s:taboption("privacy",Flag, "kcp_proxy", translate("启用KCP代理"),
translate("将TCP流量转为 KCP 流量,降低传输延迟,提升传输速度。
KCP 代理功能需要虚拟网内所有节点的 EasyTier 版本在 v2.2.0 以上。( --enable-kcp-proxy 参数)"))
-kcp_proxy.rmempty = false
kcp_proxy:depends("etcmd", "etcmd")
kcp_input = s:taboption("privacy",Flag, "kcp_input", translate("禁用KCP输入"),
translate("不允许其他节点使用 KCP 代理 TCP 流到此节点。
开启 KCP 代理的节点访问此节点时,依然使用原始。( --disable-kcp-input 参数)"))
-kcp_input.rmempty = false
kcp_input:depends("etcmd", "etcmd")
log = s:taboption("general",ListValue, "log", translate("程序日志"),
translate("运行日志在/tmp/easytier.log,可在上方日志查看
若启动失败,请前往 状态- 系统日志 查看具体启动失败日志
详细程度:警告<信息<调试<跟踪"))
-log.default = "info"
+log.default = "off"
log:value("off",translate("关闭"))
log:value("warn",translate("警告"))
log:value("info",translate("信息"))
log:value("debug",translate("调试"))
log:value("trace",translate("跟踪"))
-log:depends("etcmd", "etcmd")
-log:depends("etcmd", "config")
et_forward = s:taboption("privacy",MultiValue, "et_forward", translate("访问控制"),
translate("设置不同网络区域之间的流量允许规则"))
@@ -513,7 +508,7 @@ end
btnrm = s:taboption("infos", Button, "btnrm")
btnrm.inputtitle = translate("检测更新")
-btnrm.description = translate("点击按钮开始检测更新,刷新上方状态栏显示")
+btnrm.description = translate("点击按钮开始检测更新,刷新上方状态栏版本显示")
btnrm.inputstyle = "apply"
btnrm.write = function()
os.execute("rm -rf /tmp/easytier*.tag /tmp/easytier*.newtag /tmp/easytier-core_*")
@@ -523,6 +518,12 @@ end
easytierbin = s:taboption("upload", Value, "easytierbin", translate("easytier-core程序路径"),
translate("自定义easytier-core的存放路径,确保填写完整的路径及名称,若指定的路径可用空间不足将会自动移至/tmp/easytier-core"))
easytierbin.placeholder = "/usr/bin/easytier-core"
+easytierbin.default = "/usr/bin/easytier-core"
+
+webbin = s:taboption("upload", Value, "webbin", translate("easytier-web程序路径"),
+ translate("自定义easytier-web的存放路径,确保填写完整的路径及名称,然后上传安装程序"))
+webbin.placeholder = "/usr/bin/easytier-web"
+webbin.default = "/usr/bin/easytier-web"
local upload = s:taboption("upload", FileUpload, "upload_file")
upload.optional = true
@@ -561,12 +562,16 @@ http.setfilehandler(
local extracted_dir = "/tmp/easytier-linux-*/"
os.execute("mv " .. extracted_dir .. "easytier-cli /tmp/easytier-cli")
os.execute("mv " .. extracted_dir .. "easytier-core /tmp/easytier-core")
+ os.execute("mv " .. extracted_dir .. "easytier-core /tmp/easytier-web")
if nixio.fs.access("/tmp/easytier-cli") then
um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-cli上传成功,重启一次插件才生效")
end
if nixio.fs.access("/tmp/easytier-core") then
um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-core上传成功,重启一次插件才生效")
end
+ if nixio.fs.access("/tmp/easytier-web") then
+ um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-web上传成功,重启一次插件才生效")
+ end
end
if string.sub(meta.file, -7) == ".tar.gz" then
local file_path = dir .. meta.file
@@ -574,15 +579,20 @@ http.setfilehandler(
local extracted_dir = "/tmp/easytier-linux-*/"
os.execute("mv " .. extracted_dir .. "easytier-cli /tmp/easytier-cli")
os.execute("mv " .. extracted_dir .. "easytier-core /tmp/easytier-core")
+ os.execute("mv " .. extracted_dir .. "easytier-core /tmp/easytier-web")
if nixio.fs.access("/tmp/easytier-cli") then
um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-cli上传成功,重启一次插件才生效")
end
if nixio.fs.access("/tmp/easytier-core") then
um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-core上传成功,重启一次插件才生效")
end
+ if nixio.fs.access("/tmp/easytier-web") then
+ um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-web上传成功,重启一次插件才生效")
+ end
end
os.execute("chmod +x /tmp/easytier-core")
- os.execute("chmod +x /tmp/easytier-cli")
+ os.execute("chmod +x /tmp/easytier-cli")
+ os.execute("chmod +x /tmp/easytier-web")
end
end
)
@@ -590,4 +600,57 @@ if luci.http.formvalue("upload") then
local f = luci.http.formvalue("ulfile")
end
+-- easytier-web
+s=m:section(TypedSection, "easytierweb", translate("自建Web服务器"))
+s.addremove=false
+s.anonymous=true
+
+switch = s:option(Flag, "enabled", translate("Enable"))
+switch.rmempty = false
+
+btncq = s:option(Button, "btncq", translate("重启"))
+btncq.inputtitle = translate("重启")
+btncq.description = translate("在没有修改参数的情况下快速重新启动一次")
+btncq.inputstyle = "apply"
+btncq:depends("enabled", "1")
+btncq.write = function()
+ luci.sys.call("/etc/init.d/easytier restart >/dev/null 2>&1 &") -- 执行重启命令
+end
+
+db_path = s:option(Value, "db_path", translate("数据库文件路径"),
+ translate(" sqlite3 数据库文件路径, 用于保存所有数据。( -d 参数)"))
+db_path.default = "/etc/easytier/et.db"
+db_path:depends("enabled", "1")
+
+web_protocol = s:option(ListValue, "web_protocol", translate("监听协议"),
+ translate("配置服务器的监听协议,用于被 easytier-core 连接。( -p 参数)"))
+web_protocol.default = "udp"
+web_protocol:value("udp",translate("UDP"))
+web_protocol:value("tcp",translate("TCP"))
+web_protocol:depends("enabled", "1")
+
+web_port = s:option(Value, "web_port", translate("服务端口"),
+ translate("配置服务器的监听端口,用于被 easytier-core 连接。( -c 参数)"))
+web_port.datatype = "range(1,65535)"
+web_port.placeholder = "22020"
+web_port.default = "22020"
+web_port:depends("enabled", "1")
+
+api_port = s:option(Value, "api_port", translate("API端口"),
+ translate("restful 服务器的监听端口,作为 ApiHost 并被 web 前端使用。( -a 参数)"))
+api_port.datatype = "range(1,65535)"
+api_port.placeholder = "11211"
+api_port.default = "11211"
+api_port:depends("enabled", "1")
+
+weblog = s:option(ListValue, "weblog", translate("程序日志"),
+ translate("运行日志在/tmp/easytierweb.log,可在上方日志查看
若启动失败,请前往 状态- 系统日志 查看具体启动失败日志
详细程度:警告<信息<调试<跟踪"))
+weblog.default = "off"
+weblog:value("off",translate("关闭"))
+weblog:value("warn",translate("警告"))
+weblog:value("info",translate("信息"))
+weblog:value("debug",translate("调试"))
+weblog:value("trace",translate("跟踪"))
+weblog:depends("enabled", "1")
+
return m