From 781c3f9ff1a4c0909634210294c3d6398bcaa82a Mon Sep 17 00:00:00 2001 From: Wouter R Date: Thu, 25 Jul 2013 01:06:00 +0200 Subject: [PATCH] Add kmod-usb-serial-ftdi as package dependency for FTDI-based 3D printers; fix MAC address lookup; fix dhcp configuration when switching to AP mode; rename api functions in network module; minor fixes and changes. --- Makefile | 2 +- src/network/netconfig.lua | 4 +-- src/network/wlanconfig.lua | 62 ++++++++++++++++++++---------------- src/rest/api/api_network.lua | 14 ++++---- src/script/wifibox_init | 2 +- src/test/test_wlanconfig.lua | 7 ++-- src/util/utils.lua | 10 ++++++ 7 files changed, 59 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index 7370cbe..c5ff15b 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ define Package/wifibox # DEFAULT:=y TITLE:=Doodle3D WifiBox firmware URL:=http://www.doodle3d.com/wifibox - DEPENDS:=+lua +libuci-lua +libiwinfo-lua +uhttpd +kmod-usb-acm + DEPENDS:=+lua +libuci-lua +libiwinfo-lua +uhttpd +kmod-usb-acm +kmod-usb-serial-ftdi endef define Package/wifibox/description diff --git a/src/network/netconfig.lua b/src/network/netconfig.lua index 75e0e16..985be57 100644 --- a/src/network/netconfig.lua +++ b/src/network/netconfig.lua @@ -150,8 +150,8 @@ end --[[ Add/remove DHCP pool for wireless net ]] function reconf.dhcppool_add(dirtyList) - uci:set('dhcp', wifi.NET, 'dhcp') --create section - M.uciTableSet('dhcp', wifi.NET, { + uci:set('dhcp', wifi.getDeviceName(), 'dhcp') --create section + M.uciTableSet('dhcp', wifi.getDeviceName(), { interface = wifi.NET, start = '100', limit = '150', diff --git a/src/network/wlanconfig.lua b/src/network/wlanconfig.lua index cef33aa..be91200 100644 --- a/src/network/wlanconfig.lua +++ b/src/network/wlanconfig.lua @@ -1,15 +1,17 @@ local log = require('util.logger') +local utils = require('util.utils') local uci = require('uci').cursor() local iwinfo = require('iwinfo') local M = {} ---NOTE: fallback device 'radio0' is required because sometimes the wlan0 device disappears +-- NOTE: fallback device 'radio0' is required because sometimes the wlan0 device disappears M.DFL_DEVICE = 'wlan0' M.DFL_DEVICE_FALLBACK = 'radio0' M.NET = 'wlan' -local dev, dev_api +-- NOTE: deviceApi is returned by iwinfo.tpe(deviceName) +local deviceName, deviceApi -- if a substitution of baseApSsid is requested, cachedApSsid is returned if not nil local cachedApSsid, baseApSsid = nil, nil @@ -58,17 +60,17 @@ end -- @param device wireless device to operate on (optional, defaults to DFL_DEVICE) -- @return true on success or false+error on failure function M.init(device) --- iwinfo = pcall(require, 'iwinfo') - dev = device or M.DFL_DEVICE - dev_api = iwinfo.type(dev) - if not dev_api then - --TODO: warn about missing dev here? - local devInitial = dev - dev = M.DFL_DEVICE_FALLBACK - dev_api = iwinfo.type(dev) + deviceName = device or M.DFL_DEVICE + deviceApi = iwinfo.type(deviceName) + if not deviceApi then + local devInitial = deviceName + deviceName = M.DFL_DEVICE_FALLBACK + deviceApi = iwinfo.type(deviceName) - if not dev_api then - return false, "No such wireless device: '" .. devInitial .. "' (and fallback '" .. dev .. "' does not exist either)" + log:info("wireless device '" .. devInitial .. "' not found, trying fallback '" .. deviceName .. "'") + + if not deviceApi then + return false, "No such wireless device: '" .. devInitial .. "' (and fallback '" .. deviceName .. "' does not exist either)" end end @@ -77,18 +79,19 @@ end function M.getDeviceState() - local iw = iwinfo[dev_api] + local iw = iwinfo[deviceApi] + local encDescription = type(iw.encryption) == 'function' and iw.encryption(deviceName) or '' local result = { - ['ssid'] = iw.ssid(dev), - ['bssid'] = iw.bssid(dev), - ['channel'] = iw.channel(dev), - ['mode'] = M.mapDeviceMode(iw.mode(dev), true), - ['encryption'] = M.mapEncryptionType(iw.encryption(dev).description), - ['quality'] = iw.quality(dev), - ['quality_max'] = iw.quality_max(dev), - ['txpower'] = iw.txpower(dev), - ['signal'] = iw.signal(dev), - ['noise'] = iw.noise(dev) + ['ssid'] = iw.ssid(deviceName), + ['bssid'] = iw.bssid(deviceName), + ['channel'] = iw.channel(deviceName), + ['mode'] = M.mapDeviceMode(iw.mode(deviceName), true), + ['encryption'] = M.mapEncryptionType(encDescription), + ['quality'] = iw.quality(deviceName), + ['quality_max'] = iw.quality_max(deviceName), + ['txpower'] = iw.txpower(deviceName), + ['signal'] = iw.signal(deviceName), + ['noise'] = iw.noise(deviceName) } return result end @@ -96,8 +99,7 @@ end --returns the wireless device's MAC address (as string, without colons) --(lua numbers on openWrt seem to be 32bit so they cannot represent a MAC address as one number) function M.getMacAddress() - local iw = iwinfo[dev_api] - local macText = iw.bssid(dev) + local macText = utils.readFile('/sys/class/net/' .. deviceName .. '/address') local out = '' for i = 0, 5 do @@ -105,15 +107,19 @@ function M.getMacAddress() out = out .. bt end - return out + return out:upper() +end + +function M.getDeviceName() + return deviceName end --- Return one or all available wifi networks resulting from an iwinfo scan -- @param ssid return data for given SSID or for all networks if SSID not given -- @return data for all or requested network; false+error on failure or nil when requested network not found function M.getScanInfo(ssid) - local iw = iwinfo[dev_api] - local sr = iw.scanlist(dev) + local iw = iwinfo[deviceApi] + local sr = iw.scanlist(deviceName) local si, se if ssid == nil then diff --git a/src/rest/api/api_network.lua b/src/rest/api/api_network.lua index 0a246df..6ee8814 100644 --- a/src/rest/api/api_network.lua +++ b/src/rest/api/api_network.lua @@ -16,7 +16,7 @@ end --accepts API argument 'nofilter'(bool) to disable filtering of APs and 'self' --accepts with_raw(bool) to include raw table dump -function M.available(request, response) +function M.scan(request, response) local noFilter = u.toboolean(request:get("nofilter")) local withRaw = u.toboolean(request:get("with_raw")) local sr = wifi.getScanInfo() @@ -73,7 +73,7 @@ function M.known(request, response) end --accepts with_raw(bool) to include raw table dump -function M.state(request, response) +function M.status(request, response) local withRaw = u.toboolean(request:get("with_raw")) local ds = wifi.getDeviceState() @@ -93,7 +93,7 @@ end --UNTESTED --requires ssid(string), accepts phrase(string), recreate(bool) -function M.assoc(request, response) +function M.associate_POST(request, response) local argSsid = request:get("ssid") local argPhrase = request:get("phrase") local argRecreate = request:get("recreate") @@ -131,7 +131,7 @@ function M.assoc(request, response) end --UNTESTED -function M.disassoc(request, response) +function M.disassociate_POST(request, response) wifi.activateConfig() local rv = wifi.restart() response:setSuccess("all wireless networks deactivated") @@ -139,12 +139,10 @@ function M.disassoc(request, response) end --UNTESTED -function M.openap(request, response) - --add AP net, activate it, deactivate all others, reload network/wireless config, add all dhcp and captive settings and reload as needed +function M.openap_POST(request, response) local ssid = wifi.getSubstitutedSsid(s.get('apSsid')) netconf.switchConfiguration{apnet="add_noreload"} wifi.activateConfig(ssid) - --netconf.switchConfiguration{ wifiiface="add", network="reload", staticaddr="add", dhcppool="add", wwwredir="add", dnsredir="add", wwwcaptive="add" } netconf.switchConfiguration{ wifiiface="add", network="reload", staticaddr="add", dhcppool="add", wwwredir="add", dnsredir="add" } response:setSuccess("switched to Access Point mode") response:addData("ssid", ssid) @@ -152,7 +150,7 @@ end --UNTESTED --requires ssid(string) -function M.rm(request, response) +function M.remove_POST(request, response) local argSsid = request:get("ssid") if argSsid == nil or argSsid == "" then diff --git a/src/script/wifibox_init b/src/script/wifibox_init index bfcb972..75f1ec4 100755 --- a/src/script/wifibox_init +++ b/src/script/wifibox_init @@ -5,7 +5,7 @@ LOGGER="logger -s -t autowifi -p 6" boot() { $LOGGER "dummy boot" - #/www/cgi-bin/wfcf op=auto + /usr/share/lua/wifibox/script/d3dapi autowifi } start() { diff --git a/src/test/test_wlanconfig.lua b/src/test/test_wlanconfig.lua index 461bc64..b7b3d3e 100644 --- a/src/test/test_wlanconfig.lua +++ b/src/test/test_wlanconfig.lua @@ -17,8 +17,11 @@ end function M.test_getMacAddress() local reportedMac = wlanconfig.getMacAddress() - local output = captureCommandOutput('ifconfig wlan0') - local actualMac = output:match('HWaddr (%w%w:%w%w:%w%w:%w%w:%w%w:%w%w)'):gsub(':', ''):upper() + local f = io.open('/sys/class/net/wlan0/address') + assert(f) + local output = f:read('*all') + f:close() + local actualMac = output:match('(%w%w:%w%w:%w%w:%w%w:%w%w:%w%w)'):gsub(':', ''):upper() assert(reportedMac == actualMac) end diff --git a/src/util/utils.lua b/src/util/utils.lua index 6723b83..f8791df 100644 --- a/src/util/utils.lua +++ b/src/util/utils.lua @@ -75,4 +75,14 @@ function M.symlink(from, to) return os.execute(x) end +function M.readFile(filePath) + local f, msg, nr = io.open(filePath, 'r') + if not f then return nil,msg,nr end + + local res = f:read('*all') + f:close() + + return res +end + return M