module("luci.controller.vnt", package.seeall)
function index()
if not nixio.fs.access("/etc/config/vnt") then
return
end
entry({"admin", "vpn", "vnt"}, alias("admin", "vpn", "vnt", "vnt"),_("VNT"), 44).dependent = true
entry({"admin", "vpn", "vnt", "vnt"}, cbi("vnt"),_("VNT"), 45).leaf = true
entry({"admin", "vpn", "vnt", "vnt_log"}, form("vnt_log"),_("客户端日志"), 46).leaf = true
entry({"admin", "vpn", "vnt", "get_log"}, call("get_log")).leaf = true
entry({"admin", "vpn", "vnt", "clear_log"}, call("clear_log")).leaf = true
entry({"admin", "vpn", "vnt", "vnt_log2"}, form("vnt_log2"),_("服务端日志"), 47).leaf = true
entry({"admin", "vpn", "vnt", "get_log2"}, call("get_log2")).leaf = true
entry({"admin", "vpn", "vnt", "clear_log2"}, call("clear_log2")).leaf = true
entry({"admin", "vpn", "vnt", "status"}, call("act_status")).leaf = true
entry({"admin", "vpn", "vnt", "vnt_info"}, call("vnt_info")).leaf = true
entry({"admin", "vpn", "vnt", "vnt_all"}, call("vnt_all")).leaf = true
entry({"admin", "vpn", "vnt", "vnt_list"}, call("vnt_list")).leaf = true
entry({"admin", "vpn", "vnt", "vnt_route"}, call("vnt_route")).leaf = true
entry({"admin", "vpn", "vnt", "vnt_cmd"}, call("vnt_cmd")).leaf = true
end
function act_status()
local e = {}
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
local port = tonumber(uci:get_first("vnt", "vnts", "web_port"))
e.port = (port or 29870)
local web = tonumber(uci:get_first("vnt", "vnts", "web"))
e.web = (web or 0)
e.crunning = luci.sys.call("pgrep vnt-cli >/dev/null") == 0
e.srunning = luci.sys.call("pgrep vnts >/dev/null") == 0
local tagfile = io.open("/tmp/vnt_time", "r")
if tagfile then
local tagcontent = tagfile:read("*all")
tagfile:close()
if tagcontent and tagcontent ~= "" then
os.execute("start_time=$(cat /tmp/vnt_time) && time=$(($(date +%s)-start_time)) && day=$((time/86400)) && [ $day -eq 0 ] && day='' || day=${day}天 && time=$(date -u -d @${time} +'%H小时%M分%S秒') && echo $day $time > /tmp/command_vnt 2>&1")
local command_output_file = io.open("/tmp/command_vnt", "r")
if command_output_file then
e.vntsta = command_output_file:read("*all")
command_output_file:close()
end
end
end
local command2 = io.popen('test ! -z "`pidof vnt-cli`" && (top -b -n1 | grep -E "$(pidof vnt-cli)" 2>/dev/null | grep -v grep | awk \'{for (i=1;i<=NF;i++) {if ($i ~ /vnt-cli/) break; else cpu=i}} END {print $cpu}\')')
e.vntcpu = command2:read("*all")
command2:close()
local command3 = io.popen("test ! -z `pidof vnt-cli` && (cat /proc/$(pidof vnt-cli | awk '{print $NF}')/status | grep -w VmRSS | awk '{printf \"%.2f MB\", $2/1024}')")
e.vntram = command3:read("*all")
command3:close()
local stagfile = io.open("/tmp/vnts_time", "r")
if stagfile then
local stagcontent = stagfile:read("*all")
stagfile:close()
if stagcontent and stagcontent ~= "" then
os.execute("start_time=$(cat /tmp/vnts_time) && time=$(($(date +%s)-start_time)) && day=$((time/86400)) && [ $day -eq 0 ] && day='' || day=${day}天 && time=$(date -u -d @${time} +'%H小时%M分%S秒') && echo $day $time > /tmp/command_vnts 2>&1")
local command_output_file2 = io.open("/tmp/command_vnts", "r")
if command_output_file2 then
e.vntsta2 = command_output_file2:read("*all")
command_output_file2:close()
end
end
end
local command5 = io.popen('test ! -z "`pidof vnts`" && (top -b -n1 | grep -E "$(pidof vnts)" 2>/dev/null | grep -v grep | awk \'{for (i=1;i<=NF;i++) {if ($i ~ /vnts/) break; else cpu=i}} END {print $cpu}\')')
e.vntscpu = command5:read("*all")
command5:close()
local command6 = io.popen("test ! -z `pidof vnts` && (cat /proc/$(pidof vnts | awk '{print $NF}')/status | grep -w VmRSS | awk '{printf \"%.2f MB\", $2/1024}')")
e.vntsram = command6:read("*all")
command6:close()
local command7 = io.popen("([ -s /tmp/vnt.tag ] && cat /tmp/vnt.tag ) || (echo `$(uci -q get vnt.@vnt-cli[0].clibin) -h |grep 'version:'| awk -F 'version:' '{print $2}'` > /tmp/vnt.tag && cat /tmp/vnt.tag)")
e.vnttag = command7:read("*all")
command7:close()
local command8 = io.popen("([ -s /tmp/vntnew.tag ] && cat /tmp/vntnew.tag ) || ( curl -L -k -s --connect-timeout 3 --user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36' https://api.github.com/repos/vnt-dev/vnt/releases/latest | grep tag_name | sed 's/[^0-9.]*//g' >/tmp/vntnew.tag && cat /tmp/vntnew.tag )")
e.vntnewtag = command8:read("*all")
command8:close()
local command9 = io.popen("([ -s /tmp/vnts.tag ] && cat /tmp/vnts.tag ) || ( echo `$(uci -q get vnt.@vnts[0].vntsbin) -V | awk -F 'version: ' '{print $2}'` > /tmp/vnts.tag && cat /tmp/vnts.tag && [ ! -s /tmp/vnts.tag ] && echo '?' >> /tmp/vnts.tag && cat /tmp/vnts.tag )")
e.vntstag = command9:read("*all")
command9:close()
local command0 = io.popen("([ -s /tmp/vntsnew.tag ] && cat /tmp/vntsnew.tag ) || ( curl -L -k -s --connect-timeout 3 --user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36' https://api.github.com/repos/vnt-dev/vnts/releases/latest | grep tag_name | sed 's/[^0-9.]*//g' >/tmp/vntsnew.tag ; cat /tmp/vntsnew.tag )")
e.vntsnewtag = command0:read("*all")
command0:close()
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
function get_log()
local log = ""
local files = {"/tmp/vnt-cli.log"}
for i, file in ipairs(files) do
if luci.sys.call("[ -f '" .. file .. "' ]") == 0 then
log = log .. luci.sys.exec("cat " .. file)
end
end
luci.http.write(log)
end
function clear_log()
luci.sys.call("rm -rf /tmp/vnt-cli*.log")
end
function get_log2()
local log2 = ""
local files = {"/tmp/vnts.log"}
for i, file in ipairs(files) do
if luci.sys.call("[ -f '" .. file .. "' ]") == 0 then
log2 = log2 .. luci.sys.exec("cat " .. file)
end
end
luci.http.write(log2)
end
function clear_log2()
luci.sys.call("rm -rf /tmp/vnts*.log")
end
function vnt_info()
os.execute("rm -rf /tmp/vnt-cli_info")
local info = luci.sys.exec("$(uci -q get vnt.@vnt-cli[0].clibin) --info 2>&1")
info = info:gsub("Connection status", "连接状态")
info = info:gsub("Virtual ip", "虚拟IP")
info = info:gsub("Virtual gateway", "虚拟网关")
info = info:gsub("Virtual netmask", "虚拟网络掩码")
info = info:gsub("NAT type", "NAT类型")
info = info:gsub("Relay server", "服务器地址")
info = info:gsub("Public ips", "外网IP")
info = info:gsub("Local addr", "WAN口IP")
luci.http.prepare_content("application/json")
luci.http.write_json({ info = info })
end
function vnt_all()
os.execute("rm -rf /tmp/vnt-cli_all")
local all = luci.sys.exec("$(uci -q get vnt.@vnt-cli[0].clibin) --all 2>&1")
all = all:gsub("Virtual Ip", "虚拟IP")
all = all:gsub("NAT Type", "NAT类型")
all = all:gsub("Public Ips", "外网IP")
all = all:gsub("Local Ip", "WAN口IP")
local rows = {}
for line in all:gmatch("[^\r\n]+") do
local cols = {}
for col in line:gmatch("%S+") do
table.insert(cols, col)
end
table.insert(rows, cols)
end
local html_table = "
"
for i, row in ipairs(rows) do
html_table = html_table .. ""
for j, col in ipairs(row) do
local colors = {"#FFA500", "#800000", "#0000FF", "#3CB371", "#00BFFF", "#DAA520", "#48D1CC", "#6600CC", "#2F4F4F"}
local color = colors[(j % 9) + 1]
html_table = html_table .. "| " .. col .. " | "
end
html_table = html_table .. "
"
end
html_all = html_table .. "
"
luci.http.prepare_content("application/json")
luci.http.write_json({ all = html_all })
end
function vnt_route()
os.execute("rm -rf /tmp/vnt-cli_route")
local route = luci.sys.exec("$(uci -q get vnt.@vnt-cli[0].clibin) --route 2>&1")
route = route:gsub("Next Hop", "下一跳地址")
route = route:gsub("Interface", "连接地址")
local rows = {}
for line in route:gmatch("[^\r\n]+") do
local cols = {}
for col in line:gmatch("%S+") do
table.insert(cols, col)
end
table.insert(rows, cols)
end
local html_table = ""
for i, row in ipairs(rows) do
html_table = html_table .. ""
for j, col in ipairs(row) do
local colors = {"#FFA500", "#800000", "#0000FF", "#3CB371", "#00BFFF"}
local color = colors[(j % 5) + 1]
html_table = html_table .. "| " .. col .. " | "
end
html_table = html_table .. "
"
end
html_route = html_table .. "
"
luci.http.prepare_content("application/json")
luci.http.write_json({ route = html_route })
end
function vnt_list()
os.execute("rm -rf /tmp/vnt-cli_list")
local list = luci.sys.exec("$(uci -q get vnt.@vnt-cli[0].clibin) --list 2>&1")
list = list:gsub("Virtual Ip", "虚拟IP")
local rows = {}
for line in list:gmatch("[^\r\n]+") do
local cols = {}
for col in line:gmatch("%S+") do
table.insert(cols, col)
end
table.insert(rows, cols)
end
local html_table = ""
for i, row in ipairs(rows) do
html_table = html_table .. ""
for j, col in ipairs(row) do
local colors = {"#FFA500", "#800000", "#0000FF", "#3CB371", "#00BFFF"}
local color = colors[(j % 5) + 1]
html_table = html_table .. "| " .. col .. " | "
end
html_table = html_table .. "
"
end
html_table = html_table .. "
"
luci.http.prepare_content("application/json")
luci.http.write_json({ list = html_table })
end
function vnt_cmd()
os.execute("rm -rf /tmp/vnt*_cmd")
local html_cmd= luci.sys.exec("echo $(cat /proc/$(pidof vnt-cli)/cmdline | awk '{print $1}') 2>&1")
html_cmd = html_cmd:gsub("--no", "-不")
html_cmd = html_cmd:gsub("--dns", "dns服务")
html_cmd = html_cmd:gsub("--ip", "--地址")
html_cmd = html_cmd:gsub("--nic", "网卡名")
html_cmd = html_cmd:gsub("--use", "直连")
html_cmd = html_cmd:gsub("-channel", "方式")
luci.http.prepare_content("application/json")
luci.http.write_json({ cmd = html_cmd })
end