lede/package/lean/luci-app-leigod-acc/luasrc/model/cbi/leigod/device.lua

157 lines
3.9 KiB
Lua

local uci = require "luci.model.uci".cursor()
local util = require "luci.util"
local fs = require "nixio.fs"
local pairs = pairs
local io = io
-- config
m = Map("accelerator")
m.title = translate("Leigod Device Config")
m.description = translate("Control Device Config")
-- get neigh info
neigh = m:section(NamedSection, "base", "system", translate("Neigh Device"))
neigh_tab = neigh:option(ListValue, "neigh", translate("acc interface"))
local sys_dir = util.exec("ls /sys/class/net")
if sys_dir ~= nil then
neigh_tab:value("br-lan")
for ifc in string.gmatch(sys_dir, "[^\n]+") do
neigh_tab:value(ifc)
end
end
-- range all device
device = m:section(NamedSection, "device", "hardware", translate("Device Info"))
device:tab("none_catalog", translate("None_Catalog"))
device:tab("phone_catalog", translate("Phone_Catalog"))
device:tab("pc_catalog", translate("PC_Catalog"))
device:tab("game_catalog", translate("Game_Catalog"))
device:tab("vr_catalog", translate("VR_Catalog"))
device:tab("unknown_catalog", translate("Unknown_Catalog"))
local dhcp_map = {}
-- check dhcp file
if fs.access("/tmp/dhcp.leases") then
for line in io.lines("/tmp/dhcp.leases") do
-- check if read empty line
if line == "" then
break
end
-- split line
local valueSl = string.gmatch(line, "[^ ]+")
-- read time
valueSl()
-- read mac
local mac = valueSl()
-- get ip
local ip = valueSl()
-- get host name
local hostname = valueSl()
-- key
local key = string.gsub(mac, ":", "")
-- store key
dhcp_map[key] = {
["key"] = key,
["mac"] = mac,
["ip"] = ip,
["name"] = hostname
}
end
end
ifc = uci:get("accelerator", "base", "neigh")
if ifc == nil then
ifc = "br-lan"
end
local arp_map = {}
-- check if arp exist
if fs.access("/proc/net/arp") then
-- read all item from arp
for line in io.lines("/proc/net/arp") do
-- check if line is not exist
if line == "" then
break
end
-- split item
local valueSl = string.gmatch(line, "[^ ]+")
-- get ip
local ip = valueSl()
-- get type
valueSl()
-- get flag
local flag = valueSl()
-- get mac
local mac = valueSl()
-- get mask
valueSl()
-- get device
local dev = valueSl()
-- get key
local key = string.gsub(mac, ":", "")
-- check if device and flag state
if dev == ifc and flag == "0x2" then
-- get current name
local name = mac
if dhcp_map[key] ~= nil and dhcp_map[key] ~= "*" then
name = dhcp_map[key].name
end
arp_map[key] = {
["key"] = key,
["mac"] = mac,
["ip"] = ip,
["name"] = name
}
end
end
end
-- get device config
for key, item in pairs(arp_map) do
local typ = uci:get("accelerator", "device", key)
-- get device catalog from type
local catalog = "none_catalog"
-- default to unknown device
if typ == nil then
typ = 9
else
typ = tonumber(typ)
end
if typ == nil then
catalog = "unknown_catalog"
elseif typ >= 1 and typ <= 3 then
catalog = "game_catalog"
elseif typ >= 4 and typ <= 6 then
catalog = "pc_catalog"
elseif typ >= 7 and typ <= 8 then
catalog = "phone_catalog"
elseif typ >= 20 and typ <= 21 then
catalog = "vr_catalog"
else
catalog = "unknown_catalog"
end
-- device type
device_typ = device:taboption(catalog, ListValue, key, item.name)
device_typ:value("0", "None")
device_typ:value("1", "XBox")
device_typ:value("2", "Switch")
device_typ:value("3", "Play Station")
device_typ:value("4", "Steam Deck")
device_typ:value("5", "Windows")
device_typ:value("6", "MacBook")
device_typ:value("7", "Android")
device_typ:value("8", "iPhone")
device_typ:value("20", "Oculus")
device_typ:value("21", "HTC Vive")
device_typ:value("22", "Pico")
device_typ:value("9", "Unknown")
end
-- set
device.write = function()
util.exec("/etc/init.d/acc restart")
end
return m