【LEDE】树莓派上玩LEDE终极指南-92-自己编译的LEDE为啥子不能用SSR和KoolProxy?

来源:互联网 发布:单片机数据类型 编辑:程序博客网 时间:2024/05/12 05:41

一直有个问题,我自己编译的所有的LEDE的固件,在我使用opkg安装完ssr或者kp之后,打开luci界面会出现:

attemp to call a nil field net.arptable (a nil value)

诸如这个消息。

当我使用潘多拉的固件或者是官方的固件的时候,发现是正常的,这个问题就不会出现,这是为啥来?

原因就在自己编译的LEDE固件的sys.lua文件和官方的这个文件不一样!!!

把自己的文件改一下:

-- Copyright 2008 Steven Barth <steven@midlink.org>-- Licensed to the public under the Apache License 2.0.local io     = require "io"local os     = require "os"local table  = require "table"local nixio  = require "nixio"local fs     = require "nixio.fs"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, require, select =tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, selectmodule "luci.sys"function call(...)return os.execute(...) / 256endexec = luci.util.execfunction mounts()local data = {}local k = {"fs", "blocks", "used", "available", "percent", "mountpoint"}local ps = luci.util.execi("df")if not ps thenreturnelseps()endfor line in ps dolocal row = {}local j = 1for value in line:gmatch("[^%s]+") dorow[k[j]] = valuej = j + 1endif row[k[1]] then-- this is a rather ugly workaround to cope with wrapped lines in-- the df output:----/dev/scsi/host0/bus0/target0/lun0/part3--                   114382024  93566472  15005244  86% /mnt/usb--if not row[k[2]] thenj = 2line = ps()for value in line:gmatch("[^%s]+") dorow[k[j]] = valuej = j + 1endendtable.insert(data, row)endendreturn dataend-- containing the whole environment is returned otherwise this function returns-- the corresponding string value for the given name or nil if no such variable-- exists.getenv = nixio.getenvfunction hostname(newname)if type(newname) == "string" and #newname > 0 thenfs.writefile( "/proc/sys/kernel/hostname", newname )return newnameelsereturn nixio.uname().nodenameendendfunction httpget(url, stream, target)if not target thenlocal source = stream and io.popen or luci.util.execreturn source("wget -qO- '"..url:gsub("'", "").."'")elsereturn os.execute("wget -qO '%s' '%s'" %{target:gsub("'", ""), url:gsub("'", "")})endendfunction reboot()return os.execute("reboot >/dev/null 2>&1")endfunction syslog()return luci.util.exec("logread")endfunction dmesg()return luci.util.exec("dmesg")endfunction uniqueid(bytes)local rand = fs.readfile("/dev/urandom", bytes)return rand and nixio.bin.hexlify(rand)endfunction uptime()return nixio.sysinfo().uptimeendnet = {}--The following fields are defined for arp entry objects:--{ "IP address", "HW address", "HW type", "Flags", "Mask", "Device" }function net.arptable(callback)local arp = (not callback) and {} or nillocal e, r, vif fs.access("/proc/net/arp") thenfor e in io.lines("/proc/net/arp") dolocal r = { }, vfor v in e:gmatch("%S+") dor[#r+1] = vendif r[1] ~= "IP" thenlocal x = {["IP address"] = r[1],["HW type"]    = r[2],["Flags"]      = r[3],["HW address"] = r[4],["Mask"]       = r[5],["Device"]     = r[6]}if callback thencallback(x)elsearp = arp or { }arp[#arp+1] = xendendendendreturn arpendlocal function _nethints(what, callback)local _, k, e, mac, ip, namelocal cur = uci.cursor()local ifn = { }local hosts = { }local function _add(i, ...)local k = select(i, ...)if k thenif not hosts[k] then hosts[k] = { } endhosts[k][1] = select(1, ...) or hosts[k][1]hosts[k][2] = select(2, ...) or hosts[k][2]hosts[k][3] = select(3, ...) or hosts[k][3]hosts[k][4] = select(4, ...) or hosts[k][4]endendluci.ip.neighbors(nil, function(neigh)if neigh.mac and neigh.family == 4 then_add(what, neigh.mac:upper(), neigh.dest:string(), nil, nil)elseif neigh.mac and neigh.family == 6 then_add(what, neigh.mac:upper(), nil, neigh.dest:string(), nil)endend)if fs.access("/etc/ethers") thenfor e in io.lines("/etc/ethers") domac, ip = e:match("^([a-f0-9]%S+) (%S+)")if mac and ip then_add(what, mac:upper(), ip, nil, nil)endendendcur:foreach("dhcp", "dnsmasq",function(s)if s.leasefile and fs.access(s.leasefile) thenfor e in io.lines(s.leasefile) domac, ip, name = e:match("^%d+ (%S+) (%S+) (%S+)")if mac and ip then_add(what, mac:upper(), ip, nil, name ~= "*" and name)endendendend)cur:foreach("dhcp", "host",function(s)for mac in luci.util.imatch(s.mac) do_add(what, mac:upper(), s.ip, nil, s.name)endend)for _, e in ipairs(nixio.getifaddrs()) doif e.name ~= "lo" thenifn[e.name] = ifn[e.name] or { }if e.family == "packet" and e.addr and #e.addr == 17 thenifn[e.name][1] = e.addr:upper()elseif e.family == "inet" thenifn[e.name][2] = e.addrelseif e.family == "inet6" thenifn[e.name][3] = e.addrendendendfor _, e in pairs(ifn) doif e[what] and (e[2] or e[3]) then_add(what, e[1], e[2], e[3], e[4])endendfor _, e in luci.util.kspairs(hosts) docallback(e[1], e[2], e[3], e[4])endend--          Each entry contains the values in the following order:--          [ "mac", "name" ]function net.mac_hints(callback)if callback then_nethints(1, function(mac, v4, v6, name)name = name or nixio.getnameinfo(v4 or v6, nil, 100) or v4if name and name ~= mac thencallback(mac, name or nixio.getnameinfo(v4 or v6, nil, 100) or v4)endend)elselocal rv = { }_nethints(1, function(mac, v4, v6, name)name = name or nixio.getnameinfo(v4 or v6, nil, 100) or v4if name and name ~= mac thenrv[#rv+1] = { mac, name or nixio.getnameinfo(v4 or v6, nil, 100) or v4 }endend)return rvendend--          Each entry contains the values in the following order:--          [ "ip", "name" ]function net.ipv4_hints(callback)if callback then_nethints(2, function(mac, v4, v6, name)name = name or nixio.getnameinfo(v4, nil, 100) or macif name and name ~= v4 thencallback(v4, name)endend)elselocal rv = { }_nethints(2, function(mac, v4, v6, name)name = name or nixio.getnameinfo(v4, nil, 100) or macif name and name ~= v4 thenrv[#rv+1] = { v4, name }endend)return rvendend--          Each entry contains the values in the following order:--          [ "ip", "name" ]function net.ipv6_hints(callback)if callback then_nethints(3, function(mac, v4, v6, name)name = name or nixio.getnameinfo(v6, nil, 100) or macif name and name ~= v6 thencallback(v6, name)endend)elselocal rv = { }_nethints(3, function(mac, v4, v6, name)name = name or nixio.getnameinfo(v6, nil, 100) or macif name and name ~= v6 thenrv[#rv+1] = { v6, name }endend)return rvendendfunction net.host_hints(callback)if callback then_nethints(1, function(mac, v4, v6, name)if mac and mac ~= "00:00:00:00:00:00" and (v4 or v6 or name) thencallback(mac, v4, v6, name)endend)elselocal rv = { }_nethints(1, function(mac, v4, v6, name)if mac and mac ~= "00:00:00:00:00:00" and (v4 or v6 or name) thenlocal e = { }if v4   then e.ipv4 = v4   endif v6   then e.ipv6 = v6   endif name then e.name = name endrv[mac] = eendend)return rvendendfunction net.conntrack(callback)local ok, nfct = pcall(io.lines, "/proc/net/nf_conntrack")if not ok or not nfct thenreturn nilendlocal line, connt = nil, (not callback) and { }for line in nfct dolocal fam, l3, l4, timeout, tuples =line:match("^(ipv[46]) +(%d+) +%S+ +(%d+) +(%d+) +(.+)$")if fam and l3 and l4 and timeout and not tuples:match("^TIME_WAIT ") thenl4 = nixio.getprotobynumber(l4)local entry = {bytes = 0,packets = 0,layer3 = fam,layer4 = l4 and l4.name or "unknown",timeout = tonumber(timeout, 10)}local key, valfor key, val in tuples:gmatch("(%w+)=(%S+)") doif key == "bytes" or key == "packets" thenentry[key] = entry[key] + tonumber(val, 10)elseif key == "src" or key == "dst" thenif entry[key] == nil thenentry[key] = luci.ip.new(val):string()endelseif key == "sport" or key == "dport" thenif entry[key] == nil thenentry[key] = valendelseif val thenentry[key] = valendendif callback thencallback(entry)elseconnt[#connt+1] = entryendendendreturn callback and true or conntendfunction net.devices()local devs = {}for k, v in ipairs(nixio.getifaddrs()) doif v.family == "packet" thendevs[#devs+1] = v.nameendendreturn devsendfunction net.deviceinfo()local devs = {}for k, v in ipairs(nixio.getifaddrs()) doif v.family == "packet" thenlocal d = v.datad[1] = d.rx_bytesd[2] = d.rx_packetsd[3] = d.rx_errorsd[4] = d.rx_droppedd[5] = 0d[6] = 0d[7] = 0d[8] = d.multicastd[9] = d.tx_bytesd[10] = d.tx_packetsd[11] = d.tx_errorsd[12] = d.tx_droppedd[13] = 0d[14] = d.collisionsd[15] = 0d[16] = 0devs[v.name] = dendendreturn devsend--The following fields are defined for route entry tables:--{ "dest", "gateway", "metric", "refcount", "usecount", "irtt",--  "flags", "device" }function net.routes(callback)local routes = { }for line in io.lines("/proc/net/route") dolocal dev, dst_ip, gateway, flags, refcnt, usecnt, metric,  dst_mask, mtu, win, irtt = line:match("([^%s]+)\t([A-F0-9]+)\t([A-F0-9]+)\t([A-F0-9]+)\t" .."(%d+)\t(%d+)\t(%d+)\t([A-F0-9]+)\t(%d+)\t(%d+)\t(%d+)")if dev thengateway  = luci.ip.Hex( gateway,  32, luci.ip.FAMILY_INET4 )dst_mask = luci.ip.Hex( dst_mask, 32, luci.ip.FAMILY_INET4 )dst_ip   = luci.ip.Hex(dst_ip, dst_mask:prefix(dst_mask), luci.ip.FAMILY_INET4)local rt = {dest     = dst_ip,gateway  = gateway,metric   = tonumber(metric),refcount = tonumber(refcnt),usecount = tonumber(usecnt),mtu      = tonumber(mtu),window   = tonumber(window),irtt     = tonumber(irtt),flags    = tonumber(flags, 16),device   = dev}if callback thencallback(rt)elseroutes[#routes+1] = rtendendendreturn routesend--The following fields are defined for route entry tables:--{ "source", "dest", "nexthop", "metric", "refcount", "usecount",--  "flags", "device" }function net.routes6(callback)if fs.access("/proc/net/ipv6_route", "r") thenlocal routes = { }for line in io.lines("/proc/net/ipv6_route") dolocal 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]+)")if dst_ip and dst_prefix and   src_ip and src_prefix and   nexthop and metric and   refcnt and usecnt and   flags and devthensrc_ip = luci.ip.Hex(src_ip, tonumber(src_prefix, 16), luci.ip.FAMILY_INET6, false)dst_ip = luci.ip.Hex(dst_ip, tonumber(dst_prefix, 16), luci.ip.FAMILY_INET6, false)nexthop = luci.ip.Hex( nexthop, 128, luci.ip.FAMILY_INET6, false )local rt = {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,-- lua number is too small for storing the metric-- add a metric_raw field with the original contentmetric_raw = metric}if callback thencallback(rt)elseroutes[#routes+1] = rtendendendreturn routesendendfunction net.pingtest(host)return os.execute("ping -c1 '"..host:gsub("'", '').."' >/dev/null 2>&1")endprocess = {}function process.info(key)local s = {uid = nixio.getuid(), gid = nixio.getgid()}return not key and s or s[key]endfunction process.list()local data = {}local klocal ps = luci.util.execi("/bin/busybox top -bn1")if not ps thenreturnendfor line in ps dolocal pid, ppid, user, stat, vsz, mem, cpu, cmd = line:match("^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][W ][<N ]) +(%d+) +(%d+%%) +(%d+%%) +(.+)")local idx = tonumber(pid)if idx thendata[idx] = {['PID']     = pid,['PPID']    = ppid,['USER']    = user,['STAT']    = stat,['VSZ']     = vsz,['%MEM']    = mem,['%CPU']    = cpu,['COMMAND'] = cmd}endendreturn dataendfunction process.setgroup(gid)return nixio.setgid(gid)endfunction process.setuser(uid)return nixio.setuid(uid)endprocess.signal = nixio.killuser = {}--{ "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }user.getuser = nixio.getpwfunction 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" thenreturn nil, pweelsereturn pwh, pweendendfunction user.checkpasswd(username, pass)local pwh, pwe = user.getpasswd(username)if pwe thenreturn (pwh == nil or nixio.crypt(pass, pwh) == pwh)endreturn falseendfunction user.setpasswd(username, password)if password thenpassword = password:gsub("'", [['"'"']])endif username thenusername = username:gsub("'", [['"'"']])endreturn os.execute("(echo '" .. password .. "'; sleep 1; echo '" .. password .. "') | " .."passwd '" .. username .. "' >/dev/null 2>&1")endwifi = {}function wifi.getiwinfo(ifname)local stat, iwinfo = pcall(require, "iwinfo")if ifname thenlocal d, n = ifname:match("^(%w+)%.network(%d+)")local wstate = luci.util.ubus("network.wireless", "status") or { }d = d or ifnamen = n and tonumber(n) or 1if type(wstate[d]) == "table" and   type(wstate[d].interfaces) == "table" and   type(wstate[d].interfaces[n]) == "table" and   type(wstate[d].interfaces[n].ifname) == "string"thenifname = wstate[d].interfaces[n].ifnameelseifname = dendlocal t = stat and iwinfo.type(ifname)local x = t and iwinfo[t] or { }return setmetatable({}, {__index = function(t, k)if k == "ifname" thenreturn ifnameelseif x[k] thenreturn x[k](ifname)endend})endendinit = {}init.dir = "/etc/init.d/"function init.names()local names = { }for name in fs.glob(init.dir.."*") donames[#names+1] = fs.basename(name)endreturn namesendfunction init.index(name)if fs.access(init.dir..name) thenreturn call("env -i sh -c 'source %s%s enabled; exit ${START:-255}' >/dev/null"%{ init.dir, name })endendlocal function init_action(action, name)if fs.access(init.dir..name) thenreturn call("env -i %s%s %s >/dev/null" %{ init.dir, name, action })endendfunction init.enabled(name)return (init_action("enabled", name) == 0)endfunction init.enable(name)return (init_action("enable", name) == 1)endfunction init.disable(name)return (init_action("disable", name) == 0)endfunction init.start(name)return (init_action("start", name) == 0)endfunction init.stop(name)return (init_action("stop", name) == 0)end

就是那里net那里,改一下。或者直接把所有的代码复制进去就行。

阅读全文
0 0