2 local sys = require
"luci.sys"
3 local twa = require
"luci.tools.webadmin"
6 local system, model, memtotal, memcached, membuffers, memfree = sys.sysinfo()
7 local uptime = twa.date_format(tonumber(sys.uptime()))
8 local_time = os.date(
"%c")
9 local load1, load5, load15 = sys.loadavg()
10 local load = string.format(
"%.2f, %.2f, %.2f", load1, load5, load15)
11 local memory = string.format(
"%.2f MB (%.0f%% %s, %.0f%% %s, %.0f%% %s)",
12 tonumber(memtotal) /
1024,
13 100 * memcached / memtotal,
14 tostring(translate(
"cached")),
15 100 * membuffers / memtotal,
16 tostring(translate(
"buffered")),
17 100 * memfree / memtotal,
18 tostring(translate(
"free"))
22 local uci = require
"luci.model.uci".cursor()
23 local ntm = require
"luci.model.network"
25 local devices = ntm:get_wifidevs()
31 local defroutev4 = sys.net.defaultroute()
32 local defroutev6 = sys.net.defaultroute6 ()
39 <div class=
"cbi-section-node">
40 <div class=
"cbi-value"><label class=
"cbi-value-title"><%:System%
></label><div class=
"cbi-value-field"><%=system%
></div></div>
41 <div class=
"cbi-value"><label class=
"cbi-value-title"><%:Processor%
></label><div class=
"cbi-value-field"><%=model%
></div></div>
42 <div class=
"cbi-value"><label class=
"cbi-value-title"><%:Load%
></label><div class=
"cbi-value-field"><%=load%
></div></div>
43 <div class=
"cbi-value"><label class=
"cbi-value-title"><%:Memory%
></label><div class=
"cbi-value-field"><%=memory%
></div></div>
44 <div class=
"cbi-value"><label class=
"cbi-value-title"><%:Local Time%
></label><div class=
"cbi-value-field"><%=local_time%
></div></div>
45 <div class=
"cbi-value"><label class=
"cbi-value-title"><%:Uptime%
></label><div class=
"cbi-value-field"><%=uptime%
></div></div>
49 <% if devices[
1] then %
>
52 <h2><%:Wireless Overview%
></h2>
53 <div class=
"cbi-section">
54 <div class=
"cbi-section-node">
55 <table class=
"cbi-section-table">
56 <tr class=
"cbi-section-table-titles">
57 <th class=
"cbi-section-table-cell"><%:Signal%
></th>
58 <th class=
"cbi-section-table-cell"><%:Bitrate%
></th>
59 <th class=
"cbi-section-table-cell"><%:SSID%
></th>
60 <th class=
"cbi-section-table-cell"><%:BSSID%
></th>
61 <th class=
"cbi-section-table-cell"><%:Channel%
></th>
62 <th class=
"cbi-section-table-cell"><%:Mode%
></th>
63 <th class=
"cbi-section-table-cell"><%:TX%
>-<%:Power%
></th>
64 <th class=
"cbi-section-table-cell"><%:Interface%
></th>
67 for _, dev in ipairs(devices) do
69 for _, net in ipairs(dev:get_wifinets()) do
70 netlist[#netlist+
1] = net:ifname()
71 netdevs[net:ifname()] = dev:name()
73 if net.iwdata.ifname then
74 local signal = net.iwinfo.signal or
"N/A"
75 local noise = net.iwinfo.noise or
"N/A"
76 local q = net.iwinfo.quality or
"0"
77 local qmax = net.iwinfo.quality_max or
"100"
78 local qperc = q / qmax *
100
81 icon =
"signal-none.png"
82 elseif qperc <
26 then
83 icon =
"signal-0-25.png"
84 elseif qperc <
51 then
85 icon =
"signal-25-50.png"
86 elseif qperc <
76 then
87 icon =
"signal-50-75.png"
88 elseif qperc <
100 then
89 icon =
"signal-75-100.png"
94 signal_string =
"<img src='"..resource..
"/icons/"..icon..
"' title='Signal: "..signal..
" db / Noise: "..noise..
" db' alt='Signal Quality'></img>"
96 local ssid = net.iwinfo.ssid or
"N/A"
97 local bssid = net.iwinfo.bssid or
"N/A"
98 local chan = net.iwinfo.channel or
"N/A"
99 local mode = net.iwinfo.mode or
"N/A"
100 local txpwr = net.iwinfo.txpower or
"N/A"
101 if txpwr ~=
"N/A" then
102 txpwr = txpwr..
" dbm"
104 local bitrate = net.iwinfo.bitrate or
"N/A"
105 if bitrate ~=
"N/A" then
106 bitrate = ( bitrate /
1000 )..
"Mb/s"
108 local interface = net.iwdata.ifname or
"N/A"
110 <tr class=
"cbi-section-table-row cbi-rowstyle-1">
111 <td class=
"cbi-value-field"><%=signal_string%
></td>
112 <td class=
"cbi-value-field"><%=bitrate%
></td>
113 <td class=
"cbi-value-field"><%=ssid%
></td>
114 <td class=
"cbi-value-field"><%=bssid%
></td>
115 <td class=
"cbi-value-field"><%=chan%
></td>
116 <td class=
"cbi-value-field"><%=mode%
></td>
117 <td class=
"cbi-value-field"><%=txpwr%
></td>
118 <td class=
"cbi-value-field"><%=interface%
></td>
129 <div class=
"cbi-map">
130 <h2><%:Default routes%
></h2>
131 <div class=
"cbi-section">
132 <div class=
"cbi-section-node">
133 <table class=
"cbi-section-table">
135 <% if not defroutev4 and not defroutev6 then %
>
136 <%:No defaultroutes known.%
>
138 <tr class=
"cbi-section-table-titles">
139 <th class=
"cbi-section-table-cell"><%:Network%
></th>
140 <th class=
"cbi-section-table-cell"><%:Interface%
></th>
141 <th class=
"cbi-section-table-cell"><%:Gateway%
></th>
142 <th class=
"cbi-section-table-cell"><%:Metric%
></th>
145 <% if defroutev4 then %
>
147 <tr class=
"cbi-section-table-row cbi-rowstyle-1">
148 <td class=
"cbi-value-field"><%=defroutev4.dest:string()%
></td>
149 <td class=
"cbi-value-field"><%=defroutev4.device%
></td>
150 <td class=
"cbi-value-field"><%=defroutev4.gateway:string()%
></td>
151 <td class=
"cbi-value-field"><%=defroutev4.metric%
></td>
155 if defroutev6 then %
>
157 <tr class=
"cbi-section-table-row cbi-rowstyle-2">
158 <td class=
"cbi-value-field"><%=defroutev6.dest:string()%
></td>
159 <td class=
"cbi-value-field"><%=defroutev6.device%
></td>
160 <td class=
"cbi-value-field"><%=defroutev6.nexthop:string()%
></td>
161 <td class=
"cbi-value-field"><%=defroutev6.metric%
></td>