OpenWrt_Luci_Lua/Me_Lua/h10/meizu/nwfs.lua
2015-05-14 10:17:14 +08:00

1879 lines
50 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module("meizu.nwfs", package.seeall)
--network functions
local cjson = require "cjson"
local lfs = require "lfs"
local bfs = require "meizu.bfs"
local RC = require "meizu.r10config"
local bind_router = bfs.bind_router
local data_to_json = bfs.data_to_json
local exec_cmd_in_sh = bfs.exec_cmd_in_sh
local exec_reboot = bfs.exec_reboot
local get_device_SN = bfs.get_device_SN
local get_device_version = bfs.get_device_version
local get_https_data = bfs.get_https_data
local rts_get_access_token = bfs.rts_get_access_token
local set_passwd = bfs.set_passwd
local silent_upgrade = bfs.silent_upgrade
local strsplit = bfs.strsplit
local b64dec = bfs.b64dec
local b64enc = bfs.b64enc
local lue = require("luci.util").exec
function get_connect_info()
--usr/lib/lua/luci/controller/admin/network.lua lease_status()
local rv = { }
local s = require "luci.tools.status"
luci.http.prepare_content("application/json")
rv = s.dhcp_leases()
for k, v in pairs(rv) do
v.netswitch = "true"
v.diskswitch = "true"
v.netspeed = 0
v.onnettime = 0
v.netflow = 0
end
luci.http.write_json(rv)
end
function wifi_network(wifi_device_name)
local network = require "luci.model.network".init()
local wifi_net = network:get_wifinet(wifi_device_name)
if wifi_net then
local dev = wifi_net:get_device()
if dev then
return {
id = wifi_device_name,
name = wifi_net:shortname(),
up = wifi_net:is_up(),
mode = wifi_net:active_mode(),
ssid = wifi_net:active_ssid(),
bssid = wifi_net:active_bssid(),
encryption = wifi_net:active_encryption(),
encryption_src = wifi_net:get("encryption"),
frequency = wifi_net:frequency(),
bitrate = wifi_net:bitrate(),
ifname = wifi_net:ifname(),
assoclist = wifi_net:assoclist(),
country = wifi_net:country(),
key = wifi_net:get("key"),
key1 = wifi_net:get("key1"),
hidden = wifi_net:get("hidden"),
device = {
up = dev:is_up(),
device = dev:name(),
name = dev:get_i18n()
}
}
end
end
return {}
end
function wifi_networks()
local result = {}
local network = require "luci.model.network".init()
local dev
for _, dev in ipairs(network:get_wifidevs()) do
local rd = {
up = dev:is_up(),
device = dev:name(),
name = dev:get_i18n(),
networks = {}
}
local wifi_net
for _, wifi_net in ipairs(dev:get_wifinets()) do
rd.networks[#rd.networks+1] = {
name = wifi_net:shortname(),
up = wifi_net:is_up(),
mode = wifi_net:active_mode(),
ssid = wifi_net:active_ssid(),
bssid = wifi_net:active_bssid(),
encryption = wifi_net:active_encryption(),
frequency = wifi_net:frequency(),
channel = wifi_net:channel(),
signal = wifi_net:signal(),
quality = wifi_net:signal_percent(),
noise = wifi_net:noise(),
bitrate = wifi_net:bitrate(),
ifname = wifi_net:ifname(),
assoclist = wifi_net:assoclist(),
country = wifi_net:country(),
key = wifi_net:get("key"),
key1 = wifi_net:get("key1"),
encryption_src = wifi_net:get("encryption"),
hidden = wifi_net:get("hidden"),
}
end
result[#result+1] = rd
end
return result
end
function nw_get_wifi_settings()
luci.http.prepare_content("application/json")
local app_version = luci.http.formvalue("appVer")
if app_version == nil then
app_version = 0
end
local list = get_wifi_settings(app_version)
luci.http.write(list)
end
function ww_get_wifi_settings(app_version)
local list = get_wifi_settings(app_version)
--return data_to_json(list)
return list
end
function get_wifi_settings(app_version)
local network = require "luci.model.network".init()
local info_list = {}
local wifis = wifi_networks()
for i,wifi_net in ipairs(wifis) do
local item = {}
local index = 1
if wifi_net.device == "wl0" then
local wifi_net_wl0 = network:get_wifinet('wl0.network1')
if wifi_net_wl0:get("disabled") == "1" then
item["status"] = "false"
else
item["status"] = "true"
end
end
if wifi_net.device == "wl1" then
local wifi_net_wl1 = network:get_wifinet('wl1.network1')
if wifi_net_wl1:get("disabled") == "1" then
item["status"] = "false"
else
item["status"] = "true"
end
end
local encryption = wifi_net.networks[index].encryption_src
local key = wifi_net.networks[index].key
if encryption == "wep-open" then
key = wifi_net.networks[index].key1
if key:len()>4 and key:sub(0,2)=="s:" then
key = key:sub(3)
end
end
item["name"] = wifi_net.networks[index].ifname
item["ssid"] = wifi_net.networks[index].ssid
if key == nil then
key = ""
end
item["password"] = key
item["encryption"] = encryption
info_list[#wifis+1-i] = item
end
local guestwifi = get_guest_wifi(1)
if guestwifi then
table.insert(info_list, guestwifi)
end
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, info_list)
if tonumber(app_version) >= 5 then
return b64enc(cjson.encode(info_list))
else
return cjson.encode(info_list)
end
end
function get_wifi_ssids()
local wifis = wifi_networks()
local ssid1 = ""
local ssid2 = ""
for i, wifi_net in ipairs(wifis) do
if i == 1 then
ssid1 = wifi_net.networks[1].ssid
end
if i == 2 then
ssid2 = wifi_net.networks[1].ssid
end
end
return ssid1, ssid2
end
function nw_wifi_settings()
luci.http.prepare_content("application/json")
local data = luci.http.formvalue("data")
local app_version = luci.http.formvalue("appVer")
if app_version == nil then
app_version = 0
end
local switch_2g = nil
local switch_5g = nil
local switch_guest = nil
local ssid_2g = nil
local ssid_5g = nil
local ssid_guest = nil
local pwd_2g = nil
local pwd_5g = nil
local pwd_guest = nil
local encry_2g = nil
local encry_5g = nil
local encry_guest = nil
if tonumber(app_version) >= 5 then
local data = b64dec(data)
data = cjson.decode(data)
for k, v in pairs(data) do
if v.name == "wl0" then
switch_2g = v.on
ssid_2g = v.ssid
pwd_2g = v.pwd
encry_2g = v.encryption
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, debug.getinfo(1).currentline)
elseif v.name == "wl1" then
switch_5g = v.on
ssid_5g = v.ssid
pwd_5g = v.pwd
encry_5g = v.encryption
else
switch_guest = v.on
ssid_guest = v.ssid
pwd_guest = v.pwd
encry_guest = v.encryption
end
end
else
switch_2g = luci.http.formvalue("on1")
ssid_2g = luci.http.formvalue("ssid1")
pwd_2g = luci.http.formvalue("pwd1")
encry_2g = luci.http.formvalue("encryption1")
switch_5g = luci.http.formvalue("on2")
ssid_5g = luci.http.formvalue("ssid2")
pwd_5g = luci.http.formvalue("pwd2")
encry_5g = luci.http.formvalue("encryption2")
switch_guest = luci.http.formvalue("on3")
ssid_guest = luci.http.formvalue("ssid3")
pwd_guest = luci.http.formvalue("pwd3")
encry_guest = luci.http.formvalue("encryption3")
end
local res = wifi_settings(switch_2g, ssid_2g, pwd_2g, encry_2g, switch_5g, ssid_5g, pwd_5g, encry_5g, switch_guest, ssid_guest, pwd_guest, encry_guest)
luci.http.write_json(res)
end
function wifi_settings(switch_2g, ssid_2g, pwd_2g, encry_2g, switch_5g, ssid_5g, pwd_5g, encry_5g, switch_guest, ssid_guest, pwd_guest, encry_guest)
local result = {}
local res = {}
local details = {}
--local code = 0
local code_2g = 0
local code_5g = 0
local code_guest = 0
local code_2g = check_ssid(ssid_2g, 31)
local code_5g = check_ssid(ssid_5g, 31)
local code_guest = check_ssid(ssid_guest, 31)
local succeed_2g = false
local succeed_5g = false
local succeed_guest = false
if switch_2g == "false" then
succeed_2g = set_wifi_basic_info(1, nil, nil, nil, switch_2g)
else
if code_2g == 1 then
succeed_2g = set_wifi_basic_info(1, ssid_2g, pwd_2g, encry_2g, switch_2g)
end
end
if switch_5g == "false" then
succeed_5g = set_wifi_basic_info(2, nil, nil, nil, switch_5g)
else
if code_5g == 1 then
succeed_5g = set_wifi_basic_info(2, ssid_5g, pwd_5g, encry_5g, switch_5g)
end
end
local wifirestart = true
if switch_guest == "true" then
switch_guest = 1
if set_guest(1, ssid_guest, encry_guest, pwd_guest, 1, switch_guest) then
succeed_guest = true
--code = 0
else
succeed_guest = false
wifirestart = false
end
elseif switch_guest == "false" then
switch_guest = 0
if set_guest(1, nil, nil, nil, 0, switch_guest) then
succeed_guest = true
end
else
return nil
end
if code_2g ~= 0 and code_5g ~= 0 and code_guest ~= 0 and succeed_2g ~= false
and succeed_5g ~= false and succeed_guest ~= false then
res["result"] = true
if wifirestart then
fork_restart_wifi()
end
else
res["result"] = false
end
return res
end
function set_wifi_basic_info(wifi_index, ssid, password, encryption, on)
local network = require "luci.model.network".init()
if wifi_index == 1 then
wifi_net = network:get_wifinet('wl0.network1')
wifi_dev = network:get_wifidev('wl0')
end
if wifi_index == 2 then
wifi_net = network:get_wifinet('wl1.network1')
wifi_dev = network:get_wifidev('wl1')
end
if wifi_net == nil then
return false
end
if wifi_dev then
if on == "true" then
wifi_net:set("disabled", "0")
elseif on == "false" then
wifi_net:set("disabled", "1")
end
end
if not is_str_nil(ssid) and check_ssid(ssid) then
wifi_net:set("ssid",ssid)
end
local code = check_wifi_passwd(password,encryption)
if code == 0 then
wifi_net:set("encryption",encryption)
wifi_net:set("key",password)
if encryption == "none" then
wifi_net:set("key","")
elseif encryption == "wep-open" then
wifi_net:set("key1","s:"..password)
wifi_net:set("key",1)
end
elseif code > 1502 then
return false
end
network:save("wireless")
network:commit("wireless")
return true
end
function is_str_nil(str)
return (str == nil or str == "")
end
function check_ssid(ssid)
if is_str_nil(ssid) then
return 0
end
return 1
--[[
if string.match(ssid,"^%w[%w_.-]*%w$") or string.match(ssid, "^%w$") or
string.match(ssid, "^%w[%w_.-]*$") or string.match(ssid,"^[%w_.-]*$") or
string.match(ssid, "^[%w_.-]*%w$") then
return 1
else
return 0
end
]]
end
function check_wifi_passwd(passwd,encryption)
if is_str_nil(encryption) or (encryption and encryption ~= "none" and is_str_nil(passwd)) then
return 1502
end
if encryption == "psk" or encryption == "psk2" then
if passwd:len() < 8 then
return 1520
end
elseif encryption == "mixed-psk" then
if passwd:len()<8 or passwd:len()>63 then
return 1521
end
elseif encryption == "wep-open" then
if passwd:len()~=5 and passwd:len()~=13 then
return 1522
end
end
--[[
if passwd ~= "" then
local ret = string.match(passwd, "^%w[^&\\%%+]*%w$") or string.match(passwd, "^%w[^&\\%%+]*$")
if ret == nil or string.find(passwd,'"') then
return 1523
end
end
]]
return 0
end
function fork_restart_wifi()
local FORK_RESTART_WIFI = "sleep 1; /sbin/wifi >/dev/null 2>/dev/null; /etc/init.d/minidlna restart; /etc/init.d/samba restart; /usr/bin/gettraffic flush_wl_dev >/dev/null 2>/dev/null"
exec_cmd_in_sh(FORK_RESTART_WIFI)
end
function fork_restart_network()
local FORK_RESTART_WORK= "/etc/init.d/network restart"
exec_cmd_in_sh(FORK_RESTART_WORK)
end
function fork_smart_wifi_shutdown(wnet, close_time, open_time)
local close_interval = close_time - os.time()
local open_interval = open_time - os.time()
local cmd = string.format("sleep 15; /sbin/wifi down "..wnet.."; sleep 15; /sbin/wifi up "..wnet)
--local cmd = string.format("sleep %s; /sbin/wifi down; sleep %s; /sbin/wifi up;", tostring(close_interval), tostring(open_interval))
--local cmd = "/sbin/wifi "..switch.." "..wnet
--local cmd = string.format("sleep %s; /sbin/wifi down; sleep %s; /sbin/wifi up;", tostring(close_interval), tostring(open_interval))
local cmd = string.format("/sbin/wifi down")
luci.http.status(200, shutdown and "Shutdown" or "Reconnected")
exec_cmd_in_sh(cmd)
end
--[[
--function: 定时wifi开关
--author rh_Jameson
--]]--
--wifi重连 &开关基础函数
local function wifi_reconnect_shutdown(shutdown, wnet)
local netmd = require "luci.model.network".init()
local net = netmd:get_wifinet(wnet)
local dev = net:get_device()
if dev and net then
dev:set("disabled", nil)
net:set("disabled", shutdown and 1 or nil)
netmd:commit("wireless")
luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>/dev/null")
luci.sys.call("env -i /sbin/wifi reload >/dev/null 2>/dev/null")
--luci.http.status(200, shutdown and "Shutdown" or "Reconnected")
return
end
--luci.http.status(404, "No such radio")
end
--wifi重连
function wifi_reconnect(wnet)
wifi_reconnect_shutdown(false, wnet)
end
--wifi关闭
function wifi_shutdown(wnet)
wifi_reconnect_shutdown(true, wnet)
end
--function: 定时wifi开关shell形式
--author rh_Jameson
function smart_wifi_shutdown()
local wnet = 'WL1'
local info = {}
local switch = luci.http.formvalue("switch")
--get para
--close_time = luci.http.formvalue("close_time")
--open_time = luci.http.formvalue("open_time")
--test normal
close_time = os.time() + 5
restart_time = os.time() + 10
--test exception
--close_time = os.time() - 5
--restart_time = os.time() - 10
--para err manage
if close_time < os.time() or restart_time < close_time then
info["SUCCESS"] = false
else
info["SUCCESS"] = true
end
fork_smart_wifi_shutdown(switch, wnet, close_time, restart_time)
luci.http.write_json(info)
end
--[[
--function: 定时wifi开关
--author rh_Jameson
function smart_wifi_shutdown()
local wnet = 'mt7628.network1'
local table = {}
--get para
--local close_time = luci.http.formvalue("close_time")
--local open_time = luci.http.formvalue("open_time")
--test normal
--local close_time = os.time() + 5
--local restart_time = os.time() + 10
--test exception
local close_time = os.time() - 5
local restart_time = os.time() - 10
--para err manage
if close_time < os.time() or restart_time < close_time then
table["err"] = true
luci.http.write_json(table)
return
end
--do close
while true do
if os.time() ~= close_time then
posix.sleep(1)
else
wifi_shutdown(wnet)
table["close"] = true
luci.http.write_json(table)
break
end
end
--do restart
while true do
if os.time() ~= restart_time then
posix.sleep(1)
else
wifi_reconnect(wnet)
table["restart"] = true
luci.http.write_json(table)
break
end
end
end
--]]--
function check_guest_wifi()
local uci = require("luci.model.uci").cursor()
local guest = uci:get_all("network", "eth0_3")
if guest then
return true
else
return false
end
end
function set_guest(wifi_index, ssid, encryption, key, enabled, open)
local success = set_guest_wifi(wifi_index, ssid, encryption, key, enabled, open)
if not success then
return false
end
local networkrestart = true
if check_guest_wifi() then
networkrestart = false
end
if networkrestart then
local lanip = get_lan_ip()
local lan = lanip:gsub(".%d+.%d+$", "")
local cip = tonumber(lanip:match(".(%d+).%d+$"))
local nixio = require("nixio")
local bit = nixio.bit
cip = bit.bor(bit.band(1, cip + 1), bit.lshift(bit.rshift(cip, 1), 1))
lanip = lan.."."..tostring(cip)..".1"
exec_cmd_in_sh("sleep 4; /usr/sbin/guest_ssid_network start "..lanip.." 255.255.255.0 >/dev/null 2>/dev/null")
else
fork_restart_wifi()
end
return true
end
function set_guest_wifi(wifi_index, ssid, encryption, key, enabled, open)
local uci = require("luci.model.uci").cursor()
local wifinetid, ifname
local enabled = tonumber(enabled) == 1 and 1 or 0
local open = tonumber(open) == 1 and 1 or 0
if tonumber(wifi_index) == 1 then
wifinetid = "wl0iface1"
ifname = uci:get_all("wireless", "@wifi-iface[1]","ifname")
else
return false
end
guestwifi = uci:get_all("wireless", wifinetid)
if guestwifi then
guestwifi["ifname"] = ifname
if not is_str_nil(ssid) and check_ssid(ssid) then
guestwifi["ssid"] = ssid
end
if encryption and string.lower(tostring(encryption)) == "none" then
guestwifi["encryption"] = "none"
guestwifi["key"] = ""
end
if enabled == 1 then
guestwifi["disabled"] = 0
elseif enabled == 0 then
guestwifi["disabled"] = 1
else
end
if open then
guestwifi["open"] = open
end
if encryption and string.lower(tostring(encryption)) ~= "none" and not is_str_nil(key) then
local check = check_wifi_passwd(key,encryption)
if check == 0 then
guestwifi["encryption"] = encryption
guestwifi["key"] = key
else
return false
end
end
else
if is_str_nil(ssid) or is_str_nil(encryption) then
return false
end
guestwifi = {
["ifname"] = ifname,
["network"] = "guest",
["ssid"] = ssid,
["mode"] = "ap",
["encryption"] = encryption,
["key"] = key,
["open"] = open,
["enabled"] = enabled
}
end
uci:section("wireless", "wifi-iface", wifinetid, guestwifi)
uci:commit("wireless")
return true
end
function get_lan_ip()
local uci = require("luci.model.uci").cursor()
local lan = uci:get_all("network", "lan")
return lan.ipaddr
end
function get_guest_wifi(wifiIndex)
local uci = require("luci.model.uci").cursor()
local index = tonumber(wifiIndex)
local status
local guestwifi
guestwifi = uci:get_all("wireless","wl0iface1")
if guestwifi then
if guestwifi.disabled == "1" then
status = "false"
else
status = "true"
end
if guestwifi.key == nil then
guestwifi.key = "none"
end
return {
["name"] = "guest",
["ssid"] = guestwifi.ssid,
["encryption"] = guestwifi.encryption,
["password"] = guestwifi.key,
["status"] = status,
}
end
return guestwifi
end
function macFormat(mac)
if mac then
return string.upper(string.gsub(mac, "-", ":"))
else
return ""
end
end
function getAllWifiConnetDeviceDict()
local result = {}
for index = 1,3 do
local wifilist = getWifiConnectDeviceList(index)
for _, mac in pairs(wifilist) do
local item = {}
item['wifiIndex'] = index
result[macFormat(mac)] = item
end
end
return result
end
function getWifiConnectDeviceList(wifiIndex)
local assoclist = {}
if tonumber(wifiIndex) == 1 then
assoclist = wifi_network('wl0.network1').assoclist or {}
elseif tonumber(wifiIndex) == 2 then
assoclist = wifi_network('wl1.network1').assoclist or {}
else
assoclist = wifi_network('wl0.network2').assoclist or {}
end
local dlist = {}
for mac, info in pairs(assoclist) do
table.insert(dlist, macFormat(mac))
end
return dlist
end
function getDHCPLists()
local NixioFs = require("nixio.fs")
local LuciUci = require("luci.model.uci")
local uci = LuciUci.cursor()
local result = {}
local leasefile = "/var/dhcp.leases"
uci:foreach("dhcp", "dnsmasq",
function(s)
if s.leasefile and NixioFs.access(s.leasefile) then
leasefile = s.leasefile
return false
end
end)
local dhcp = io.open(leasefile, "r")
if dhcp then
for line in dhcp:lines() do
if line then
local ts, mac, ip, name = line:match("^(%d+) (%S+) (%S+) (%S+)")
if name == "*" then
name = ""
end
if ts and mac and ip and name then
result[#result+1] = {
mac = macFormat(mac),
ip = ip,
name = name,
sp = 0
}
end
end
end
dhcp:close()
return result
else
return false
end
end
function getDHCPDict()
local dhcpDict = {}
local dhcpList = getDHCPLists()
for _,value in ipairs(dhcpList) do
dhcpDict[value.mac] = value
end
return dhcpDict
end
function getDHCPIpDicts()
local dhcpDict = {}
local dhcpList = getDHCPLists()
for _,value in ipairs(dhcpList) do
dhcpDict[value.ip] = value
end
return dhcpDict
end
function getDeviceInfoFromDB()
local dbfs = require("meizu.dbfs")
local result = {}
local deviceList = dbfs.fetchAllDeviceInfo()
if #deviceList > 0 then
for _, device in ipairs(deviceList) do
result[device.mac] = device
end
end
return result
end
function is_device_online(ip)
local lu = require("luci.util")
--local cmd = "ping -W 2 -c 1 www.baidu.com > /dev/null ;echo -n $?"
local cmd = "ping -W 2 -c 1 " .. ip .. " > /dev/null ;echo -n $?"
local pingresult = lu.exec(cmd)
local res = nil
if pingresult == "0" then
res = true
else
res = false
end
return res
end
function get_connect_device_list()
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, require"socket".gettime()*1000)
local dbfs = require("meizu.dbfs")
dbfs.change_maclist_table()
local LuciUtil = require("luci.util")
local deviceList = {}
local dhcpDeviceDict = getDHCPDict()
local wifiDeviceDict = getAllWifiConnetDeviceDict()
-- local dhcpDevIpDict = getNetConnect()
local blacklist0 = getMacfilterList(0)
if next(blacklist0) ~= nil then
for _, mac in pairs(blacklist0) do
local flag = 0
for key, value in pairs(dhcpDeviceDict) do
if value.mac == mac then
flag = 1
break
end
end
if flag == 0 then
local res = dbfs.fetchDenyDeviceInfo(mac)
if #res > 0 then
for _, device in ipairs(res) do
dhcpDeviceDict[device.mac] = device
end
end
end
end
end
local cmd = [[cat /proc/net/arp |grep br-lan|awk '{print $1","$4}']]
local ipmacs = {}
local devs = lue(cmd)
if devs ~= "" then
ipmacs = strsplit(devs, '\n')
end
ipmacs[#ipmacs] = nil
local wire_table = {}
for k, v in pairs(ipmacs) do
local ipmac = strsplit(v, ',')
local ip = ipmac[1]
local mac = string.upper(ipmac[2])
local flag = false
local res = dbfs.fetch_all_wireless_device()
if #res > 0 then
for key, value in pairs(res) do
if mac == value.mac then
flag = true
break
end
end
end
if flag == false then
local res = {}
res.mac = mac
res.ip = ip
res.name = ""
table.insert(wire_table, res)
end
end
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, wire_table)
for k, v in pairs(wire_table) do
local flag = false
for key, value in pairs(dhcpDeviceDict) do
local mac = macFormat(key)
if v.mac == mac then
local dhcpinfo = dhcpDeviceDict[mac]
v["name"] = dhcpinfo.name
dbfs.updateDeviceOrgname(mac, dhcpinfo.name)
flag = true
break
end
end
if flag == false then
dhcpDeviceDict[v.mac] = v
end
end
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, debug.getinfo(1).currentline)
local deviceDBDict = getDeviceInfoFromDB()
for key, item in pairs(dhcpDeviceDict) do
local item = {}
local mac = macFormat(key)
local deviceDB = deviceDBDict[mac]
local dhcpinfo = dhcpDeviceDict[mac]
if deviceDB ~= nil then
item["devicename"] = deviceDB.orgname
if deviceDB.devicename ~= '' then
item["devicename"] = deviceDB.devicename
end
else
item["devicename"] = dhcpinfo.name
dbfs.saveDeviceInfo(mac, dhcpinfo.name, "", dhcpinfo.ip)
end
local black0 = blacklist0[mac]
if black0 ~= nil then
item["enable"] = false
else
item["enable"] = true
end
local wifiType = wifiDeviceDict[mac]
local online = dhcpDeviceDict[mac]
if wifiType ~= nil then
if wifiType.wifiIndex == 1 or wifiType.wifiIndex == 3 then
item["type"] = "2.4G"
elseif wifiType.wifiIndex == 2 then
item["type"] = "5G"
end
elseif wifiType == nil and online ~= nil and black0 == nil then
local wireless_res = dbfs.fetch_wireless_device_mac(mac)
if wireless_res == "" and mac ~= "00:00:00:00:00:00" then
item["type"] = "wire"
else
item["type"] = "unknown"
end
else
item["type"] = "unknown"
end
if online ~= nil and black0 == nil and item["type"] ~= "unknown" then
item["online"] = true
else
item["online"] = false
end
item["ip"] = dhcpinfo.ip
item["mac"] = mac
-- item["netSpeed"] = tostring(dhcpinfo.ip.rx_bytes or 0)
deviceList[#deviceList+1] = item
end
--[[
if blacklist0 ~= nil then
for _, mac in pairs(blacklist0) do
local item = {}
local mac = macFormat(mac)
local deviceDB = deviceDBDict[mac]
local dhcpdevice = dhcpDeviceDict[mac]
if dhcpdevice == nil then
if deviceDB ~= nil then
item["devicename"] = deviceDB.orgname
if deviceDB.devicename ~= '' then
item["devicename"] = deviceDB.devicename
end
end
local wifiType = wifiDeviceDict[mac]
if wifiType ~= nil then
if wifiType.wifiIndex == 1 then
item["type"] = "2.4G"
elseif wifiType.wifiIndex == 2 then
item["type"] = "5G"
end
else
item["type"] = "lan"
end
item["enable"] = false
item["online"] = false
item["ip"] = "null"
item["mac"] = mac
--item["diskaccess"] = false
-- item["netSpeed"] = tostring(dhcpinfo.ip.rx_bytes or 0)
deviceList[#deviceList+1] = item
end
end
end
if blacklist1 ~= nil then
for _,mac in pairs(blacklist1) do
local item = {}
local mac = macFormat(mac)
local deviceDB = deviceDBDict[mac]
local dhcpdevice = dhcpDeviceDict[mac]
if dhcpdevice == nil then
if deviceDB ~= nil then
item["devicename"] = deviceDB.orgname
if deviceDB.devicename ~= '' then
item["devicename"] = deviceDB.devicename
end
end
local wifiType = wifiDeviceDict[mac]
if wifiType ~= nil then
if wifiType.wifiIndex == 1 then
item["type"] = "2.4G"
elseif wifiType.wifiIndex == 2 then
item["type"] = "5G"
end
else
item["type"] = "lan"
end
item["enable"] = false
item["online"] = false
item["ip"] = "null"
item["mac"] = mac
--item["diskaccess"] = false
-- item["netSpeed"] = tostring(dhcpinfo.ip.rx_bytes or 0)
deviceList[#deviceList+1] = item
end
end
end
]]
--[[
local str = 0xffdddddd
str = string.format("%u",str)
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, str)
require "MZLog".log(3, debug.getinfo(1).currentline)
]]
require "MZLog".log(3, require"socket".gettime()*1000)
return deviceList
end
function ww_get_connect_device_list()
local result = get_connect_device_list()
return result
end
function nw_get_connect_device_list()
luci.http.prepare_content("application/json")
local result = get_connect_device_list()
luci.http.write_json(result)
end
function nw_set_device_name()
local mac = luci.http.formvalue("mac")
local devicename = luci.http.formvalue("devicename")
set_device_name(mac,devicename)
end
function set_device_name(mac,devicename)
local code = 0
local deviceList = {}
local dbfs = require("meizu.dbfs")
if is_str_nil(mac) or is_str_nil(devicename) then
code = 1502
else
code = save_device_name(mac,devicename)
end
return code
end
function save_device_name(mac,name)
local code = 0
local dbfs = require("meizu.dbfs")
local code = dbfs.updateDeviceNickname(macFormat(mac),name)
if code == 0 then
return true
else
return false
end
end
function getMacfilterList(mode)
mode = tonumber(mode)
local maclist = {}
local dlist = {}
local uci = require("luci.model.uci").cursor()
if mode == 0 then
maclist = uci:get_list("wireless", "wl0iface0", "maclist")
else
maclist = uci:get_list("wireless", "wl1iface0", "maclist")
end
if #maclist > 0 then
for _, mac in pairs(maclist) do
dlist[macFormat(mac)] = mac
end
end
return dlist
end
function set_disk_access(mac, enable)
local result = {}
local code = false
local uci = require("luci.model.uci").cursor()
local dbfs = require("meizu.dbfs")
dbfs.initSmbBanTable()
if is_str_nil(mac) then
return
else
mac = macFormat(mac)
enable = tonumber(enable)
end
if enable == 0 then
local cmd = "samba_ban add "..mac
local smb_ban = "true"
exec_cmd_in_sh(cmd)
dbfs.addSmbBanList(mac, smb_ban)
code = false
else
local cmd = "samba_ban remove "..mac
exec_cmd_in_sh(cmd)
dbfs.deleteSmbBanList(mac)
code = true
end
result["result"] = code
return result
end
function set_wan_switch(mac, mode, enable)
local result = {}
local code = false
local uci = require("luci.model.uci").cursor()
if is_str_nil(mac) then
return
else
mac = macFormat(mac)
enable = tonumber(enable)
end
uci:set("wireless", "wl0iface0", "macfilter", "deny")
local maclist = uci:get_list("wireless", "wl0iface0", "maclist")
if enable == 0 then
for _, macaddr in ipairs(maclist) do
if mac == macaddr then
code = "same black"
return code
end
end
table.insert(maclist, mac)
code = true
else
local pos = -1
for i, macaddr in ipairs(maclist) do
if mac == macaddr then
pos = i
end
end
if pos >= 0 then
table.remove(maclist, pos)
code = true
else
code = "same white"
return code
end
end
if #maclist > 0 then
uci:set_list("wireless", "wl0iface0", "maclist", maclist)
else
uci:delete("wireless", "wl0iface0", "maclist")
end
uci:set("wireless", "wl0iface1", "macfilter", "deny")
local maclist = uci:get_list("wireless", "wl0iface1", "maclist")
if enable == 0 then
for _, macaddr in ipairs(maclist) do
if mac == macaddr then
code = "same black"
return code
end
end
table.insert(maclist, mac)
code = true
else
local pos = -1
for i, macaddr in ipairs(maclist) do
if mac == macaddr then
pos = i
end
end
if pos >= 0 then
table.remove(maclist, pos)
code = true
else
code = "same white"
return code
end
end
if #maclist > 0 then
uci:set_list("wireless", "wl0iface1", "maclist", maclist)
else
uci:delete("wireless", "wl0iface1", "maclist")
end
uci:set("wireless", "wl1iface0", "macfilter", "deny")
local maclist = uci:get_list("wireless", "wl1iface0", "maclist")
if enable == 0 then
for _, macaddr in ipairs(maclist) do
if mac == macaddr then
code = "same black"
return code
end
end
table.insert(maclist, mac)
code = true
else
local pos = -1
for i, macaddr in ipairs(maclist) do
if mac == macaddr then
pos = i
end
end
if pos >= 0 then
table.remove(maclist, pos)
code = true
else
code = "same white"
return code
end
end
if #maclist > 0 then
uci:set_list("wireless", "wl1iface0", "maclist", maclist)
else
uci:delete("wireless", "wl1iface0", "maclist")
end
uci:commit("wireless")
fork_restart_wifi()
result["result"] = code
return result
end
function nw_set_wan_switch()
local result = {}
local code = false
local mac = luci.http.formvalue("mac")
local mode = luci.http.formvalue("mode")
local enable = luci.http.formvalue("enable")
code = set_wan_switch(mac,mode,enable)
result["result"] = code
luci.http.write_json(result)
end
function nw_set_disk_access()
local result = {}
local code = false
local mac = luci.http.formvalue("mac")
local enable = luci.http.formvalue("enable")
code = set_disk_access(mac,enable)
result["enable"] = enable
luci.http.write_json(result)
end
function getNetConnect(ip)
local sys = require "luci.sys"
local res = {}
res["bytes"] = 0
local conn = sys.net.conntrack()
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, conn)
for _, value in pairs(conn) do
if value.src == ip then
res["bytes"] = value.bytes + res["bytes"]
end
end
return res
--[[
table.sort(conn, function(a,b)
return(a.src < b.src)
end)
local dhcpDevIpDict = getDHCPIpDicts()
for _,ip in pairs(conn) do
if dhcpDevIpDict[ip.src] ~= nil then
dhcpDevIpDict[ip.src].sp = dhcpDevIpDict[ip.src].sp + ip.bytes
end
end
return dhcpDevIpDict
]]
end
function get_net_device()
local ntm = require "luci.model.network".init()
local dev
local devices = { }
for _, dev in luci.util.vspairs(luci.sys.net.devices()) do
if dev ~= "lo" and not ntm:ignore_interface(dev) then
devices[#devices+1] = dev
end
end
local curdev = luci.dispatcher.context.requestpath
curdev = curdev[#curdev] ~= "bandwidth" and curdev[#curdev] or devices[1]
luci.http.write_json(devices)
end
function nw_check_sys_password()
local password = luci.http.formvalue("password")
check_sys_password(password)
end
function check_sys_password(password)
local result={}
if not is_str_nil(password) then
local check = check_sys_pwd(password)
if check then
code = true
else
code = false
end
end
result["result"] = code
luci.http.write_json(result)
end
function get_wan_type()
local LuciNetwork = require("luci.model.network").init()
local wanNetwork = LuciNetwork:get_network("wan")
local wanDetails = {}
if wanNetwork then
local wanType = wanNetwork:proto()
if wanType == "static" then
wanDetails["ipaddr"] = wanNetwork:get_option_value("ipaddr")
wanDetails["netmask"] = wanNetwork:get_option_value("netmask")
wanDetails["gateway"] = wanNetwork:get_option_value("gateway")
elseif wanType == "pppoe" then
wanDetails["type"] = "pppoe"
wanDetails["pppoeName"] = wanNetwork:get_option_value("username")
wanDetails["pppoePwd"] = wanNetwork:get_option_value("password")
elseif wanType == "dhcp" then
wanDetails["type"] = "dhcp"
wanDetails["pppoeName"] = ""
wanDetails["pppoePwd"] = ""
end
return wanDetails
else
return nil
end
end
function ww_get_wan_type()
local result = get_wan_type()
return data_to_json(result)
end
function nw_get_wan_type()
local result = get_wan_type()
luci.http.write_json(result)
end
function nw_set_wan_type()
local wan_type = luci.http.formvalue("type")
local pppoe_name = luci.http.formvalue("pppoeName")
local pppoe_pwd = luci.http.formvalue("pppoePwd")
set_wan_type(wan_type, pppoe_name, pppoe_pwd)
end
function set_wan_type(wan_type, pppoe_name, pppoe_pwd)
local result = {}
local code = true
local needRestartWifi = false
if not is_str_nil(wan_type) then
local succeed
if wan_type == "pppoe" and not is_str_nil(pppoe_name) and not is_str_nil(pppoe_pwd) then
succeed = setWanPPPoE(pppoe_name, pppoe_pwd)
elseif wan_type == "dhcp" then
succeed = setWanDHCP()
end
if not succeed then
code = false
else
needRestartWifi = true
end
end
result["result"] = code
luci.http.write_json(result)
if needRestartWifi then
fork_restart_network()
end
luci.http.close()
end
function setWanPPPoE(name, password)
local LuciNetwork = require("luci.model.network").init()
local uci = require("luci.model.uci").cursor()
local iface = "wan"
local ifname = getWanEth()
local oldconf = uci:get_all("network", "wan") or {}
local wanrestart = true
if oldconf.username == name and oldconf.password == password then
wanrestart = false
end
local wanNet = LuciNetwork:del_network(iface)
local mtuvalue = 1480
wanNet = LuciNetwork:add_network(
iface, {
proto ="pppoe",
ifname = ifname,
username = name,
password = password,
mtu = mtuvalue
})
if wanNet then
LuciNetwork:save("network")
LuciNetwork:commit("network")
if wanrestart then
wanRestart()
end
return true
else
return false
end
end
function setWanDHCP()
local LuciNetwork = require("luci.model.network").init()
local uci = require("luci.model.uci").cursor()
local oldconf = uci:get_all("network", "wan") or {}
local iface = "wan"
local ifname = getWanEth()
local wanrestart = true
local wanNet = LuciNetwork:del_network(iface)
if oldconf.proto == "dhcp" then
wanrestart = false
end
local network = {
proto = "dhcp",
ifname = ifname
}
wanNet = LuciNetwork:add_network(iface, network)
if wanNet then
LuciNetwork:save("network")
LuciNetwork:commit("network")
if wanrestart then
wanRestart()
end
return true
else
return false
end
end
function check_sys_pwd(oldPassword)
local LuciSys = require("luci.sys")
return LuciSys.user.checkpasswd("root", oldPassword)
end
function getWanEth()
local LuciNetwork = require("luci.model.network").init()
local wanNetwork = LuciNetwork:get_network("wan")
return wanNetwork:get_option_value("ifname")
end
function wanRestart()
local LuciUtil = require("luci.util")
LuciUtil.exec("env -i /sbin/ifup wan")
end
function real_time_net_speed()
local res = {}
local cmd = [[luci-bwc -i eth0.2|tail -n 5|sed -e 's#.*\[\s*\(.*\)\s*\].*#\1#']]
local eth02_speed = io.popen(cmd)
local speed_table = {}
for line in eth02_speed:lines() do
table.insert(speed_table, line)
end
eth02_speed:close()
local rx = 0
local tx = 0
local speed, tb, rxb, txb
local n = 0
for k, v in ipairs(speed_table) do
speed = strsplit(v, ',')
if (k == 1) then
tb = tonumber(speed[1])
rxb = tonumber(speed[2])
txb = tonumber(speed[4])
else
n = n + 1
local tmp
local td
tmp = tonumber(speed[1])
td = tmp - tb
tb = tmp
tmp = tonumber(speed[2])
rx = rx + (tmp - rxb) / td
rxb = tmp
tmp = tonumber(speed[4])
tx = tx + (tmp - txb) / td
txb = tmp
end
end
res["rx"] = string.format("%6.2f", rx/n)
res["tx"] = string.format("%6.2f", tx/n)
return res
end
function set_smb_switch(smbswitch)
local result = {}
local code = false
local onoff = smbswitch
if (tonumber)(onoff) == 1 then
luci.sys.init.enable("samba")
exec_cmd_in_sh("sleep 1")
if luci.sys.init.enabled("samba") == true then
code = true
else
code = false
end
elseif (tonumber)(onoff) == 0 then
luci.sys.init.disable("samba")
exec_cmd_in_sh("sleep 1")
if luci.sys.init.enabled("samba") == true then
code = false
else
code = true
end
end
result["result"] = code
return data_to_json(result)
end
function get_smb_switch()
local smbswitch = {}
local code = false
code = luci.sys.init.enabled("samba")
smbswitch["smbswitch"] = code
return data_to_json(smbswitch)
end
function nw_set_smbswitch()
local res = {}
local smbswitch = luci.http.formvalue("smbswitch")
res = set_smb_switch(smbswitch)
luci.http.write(res)
end
function nw_get_smbswitch()
local res = {}
res = get_smb_switch()
luci.http.write(res)
end
function make_get_device_details_cmd(mac, patten)
local cmd = [[((wl -i wl0 sta_info ]]..mac..[[ 2>/dev/null| ]]
cmd = cmd..[[grep -E ']]..patten..[[')||]]
cmd = cmd..[[(wl -i wl1 sta_info ]]..mac..[[ 2>/dev/null| ]]
cmd = cmd..[[grep -E ']]..patten..[[')||]]
cmd = cmd..[[(wl -i wl0.1 sta_info ]]..mac..[[ 2>/dev/null| ]]
cmd = cmd..[[grep -E ']]..patten..[['))]]
cmd = cmd..[[|sed -e 's/[^0-9]//g'|awk '{printf $1}']]
return cmd
end
function get_device_details_duration(mac)
local patten = "in network"
local cmd = make_get_device_details_cmd(mac, patten)
local ret = lue(cmd)
if ret == "" then
ret = "0"
end
return ret
end
function get_device_details_tx(mac)
local patten = "tx data bytes"
local cmd = make_get_device_details_cmd(mac, patten)
local ret = lue(cmd)
if ret == "" then
ret = "0"
end
return ret
end
function get_device_details_rx(mac)
local patten = "rx data bytes"
local cmd = make_get_device_details_cmd(mac, patten)
local ret = lue(cmd)
if ret == "" then
ret = "0"
end
return ret
end
function get_device_details(mac)
local dbfs = require("meizu.dbfs")
dbfs.change_maclist_table()
local item = {}
mac = string.upper(mac)
local sec = 0
local tx = 0
local rx = 0
local smbBanList = {}
dbfs.initSmbBanTable()
smbBanList = dbfs.fetchSmbBanList()
local flag = 0
if next(smbBanList) ~= nil then
for _, value in pairs(smbBanList) do
if value.mac == mac then
flag = 1
break
end
end
end
if flag == 0 then
item["diskaccess"] = true
else
item["diskaccess"] = false
end
local blacklist0 = getMacfilterList(0)
local black0 = blacklist0[mac]
if black0 ~= nil then
item["enable"] = false
else
item["enable"] = true
end
local dhcpDeviceDict = getDHCPDict()
local res = dbfs.fetch_all_wire_device()
if #res > 0 then
for k, v in pairs(res) do
v["name"] = ""
for key, value in pairs(dhcpDeviceDict) do
local mac = macFormat(key)
if v.mac == mac then
local dhcpinfo = dhcpDeviceDict[mac]
v["name"] = dhcpinfo.name
--dbfs.saveDeviceInfo(mac, dhcpinfo.name, "", dhcpinfo.ip)
dbfs.updateDeviceOrgname(mac, dhcpinfo.name)
break
end
end
dhcpDeviceDict[v.mac] = v
end
end
local dhcpinfo = dhcpDeviceDict[mac]
local online = dhcpDeviceDict[mac]
local wifiDeviceDict = getAllWifiConnetDeviceDict()
local wifiType = wifiDeviceDict[mac]
if wifiType ~= nil then
sec = get_device_details_duration(mac)
tx = get_device_details_tx(mac)
rx = get_device_details_rx(mac)
if wifiType.wifiIndex == 1 or wifiType.wifiIndex == 3 then
item["type"] = "2.4G"
elseif wifiType.wifiIndex == 2 then
item["type"] = "5G"
end
elseif wifiType == nil and black0 == nil then
local wireless_res = dbfs.fetch_wireless_device_mac(mac)
if wireless_res == "" and mac ~= "00:00:00:00:00:00" then
item["type"] = "wire"
local ret = getNetConnect(dhcpinfo.ip)
tx = ret.bytes or 0
else
item["type"] = "unknown"
end
else
item["type"] = "unknown"
end
if black0 == nil and item["type"] ~= "unknown" then
item["online"] = true
else
item["online"] = false
end
if dhcpinfo then
item["ip"] = dhcpinfo.ip
else
item["ip"] = ""
end
local deviceDBDict = getDeviceInfoFromDB()
local deviceDB = deviceDBDict[mac]
item["devicename"] = ""
if deviceDB ~= nil then
item["devicename"] = deviceDB.orgname
if deviceDB.devicename ~= '' then
item["devicename"] = deviceDB.devicename
end
else
if dhcpinfo then
dbfs.saveDeviceInfo(mac, dhcpinfo.name, "", dhcpinfo.ip)
end
end
item["mac"] = mac
item["speed"] = 0
item["time"] = sec
item["upload"] = rx
item["download"] = tx
return item
end
function nw_get_device_details()
local mac = luci.http.formvalue("mac")
local res = get_device_details(mac)
luci.http.write_json(res)
end
function get_wireless_channel()
local res = false
local uci = require("luci.model.uci").cursor()
local channel = uci.get("wireless", "wl0", "channel")
local htmode = uci.get("wireless", "wl0", "htmode")
local extch = 1
if "auto" == channel then
channel = "0"
end
local mode = string.sub(htmode,3,4)
if "20" == mode then
extch = 0
end
local ret = {}
ret["channel"] = channel
ret["extch"] = extch
return ret
end
function nw_get_wireless_channel()
local ret = get_wireless_channel()
luci.http.write_json(ret)
end
function ww_get_wireless_channel()
local ret = get_wireless_channel()
return cjson.encode(ret)
end
function set_wireless_channel(channel, extch)
local res = false
local uci = require("luci.model.uci").cursor()
if "0" == channel then
res = uci.set("wireless", "wl0", "channel", "auto")
else
local c = tonumber(channel)
local tab = "+"
local mode = "40"
if c >= 7 and c <= 13 then
tab = "-"
end
if extch == "0" then
mode = "20"
end
local htmode = "HT"..mode..tab
res = uci.set("wireless", "wl0", "channel", channel)
res = uci.set("wireless", "wl0", "htmode", htmode)
end
uci.commit("wireless")
fork_restart_wifi()
return res
end
function nw_set_wireless_channel(channel, extch)
local channel = luci.http.formvalue("channel")
local extch = luci.http.formvalue("extch")
local res = set_wireless_channel(channel, extch)
local ret = {}
ret["result"] = res
luci.http.write_json(ret)
end
function ww_set_wireless_channel(channel, extch)
local res = set_wireless_channel(channel, extch)
local ret = {}
ret["result"] = res
return ret
end
function ww_get_device_details(mac)
local res = get_device_details(mac)
return res
end
function get_tx_power_mode(mode)
local res = false
local uci = require("luci.model.uci").cursor()
local txpower = tonumber(uci.get("wireless", "wl0", "txpower"));
local mode = "normal"
if txpower > 15 then
mode = "enhance"
--[[
[else
[ if txpower < 12 then
[ mode = "green"
[ end
]]
end
return mode
end
function nw_get_tx_power_mode(mode)
local mode = get_tx_power_mode()
local ret = {}
ret["mode"] = mode
luci.http.write_json(ret)
end
function ww_get_tx_power_mode(mode)
local ret = {}
local mode = get_tx_power_mode(mode)
ret["mode"] = mode
return data_to_json(ret)
end
function set_tx_power_mode(mode)
local res = false
local uci = require("luci.model.uci").cursor()
if mode == "normal" then
res = uci.set("wireless", "wl0", "txpower", "15")
res = uci.set("wireless", "wl1", "txpower", "15")
else
if mode == "enhance" then
res = uci.set("wireless", "wl0", "txpower", "22")
res = uci.set("wireless", "wl1", "txpower", "22")
end
end
uci.commit("wireless")
return res
end
function nw_set_tx_power_mode(mode)
local mode = luci.http.formvalue("mode")
local res = set_tx_power_mode(mode)
local ret = {}
ret["result"] = res
luci.http.write_json(ret)
end
function ww_set_tx_power_mode(mode)
local ret = {}
local res = set_tx_power_mode(mode)
ret["result"] = res
return ret
end
function is_wan_connected()
local lu = require("luci.util")
local cmd = "ping -W 2 -c 1 www.baidu.com > /dev/null ;echo -n $?"
local pingresult = lu.exec(cmd)
local res = {}
if pingresult == "0" then
res["result"] = true
else
res["result"] = false
end
return res
end