| 22 | | |
| 23 | | local created |
| 24 | | local netstat = sys.net.deviceinfo() |
| 25 | | |
| 26 | | s = m:section(TypedSection, "interface", "") |
| 27 | | s.addremove = true |
| 28 | | s.anonymous = false |
| 29 | | s.extedit = luci.dispatcher.build_url("admin", "network", "network") .. "/%s" |
| 30 | | s.template = "cbi/tblsection" |
| 31 | | s.override_scheme = true |
| 32 | | |
| 33 | | function s.filter(self, section) |
| 34 | | return section ~= "loopback" and section |
| 35 | | end |
| 36 | | |
| 37 | | function s.create(self, section) |
| 38 | | if TypedSection.create(self, section) then |
| 39 | | created = section |
| 40 | | else |
| 41 | | self.invalid_cts = true |
| 42 | | end |
| 43 | | end |
| 44 | | |
| 45 | | function s.parse(self, ...) |
| 46 | | TypedSection.parse(self, ...) |
| 47 | | if created then |
| 48 | | m.uci:save("network") |
| 49 | | luci.http.redirect(luci.dispatcher.build_url("admin", "network", "network") |
| 50 | | .. "/" .. created) |
| 51 | | end |
| 52 | | end |
| 53 | | |
| 54 | | up = s:option(Flag, "up") |
| 55 | | function up.cfgvalue(self, section) |
| 56 | | return netstate[section] and netstate[section].up or "0" |
| 57 | | end |
| 58 | | |
| 59 | | function up.write(self, section, value) |
| 60 | | local call |
| 61 | | if value == "1" then |
| 62 | | call = "ifup" |
| 63 | | elseif value == "0" then |
| 64 | | call = "ifdown" |
| 65 | | end |
| 66 | | os.execute(call .. " " .. section .. " >/dev/null 2>&1") |
| 67 | | end |
| 68 | | |
| 69 | | ifname = s:option(DummyValue, "ifname", translate("Device")) |
| 70 | | function ifname.cfgvalue(self, section) |
| 71 | | return netstate[section] and netstate[section].ifname |
| 72 | | end |
| 73 | | |
| 74 | | ifname.titleref = luci.dispatcher.build_url("admin", "network", "vlan") |
| 75 | | |
| 76 | | |
| 77 | | if luci.model.uci.cursor():load("firewall") then |
| 78 | | zone = s:option(DummyValue, "_zone", translate("Zone")) |
| 79 | | zone.titleref = luci.dispatcher.build_url("admin", "network", "firewall", "zones") |
| 80 | | |
| 81 | | function zone.cfgvalue(self, section) |
| 82 | | return table.concat(wa.network_get_zones(section) or { "-" }, ", ") |
| 83 | | end |
| 84 | | end |
| 85 | | |
| 86 | | hwaddr = s:option(DummyValue, "_hwaddr", |
| 87 | | translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"), |
| 88 | | translate("Hardware Address")) |
| 89 | | |
| 90 | | function hwaddr.cfgvalue(self, section) |
| 91 | | local ix = self.map:get(section, "ifname") or "" |
| 92 | | ix = (type(ix) == "table") and ix[1] or ix |
| 93 | | |
| 94 | | local mac = fs.readfile("/sys/class/net/" .. ix .. "/address") |
| 95 | | |
| 96 | | if not mac then |
| 97 | | mac = luci.util.exec("ifconfig " .. ix) |
| 98 | | mac = mac and mac:match(" ([A-F0-9:]+)%s*\n") |
| 99 | | end |
| 100 | | |
| 101 | | if mac and #mac > 0 then |
| 102 | | return mac:upper() |
| 103 | | end |
| 104 | | |
| 105 | | return "?" |
| 106 | | end |
| 107 | | |
| 108 | | |
| 109 | | ipaddr = s:option(DummyValue, "ipaddr", |
| 110 | | translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>" .. |
| 111 | | "-Address")) |
| 112 | | function ipaddr.cfgvalue(self, section) |
| 113 | | return table.concat(wa.network_get_addresses(section), ", ") |
| 114 | | end |
| 115 | | |
| 116 | | txrx = s:option(DummyValue, "_txrx", translate("Traffic"), |
| 117 | | translate("transmitted / received")) |
| 118 | | |
| 119 | | function txrx.cfgvalue(self, section) |
| 120 | | local ix = self.map:get(section, "ifname") |
| 121 | | |
| 122 | | local rx = netstat and netstat[ix] and netstat[ix][1] |
| 123 | | rx = rx and wa.byte_format(tonumber(rx)) or "-" |
| 124 | | |
| 125 | | local tx = netstat and netstat[ix] and netstat[ix][9] |
| 126 | | tx = tx and wa.byte_format(tonumber(tx)) or "-" |
| 127 | | |
| 128 | | return string.format("%s / %s", tx, rx) |
| 129 | | end |
| 130 | | |
| 131 | | errors = s:option(DummyValue, "_err", translate("Errors"), |
| 132 | | translate("TX / RX")) |
| 133 | | |
| 134 | | function errors.cfgvalue(self, section) |
| 135 | | local ix = self.map:get(section, "ifname") |
| 136 | | |
| 137 | | local rx = netstat and netstat[ix] and netstat[ix][3] |
| 138 | | local tx = netstat and netstat[ix] and netstat[ix][11] |
| 139 | | |
| 140 | | rx = rx and tostring(rx) or "-" |
| 141 | | tx = tx and tostring(tx) or "-" |
| 142 | | |
| 143 | | return string.format("%s / %s", tx, rx) |
| 144 | | end |
| | 19 | m:section(SimpleSection).template = "admin_network/iface_overview" |