2 Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
3 This is free software, licensed under the Apache License, Version 2.0
6 <style type="text/css">
11 display: inline-block;
17 <script type="text/javascript">
19 function status_update(json)
21 var btn1 = document.getElementById("btn1");
22 var view = document.getElementById("value_1");
23 var input = json.data.travelmate_status;
25 btn1.value = "<%:Restart%>";
26 btn1.name = "do_restart";
27 view.innerHTML = input || "-";
28 view = document.getElementById("value_2");
29 input = json.data.travelmate_version;
30 view.innerHTML = input || "-";
31 view = document.getElementById("value_3");
32 input = json.data.station_id;
33 view.innerHTML = input || "-";
34 view = document.getElementById("value_4");
35 input = json.data.station_interface;
36 view.innerHTML = input || "-";
37 view = document.getElementById("value_5");
38 input = json.data.faulty_stations;
39 view.innerHTML = input || "-";
40 view = document.getElementById("value_6");
41 input = json.data.last_rundate;
42 view.innerHTML = input || "-";
45 function btn_action(action)
47 var btn1 = document.getElementById("btn1");
48 var btn1_running = document.getElementById("btn1_running");
51 running(btn1_running, 1);
53 new XHR.get('<%=luci.dispatcher.build_url("admin", "services", "travelmate")%>/action/' + action.name, null,
60 btn1.disabled = false;
61 running(btn1_running, 0);
65 function running(element, state)
69 var running_html = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" width="16" height="16" style="vertical-align:middle" />';
70 element.innerHTML = running_html;
74 element.innerHTML = '';
78 function toggle_qrcode() {
79 var view = document.getElementById("qrcode");
80 if (view.style.display === "none") {
81 view.style.display = "block";
83 view.style.display = "none";
87 XHR.get('<%=luci.dispatcher.build_url("admin", "services", "travelmate", "status")%>', null,
88 function(x, json_info)
94 status_update(json_info)
97 XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "travelmate", "status")%>', null,
98 function(x, json_info)
100 if (!x || !json_info)
104 status_update(json_info)
109 <h3><%:Runtime Information%></h3>
110 <div class="cbi-value" id="status_1">
111 <label class="cbi-value-title" for="status_1"><%:Travelmate Status (Quality)%></label>
112 <div class="cbi-value-field">
113 <span class="runtime" id="value_1">-</span>
116 <div class="cbi-value" id="status_2">
117 <label class="cbi-value-title" for="status_2"><%:Travelmate Version%></label>
118 <div class="cbi-value-field">
119 <span class="runtime" id="value_2">-</span>
122 <div class="cbi-value" id="status_3">
123 <label class="cbi-value-title" for="status_3"><%:Station ID (RADIO/SSID/BSSID)%></label>
124 <div class="cbi-value-field">
125 <span class="runtime" id="value_3">-</span>
128 <div class="cbi-value" id="status_4">
129 <label class="cbi-value-title" for="status_4"><%:Station Interface%></label>
130 <div class="cbi-value-field">
131 <span class="runtime" id="value_4">-</span>
134 <div class="cbi-value" id="status_5">
135 <label class="cbi-value-title" for="status_5"><%:Faulty Stations%></label>
136 <div class="cbi-value-field">
137 <span class="runtime" id="value_5">-</span>
140 <div class="cbi-value" id="status_6">
141 <label class="cbi-value-title" for="status_6"><%:Last Run%></label>
142 <div class="cbi-value-field">
143 <span class="runtime" id="value_6">-</span>
147 <div class="cbi-value" id="button_1">
148 <label class="cbi-value-title" for="button_1"><%:Restart Travelmate%></label>
149 <div class="cbi-value-field">
150 <input class="cbi-button cbi-button-reset" id="btn1" type="button" name="do_restart" value="<%:Restart%>" onclick="btn_action(this)" />
151 <span id="btn1_running" style="display:inline-block; width:16px; height:16px; margin:0 5px"></span>
154 <div class="cbi-value" id="button_2">
155 <label class="cbi-value-title" for="button_2"><%:View AP QR-Codes%></label>
156 <div class="cbi-value-field">
157 <input class="cbi-button cbi-button-apply" type="button" value="<%:Show/Hide QR-Codes%>" onclick="toggle_qrcode()" />
160 <div class="cbi-value" style="margin-bottom: 0px">
161 <span class="cbi-value" style="display: none" id="qrcode">
163 local fs = require("nixio.fs")
164 local uci = require("luci.model.uci").cursor()
167 uci:foreach("wireless", "wifi-iface", function(s)
168 local device = s.device or ""
169 local mode = s.mode or ""
170 local ssid = s.ssid or ""
171 local enc = s.encryption or ""
172 local key = s.key or ""
173 local hidden = s.hidden or "false"
174 local disabled = s.disabled or ""
175 local wep_slots = {s.key1 or "", s.key2 or "", s.key3 or "", s.key4 or ""}
177 if device and mode == "ap" and disabled ~= "1" then
178 if string.match(enc, '^psk') then
180 elseif string.match(enc, '^wep') then
182 if tonumber(key) then
183 key = wep_slots[tonumber(key)]
185 elseif enc == "none" then
192 if hidden == "1" then
196 if ssid and enc and key then
197 local e_ssid = string.gsub(ssid,"[\"\\';:, ]",[[\\\%1]])
198 local e_key = string.gsub(key,"[\"\\';:, ]",[[\\\%1]])
200 if fs.access("/usr/bin/qrencode") then
201 qrcode = luci.sys.exec("/usr/bin/qrencode --inline --8bit --type=SVG --output=- 'WIFI:S:\"'" .. e_ssid .. "'\";T:'" .. enc .. "';P:\"'" .. e_key .. "'\";H:'" .. hidden .. "';'")
203 <div class="cbi-value" style="border-bottom: 0px; margin-bottom: 0px; padding: 0.25em 0.6em; text-align: left">
206 <div class="cbi-value" style="border-bottom: 0px; margin-bottom: 0px; padding: 0.25em 0.6em; text-align: left">
207 <em><%:AP on %><%=device%><%: with SSID %>"<%=ssid%>"</em>
217 <div class="cbi-value" style="border-bottom: 0px; margin-bottom: 0px; padding: 0.25em 0.6em; text-align: left">
218 <em><%:For QR-Code support please install package 'qrencode'!%></em>