X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=libs%2Fsys%2Fluasrc%2Fsys.lua;h=c978fb70f5ed37f01051bf7a6437d8ace3bef3ce;hb=6bfe0624b69defeba37cadffc6afa5ccb9577add;hp=e92adc1ad6ab8972f990baa4aff02eb160293535;hpb=cd8e12d72a038bc3d6f4a62225c83f12815e28cd;p=project%2Fluci.git diff --git a/libs/sys/luasrc/sys.lua b/libs/sys/luasrc/sys.lua index e92adc1ad6..c978fb70f5 100644 --- a/libs/sys/luasrc/sys.lua +++ b/libs/sys/luasrc/sys.lua @@ -27,7 +27,7 @@ limitations under the License. local io = require "io" local os = require "os" -local posix = require "posix" +local nixio = require "nixio" local table = require "table" local luci = {} @@ -35,7 +35,8 @@ luci.util = require "luci.util" luci.fs = require "luci.fs" luci.ip = require "luci.ip" -local tonumber, ipairs, pairs, pcall = tonumber, ipairs, pairs, pcall +local tonumber, ipairs, pairs, pcall, type = + tonumber, ipairs, pairs, pcall, type --- LuCI Linux and POSIX system utilities. @@ -127,12 +128,18 @@ end -- @param var Name of the environment variable to retrieve (optional) -- @return String containg the value of the specified variable -- @return Table containing all variables if no variable name is given -getenv = posix.getenv +getenv = nixio.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 nixio.uname().nodename + end end --- Returns the contents of a documented referred by an URL. @@ -154,11 +161,9 @@ end -- @return String containing the average load value 1 minute ago -- @return String containing the average load value 5 minutes ago -- @return String containing the average load value 15 minutes ago --- @return String containing the active and total number of processes --- @return String containing the last used pid function loadavg() - local loadavg = io.lines("/proc/loadavg")() - return loadavg:match("^(.-) (.-) (.-) (.-) (.-)$") + local info = nixio.sysinfo() + return info.loads[1], info.loads[2], info.loads[3] end --- Initiate a system reboot. @@ -186,7 +191,7 @@ function sysinfo() local membuffers = tonumber(meminfo:match("Buffers:%s*(%d+)")) if not system then - system = posix.uname("%m") + system = nixio.uname().machine model = cpuinfo:match("model name.-:%s*([^\n]+)") if not model then model = cpuinfo:match("Processor.-:%s*([^\n]+)") @@ -236,18 +241,6 @@ function uptime() return loadavg:match("^(.-) (.-)$") end ---- LuCI system utilities / POSIX user group related functions. --- @class module --- @name luci.sys.group -group = {} - ---- Returns information about a POSIX user group. --- @class function --- @name getgroup --- @param group Group ID or name of a system user group --- @return Table with information about the requested group -group.getgroup = posix.getgroup - --- LuCI system utilities / network related functions. -- @class module @@ -303,12 +296,14 @@ end -- { "dest", "gateway", "metric", "refcount", "usecount", "irtt", -- "flags", "device" } function net.defaultroute() - local route = nil - for _, r in pairs(net.routes()) do - if r.dest:prefix() == 0 and (not route or route.metric > r.metric) then - route = r + local route + + net.routes(function(rt) + if rt.dest:prefix() == 0 and (not route or route.metric > rt.metric) then + route = rt end - end + end) + return route end @@ -319,14 +314,15 @@ end -- { "source", "dest", "nexthop", "metric", "refcount", "usecount", -- "flags", "device" } function net.defaultroute6() - local route = nil + local route = nil local routes6 = net.routes6() - if not routes6 then - return nil - end - for _, r in pairs(routes6) do - if r.dest:prefix() == 0 and (not route or route.metric > r.metric) then - route = r + 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 @@ -377,7 +373,7 @@ end -- The following fields are defined for route entry tables: -- { "dest", "gateway", "metric", "refcount", "usecount", "irtt", -- "flags", "device" } -function net.routes() +function net.routes(callback) local routes = { } for line in io.lines("/proc/net/route") do @@ -395,7 +391,7 @@ function net.routes() dst_ip, dst_mask:prefix(dst_mask), luci.ip.FAMILY_INET4 ) - routes[#routes+1] = { + local rt = { dest = dst_ip, gateway = gateway, metric = tonumber(metric), @@ -407,6 +403,12 @@ function net.routes() flags = tonumber(flags, 16), device = dev } + + if callback then + callback(rt) + else + routes[#routes+1] = rt + end end end @@ -419,46 +421,44 @@ end -- { "source", "dest", "nexthop", "metric", "refcount", "usecount", -- "flags", "device" } function net.routes6() - local routes = { } - - if not luci.fs.access("/proc/net/ipv6_route", "r") then - return nil - end + 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. @@ -478,7 +478,10 @@ process = {} -- @class function -- @name process.info -- @return Number containing the current pid -process.info = posix.getpid +function process.info(key) + local s = {uid = nixio.getuid(), gid = nixio.getgid()} + return not key and s or s[key] +end --- Retrieve information about currently running processes. -- @return Table containing process information @@ -521,23 +524,21 @@ function process.list() end --- Set the gid of a process identified by given pid. --- @param pid Number containing the process id -- @param gid Number containing the Unix group id -- @return Boolean indicating successful operation -- @return String containing the error message if failed -- @return Number containing the error code if failed -function process.setgroup(pid, gid) - return posix.setpid("g", pid, gid) +function process.setgroup(gid) + return nixio.setgid(gid) end --- Set the uid of a process identified by given pid. --- @param pid Number containing the process id -- @param uid Number containing the Unix user id -- @return Boolean indicating successful operation -- @return String containing the error message if failed -- @return Number containing the error code if failed -function process.setuser(pid, uid) - return posix.setpid("u", pid, uid) +function process.setuser(uid) + return nixio.setuid(uid) end --- Send a signal to a process identified by given pid. @@ -547,7 +548,7 @@ end -- @param sig Signal to send (default: 15 [SIGTERM]) -- @return Boolean indicating successful operation -- @return Number containing the error code if failed -process.signal = posix.kill +process.signal = nixio.kill --- LuCI system utilities / user related functions. @@ -561,44 +562,20 @@ user = {} -- @param uid Number containing the Unix user id -- @return Table containing the following fields: -- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" } -user.getuser = posix.getpasswd +user.getuser = nixio.getpw --- Test whether given string matches the password of a given system user. -- @param username String containing the Unix user name --- @param password String containing the password to compare +-- @param pass String containing the password to compare -- @return Boolean indicating wheather the passwords are equal -function user.checkpasswd(username, password) - local account = user.getuser(username) - - if account then - local pwd = account.passwd - local shadowpw - if #pwd == 1 then - if luci.fs.stat("/etc/shadow") then - if not pcall(function() - for l in io.lines("/etc/shadow") do - shadowpw = l:match("^%s:([^:]+)" % username) - if shadowpw then - pwd = shadowpw - break - end - end - end) then - return nil, "Unable to access shadow-file" - end - end - - if pwd == "!" then - return true - end - end - - if pwd and #pwd > 0 and password and #password > 0 then - return (pwd == posix.crypt(password, pwd)) - end +function user.checkpasswd(username, pass) + local pwe = nixio.getsp and nixio.getsp(username) or nixio.getpw(username) + local pwh = pwe and (pwe.pwdp or pwe.passwd) + if not pwh or #pwh < 1 or pwh ~= "!" and nixio.crypt(pass, pwh) ~= pwh then + return false + else + return true end - - return false end --- Change the password of given user. @@ -628,7 +605,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 @@ -675,6 +652,37 @@ function wifi.iwscan(iface) return iface and (iws[iface] or {}) or iws end +--- Get available channels from given wireless iface. +-- @param iface Wireless interface (optional) +-- @return Table of available channels +function wifi.channels(iface) + local cmd = "iwlist " .. ( iface or "" ) .. " freq 2>/dev/null" + local cns = { } + + local fd = io.popen(cmd) + if fd then + local ln, c, f + while true do + ln = fd:read("*l") + if not ln then break end + c, f = ln:match("Channel (%d+) : (%d+%.%d+) GHz") + if c and f then + cns[tonumber(c)] = tonumber(f) + end + end + fd:close() + end + + if not ((pairs(cns))(cns)) then + cns = { + 2.412, 2.417, 2.422, 2.427, 2.432, 2.437, + 2.442, 2.447, 2.452, 2.457, 2.462 + } + end + + return cns +end + --- LuCI system utilities / init related functions. -- @class module