+ rv[#rv+1] = data
+ else
+ rv[#rv+1] = {
+ id = iface,
+ name = iface,
+ type = "ethernet"
+ }
+ end
+ end
+
+ if #rv > 0 then
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(rv)
+ return
+ end
+
+ luci.http.status(404, "No such device")
+end
+
+function iface_reconnect()
+ local path = luci.dispatcher.context.requestpath
+ local iface = path[#path]
+ local netmd = require "luci.model.network".init()
+
+ local net = netmd:get_network(iface)
+ if net then
+ luci.sys.call("env -i /sbin/ifup %q >/dev/null 2>/dev/null" % iface)
+ luci.http.status(200, "Reconnected")
+ return
+ end
+
+ luci.http.status(404, "No such interface")
+end
+
+function iface_shutdown()
+ local path = luci.dispatcher.context.requestpath
+ local iface = path[#path]
+ local netmd = require "luci.model.network".init()
+
+ local net = netmd:get_network(iface)
+ if net then
+ luci.sys.call("env -i /sbin/ifdown %q >/dev/null 2>/dev/null" % iface)
+ luci.http.status(200, "Shutdown")
+ return
+ end
+
+ luci.http.status(404, "No such interface")
+end
+
+function iface_delete()
+ local path = luci.dispatcher.context.requestpath
+ local iface = path[#path]
+ local netmd = require "luci.model.network".init()
+
+ local net = netmd:del_network(iface)
+ if net then
+ luci.sys.call("env -i /sbin/ifdown %q >/dev/null 2>/dev/null" % iface)
+ luci.http.redirect(luci.dispatcher.build_url("admin/network/network"))
+ netmd:commit("network")
+ netmd:commit("wireless")
+ return
+ end
+
+ luci.http.status(404, "No such interface")
+end
+
+function wifi_status()
+ local path = luci.dispatcher.context.requestpath
+ local s = require "luci.tools.status"
+ local rv = { }
+
+ local dev
+ for dev in path[#path]:gmatch("[%w%.%-]+") do
+ rv[#rv+1] = s.wifi_network(dev)
+ end
+
+ if #rv > 0 then
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(rv)
+ return
+ end
+
+ luci.http.status(404, "No such device")
+end
+
+function wifi_reconnect()
+ local path = luci.dispatcher.context.requestpath
+ local mode = path[#path-1]
+ local wnet = path[#path]
+ 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", (mode == "wireless_shutdown") and 1 or nil)
+ netmd:commit("wireless")
+
+ luci.sys.call("(env -i /sbin/wifi down; env -i /sbin/wifi up) >/dev/null 2>/dev/null")
+ luci.http.status(200, (mode == "wireless_shutdown") and "Shutdown" or "Reconnected")
+
+ return
+ end
+
+ luci.http.status(404, "No such radio")
+end
+
+function lease_status()
+ local s = require "luci.tools.status"
+
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(s.dhcp_leases())
+end