luci/libs/core/luasrc/sys.lua

408 lines
8.6 KiB
Lua
Raw Normal View History

--[[
LuCI - System library
Description:
Utilities for interaction with the Linux system
FileId:
$Id$
License:
Copyright 2008 Steven Barth <steven@midlink.org>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]]--
module("luci.sys", package.seeall)
require("posix")
require("luci.bits")
require("luci.util")
require("luci.fs")
-- Returns whether a system is bigendian
function bigendian()
local fp = io.open("/bin/sh")
fp:seek("set", 5)
local be = (fp:read(1):byte() ~= 1)
fp:close()
return be
end
-- Runs "command" and returns its output
function exec(command)
local pp = io.popen(command)
local data = pp:read("*a")
pp:close()
return data
end
-- Runs "command" and returns its output as a array of lines
function execl(command)
local pp = io.popen(command)
local line = ""
local data = {}
while true do
line = pp:read()
if (line == nil) then break end
table.insert(data, line)
end
pp:close()
return data
end
-- Uses "luci-flash" to flash a new image file to the system
function flash(image, kpattern)
local cmd = "luci-flash "
if kpattern then
2008-04-11 19:45:59 +00:00
cmd = cmd .. "-k '" .. kpattern:gsub("'", "") .. "' "
end
2008-04-11 19:53:09 +00:00
cmd = cmd .. "'" .. image:gsub("'", "") .. "' >/dev/null 2>&1"
return os.execute(cmd)
end
2008-06-15 17:45:10 +00:00
-- Returns the enivornment
getenv = posix.getenv
-- Returns the hostname
function hostname()
return io.lines("/proc/sys/kernel/hostname")()
end
2008-04-19 20:09:38 +00:00
-- Returns the contents of a documented referred by an URL
function httpget(url)
return exec("wget -qO- '"..url:gsub("'", "").."'")
end
-- Returns the FFLuci-Basedir
function libpath()
return luci.fs.dirname(require("luci.debug").__file__)
end
-- Returns the load average
function loadavg()
local loadavg = io.lines("/proc/loadavg")()
return loadavg:match("^(.-) (.-) (.-) (.-) (.-)$")
end
-- Reboots the system
function reboot()
return os.execute("reboot >/dev/null 2>&1")
end
2008-04-19 20:09:38 +00:00
-- Returns the system type, cpu name, and installed physical memory
function sysinfo()
local c1 = "cat /proc/cpuinfo|grep system\\ typ|cut -d: -f2 2>/dev/null"
local c2 = "uname -m 2>/dev/null"
local c3 = "cat /proc/cpuinfo|grep model\\ name|cut -d: -f2 2>/dev/null"
local c4 = "cat /proc/cpuinfo|grep cpu\\ model|cut -d: -f2 2>/dev/null"
local c5 = "cat /proc/meminfo|grep MemTotal|cut -d: -f2 2>/dev/null"
local s = luci.util.trim(exec(c1))
2008-04-19 20:09:38 +00:00
local m = ""
local r = ""
if s == "" then
s = luci.util.trim(exec(c2))
m = luci.util.trim(exec(c3))
2008-04-19 20:09:38 +00:00
else
m = luci.util.trim(exec(c4))
2008-04-19 20:09:38 +00:00
end
r = luci.util.trim(exec(c5))
2008-04-19 20:09:38 +00:00
return s, m, r
end
-- Reads the syslog
function syslog()
return exec("logread")
end
-- Generates a random key of length BYTES
function uniqueid(bytes)
local fp = io.open("/dev/urandom")
local chunk = { fp:read(bytes):byte(1, bytes) }
fp:close()
local hex = ""
local pattern = "%02X"
for i, byte in ipairs(chunk) do
hex = hex .. pattern:format(byte)
end
return hex
end
group = {}
group.getgroup = posix.getgroup
net = {}
-- Returns the ARP-Table
function net.arptable()
return _parse_delimited_table(io.lines("/proc/net/arp"), "%s%s+")
end
2008-04-19 20:09:38 +00:00
-- Returns whether an IP-Adress belongs to a certain net
2008-04-26 21:59:45 +00:00
function net.belongs(ip, ipnet, prefix)
return (net.ip4bin(ip):sub(1, prefix) == net.ip4bin(ipnet):sub(1, prefix))
2008-04-19 20:09:38 +00:00
end
-- Detect the default route
function net.defaultroute()
local routes = net.routes()
local route = nil
for i, r in pairs(luci.sys.net.routes()) do
if r.Destination == "00000000" and (not route or route.Metric > r.Metric) then
route = r
end
end
return route
end
-- Returns all available network interfaces
function net.devices()
local devices = {}
for line in io.lines("/proc/net/dev") do
table.insert(devices, line:match(" *(.-):"))
end
return devices
end
-- Returns the MAC-Address belonging to the given IP-Address
function net.ip4mac(ip)
local mac = nil
for i, l in ipairs(net.arptable()) do
if l["IP address"] == ip then
mac = l["HW address"]
end
end
return mac
end
-- Returns the prefix to a given netmask
function net.mask4prefix(mask)
local bin = net.ip4bin(mask)
if not bin then
return nil
end
return #luci.util.split(bin, "1")-1
end
2008-04-19 20:09:38 +00:00
-- Returns the kernel routing table
function net.routes()
return _parse_delimited_table(io.lines("/proc/net/route"))
end
-- Returns the numeric IP to a given hexstring
function net.hexip4(hex, be)
2008-04-19 20:09:38 +00:00
if #hex ~= 8 then
return nil
end
be = be or bigendian()
local hexdec = luci.bits.Hex2Dec
2008-04-19 20:09:38 +00:00
local ip = ""
if be then
ip = ip .. tostring(hexdec(hex:sub(1,2))) .. "."
ip = ip .. tostring(hexdec(hex:sub(3,4))) .. "."
ip = ip .. tostring(hexdec(hex:sub(5,6))) .. "."
ip = ip .. tostring(hexdec(hex:sub(7,8)))
else
ip = ip .. tostring(hexdec(hex:sub(7,8))) .. "."
ip = ip .. tostring(hexdec(hex:sub(5,6))) .. "."
ip = ip .. tostring(hexdec(hex:sub(3,4))) .. "."
ip = ip .. tostring(hexdec(hex:sub(1,2)))
end
2008-04-19 20:09:38 +00:00
return ip
end
-- Returns the binary IP to a given IP
function net.ip4bin(ip)
local parts = luci.util.split(ip, '.')
2008-04-19 20:09:38 +00:00
if #parts ~= 4 then
return nil
end
local decbin = luci.bits.Dec2Bin
2008-04-19 20:09:38 +00:00
local bin = ""
bin = bin .. decbin(parts[1], 8)
bin = bin .. decbin(parts[2], 8)
bin = bin .. decbin(parts[3], 8)
bin = bin .. decbin(parts[4], 8)
return bin
end
-- Tests whether a host is pingable
function net.pingtest(host)
return os.execute("ping -c1 '"..host:gsub("'", '').."' >/dev/null 2>&1")
end
process = {}
process.info = posix.getpid
-- Sets the gid of a process
function process.setgroup(pid, gid)
return posix.setpid("g", pid, gid)
end
-- Sets the uid of a process
function process.setuser(pid, uid)
return posix.setpid("u", pid, uid)
end
user = {}
-- returns user information to a given uid
user.getuser = posix.getpasswd
-- checks whether a string matches the password of a certain system user
function user.checkpasswd(username, password)
local account = user.getuser(username)
-- FIXME: detect testing environment
if luci.fs.isfile("/etc/shadow") and not luci.fs.access("/etc/shadow", "r") then
return true
elseif account then
if account.passwd == "!" then
return true
else
return (account.passwd == posix.crypt(account.passwd, password))
end
end
end
-- Changes the user password of given user
function user.setpasswd(user, pwd)
if pwd then
pwd = pwd:gsub("'", "")
end
if user then
user = user:gsub("'", "")
end
local cmd = "(echo '"..pwd.."';sleep 1;echo '"..pwd.."')|"
cmd = cmd .. "passwd '"..user.."' >/dev/null 2>&1"
return os.execute(cmd)
2008-04-19 20:09:38 +00:00
end
wifi = {}
function wifi.getiwconfig()
local cnt = exec("/usr/sbin/iwconfig 2>/dev/null")
local iwc = {}
for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n\n")) do
2008-04-19 20:09:38 +00:00
local k = l:match("^(.-) ")
l = l:gsub("^(.-) +", "", 1)
if k then
iwc[k] = _parse_mixed_record(l)
end
end
return iwc
end
function wifi.iwscan()
local cnt = exec("iwlist scan 2>/dev/null")
local iws = {}
for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n\n")) do
2008-04-19 20:09:38 +00:00
local k = l:match("^(.-) ")
l = l:gsub("^[^\n]+", "", 1)
l = luci.util.trim(l)
2008-04-19 20:09:38 +00:00
if k then
iws[k] = {}
for j, c in pairs(luci.util.split(l, "\n Cell")) do
2008-04-19 20:09:38 +00:00
c = c:gsub("^(.-)- ", "", 1)
c = luci.util.split(c, "\n", 7)
c = table.concat(c, "\n", 1)
2008-04-19 20:09:38 +00:00
table.insert(iws[k], _parse_mixed_record(c))
end
end
end
return iws
end
-- Internal functions
function _parse_delimited_table(iter, delimiter)
delimiter = delimiter or "%s+"
2008-04-19 20:09:38 +00:00
local data = {}
local trim = luci.util.trim
local split = luci.util.split
2008-04-19 20:09:38 +00:00
local keys = split(trim(iter()), delimiter, nil, true)
2008-04-19 20:09:38 +00:00
for i, j in pairs(keys) do
keys[i] = trim(keys[i])
end
for line in iter do
local row = {}
line = trim(line)
if #line > 0 then
for i, j in pairs(split(line, delimiter, nil, true)) do
2008-04-19 20:09:38 +00:00
if keys[i] then
row[keys[i]] = j
end
end
end
table.insert(data, row)
end
return data
end
function _parse_mixed_record(cnt)
local data = {}
for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n")) do
for j, f in pairs(luci.util.split(luci.util.trim(l), " ")) do
2008-04-19 20:09:38 +00:00
local k, x, v = f:match('([^%s][^:=]+) *([:=]*) *"*([^\n"]*)"*')
if k then
if x == "" then
table.insert(data, k)
else
data[k] = v
end
end
end
end
return data
Squashed commit of the following: commit d45d1757d24d8214f730af1a3401dd2bef4a434f Author: Steven <steven@cyrus.homeunix.org> Date: Wed May 28 17:23:27 2008 +0200 * libs/core: Removed dummymode checks in sys * libs/sgi-webuci: Fixes commit b870e8d345bc8912fd8ab61d463b9d68b924a6f4 Author: Felix Fietkau <nbd@openwrt.org> Date: Wed May 28 15:40:10 2008 +0200 fix path to theme commit e3732926bd98db4cc38de6eb8018cd4e55176699 Author: Felix Fietkau <nbd@openwrt.org> Date: Wed May 28 14:56:03 2008 +0200 set the proper path to the config in dummy mode commit a75aecf46f037c98bd6e49b9e48adb735d76d150 Author: Felix Fietkau <nbd@openwrt.org> Date: Wed May 28 14:50:42 2008 +0200 add some dummy mode support commit 12bb39ef606bca6b403cc982213a6597b76dc1b3 Author: Felix Fietkau <nbd@openwrt.org> Date: Wed May 28 14:41:56 2008 +0200 normalize paths commit 7aaad1103fd2bdc75aca158baa6ef191f9a961c6 Author: Felix Fietkau <nbd@openwrt.org> Date: Wed May 28 14:27:26 2008 +0200 add missing require statement commit 5766274bd2511b00c42b474aeeeb3efaca6ded9b Author: Felix Fietkau <nbd@openwrt.org> Date: Wed May 28 14:19:54 2008 +0200 add optional luaposix package (patched for darwin support) commit 9e257a76d03722fc0ce8312aa9952641b21424bd Author: Felix Fietkau <nbd@openwrt.org> Date: Tue May 27 20:21:59 2008 +0200 add missing files, more integration for the boa plugin, fix path to lua modules commit dacc1a98ec946975fcb19f87076dfa7db865fca6 Author: Felix Fietkau <nbd@openwrt.org> Date: Tue May 27 19:42:37 2008 +0200 use "compile" instead of "source" and rename the old version of compile to "compile-all" commit eb14777c4fee1eb5740aba1e5603e481320da7b1 Author: Felix Fietkau <nbd@openwrt.org> Date: Tue May 27 19:41:59 2008 +0200 more boa integration commit df0afb965bf0a987b653e9d0acadf3151179a596 Author: Felix Fietkau <nbd@openwrt.org> Date: Tue May 27 18:33:42 2008 +0200 build boa and the webuci.so plugin along with sgi-webuci commit 878161dabf32066631103d199e2cbaf3f5a7fb07 Author: Felix Fietkau <nbd@openwrt.org> Date: Tue May 27 18:03:16 2008 +0200 add .gitignore
2008-05-28 15:28:13 +00:00
end