libs/sys: extend luci.sys.hostname() to allow setting a new name
[project/luci.git] / libs / sys / luasrc / sys.lua
index 948da5b..3e2ce7f 100644 (file)
@@ -129,10 +129,16 @@ end
 -- @return             Table containing all variables if no variable name is given
 getenv = posix.getenv
 
---- Determine the current hostname.
+--- Get or set the current hostname.
+-- @param              String containing a new hostname to set (optional)
 -- @return             String containing the system hostname
-function hostname()
-       return posix.uname("%n")
+function hostname(newname)
+       if type(newname) == "string" and #newname > 0 then
+               luci.fs.writefile( "/proc/sys/kernel/hostname", newname .. "\n" )
+               return newname
+       else
+               return posix.uname("%n")
+       end
 end
 
 --- Returns the contents of a documented referred by an URL.
@@ -319,10 +325,15 @@ end
 --                     { "source", "dest", "nexthop", "metric", "refcount", "usecount",
 --                       "flags", "device" }
 function net.defaultroute6()
-       local route = nil
-       for _, r in pairs(net.routes6()) do
-               if r.dest:prefix() == 0 and (not route or route.metric > r.metric) then
-                       route = r
+       local route   = nil
+       local routes6 = net.routes6()
+       if routes6 then
+               for _, r in pairs(routes6) do
+                       if r.dest:prefix() == 0 and
+                          (not route or route.metric > r.metric)
+                       then
+                               route = r
+                       end
                end
        end
        return route
@@ -415,42 +426,44 @@ end
 --                     { "source", "dest", "nexthop", "metric", "refcount", "usecount",
 --                       "flags", "device" }
 function net.routes6()
-       local routes = { }
+       if luci.fs.access("/proc/net/ipv6_route", "r") then
+               local routes = { }
+
+               for line in io.lines("/proc/net/ipv6_route") do
+
+                       local dst_ip, dst_prefix, src_ip, src_prefix, nexthop,
+                                 metric, refcnt, usecnt, flags, dev = line:match(
+                               "([a-f0-9]+) ([a-f0-9]+) " ..
+                               "([a-f0-9]+) ([a-f0-9]+) " ..
+                               "([a-f0-9]+) ([a-f0-9]+) " ..
+                               "([a-f0-9]+) ([a-f0-9]+) " ..
+                               "([a-f0-9]+) +([^%s]+)"
+                       )
 
-       for line in io.lines("/proc/net/ipv6_route") do
+                       src_ip = luci.ip.Hex(
+                               src_ip, tonumber(src_prefix, 16), luci.ip.FAMILY_INET6, false
+                       )
 
-               local dst_ip, dst_prefix, src_ip, src_prefix, nexthop,
-                         metric, refcnt, usecnt, flags, dev = line:match(
-                       "([a-f0-9]+) ([a-f0-9]+) " ..
-                       "([a-f0-9]+) ([a-f0-9]+) " ..
-                       "([a-f0-9]+) ([a-f0-9]+) " ..
-                       "([a-f0-9]+) ([a-f0-9]+) " ..
-                       "([a-f0-9]+) +([^%s]+)"
-               )
+                       dst_ip = luci.ip.Hex(
+                               dst_ip, tonumber(dst_prefix, 16), luci.ip.FAMILY_INET6, false
+                       )
 
-               src_ip = luci.ip.Hex(
-                       src_ip, tonumber(src_prefix, 16), luci.ip.FAMILY_INET6, false
-               )
+                       nexthop = luci.ip.Hex( nexthop, 128, luci.ip.FAMILY_INET6, false )
 
-               dst_ip = luci.ip.Hex(
-                       dst_ip, tonumber(dst_prefix, 16), luci.ip.FAMILY_INET6, false
-               )
+                       routes[#routes+1] = {
+                               source   = src_ip,
+                               dest     = dst_ip,
+                               nexthop  = nexthop,
+                               metric   = tonumber(metric, 16),
+                               refcount = tonumber(refcnt, 16),
+                               usecount = tonumber(usecnt, 16),
+                               flags    = tonumber(flags, 16),
+                               device   = dev
+                       }
+               end
 
-               nexthop = luci.ip.Hex( nexthop, 128, luci.ip.FAMILY_INET6, false )
-
-               routes[#routes+1] = {
-                       source   = src_ip,
-                       dest     = dst_ip,
-                       nexthop  = nexthop,
-                       metric   = tonumber(metric, 16),
-                       refcount = tonumber(refcnt, 16),
-                       usecount = tonumber(usecnt, 16),
-                       flags    = tonumber(flags, 16),
-                       device   = dev
-               }
+               return routes
        end
-
-       return routes
 end
 
 --- Tests whether the given host responds to ping probes.
@@ -620,7 +633,7 @@ wifi = {}
 --- Get iwconfig output for all wireless devices.
 -- @return     Table of tables containing the iwconfing output for each wifi device
 function wifi.getiwconfig()
-       local cnt = luci.util.exec("/usr/sbin/iwconfig 2>/dev/null")
+       local cnt = luci.util.exec("PATH=/sbin:/usr/sbin iwconfig 2>/dev/null")
        local iwc = {}
 
        for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n\n")) do