applications/luci-commands, applications/luci-upnp, modules/admin-core, modules/admin...
[project/luci.git] / modules / admin-full / luasrc / controller / admin / network.lua
index 6840751..f401ecd 100644 (file)
@@ -10,14 +10,12 @@ You may obtain a copy of the License at
 
        http://www.apache.org/licenses/LICENSE-2.0
 
-$Id$
 ]]--
 
 module("luci.controller.admin.network", package.seeall)
 
 function index()
        local uci = require("luci.model.uci").cursor()
-
        local page
 
        page = node("admin", "network")
@@ -26,7 +24,7 @@ function index()
        page.order  = 50
        page.index  = true
 
-       if page.inreq then
+--     if page.inreq then
                local has_switch = false
 
                uci:foreach("network", "switch",
@@ -40,17 +38,20 @@ function index()
                        page.target = cbi("admin_network/vlan")
                        page.title  = _("Switch")
                        page.order  = 20
+
+                       page = entry({"admin", "network", "switch_status"}, call("switch_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", "network", "wireless_join"}, call("wifi_join"), nil)
                        page.leaf = true
@@ -67,7 +68,7 @@ function index()
                        page = entry({"admin", "network", "wireless_reconnect"}, call("wifi_reconnect"), nil)
                        page.leaf = true
 
-                       page = entry({"admin", "network", "wireless_shutdown"}, call("wifi_reconnect"), nil)
+                       page = entry({"admin", "network", "wireless_shutdown"}, call("wifi_shutdown"), nil)
                        page.leaf = true
 
                        page = entry({"admin", "network", "wireless"}, arcombine(template("admin_network/wifi_overview"), cbi("admin_network/wifi")), _("Wifi"), 15)
@@ -155,7 +156,13 @@ function index()
 
                page = entry({"admin", "network", "diag_traceroute"}, call("diag_traceroute"), nil)
                page.leaf = true
-       end
+
+               page = entry({"admin", "network", "diag_ping6"}, call("diag_ping6"), nil)
+               page.leaf = true
+
+               page = entry({"admin", "network", "diag_traceroute6"}, call("diag_traceroute6"), nil)
+               page.leaf = true
+--     end
 end
 
 function wifi_join()
@@ -215,29 +222,31 @@ function wifi_delete(network)
        local wnet = ntm:get_wifinet(network)
        if wnet then
                local dev = wnet:get_device()
-               local net = wnet:get_network()
+               local nets = wnet:get_networks()
                if dev then
-                       luci.sys.call("env -i /sbin/wifi down %q" % dev:name())
+                       luci.sys.call("env -i /sbin/wifi down %q >/dev/null" % dev:name())
                        ntm:del_wifinet(network)
                        ntm:commit("wireless")
-                       if net:is_empty() then
-                               ntm:del_network(net:name())
-                               ntm:commit("network")
+                       local _, net
+                       for _, net in ipairs(nets) do
+                               if net:is_empty() then
+                                       ntm:del_network(net:name())
+                                       ntm:commit("network")
+                               end
                        end
-                       luci.sys.call("env -i /sbin/wifi up %q" % dev:name())
+                       luci.sys.call("env -i /sbin/wifi up %q >/dev/null" % dev:name())
                end
        end
 
        luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless"))
 end
 
-function iface_status()
-       local path = luci.dispatcher.context.requestpath
+function iface_status(ifaces)
        local netm = require "luci.model.network".init()
        local rv   = { }
 
        local iface
-       for iface in path[#path]:gmatch("[%w%.%-_]+") do
+       for iface in ifaces:gmatch("[%w%.%-_]+") do
                local net = netm:get_network(iface)
                local device = net and net:get_interface()
                if device then
@@ -271,11 +280,13 @@ function iface_status()
                                }
                        end
                        for _, a in ipairs(device:ip6addrs()) do
-                               data.ip6addrs[#data.ip6addrs+1] = {
-                                       addr      = a:host():string(),
-                                       netmask   = a:mask():string(),
-                                       prefix    = a:prefix()
-                               }
+                               if not a:is6linklocal() then
+                                       data.ip6addrs[#data.ip6addrs+1] = {
+                                               addr      = a:host():string(),
+                                               netmask   = a:mask():string(),
+                                               prefix    = a:prefix()
+                                       }
+                               end
                        end
 
                        for _, device in ipairs(net:get_interfaces() or {}) do
@@ -312,11 +323,8 @@ function iface_status()
        luci.http.status(404, "No such device")
 end
 
-function iface_reconnect()
-       local path  = luci.dispatcher.context.requestpath
-       local iface = path[#path]
+function iface_reconnect(iface)
        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)
@@ -327,11 +335,8 @@ function iface_reconnect()
        luci.http.status(404, "No such interface")
 end
 
-function iface_shutdown()
-       local path  = luci.dispatcher.context.requestpath
-       local iface = path[#path]
+function iface_shutdown(iface)
        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)
@@ -342,11 +347,8 @@ function iface_shutdown()
        luci.http.status(404, "No such interface")
 end
 
-function iface_delete()
-       local path  = luci.dispatcher.context.requestpath
-       local iface = path[#path]
+function iface_delete(iface)
        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)
@@ -359,13 +361,12 @@ function iface_delete()
        luci.http.status(404, "No such interface")
 end
 
-function wifi_status()
-       local path = luci.dispatcher.context.requestpath
+function wifi_status(devs)
        local s    = require "luci.tools.status"
        local rv   = { }
 
        local dev
-       for dev in path[#path]:gmatch("[%w%.%-]+") do
+       for dev in devs:gmatch("[%w%.%-]+") do
                rv[#rv+1] = s.wifi_network(dev)
        end
 
@@ -378,23 +379,19 @@ function wifi_status()
        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 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
                luci.sys.call("env -i /sbin/wifi down >/dev/null 2>/dev/null")
 
                dev:set("disabled", nil)
-               net:set("disabled", (mode == "wireless_shutdown") and 1 or nil)
+               net:set("disabled", shutdown and 1 or nil)
                netmd:commit("wireless")
 
                luci.sys.call("env -i /sbin/wifi up >/dev/null 2>/dev/null")
-               luci.http.status(200, (mode == "wireless_shutdown") and "Shutdown" or "Reconnected")
+               luci.http.status(200, shutdown and "Shutdown" or "Reconnected")
 
                return
        end
@@ -402,17 +399,33 @@ function wifi_reconnect()
        luci.http.status(404, "No such radio")
 end
 
+function wifi_reconnect(wnet)
+       wifi_reconnect_shutdown(false, wnet)
+end
+
+function wifi_shutdown(wnet)
+       wifi_reconnect_shutdown(true, wnet)
+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 diag_command(cmd)
-       local path = luci.dispatcher.context.requestpath
-       local addr = path[#path]
+function switch_status(switches)
+       local s = require "luci.tools.status"
+
+       luci.http.prepare_content("application/json")
+       luci.http.write_json(s.switch_status(switches))
+end
 
+function diag_command(cmd, addr)
        if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then
                luci.http.prepare_content("text/plain")
 
@@ -434,14 +447,22 @@ function diag_command(cmd)
        luci.http.status(500, "Bad address")
 end
 
-function diag_ping()
-       diag_command("ping -c 5 -W 1 %q 2>&1")
+function diag_ping(addr)
+       diag_command("ping -c 5 -W 1 %q 2>&1", addr)
+end
+
+function diag_traceroute(addr)
+       diag_command("traceroute -q 1 -w 1 -n %q 2>&1", addr)
+end
+
+function diag_nslookup(addr)
+       diag_command("nslookup %q 2>&1", addr)
 end
 
-function diag_traceroute()
-       diag_command("traceroute -q 1 -w 1 -n %q 2>&1")
+function diag_ping6(addr)
+       diag_command("ping6 -c 5 %q 2>&1", addr)
 end
 
-function diag_nslookup()
-       diag_command("nslookup %q 2>&1")
+function diag_traceroute6(addr)
+       diag_command("traceroute6 -q 1 -w 2 -n %q 2>&1", addr)
 end