mirror of
https://github.com/wangyu-/udp2raw.git
synced 2025-10-03 04:15:35 +08:00
add luci-app-udp2raw and udp2raw-openwrt-makefile
This commit is contained in:
30
third-party/luci-app-udp2raw/files/luci/controller/udp2raw.lua
vendored
Normal file
30
third-party/luci-app-udp2raw/files/luci/controller/udp2raw.lua
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
module("luci.controller.udp2raw", package.seeall)
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access("/etc/config/udp2raw") then
|
||||
return
|
||||
end
|
||||
|
||||
entry({"admin", "services", "udp2raw"},
|
||||
firstchild(), _("udp2raw-tunnel")).dependent = false
|
||||
|
||||
entry({"admin", "services", "udp2raw", "general"},
|
||||
cbi("udp2raw/general"), _("Settings"), 1)
|
||||
|
||||
entry({"admin", "services", "udp2raw", "servers"},
|
||||
arcombine(cbi("udp2raw/servers"), cbi("udp2raw/servers-details")),
|
||||
_("Servers Manage"), 2).leaf = true
|
||||
|
||||
entry({"admin", "services", "udp2raw", "status"}, call("action_status"))
|
||||
end
|
||||
|
||||
local function is_running(name)
|
||||
return luci.sys.call("pidof %s >/dev/null" %{name}) == 0
|
||||
end
|
||||
|
||||
function action_status()
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json({
|
||||
running = is_running("udp2raw")
|
||||
})
|
||||
end
|
BIN
third-party/luci-app-udp2raw/files/luci/i18n/udp2raw.zh-cn.lmo
vendored
Normal file
BIN
third-party/luci-app-udp2raw/files/luci/i18n/udp2raw.zh-cn.lmo
vendored
Normal file
Binary file not shown.
120
third-party/luci-app-udp2raw/files/luci/i18n/udp2raw.zh-cn.po
vendored
Normal file
120
third-party/luci-app-udp2raw/files/luci/i18n/udp2raw.zh-cn.po
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
||||
msgid "udp2raw-tunnel"
|
||||
msgstr "udp2raw 隧道"
|
||||
|
||||
msgid "Settings"
|
||||
msgstr "设置"
|
||||
|
||||
msgid "Servers Manage"
|
||||
msgstr "服务器管理"
|
||||
|
||||
msgid "Running Status"
|
||||
msgstr "运行状态"
|
||||
|
||||
msgid "Binary Version"
|
||||
msgstr "文件版本"
|
||||
|
||||
msgid "Build Time"
|
||||
msgstr "编译时间"
|
||||
|
||||
msgid "Invalid Binary File."
|
||||
msgstr "可执行文件无效。"
|
||||
|
||||
msgid "RUNNING"
|
||||
msgstr "运行中"
|
||||
|
||||
msgid "NOT RUNNING"
|
||||
msgstr "未运行"
|
||||
|
||||
msgid "General Settings"
|
||||
msgstr "基本设置"
|
||||
|
||||
msgid "Server"
|
||||
msgstr "服务器"
|
||||
|
||||
msgid "Disable"
|
||||
msgstr "停用"
|
||||
|
||||
msgid "Run Daemon as User"
|
||||
msgstr "以该用户启动"
|
||||
|
||||
msgid "Alias"
|
||||
msgstr "别名"
|
||||
|
||||
msgid "None"
|
||||
msgstr "无"
|
||||
|
||||
msgid "Server Address"
|
||||
msgstr "服务器地址"
|
||||
|
||||
msgid "Listen Address"
|
||||
msgstr "监听地址"
|
||||
|
||||
msgid "Edit Server"
|
||||
msgstr "编辑服务器"
|
||||
|
||||
msgid "Alias(optional)"
|
||||
msgstr "别名(可选)"
|
||||
|
||||
msgid "Server Port"
|
||||
msgstr "服务器端口"
|
||||
|
||||
msgid "Local Listen Host"
|
||||
msgstr "本地监听地址"
|
||||
|
||||
msgid "Local Listen Port"
|
||||
msgstr "本地监听端口"
|
||||
|
||||
msgid "Raw Mode"
|
||||
msgstr "Raw 方式"
|
||||
|
||||
msgid "Password"
|
||||
msgstr "密码"
|
||||
|
||||
msgid "Cipher Mode"
|
||||
msgstr "加密方式"
|
||||
|
||||
msgid "Auth Mode"
|
||||
msgstr "认证方式"
|
||||
|
||||
msgid "Auto Rule"
|
||||
msgstr "自动规则"
|
||||
|
||||
msgid "Auto add (and delete) iptables rule."
|
||||
msgstr "自动添加/删除 iptables 规则。"
|
||||
|
||||
msgid "Keep Rule"
|
||||
msgstr "保持规则"
|
||||
|
||||
msgid "Monitor iptables and auto re-add if necessary."
|
||||
msgstr "监视 iptables 并在必要时重新添加规则。"
|
||||
|
||||
msgid "seq Mode"
|
||||
msgstr "seq 模式"
|
||||
|
||||
msgid "seq increase mode for faketcp."
|
||||
msgstr "用于 faketcp 的 seq 增加方式。"
|
||||
|
||||
msgid "Lower Level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send packets at OSI level 2, format: \"eth0#00:11:22:33:44:55\", or \"auto\"."
|
||||
msgstr "在 OSI 模型第二层发送数据包,格式:\"eth0#00:11:22:33:44:55\",或 \"auto\"。"
|
||||
|
||||
msgid "Source-IP"
|
||||
msgstr "源IP"
|
||||
|
||||
msgid "Force source-ip for Raw Socket."
|
||||
msgstr "在原始数据包中强制指定源IP。"
|
||||
|
||||
msgid "Source-Port"
|
||||
msgstr "源端口"
|
||||
|
||||
msgid "Force source-port for Raw Socket, TCP/UDP only."
|
||||
msgstr "在原始数据包中强制指定源端口,仅用于 TCP/UDP。"
|
||||
|
||||
msgid "Log Level"
|
||||
msgstr "日志级别"
|
||||
|
38
third-party/luci-app-udp2raw/files/luci/model/cbi/udp2raw/general.lua
vendored
Normal file
38
third-party/luci-app-udp2raw/files/luci/model/cbi/udp2raw/general.lua
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
local m, s, o
|
||||
local uci = luci.model.uci.cursor()
|
||||
local servers = {}
|
||||
|
||||
local function has_bin(name)
|
||||
return luci.sys.call("command -v %s >/dev/null" %{name}) == 0
|
||||
end
|
||||
|
||||
if not has_bin("udp2raw") then
|
||||
return Map("udp2raw", "%s - %s" %{translate("udp2raw-tunnel"),
|
||||
translate("Settings")}, '<b style="color:red">udp2raw-tunnel binary file not found.</b>')
|
||||
end
|
||||
|
||||
uci:foreach("udp2raw", "servers", function(s)
|
||||
if s.server_addr and s.server_port then
|
||||
servers[#servers+1] = {name = s[".name"], alias = s.alias or "%s:%s" %{s.server_addr, s.server_port}}
|
||||
end
|
||||
end)
|
||||
|
||||
m = Map("udp2raw", "%s - %s" %{translate("udp2raw-tunnel"), translate("Settings")})
|
||||
m:append(Template("udp2raw_status"))
|
||||
|
||||
s = m:section(NamedSection, "general", "general", translate("General Settings"))
|
||||
s.anonymous = true
|
||||
s.addremove = false
|
||||
|
||||
o = s:option(ListValue, "server", translate("Server"))
|
||||
o:value("nil", translate("Disable"))
|
||||
for _, s in ipairs(servers) do o:value(s.name, s.alias) end
|
||||
o.default = "nil"
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(ListValue, "daemon_user", translate("Run Daemon as User"))
|
||||
for u in luci.util.execi("cat /etc/passwd | cut -d ':' -f1") do o:value(u) end
|
||||
o.default = "root"
|
||||
o.rmempty = false
|
||||
|
||||
return m
|
96
third-party/luci-app-udp2raw/files/luci/model/cbi/udp2raw/servers-details.lua
vendored
Normal file
96
third-party/luci-app-udp2raw/files/luci/model/cbi/udp2raw/servers-details.lua
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
local m, s, o
|
||||
local sid = arg[1]
|
||||
|
||||
local raw_modes = {
|
||||
"faketcp",
|
||||
"udp",
|
||||
"icmp",
|
||||
}
|
||||
|
||||
local cipher_modes = {
|
||||
"aes128cbc",
|
||||
"xor",
|
||||
"none",
|
||||
}
|
||||
|
||||
local auth_modes = {
|
||||
"md5",
|
||||
"crc32",
|
||||
"simple",
|
||||
"none",
|
||||
}
|
||||
|
||||
m = Map("udp2raw", "%s - %s" %{translate("udp2raw-tunnel"), translate("Edit Server")})
|
||||
m.redirect = luci.dispatcher.build_url("admin/services/udp2raw/servers")
|
||||
m.sid = sid
|
||||
|
||||
if m.uci:get("udp2raw", sid) ~= "servers" then
|
||||
luci.http.redirect(m.redirect)
|
||||
return
|
||||
end
|
||||
|
||||
s = m:section(NamedSection, sid, "servers")
|
||||
s.anonymous = true
|
||||
s.addremove = false
|
||||
|
||||
o = s:option(Value, "alias", translate("Alias(optional)"))
|
||||
|
||||
o = s:option(Value, "server_addr", translate("Server"))
|
||||
o.datatype = "host"
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, "server_port", translate("Server Port"))
|
||||
o.datatype = "port"
|
||||
o.placeholder = "8080"
|
||||
|
||||
o = s:option(Value, "listen_addr", translate("Local Listen Host"))
|
||||
o.datatype = "ipaddr"
|
||||
o.placeholder = "127.0.0.1"
|
||||
|
||||
o = s:option(Value, "listen_port", translate("Local Listen Port"))
|
||||
o.datatype = "port"
|
||||
o.placeholder = "2080"
|
||||
|
||||
o = s:option(ListValue, "raw_mode", translate("Raw Mode"))
|
||||
for _, v in ipairs(raw_modes) do o:value(v, v:lower()) end
|
||||
o.default = "faketcp"
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, "key", translate("Password"))
|
||||
o.password = true
|
||||
|
||||
o = s:option(ListValue, "cipher_mode", translate("Cipher Mode"))
|
||||
for _, v in ipairs(cipher_modes) do o:value(v, v:lower()) end
|
||||
o.default = "aes128cbc"
|
||||
|
||||
o = s:option(ListValue, "auth_mode", translate("Auth Mode"))
|
||||
for _, v in ipairs(auth_modes) do o:value(v, v:lower()) end
|
||||
o.default = "md5"
|
||||
|
||||
o = s:option(Flag, "auto_rule", translate("Auto Rule"), translate("Auto add (and delete) iptables rule."))
|
||||
o.enabled = "1"
|
||||
o.disabled = "0"
|
||||
o.default = "1"
|
||||
|
||||
o = s:option(Flag, "keep_rule", translate("Keep Rule"), translate("Monitor iptables and auto re-add if necessary."))
|
||||
o.enabled = "1"
|
||||
o.disabled = "0"
|
||||
o:depends("auto_rule", "1")
|
||||
|
||||
o = s:option(Value, "seq_mode", translate("seq Mode"), translate("seq increase mode for faketcp."))
|
||||
o.datatype = "range(0,4)"
|
||||
o.placeholder = "3"
|
||||
|
||||
o = s:option(Value, "lower_level", translate("Lower Level"), translate("Send packets at OSI level 2, format: \"eth0#00:11:22:33:44:55\", or \"auto\"."))
|
||||
|
||||
o = s:option(Value, "source_ip", translate("Source-IP"), translate("Force source-ip for Raw Socket."))
|
||||
o.datatype = "ipaddr"
|
||||
|
||||
o = s:option(Value, "source_port", translate("Source-Port"), translate("Force source-port for Raw Socket, TCP/UDP only."))
|
||||
o.datatype = "port"
|
||||
|
||||
o = s:option(Value, "log_level", translate("Log Level"))
|
||||
o.datatype = "range(0,6)"
|
||||
o.placeholder = "4"
|
||||
|
||||
return m
|
56
third-party/luci-app-udp2raw/files/luci/model/cbi/udp2raw/servers.lua
vendored
Normal file
56
third-party/luci-app-udp2raw/files/luci/model/cbi/udp2raw/servers.lua
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
local m, s, o
|
||||
|
||||
m = Map("udp2raw", "%s - %s" %{translate("udp2raw-tunnel"), translate("Servers Manage")})
|
||||
|
||||
s = m:section(TypedSection, "servers")
|
||||
s.anonymous = true
|
||||
s.addremove = true
|
||||
s.sortable = true
|
||||
s.template = "cbi/tblsection"
|
||||
s.extedit = luci.dispatcher.build_url("admin/services/udp2raw/servers/%s")
|
||||
function s.create(...)
|
||||
local sid = TypedSection.create(...)
|
||||
if sid then
|
||||
luci.http.redirect(s.extedit % sid)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
o = s:option(DummyValue, "alias", translate("Alias"))
|
||||
function o.cfgvalue(...)
|
||||
return Value.cfgvalue(...) or translate("None")
|
||||
end
|
||||
|
||||
o = s:option(DummyValue, "_server_address", translate("Server Address"))
|
||||
function o.cfgvalue(self, section)
|
||||
local server_addr = m.uci:get("udp2raw", section, "server_addr") or "?"
|
||||
local server_port = m.uci:get("udp2raw", section, "server_port") or "8080"
|
||||
return "%s:%s" %{server_addr, server_port}
|
||||
end
|
||||
|
||||
o = s:option(DummyValue, "_listen_address", translate("Listen Address"))
|
||||
function o.cfgvalue(self, section)
|
||||
local listen_addr = m.uci:get("udp2raw", section, "listen_addr") or "127.0.0.1"
|
||||
local listen_port = m.uci:get("udp2raw", section, "listen_port") or "2080"
|
||||
return "%s:%s" %{listen_addr, listen_port}
|
||||
end
|
||||
|
||||
o = s:option(DummyValue, "raw_mode", translate("Raw Mode"))
|
||||
function o.cfgvalue(...)
|
||||
local v = Value.cfgvalue(...)
|
||||
return v and v:lower() or "faketcp"
|
||||
end
|
||||
|
||||
o = s:option(DummyValue, "cipher_mode", translate("Cipher Mode"))
|
||||
function o.cfgvalue(...)
|
||||
local v = Value.cfgvalue(...)
|
||||
return v and v:lower() or "aes128cbc"
|
||||
end
|
||||
|
||||
o = s:option(DummyValue, "auth_mode", translate("Auth Mode"))
|
||||
function o.cfgvalue(...)
|
||||
local v = Value.cfgvalue(...)
|
||||
return v and v:lower() or "md5"
|
||||
end
|
||||
|
||||
return m
|
39
third-party/luci-app-udp2raw/files/luci/view/udp2raw_status.htm
vendored
Normal file
39
third-party/luci-app-udp2raw/files/luci/view/udp2raw_status.htm
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
<%
|
||||
local function get_udp2raw_version(name)
|
||||
local info = luci.util.split(luci.sys.exec("%s -h 2>/dev/null" %{name}), "\n")
|
||||
local version = string.match(info[2], "git version:(%w+)")
|
||||
local build = string.match(info[2], "build date:(.+)")
|
||||
return info[1] == "udp2raw-tunnel" and version or "", info[1] == "udp2raw-tunnel" and build or ""
|
||||
end
|
||||
|
||||
local udp2raw_version, udp2raw_build = get_udp2raw_version("udp2raw")
|
||||
-%>
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
<legend><%:Running Status%></legend>
|
||||
<table width="100%" cellspacing="10" id="_udp2raw_status_table">
|
||||
<tr>
|
||||
<td width="33%"><%:Binary Version%></td>
|
||||
<td>
|
||||
<% if udp2raw_version == "" then -%>
|
||||
<em><%:Invalid Binary File.%></em>
|
||||
<% else -%>
|
||||
<%=pcdata(udp2raw_version)%>
|
||||
<%- end %>
|
||||
</td>
|
||||
</tr>
|
||||
<% if udp2raw_build ~= "" then -%>
|
||||
<tr><td width="33%"><%:Build Time%></td><td><%=pcdata(udp2raw_build)%></td></tr>
|
||||
<% end -%>
|
||||
<tr><td width="33%"><%:Running Status%></td><td id="_udp2raw_status"><em><%:Collecting data...%></em></td></tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
var udp2raw_status = document.getElementById('_udp2raw_status');
|
||||
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "udp2raw", "status")%>', null, function(x, status) {
|
||||
if ( x && x.status == 200 ) {
|
||||
udp2raw_status.innerHTML = status.running ? '<%:RUNNING%>' : '<%:NOT RUNNING%>';
|
||||
}
|
||||
});
|
||||
//]]></script>
|
Reference in New Issue
Block a user