Add a button to each row in the wireless assoclist table to allow disconnecting clients using the ubus del_client method if the underlying radio interface supports it. Ref: https://github.com/openwrt/luci/pull/2271 Submitted-by: Wang805447391 <805447391@qq.com> [move deauth function to luci-base next to the existing assoclist function, require post security, fix parameter check condition, hide button if not supported by the radio, disable button after call, squash commits, fix whitespace, reword subject, add commit message] Signed-off-by: Jo-Philipp Wich <jo@mein.io>
164 lines
3.9 KiB
Lua
164 lines
3.9 KiB
Lua
-- Copyright 2008 Steven Barth <steven@midlink.org>
|
|
-- Licensed to the public under the Apache License 2.0.
|
|
|
|
module("luci.controller.admin.index", package.seeall)
|
|
|
|
function index()
|
|
function toplevel_page(page, preflookup, preftarget)
|
|
if preflookup and preftarget then
|
|
if lookup(preflookup) then
|
|
page.target = preftarget
|
|
end
|
|
end
|
|
|
|
if not page.target then
|
|
page.target = firstchild()
|
|
end
|
|
end
|
|
|
|
local uci = require("luci.model.uci").cursor()
|
|
|
|
local root = node()
|
|
if not root.target then
|
|
root.target = alias("admin")
|
|
root.index = true
|
|
end
|
|
|
|
local page = node("admin")
|
|
|
|
page.title = _("Administration")
|
|
page.order = 10
|
|
page.sysauth = "root"
|
|
page.sysauth_authenticator = "htmlauth"
|
|
page.ucidata = true
|
|
page.index = true
|
|
page.target = firstnode()
|
|
|
|
-- Empty menu tree to be populated by addons and modules
|
|
|
|
page = node("admin", "status")
|
|
page.title = _("Status")
|
|
page.order = 10
|
|
page.index = true
|
|
-- overview is from mod-admin-full
|
|
toplevel_page(page, "admin/status/overview", alias("admin", "status", "overview"))
|
|
|
|
page = node("admin", "system")
|
|
page.title = _("System")
|
|
page.order = 20
|
|
page.index = true
|
|
-- system/system is from mod-admin-full
|
|
toplevel_page(page, "admin/system/system", alias("admin", "system", "system"))
|
|
|
|
-- Only used if applications add items
|
|
page = node("admin", "services")
|
|
page.title = _("Services")
|
|
page.order = 40
|
|
page.index = true
|
|
toplevel_page(page, false, false)
|
|
|
|
-- Even for mod-admin-full network just uses first submenu item as landing
|
|
page = node("admin", "network")
|
|
page.title = _("Network")
|
|
page.order = 50
|
|
page.index = true
|
|
toplevel_page(page, false, false)
|
|
|
|
if nixio.fs.access("/etc/config/dhcp") then
|
|
page = entry({"admin", "dhcplease_status"}, call("lease_status"), nil)
|
|
page.leaf = true
|
|
end
|
|
|
|
local has_wifi = false
|
|
|
|
uci:foreach("wireless", "wifi-device",
|
|
function(s)
|
|
has_wifi = true
|
|
return false
|
|
end)
|
|
|
|
if has_wifi then
|
|
page = entry({"admin", "wireless_assoclist"}, call("wifi_assoclist"), nil)
|
|
page.leaf = true
|
|
|
|
page = entry({"admin", "wireless_deauth"}, post("wifi_deauth"), nil)
|
|
page.leaf = true
|
|
end
|
|
|
|
page = entry({"admin", "translations"}, call("action_translations"), nil)
|
|
page.leaf = true
|
|
|
|
-- Logout is last
|
|
entry({"admin", "logout"}, call("action_logout"), _("Logout"), 999)
|
|
end
|
|
|
|
function action_logout()
|
|
local dsp = require "luci.dispatcher"
|
|
local utl = require "luci.util"
|
|
local sid = dsp.context.authsession
|
|
|
|
if sid then
|
|
utl.ubus("session", "destroy", { ubus_rpc_session = sid })
|
|
|
|
luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s" %{
|
|
'', 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()
|
|
})
|
|
end
|
|
|
|
luci.http.redirect(dsp.build_url())
|
|
end
|
|
|
|
function action_translations(lang)
|
|
local i18n = require "luci.i18n"
|
|
local http = require "luci.http"
|
|
local fs = require "nixio".fs
|
|
|
|
if lang and #lang > 0 then
|
|
lang = i18n.setlanguage(lang)
|
|
if lang then
|
|
local s = fs.stat("%s/base.%s.lmo" %{ i18n.i18ndir, lang })
|
|
if s then
|
|
http.header("Cache-Control", "public, max-age=31536000")
|
|
http.header("ETag", "%x-%x-%x" %{ s["ino"], s["size"], s["mtime"] })
|
|
end
|
|
end
|
|
end
|
|
|
|
http.prepare_content("application/javascript; charset=utf-8")
|
|
http.write("window.TR=")
|
|
http.write_json(i18n.dump())
|
|
end
|
|
|
|
|
|
function lease_status()
|
|
local s = require "luci.tools.status"
|
|
|
|
luci.http.prepare_content("application/json")
|
|
luci.http.write('[')
|
|
luci.http.write_json(s.dhcp_leases())
|
|
luci.http.write(',')
|
|
luci.http.write_json(s.dhcp6_leases())
|
|
luci.http.write(']')
|
|
end
|
|
|
|
function wifi_assoclist()
|
|
local s = require "luci.tools.status"
|
|
|
|
luci.http.prepare_content("application/json")
|
|
luci.http.write_json(s.wifi_assoclist())
|
|
end
|
|
|
|
function wifi_deauth()
|
|
local iface = luci.http.formvalue("iface")
|
|
local bssid = luci.http.formvalue("bssid")
|
|
|
|
if iface and bssid then
|
|
luci.util.ubus("hostapd.%s" % iface, "del_client", {
|
|
addr = bssid,
|
|
deauth = true,
|
|
reason = 5,
|
|
ban_time = 60000
|
|
})
|
|
end
|
|
luci.http.status(200, "OK")
|
|
end
|