+end
+
+
+wifi = {}
+
+function wifi.getiwconfig()
+ local cnt = exec("/usr/sbin/iwconfig 2>/dev/null")
+ local iwc = {}
+
+ for i, l in pairs(ffluci.util.split(ffluci.util.trim(cnt), "\n\n")) do
+ 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(ffluci.util.split(ffluci.util.trim(cnt), "\n\n")) do
+ local k = l:match("^(.-) ")
+ l = l:gsub("^[^\n]+", "", 1)
+ if k then
+ iws[k] = {}
+ for j, c in pairs(ffluci.util.split(l, "\n Cell")) do
+ c = c:gsub("^(.-)- ", "", 1)
+ c = ffluci.util.split(c, "\n", 7)
+ c = table.concat(c, "\n", 1, 7)
+ 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 "\t+"
+
+ local data = {}
+ local trim = ffluci.util.trim
+ local split = ffluci.util.split
+
+ local keys = split(trim(iter()), delimiter)
+ 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)) do
+ 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(ffluci.util.split(ffluci.util.trim(cnt), "\n")) do
+ for j, f in pairs(ffluci.util.split(ffluci.util.trim(l), " ")) do
+ 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