OpenWrt_Luci_Lua/smart_wifi_code/5.25/nwfs.lua
2015-05-25 17:57:30 +08:00

1600 lines
41 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 dbfs = require "meizu.dbfs"
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 report_router_config = bfs.report_router_config
local lue = require("luci.util").exec
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 == "mt7628" then
local wifi_net_wl0 = network:get_wifinet('mt7628.network1')
item["ssid"] = wifi_net_wl0:get("ssid")
if wifi_net_wl0:get("disabled") == "1" then
item["status"] = "false"
else
item["status"] = "true"
end
end
if wifi_net.device == "mt7610e" then
local wifi_net_wl1 = network:get_wifinet('mt7610e.network1')
item["ssid"] = wifi_net_wl1:get("ssid")
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
local name = "wl0";
if "rai0" == wifi_net.networks[index].ifname then
name = "wl1"
end
item["name"] = name
--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
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 ssid_2g = nil
local ssid_5g = nil
local pwd_2g = nil
local pwd_5g = nil
local encry_2g = nil
local encry_5g = 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
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")
end
dbfs.init_ssid_table()
local dbssid = dbfs.fetch_ssid()
if nil == dbssid or #dbssid == 0 then
dbfs.add_ssid(ssid_2g, ssid_5g)
else
dbfs.update_ssid(ssid_2g, ssid_5g)
end
local res = wifi_settings(switch_2g, ssid_2g, pwd_2g, encry_2g, switch_5g, ssid_5g, pwd_5g, encry_5g)
luci.http.write_json(res)
end
function wifi_settings(on1, ssid1, pwd1, encry1, on2, ssid2, pwd2, encry2)
local result = {}
local res = {}
local code = 0
local code1 = 0
local code2 = 0
local details = {}
local code1 = check_ssid(ssid1, 31)
local code2 = check_ssid(ssid2, 31)
local succeed1 = false
local succeed2 = false
if on1 == "false" then
require "MZLog".log(3, debug.getinfo(1).currentline)
succeed1 = set_wifi_basic_info(1, nil, nil, nil, on1)
else
if code1 == 1 then
succeed1 = set_wifi_basic_info(1, ssid1, pwd1, encry1, on1)
end
end
if on2 == "false" then
succeed2 = set_wifi_basic_info(2, nil, nil, nil, on2)
else
if code2 == 1 then
succeed2 = set_wifi_basic_info(2, ssid2, pwd2, encry2, on2)
end
end
if code == 0 and code1 ~= 0 and code2 ~= 0 and succeed1 ~= false and succeed2 ~= false then
res["result"] = true
fork_restart_wifi()
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('mt7628.network1')
wifi_dev = network:get_wifidev('mt7628')
end
if wifi_index == 2 then
wifi_net = network:get_wifinet('mt7610e.network1')
wifi_dev = network:get_wifidev('mt7610e')
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
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
return 0
end
function fork_restart_wifi()
local FORK_RESTART_WIFI = "sleep 1; /sbin/wifi >/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 set_wifi_up()
--local cmd = "/sbin/wifi up".. wnet
local cmd = "/sbin/wifi up ".. "mt7628"
exec_cmd_in_sh(cmd)
luci.http.write_json("true")
end
function set_wifi_down()
local cmd = "/sbin/wifi down ".."mt7628"
--local cmd = "/sbin/wifi down"..wnet
exec_cmd_in_sh(cmd)
luci.http.write_json("true")
end
--set
function fork_smart_wifi_updown(wnet, close_hour, close_min, open_hour, open_min, week_repeat)
if week_repeat == "non-repeat" then
week_repeat = "0,1,2,3,4,5,6"
cmd_close = "/sbin/smart_wifi "..close_min.." "..close_hour.." "..week_repeat
cmd_open = "/sbin/smart_wifi "..open_min.." "..open_hour.." "..week_repeat
else
cmd_close = "echo '"..close_min.." "..close_hour.." * * "..week_repeat.." /sbin/wifi down "..wnet.."; #"
..close_min..close_hour..open_min..open_hour..week_repeat
.."' >> /etc/crontabs/root; crontab /etc/crontabs/root;"
cmd_open = "echo '"..open_min.." "..open_hour.." * * "..week_repeat.." /sbin/wifi up "..wnet.."; #"
..close_min..close_hour..open_min..open_hour..week_repeat
.."' >> /etc/crontabs/root; echo ''>>/etc/crontabs/root; crontab /etc/crontabs/root;"
end
luci.http.write_json(cmd_close)
luci.http.write_json(cmd_open)
exec_cmd_in_sh(cmd_close)
posix.sleep(1)
exec_cmd_in_sh(cmd_open)
end
--stop
function set_smart_wifi_stop(update_flag)
local cmd = "sed -i '/"..update_flag.."/d' /etc/crontabs/root; crontab /etc/crontabs/root"
exec_cmd_in_sh(cmd)
luci.http.write_json(cmd)
end
--function: 定时wifi开关shell形式
--author rh_Jameson
function set_smart_wifi_updown()
--get para
--wnet = luci.http.formvalue("wnet")
--close_hour = luci.http.formvalue("close_hour")
--close_min = luci.http.formvalue("close_min")
--open_hour = luci.http.formvalue("open_hour")
--open_min = luci.http.formvalue("open_min")
--repeat_var_from_http = luci.http.formvalue("repeat_var")
--func = luci.http.write_json("func")
--test normal
local wnet = 'mt7628'
local close_hour = "08"
local close_min = "11"
local open_hour = "08"
local open_min = "12"
local repeat_var_from_http = "1111111"
local func = luci.http.formvalue("func")
--para err manage
if string.len(repeat_var_from_http) ~= 7 then
luci.http.write_json("len error")
return
end
--get repeat
local week_repeat = ""
for i = 0, #repeat_var_from_http do
tmp = string.sub(repeat_var_from_http, i, i)
if tmp == "1" then
if i == #repeat_var_from_http then
week_repeat = week_repeat..0
break
end
week_repeat = week_repeat..tostring(i)..","
end
end
if week_repeat == "" then
week_repeat = "non-repeat"
end
--exec
if func == "set" then
fork_smart_wifi_updown(wnet, close_hour, close_min, open_hour, open_min, week_repeat)
elseif func == "stop" or func == "update" then
local update_flag = luci.http.formvalue("flag")
set_smart_wifi_stop(update_flag)
if func == "update" then
posix.sleep(1)
fork_smart_wifi_updown(wnet, close_hour, close_min, open_hour, open_min, week_repeat)
end
end
end
function get_lan_ip()
local uci = require("luci.model.uci").cursor()
local lan = uci:get_all("network", "lan")
return lan.ipaddr
end
function macFormat(mac)
if mac then
return string.upper(string.gsub(mac, "-", ":"))
else
return ""
end
end
function getAllWifiConnetDeviceDict()
local result = {}
for index = 1,2 do
local wifilist = getWifiConnectDeviceList(index)
for _, mactime in pairs(wifilist) do
local item = {}
item["wifiIndex"] = index
item["time"] = mactime["time"]
item["rx"] = mactime["rx"]
item["tx"] = mactime["tx"]
item["rxspeed"] = mactime["rxspeed"]
item["txspeed"] = mactime["txspeed"]
result[macFormat(mactime["mac"])] = item
end
end
return result
end
function getWifiConnectDeviceList(wifiIndex)
local dlist = {}
local macfile = nil
local uci = require("luci.model.uci").cursor()
if tonumber(wifiIndex) == 1 then
local disable_2g = uci.get("wireless", "mt7628iface", "disabled")
if "1" ~= disable_2g then
local cmd = [[iwpriv ra0 get_mac_table]]
macfile = io.popen(cmd)
end
elseif tonumber(wifiIndex) == 2 then
local disable_5g = uci.get("wireless", "mt7610eiface", "disabled")
if "1" ~= disable_5g then
local cmd = [[iwpriv rai0 get_mac_table]]
macfile = io.popen(cmd)
end
end
local tmplinenumber = 0
if nil ~= macfile then
for line in macfile:lines() do
if 0 ~= tmplinenumber and "" ~= line then
local item = {}
local mactime = strsplit(line, " ")
item["mac"] = macFormat(mactime[1])
item["time"] = mactime[2]
item["rx"] = mactime[3]
item["tx"] = mactime[4]
item["rxspeed"] = mactime[5]
item["txspeed"] = mactime[6]
table.insert(dlist,item)
end
tmplinenumber = tmplinenumber + 1
end
macfile:close()
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 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 " .. 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_router()
local devicelist = {}
dbfs.init_arp_table()
local dbarp = dbfs.fetch_all_arp()
local deviceDBDict = getDeviceInfoFromDB()
local dhcpDeviceDict = getDHCPDict()
local blacklist0 = dbfs.fetch_all_deny_mac()
local wifiDeviceDict = getAllWifiConnetDeviceDict()
local cmd = [[cat /proc/net/arp |grep br-lan|awk '{print $1","$4}']]
local ipmacs = {}
local devs = lue(cmd)
if devs ~= "" then
local ipmacstr = strsplit(devs, '\n')
ipmacstr[#ipmacstr] = nil
for k, v in pairs(ipmacstr) do
local ipmac = strsplit(v, ',')
ipmacs[string.upper(ipmac[2])] = ipmac
end
end
for k, v in pairs(dbarp) do
local item = {}
local mac = string.upper(v["mac"])
if "00:00:00:00:00:00" ~= mac then
local devflag = false
local im = ipmacs[mac]
local wf = v["wifi"]
if wf == 0 then
item["type"] = "wire"
elseif wf == 1 then
item["type"] = "2.4G"
elseif wf == 2 then
item["type"] = "5G"
end
if nil ~= im then
item["ip"] = im[1]
item["mac"] = string.upper(im[2])
else
item["ip"] = v["ip"]
item["mac"] = mac
end
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
elseif dhcpinfo ~= nil then
item["devicename"] = dhcpinfo.name
dbfs.saveDeviceInfo(mac, dhcpinfo.name, "", dhcpinfo.ip)
else
item["devicename"] = "unknown"
end
local isblack = false
if nil ~= blacklist0 then
for k, v in pairs(blacklist0) do
if v.mac == mac then
isblack = true
end
end
end
if isblack == false then
item["enable"] = true
else
item["enable"] = false
end
local wifi = wifiDeviceDict[mac]
item["online"] = false
if wf == 0 and nil ~= im then
item["online"] = true
end
if wifi ~= nil then
item["online"] = true
if wifi.wifiIndex == 1 then
item["type"] = "2.4G"
elseif wifi.wifiIndex == 2 then
item["type"] = "5G"
end
end
if nil == item["type"] or false == item["online"] then
item["type"] = "unknown"
end
table.insert(devicelist,item)
end
end
return devicelist
end
function get_connect_device_list()
local uci = require("luci.model.uci").cursor()
local apc = uci.get("network", "lan", "apclient")
local devicelist = {}
if nil == apc or "" == apc then
--mode router
devicelist = get_connect_device_list_router()
else
--mode apclient
if "mt7628" == apc then
elseif "mt7610e" == apc then
end
devicelist = get_connect_device_list_router()
end
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 = {}
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 code = dbfs.updateDeviceNickname(macFormat(mac),name)
if code == 0 then
return true
else
return false
end
end
function set_wan_switch(mac, mode, enable)
local result = {}
local code = false
if is_str_nil(mac) then
return
else
mac = macFormat(mac)
enable = tonumber(enable)
end
local dbdenymac = dbfs.fetch_all_deny_mac()
local macstr = ""
local deny = false
if enable == 0 then
if nil == dbdenymac then
dbfs.add_deny_mac(mac)
macstr = mac
else
if #dbdenymac >= 60 then
return "black person reach max"
end
for _, macaddr in ipairs(dbdenymac) do
if mac == macaddr.mac then
return "same black"
else
macstr = macstr.." "..macaddr.mac
end
end
dbfs.add_deny_mac(mac)
macstr = macstr.." "..mac
end
else
if nil == dbdenymac then
return
end
for _, macaddr in ipairs(dbdenymac) do
if mac == macaddr.mac then
dbfs.delete_deny_mac(mac)
if #dbdenymac == 1 then
deny = true
end
else
macstr = macstr.." "..macaddr.mac
end
end
end
local cmd = [[wireless-ban.sh ]]
if deny == true then
cmd = cmd.."none"
else
cmd = cmd.."deny "..macstr
end
exec_cmd_in_sh(cmd)
code = true
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 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
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 uci = require("luci.model.uci").cursor()
local apc = uci.get("network", "lan", "apclient")
local wanNetwork = LuciNetwork:get_network("wan")
local wanDetails = {}
if wanNetwork then
if nil ~= apc and "" ~= apc then
wanDetails["type"] = "apclient"
local uci = require("luci.model.uci").cursor()
local ssid = uci.get("wireless", apc, "apclissid")
wanDetails["ssid"] = ssid
else
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
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")
if "apclient" == wan_type then
local channel = luci.http.formvalue("channel")
local ssid = luci.http.formvalue("ssid")
local mac = luci.http.formvalue("mac")
local sec = luci.http.formvalue("sec")
local extch = luci.http.formvalue("extch")
local wl_type_val = luci.http.formvalue("aptype")
local key = luci.http.formvalue("key")
set_ap_client(channel, ssid, mac, sec, extch, wl_type_val, key)
else
local pppoe_name = luci.http.formvalue("pppoeName")
local pppoe_pwd = luci.http.formvalue("pppoePwd")
set_wan_type(wan_type, pppoe_name, pppoe_pwd)
end
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
cancelapclient()
needRestartWifi = true
end
end
result["result"] = code
local dbssid = dbfs.fetch_ssid()
if nil ~= dbssid then
for k, v in pairs(dbssid) do
result["ssid"] = v.ssid24
end
end
local macaddrcmd = "eth_mac r wl0"
local macaddr = lue(macaddrcmd)
if macaddr ~= "" then
local ipmacstr = strsplit(macaddr, '\n')
ipmacstr[#ipmacstr] = nil
for k, v in pairs(ipmacstr) do
result["mac"] = v
end
end
luci.http.write_json(result)
if needRestartWifi then
cmd = [[sleep 1;apcli_connect.sh restart &]]
exec_cmd_in_sh(cmd)
--fork_restart_network()
end
luci.http.close()
end
function set_ap_client(channel, ssid, mac, sec, extch, wl_type_val, key)
cancelapclient()
local sec_alg = "TKIP"
if string.find(sec, "AES") then
sec_alg = "AES"
end
if string.find(sec, "WPA2") then
sec = "WPA2PSK"
else
if string.find(sec, "WPA") then
sec = "WPA1PSK"
else
sec = "NONE"
end
end
local wl_type = "ra0"
if wl_type_val == "5G" then
wl_type = "rai0"
end
local cmd = [[apcli_connect.sh ]]..wl_type.." "..channel.." "..ssid.." "..sec
if sec ~= "NONE" then
cmd = cmd.." "..sec_alg.." "..key
end
lue(cmd)
require "MZLog".log(3, cmd)
local ret = {}
ret["result"] = true
local ssid5,ssid2 = get_wifi_ssids()
local macaddrcmd = ""
if wl_type_val == "2.4G" then
ret["ssid"] = ssid2
macaddrcmd = "eth_mac r wl0"
else
ret["ssid"] = ssid5
macaddrcmd = "eth_mac r wl1"
end
local macaddr = lue(macaddrcmd)
if macaddr ~= "" then
local ipmacstr = strsplit(macaddr, '\n')
ipmacstr[#ipmacstr] = nil
for k, v in pairs(ipmacstr) do
ret["mac"] = v
end
end
luci.http.prepare_content("application/json")
luci.http.write_json(ret)
local cmd = [[sleep 1;apcli_connect.sh restart &]]
exec_cmd_in_sh(cmd)
luci.http.close()
end
function cancelapclient()
local uci = require("luci.model.uci").cursor()
local apc = uci.get("network", "lan", "apclient")
if nil ~= apc then
local dbssid = dbfs.fetch_ssid()
local ssid_2g = ""
local ssid_5g = ""
if nil ~= dbssid then
for k, v in pairs(dbssid) do
ssid_2g = v.ssid24
ssid_5g = v.ssid5
end
end
local cmd = [[apcli_connect.sh disable]]
if "" ~= ssid_2g and "" ~= ssid_5g then
cmd = cmd.." "..ssid_2g.." "..ssid_5g
end
lue(cmd)
end
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("admin", 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 netspeed_channel(cmd)
local speed_table = {}
local speed_file = io.popen(cmd)
for line in speed_file:lines() do
table.insert(speed_table, line)
end
speed_file: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
rx = string.format("%6.2f", rx/n)
tx = string.format("%6.2f", tx/n)
return rx, tx
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 uci = require("luci.model.uci").cursor()
local apclient = uci.get("network", "lan", "apclient")
local cmd = nil
local rx = 0
local tx = 0
if nil == apclient then
cmd = [[luci-bwc -i eth0.2 |tail -n 5 |sed -e 's#.*\[\s*\(.*\)\s*\].*#\1#']]
else
if "mt7628" == apclient then
cmd = [[luci-bwc -i apcli0 |tail -n 5 |sed -e 's#.*\[\s*\(.*\)\s*\].*#\1#']]
elseif "mt7610e" == apclient then
cmd = [[luci-bwc -i apclii0 |tail -n 5 |sed -e 's#.*\[\s*\(.*\)\s*\].*#\1#']]
end
end
rx, tx = netspeed_channel(cmd)
res["rx"] = rx
res["tx"] = tx
return res
end
function get_device_details(mac)
dbfs.change_maclist_table()
local item = {}
mac = string.upper(mac)
local deviceDBDict = getDeviceInfoFromDB()
local dhcpDeviceDict = getDHCPDict()
local blacklist0 = dbfs.fetch_all_deny_mac()
local wifiDeviceDict = getAllWifiConnetDeviceDict()
local cmd = [[cat /proc/net/arp |grep br-lan|awk '{print $1","$4}']]
local ipmacs = {}
local devs = lue(cmd)
if devs ~= "" then
local ipmacstr = strsplit(devs, '\n')
ipmacstr[#ipmacstr] = nil
for k, v in pairs(ipmacstr) do
local ipmac = strsplit(v, ',')
ipmacs[string.upper(ipmac[2])] = ipmac
end
end
item["diskaccess"] = false
item["speed"] = 0
item["upload"] = 0
item["download"] = 0
item["time"] = 0
local rtxsl = get_speed_limit(mac)
item["rxlimit"] = rtxsl["rx"]
item["txlimit"] = rtxsl["tx"]
local isblack = false
if nil ~= blacklist0 then
for k, v in pairs(blacklist0) do
if v.mac == mac then
isblack = true
end
end
end
if isblack == false then
item["enable"] = true
else
item["enable"] = false
end
local dbarp = dbfs.fetch_arp(mac)
if nil ~= dbarp then
for k, v in pairs(dbarp) do
local im = ipmacs[mac]
local wf = v["wifi"]
if wf == 0 then
item["type"] = "wire"
elseif wf == 1 then
item["type"] = "2.4G"
elseif wf == 2 then
item["type"] = "5G"
end
if nil ~= im then
item["ip"] = im[1]
item["mac"] = string.upper(im[2])
else
item["ip"] = v["ip"]
item["mac"] = mac
end
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 wifi = wifiDeviceDict[mac]
item["online"] = false
if wf == 0 and nil ~= im then
item["online"] = true
end
if wifi ~= nil then
item["online"] = true
item["speed"] = wifi.rxspeed
local time = wifi.time
item["time"] = time
local rx = wifi.rx
local tx = wifi.tx
item["upload"] = tx
item["download"] = rx
if wifi.wifiIndex == 1 then
item["type"] = "2.4G"
elseif wifi.wifiIndex == 2 then
item["type"] = "5G"
end
end
if nil == item["type"] or false == item["online"] then
item["type"] = "unknown"
end
end
end
require "MZLog".log(3, debug.getinfo(1).currentline)
require "MZLog".log(3, item)
require "MZLog".log(3, debug.getinfo(1).currentline)
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 ww_get_device_details(mac)
local res = get_device_details(mac)
return res
end
---------------------wireless channel start--------
function get_wireless_channel()
local uci = require("luci.model.uci").cursor()
local channel = uci.get("wireless", "mt7628", "channel")
local bw = uci.get("wireless", "mt7628", "bw")
local ret = {}
ret["channel"] = channel
ret["extch"] = bw
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()
local c = tonumber(channel)
if c >= 0 and c <= 13 then
res = uci.set("wireless", "mt7628", "channel", c)
if extch == "1" or extch == "0" then
res = uci.set("wireless", "mt7628", "bw", extch)
end
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
---------------------wireless channel end----------
---------------------led start---------------------
function get_led()
local led_status = is_led_on()
local ret = {}
ret["status"] = led_status
return ret
end
function nw_get_led()
local ret = get_led()
luci.http.write_json(ret)
end
function ww_get_led()
local ret = get_led()
return cjson.encode(ret)
end
function set_led(status)
local res = false
local cmd = [[/etc/init.d/mtkleds ]]
local leds_status = is_led_on()
if "on" == status and "off" == leds_status then
cmd = cmd.."start"
exec_cmd_in_sh(cmd)
res = true
elseif "off" == status and "on" == leds_status then
cmd = cmd.."stop"
exec_cmd_in_sh(cmd)
res = true
end
return res
end
function nw_set_led(status)
local status = luci.http.formvalue("status")
local res = set_led(status)
local ret = {}
ret["result"] = res
luci.http.write_json(ret)
end
function ww_set_led(status)
local res = set_led(status)
local ret = {}
ret["result"] = res
return ret
end
function is_led_on()
local cmd = [[ps | grep mtkleds.sh]]
local lu = require("luci.util")
local ledstr = lu.exec(cmd)
local index = string.find(ledstr, "/usr/bin/mtkleds.sh")
if nil ~= index then
return "on"
else
return "off"
end
end
----------------------led end----------------------
----------------------speed limit start------------
function get_speed_limit_dict()
local dict = {}
local slfile = io.open("/tmp/speedlimit", "r")
if nil ~= slfile then
for line in slfile:lines() do
local speed = {}
local sl = strsplit(line, " ")
local mac = string.lower(sl[1])
speed["mac"] = mac
speed["rx"] = sl[2]
speed["tx"] = sl[3]
dict[mac] = speed
end
slfile:close()
end
return dict
end
function dict_to_file(dict)
local slfile = io.open("/tmp/speedlimit", "w")
if nil == next(dict) then
slfile:write("")
slfile:close()
return
end
local count = 0
for k,v in pairs(dict) do
count = count + 1
if nil ~= v then
if #dict == count then
slfile:write(v["mac"].." "..v["rx"].." "..v["tx"])
else
slfile:write(v["mac"].." "..v["rx"].." "..v["tx"].."\n")
end
end
end
slfile:close()
end
function set_speed_limit(mac, rx, tx)
mac = string.lower(mac)
local existSpeedLimitDict = get_speed_limit_dict()
local edit = existSpeedLimitDict[mac]
rx = tonumber(rx)
tx = tonumber(tx)
if nil ~= edit and -1 == rx and -1 == tx then
existSpeedLimitDict[mac] = nil
dict_to_file(existSpeedLimitDict)
if nil ~= next(existSpeedLimitDict) then
lue("netshaping.sh /tmp/speedlimit")
else
lue("netshaping.sh")
end
return true
end
if nil == edit then
edit = {}
end
edit["mac"] = mac
edit["rx"] = rx
edit["tx"] = tx
existSpeedLimitDict[mac] = edit
dict_to_file(existSpeedLimitDict)
lue("netshaping.sh /tmp/speedlimit")
return true
end
function nw_set_speed_limit()
local mac = luci.http.formvalue("mac")
local rx = luci.http.formvalue("rx")
local tx = luci.http.formvalue("tx")
local res = set_speed_limit(mac, rx, tx)
local ret = {}
ret["result"] = res
luci.http.write_json(ret)
end
function ww_set_speed_limit(mac, rx, tx)
local res = set_speed_limit(mac, rx, tx)
local ret = {}
ret["result"] = res
return ret
end
function get_speed_limit(mac)
mac = string.lower(mac)
local existSpeedLimitDict = get_speed_limit_dict()
local edit = existSpeedLimitDict[mac]
local rx = -1
local tx = -1
if nil ~= edit then
rx = tonumber(edit["rx"])
tx = tonumber(edit["tx"])
end
local ret = {}
ret["rx"] = rx
ret["tx"] = tx
return ret
end
function nw_get_speed_limit()
local mac = luci.http.formvalue("mac")
local ret = get_speed_limit(mac)
luci.http.write_json(ret)
end
function ww_get_speed_limit(mac)
local ret = get_speed_limit(mac)
return cjson.encode(ret)
end
----------------------speed limit 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