X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fsys%2Fluasrc%2Fsys.lua;h=d1137b76a707804a05304d141234f17abc097ced;hp=f30a2b679c15e6a29c5b4a1d6ad51ee54f75edaf;hb=e8490c385facaca9ceb2b15303f3ebc3a0b3c722;hpb=6a02931893ff7ecabf1f48597f783a18ebab92cd diff --git a/libs/sys/luasrc/sys.lua b/libs/sys/luasrc/sys.lua index f30a2b679..d1137b76a 100644 --- a/libs/sys/luasrc/sys.lua +++ b/libs/sys/luasrc/sys.lua @@ -30,14 +30,14 @@ local os = require "os" local table = require "table" local nixio = require "nixio" local fs = require "nixio.fs" -local iwinfo = require "iwinfo" +local uci = require "luci.model.uci" local luci = {} luci.util = require "luci.util" luci.ip = require "luci.ip" -local tonumber, ipairs, pairs, pcall, type, next, setmetatable = - tonumber, ipairs, pairs, pcall, type, next, setmetatable +local tonumber, ipairs, pairs, pcall, type, next, setmetatable, require = + tonumber, ipairs, pairs, pcall, type, next, setmetatable, require --- LuCI Linux and POSIX system utilities. @@ -59,20 +59,6 @@ end -- @return String containg the return the output of the command exec = luci.util.exec ---- Invoke the luci-flash executable to write an image to the flash memory. --- @param image Local path or URL to image file --- @param kpattern Pattern of files to keep over flash process --- @return Return value of os.execute() -function flash(image, kpattern) - local cmd = "luci-flash " - if kpattern then - cmd = cmd .. "-k '" .. kpattern:gsub("'", "") .. "' " - end - cmd = cmd .. "'" .. image:gsub("'", "") .. "' >/dev/null 2>&1" - - return os.execute(cmd) -end - --- Retrieve information about currently mounted file systems. -- @return Table containing mount information function mounts() @@ -584,14 +570,26 @@ user = {} -- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" } user.getuser = nixio.getpw +--- Retrieve the current user password hash. +-- @param username String containing the username to retrieve the password for +-- @return String containing the hash or nil if no password is set. +function user.getpasswd(username) + 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 == "!" or pwh == "x" then + return nil + else + return pwh + end +end + --- Test whether given string matches the password of a given system user. -- @param username String containing the Unix user name -- @param pass String containing the password to compare -- @return Boolean indicating wheather the passwords are equal 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 + local pwh = user.getpasswd(username) + if pwh and nixio.crypt(pass, pwh) ~= pwh then return false else return true @@ -626,14 +624,47 @@ wifi = {} -- @param ifname String containing the interface name -- @return A wrapped iwinfo object instance function wifi.getiwinfo(ifname) - local t = iwinfo.type(ifname) - if t then - local x = iwinfo[t] - return setmetatable({}, { - __index = function(t, k) - if x[k] then return x[k](ifname) end - end - }) + local iwinfo = require "iwinfo" + + if ifname then + local c = 0 + local u = uci.cursor_state() + local d, n = ifname:match("^(%w+)%.network(%d+)") + if d and n then + n = tonumber(n) + u:foreach("wireless", "wifi-iface", + function(s) + if s.device == d then + c = c + 1 + if c == n then + ifname = s.ifname or s.device + return false + end + end + end) + elseif u:get("wireless", ifname) == "wifi-device" then + u:foreach("wireless", "wifi-iface", + function(s) + if s.device == ifname and s.ifname then + ifname = s.ifname + return false + end + end) + end + + local t = iwinfo.type(ifname) + if t then + local x = iwinfo[t] + return setmetatable({}, { + __index = function(t, k) + if k == "ifname" then + return ifname + elseif x[k] then + return x[k](ifname) + end + end + }) + end end end @@ -693,7 +724,7 @@ end function wifi.channels(iface) local t = iwinfo.type(iface or "") local cns - if t and iwinfo[t] then + if iface and t and iwinfo[t] then cns = iwinfo[t].freqlist(iface) end @@ -748,7 +779,7 @@ end -- @return Numeric index value function init.index(name) if fs.access(init.dir..name) then - return call("source "..init.dir..name.."; exit $START") + return call("source "..init.dir..name.." enabled; exit $START") end end