luci/modules/luci-mod-network/luasrc/controller/admin/network.lua

161 lines
4.1 KiB
Lua
Raw Normal View History

-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2011-2018 Jo-Philipp Wich <jo@mein.io>
-- Licensed to the public under the Apache License 2.0.
module("luci.controller.admin.network", package.seeall)
2008-05-22 14:04:03 +00:00
function index()
local page
-- if page.inreq then
page = entry({"admin", "network", "switch"}, view("network/switch"), _("Switch"), 20)
page.uci_depends = { network = { ["@switch[0]"] = "switch" } }
page = entry({"admin", "network", "wireless"}, view("network/wireless"), _('Wireless'), 15)
page.uci_depends = { wireless = { ["@wifi-device[0]"] = "wifi-device" } }
page.leaf = true
page = entry({"admin", "network", "iface_down"}, post("iface_down"), nil)
page.leaf = true
page = entry({"admin", "network", "network"}, view("network/interfaces"), _("Interfaces"), 10)
page.leaf = true
page.subindex = true
page = node("admin", "network", "dhcp")
page.uci_depends = { dhcp = true }
page.target = view("network/dhcp")
page.title = _("DHCP and DNS")
page.order = 30
page = node("admin", "network", "hosts")
page.uci_depends = { dhcp = true }
page.target = view("network/hosts")
page.title = _("Hostnames")
page.order = 40
page = node("admin", "network", "routes")
page.target = view("network/routes")
page.title = _("Static Routes")
page.order = 50
page = node("admin", "network", "diagnostics")
page.target = template("admin_network/diagnostics")
page.title = _("Diagnostics")
page.order = 60
page = entry({"admin", "network", "diag_ping"}, post("diag_ping"), nil)
page.leaf = true
page = entry({"admin", "network", "diag_nslookup"}, post("diag_nslookup"), nil)
page.leaf = true
page = entry({"admin", "network", "diag_traceroute"}, post("diag_traceroute"), nil)
page.leaf = true
page = entry({"admin", "network", "diag_ping6"}, post("diag_ping6"), nil)
page.leaf = true
page = entry({"admin", "network", "diag_traceroute6"}, post("diag_traceroute6"), nil)
page.leaf = true
-- end
end
local function addr2dev(addr, src)
local ip = require "luci.ip"
local route = ip.route(addr, src)
if not src and route and route.src then
route = ip.route(addr, route.src:string())
end
return route and route.dev
end
function iface_down(iface, force)
local netmd = require "luci.model.network".init()
local peer = luci.http.getenv("REMOTE_ADDR")
local serv = luci.http.getenv("SERVER_ADDR")
if force ~= "force" and serv and peer then
local dev = addr2dev(peer, serv)
if dev then
local nets = netmd:get_networks()
local outnet = nil
local _, net, ai
for _, net in ipairs(nets) do
if net:contains_interface(dev) then
outnet = net
break
end
end
if outnet:name() == iface then
luci.http.status(409, "Is inbound interface")
return
end
local peeraddr = outnet:get("peeraddr")
for _, ai in ipairs(peeraddr and nixio.getaddrinfo(peeraddr) or {}) do
local peerdev = addr2dev(ai.address)
for _, net in ipairs(peerdev and nets or {}) do
if net:contains_interface(peerdev) and net:name() == iface then
luci.http.status(409, "Is inbound interface")
return
end
end
end
end
end
if netmd:get_network(iface) then
luci.sys.call("env -i /sbin/ifdown %s >/dev/null 2>/dev/null"
% luci.util.shellquote(iface))
luci.http.status(200, "Shut down")
return
end
luci.http.status(404, "No such interface")
end
function diag_command(cmd, addr)
if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then
luci.http.prepare_content("text/plain")
local util = io.popen(cmd % luci.util.shellquote(addr))
if util then
while true do
local ln = util:read("*l")
if not ln then break end
luci.http.write(ln)
luci.http.write("\n")
end
util:close()
end
return
end
luci.http.status(500, "Bad address")
end
function diag_ping(addr)
diag_command("ping -c 5 -W 1 %s 2>&1", addr)
end
function diag_traceroute(addr)
diag_command("traceroute -q 1 -w 1 -n %s 2>&1", addr)
end
function diag_nslookup(addr)
diag_command("nslookup %s 2>&1", addr)
end
function diag_ping6(addr)
diag_command("ping6 -c 5 %s 2>&1", addr)
end
function diag_traceroute6(addr)
diag_command("traceroute6 -q 1 -w 2 -n %s 2>&1", addr)
end