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