add easytier-web

This commit is contained in:
lmq8267
2025-03-21 08:52:35 +08:00
committed by GitHub
parent 6f7b5421a7
commit 86dc3fcae3
+96 -33
View File
@@ -4,9 +4,9 @@ local nixio = require "nixio"
m = Map("easytier")
m.description = translate('一个简单、安全、去中心化的内网穿透 VPN 组网方案,使用 Rust 语言和 Tokio 框架实现。 项目地址:<a href="https://github.com/EasyTier/EasyTier">github.com/EasyTier/EasyTier</a>&nbsp;&nbsp;<a href="http://easytier.cn">官网文档</a>&nbsp;&nbsp;<a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=jhP2Z4UsEZ8wvfGPLrs0VwLKn_uz0Q_p&authKey=OGKSQLfg61YPCpVQuvx%2BxE7hUKBVBEVi9PljrDKbHlle6xqOXx8sOwPPTncMambK&noverify=0&group_code=949700262">QQ群</a>&nbsp;&nbsp;<a href="https://doc.oee.icu">菜鸟教程</a>')
-- 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("默认使用命令行方式启动,也可以使用配置文件启动或<a href='https://easytier.cn/web'>WEB网页配置</a><br>切换启动方式后将以指定的方式启动,请谨慎选择"))
translate("官方Web控制台:<a href='https://easytier.cn/web'>easytier.cn/web</a><br>官方配置文件生成器:<a href='https://easytier.cn/web/index.html#/config_generator'>easytier.cn/web/index.html#/config_generator</a><br>注意配置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<br>命令行的启动参数和此配置文件的参数并不同步,请自行修改<br>配置文件介绍:<a href='https://easytier.rs/guide/network/config-file.html'>点此查看</a>"))
translate("配置文件在/etc/easytier/config.toml<br>命令行的启动参数和此配置文件的参数不会同步<br>注意填写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 参数)<br>自建WEB服务器 输入格式:udp://服务器地址:22020/账户名<br>官方WEB服务器 输入格式:账户名 <br>官方WEB服务器配置<a href='https://easytier.cn/web'>点此</a>"))
web_config = s:taboption("general", Value, "web_config", translate("Web服务器地址"),
translate("Web配置服务器地址。(-w 参数)<br>自建Web服务器 输入格式:udp://服务器地址:22020/账户名<br>官方Web服务器 输入格式:账户名 <br>官方Web控制台<a href='https://easytier.cn/web'>easytier.cn/web</a>"))
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 参数)<br>公共服务器可用状态查询:<a href='https://easytier.gd.nkbpal.cn/status/easytier' target='_blank'>点此查询</a>"))
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 端口。<br>默认值为 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 上监听 <br>如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行"))
translate("tcp/udp协议,端口号:11010,表示 tcp/udp 将在 11010 上监听 <br>如果是配置文件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 上监听 <br>如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行"))
translate("ws协议,端口号:11011,表示 ws 将在 11011 上监听 <br>如果是配置文件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 上监听 <br>如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行"))
translate("wss协议,端口号:11012,表示 wss 将在 11012 上监听 <br>如果是配置文件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 上监听 <br>如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行"))
translate("wireguard协议,端口号:11011,表示 wg 将在 11011 上监听 <br>如果是配置文件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 客户端连接。<br> 示例: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数据包,即使对等节点不在转发网络白名单中。<br>这可以帮助白名单外网络中的对等节点建立P2P连接。( -relay-all-peer-rpc 参数)"))
relay_all.rmempty = false
relay_all:depends("etcmd", "etcmd")
bind_device = s:taboption("privacy",Flag, "bind_device", translate("仅使用物理网卡"),
translate("将连接器的套接字绑定到物理设备以避免路由问题。<br>比如子网代理网段与某节点的网段冲突,绑定物理设备后可以与该节点正常通信。( --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 流量,降低传输延迟,提升传输速度。<br>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 流到此节点。<br>开启 KCP 代理的节点访问此节点时,依然使用原始。( --disable-kcp-input 参数)"))
kcp_input.rmempty = false
kcp_input:depends("etcmd", "etcmd")
log = s:taboption("general",ListValue, "log", translate("程序日志"),
translate("运行日志在/tmp/easytier.log,可在上方日志查看<br>若启动失败,请前往 状态- 系统日志 查看具体启动失败日志<br>详细程度:警告<信息<调试<跟踪"))
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,可在上方日志查看<br>若启动失败,请前往 状态- 系统日志 查看具体启动失败日志<br>详细程度:警告<信息<调试<跟踪"))
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