Changeset 8687


Ignore:
Timestamp:
May 31, 2012, 12:05:31 PM (7 years ago)
Author:
jow
Message:

libs/core: use ubus to fetch interface and device status information, depend on libubus-lua

Location:
luci/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • luci/trunk/contrib/package/luci/Makefile

    r8575 r8687  
    5555  MAINTAINER:=LuCI Development Team <luci@lists.subsignal.org>
    5656  SUBMENU:=8. Libraries
    57   DEPENDS:=+lua +libuci-lua
     57  DEPENDS:=+lua +libuci-lua +libubus-lua
    5858  TITLE:=LuCI core libraries
    5959endef
  • luci/trunk/libs/core/luasrc/model/network.lua

    r8051 r8687  
    2626local require = require
    2727
     28local bus = require "ubus"
    2829local nxo = require "nixio"
    2930local nfs = require "nixio.fs"
     
    4748
    4849local _interfaces, _bridge, _switch, _tunnel
     50local _ubus, _ubusnetcache, _ubusdevcache
    4951local _uci_real, _uci_state
    5052
     
    199201    _switch     = { }
    200202    _tunnel     = { }
     203
     204    _ubus         = bus.connect()
     205    _ubusnetcache = { }
     206    _ubusdevcache = { }
    201207
    202208    -- read interface information
     
    601607end
    602608
    603 function protocol._ip(self, opt, family, list)
    604     local ip = _uci_state:get("network", self.sid, opt)
    605     local fc = (family == 6) and ipc.IPv6 or ipc.IPv4
    606     if ip or list then
    607         if list then
    608             local l = { }
    609             for ip in utl.imatch(ip) do
    610                 ip = fc(ip)
    611                 if ip then l[#l+1] = ip:string() end
    612             end
    613             return l
    614         else
    615             ip = fc(ip)
    616             return ip and ip:string()
    617         end
    618     end
     609function protocol._ubus(self, field)
     610    if not _ubusnetcache[self.sid] then
     611        _ubusnetcache[self.sid] = _ubus:call("network.interface.%s" % self.sid,
     612                                          "status", { })
     613    end
     614
     615    return _ubusnetcache[self.sid] and (field and _ubusnetcache[self.sid][field]
     616                                            or _ubusnetcache[self.sid])
    619617end
    620618
     
    686684
    687685function protocol.uptime(self)
    688     local cnt = tonumber(_uci_state:get("network", self.sid, "connect_time"))
    689     if cnt ~= nil then
    690         return nxo.sysinfo().uptime - cnt
    691     else
    692         return 0
    693     end
     686    return self:_ubus("uptime") or 0
    694687end
    695688
     
    709702
    710703function protocol.ipaddr(self)
    711     return self:_ip("ipaddr", 4)
     704    local addrs = self:_ubus("ipv4-address")
     705    return addrs and #addrs > 0 and addrs[1].address
    712706end
    713707
    714708function protocol.netmask(self)
    715     return self:_ip("netmask", 4)
     709    local addrs = self:_ubus("ipv4-address")
     710    return addrs and #addrs > 0 and
     711        ipc.IPv4("0.0.0.0/%d" % addrs[1].mask):mask():string()
    716712end
    717713
    718714function protocol.gwaddr(self)
    719     return self:_ip("gateway", 4)
     715    local _, route
     716    for _, route in ipairs(self:_ubus("route")) do
     717        if route.target == "0.0.0.0" and route.mask == 0 then
     718            return route.nexthop
     719        end
     720    end
    720721end
    721722
    722723function protocol.dnsaddrs(self)
    723     return self:_ip("dns", 4, true)
     724    local dns = { }
     725    local _, addr
     726    for _, addr in ipairs(self:_ubus("dns-server")) do
     727        if not addr:match(":") then
     728            dns[#dns+1] = addr
     729        end
     730    end
     731    return dns
    724732end
    725733
    726734function protocol.ip6addr(self)
    727     local ip6 = self:_ip("ip6addr", 6)
    728     if not ip6 then
    729         local ifc = _interfaces[self:ifname()]
    730         if ifc and ifc.ip6addrs then
    731             local a
    732             for _, a in ipairs(ifc.ip6addrs) do
    733                 if not a:is6linklocal() then
    734                     ip6 = a:string()
    735                     break
    736                 end
    737             end
    738         end
    739     end
    740     return ip6
     735    local addrs = self:_ubus("ipv6-address")
     736    return addrs and #addrs > 0
     737        and "%s/%d" %{ addrs[1].address, addrs[1].mask }
    741738end
    742739
    743740function protocol.gw6addr(self)
    744     local ip6 = self:_ip("ip6gw", 6)
    745     if not ip6 then
    746         local dr6 = sys.net.defaultroute6()
    747         if dr6 and dr6.device == self:ifname() then
    748             return dr6.nexthop:string()
    749         end
    750     end
    751     return ip6
     741    local _, route
     742    for _, route in ipairs(self:_ubus("route")) do
     743        if route.target == "::" and route.mask == 0 then
     744            return ipc.IPv6(route.nexthop):string()
     745        end
     746    end
    752747end
    753748
    754749function protocol.dns6addrs(self)
    755     return self:_ip("dns", 6, true)
     750    local dns = { }
     751    local _, addr
     752    for _, addr in ipairs(self:_ubus("dns-server")) do
     753        if addr:match(":") then
     754            dns[#dns+1] = addr
     755        end
     756    end
     757    return dns
    756758end
    757759
     
    931933function interface.__init__(self, ifname, network)
    932934    local wif = _wifi_lookup(ifname)
    933     if wif then 
    934         self.wif    = wifinet(wif) 
     935    if wif then
     936        self.wif    = wifinet(wif)
    935937        self.ifname = _uci_state:get("wireless", wif, "ifname")
    936938    end
     
    941943end
    942944
     945function interface._ubus(self, field)
     946    if not _ubusdevcache[self.ifname] then
     947        _ubusdevcache[self.ifname] = _ubus:call("network.device", "status",
     948                                                { name = self.ifname })
     949    end
     950    return _ubusdevcache[self.ifname] and
     951        (field and _ubusdevcache[self.ifname][field] or
     952                   _ubusdevcache[self.ifname])
     953end
     954
    943955function interface.name(self)
    944956    return self.wif and self.wif:ifname() or self.ifname
     
    946958
    947959function interface.mac(self)
    948     return (self.dev and self.dev.macaddr or "00:00:00:00:00:00"):upper()
     960    return (self:_ubus("macaddr") or "00:00:00:00:00:00"):upper()
    949961end
    950962
     
    10201032
    10211033function interface.ports(self)
    1022     if self.br then
    1023         local iface
     1034    local members = self:_ubus("bridge-members")
     1035    if members then
     1036        local _, iface
    10241037        local ifaces = { }
    1025         for _, iface in ipairs(self.br.ifnames) do
    1026             ifaces[#ifaces+1] = interface(iface.name)
    1027         end
    1028         return ifaces
     1038        for _, iface in ipairs(members) do
     1039            ifaces[#ifaces+1] = interface(iface)
     1040        end
    10291041    end
    10301042end
     
    10501062        return self.wif:is_up()
    10511063    else
    1052         return self.dev and self.dev.flags and self.dev.flags.up or false
     1064        return self:_ubus("up") or false
    10531065    end
    10541066end
     
    10621074end
    10631075
     1076local function uint(x)
     1077    return (x < 0) and ((2^32) + x) or x
     1078end
     1079
    10641080function interface.tx_bytes(self)
    1065     return self.dev and self.dev.stats
    1066         and self.dev.stats.tx_bytes or 0
     1081    local stat = self:_ubus("statistics")
     1082    return stat and uint(stat.tx_bytes) or 0
    10671083end
    10681084
    10691085function interface.rx_bytes(self)
    1070     return self.dev and self.dev.stats
    1071         and self.dev.stats.rx_bytes or 0
     1086    local stat = self:_ubus("statistics")
     1087    return stat and uint(stat.rx_bytes) or 0
    10721088end
    10731089
    10741090function interface.tx_packets(self)
    1075     return self.dev and self.dev.stats
    1076         and self.dev.stats.tx_packets or 0
     1091    local stat = self:_ubus("statistics")
     1092    return stat and uint(stat.tx_packets) or 0
    10771093end
    10781094
    10791095function interface.rx_packets(self)
    1080     return self.dev and self.dev.stats
    1081         and self.dev.stats.rx_packets or 0
     1096    local stat = self:_ubus("statistics")
     1097    return stat and uint(stat.rx_packets) or 0
    10821098end
    10831099
Note: See TracChangeset for help on using the changeset viewer.