pi-modem/www/cgi-bin/wifi-join

74 lines
1.9 KiB
Lua
Executable File

#!/usr/bin/lua
local json = require("luci.jsonc")
local function uci(cmd)
local h = io.popen("uci " .. cmd .. " 2>&1")
local out = h:read("*a")
local ok = h:close()
return ok, out
end
local function next_uplink_index()
local h = io.popen("uci show wireless 2>/dev/null | grep -o 'trm_uplink[0-9]*' | grep -o '[0-9]*'")
local used = {}
for n in h:lines() do used[tonumber(n)] = true end
h:close()
local i = 0
while used[i] do i = i + 1 end
return i
end
io.write("Content-Type: application/json\r\n\r\n")
local body = io.read("*a") or ""
local req = json.parse(body)
if not req or not req.ssid or req.ssid == "" then
io.write(json.stringify({ ok = false, error = "missing ssid" }))
os.exit(0)
end
local ssid = req.ssid
local key = req.key
local secured = req.secured and true or false
if secured and (not key or key == "") then
io.write(json.stringify({ ok = false, error = "secured network requires key" }))
os.exit(0)
end
local idx = next_uplink_index()
local sec = "wireless.trm_uplink" .. idx
local function q(s) return "'" .. tostring(s):gsub("'", "'\\''") .. "'" end
uci("set " .. sec .. "=wifi-iface")
uci("set " .. sec .. ".device='radio0'")
uci("set " .. sec .. ".mode='sta'")
uci("set " .. sec .. ".network='tm_wwan'")
uci("set " .. sec .. ".ssid=" .. q(ssid))
uci("set " .. sec .. ".disabled='0'")
if secured then
uci("set " .. sec .. ".encryption='psk2+ccmp'")
uci("set " .. sec .. ".key=" .. q(key))
else
uci("set " .. sec .. ".encryption='none'")
end
local up = "travelmate.trm_uplink" .. idx
uci("set " .. up .. "=uplink")
uci("set " .. up .. ".device='radio0'")
uci("set " .. up .. ".ssid=" .. q(ssid))
uci("set " .. up .. ".enabled='1'")
local ok_w = uci("commit wireless")
local ok_t = uci("commit travelmate")
io.write(json.stringify({
ok = (ok_w and ok_t) and true or false,
ssid = ssid,
section = "trm_uplink" .. idx,
secured = secured,
}))