Merge pull request #2193 from rosysong/freespace
[oweals/luci.git] / applications / luci-app-travelmate / luasrc / view / travelmate / runtime.htm
1 <%#
2 Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
3 This is free software, licensed under the Apache License, Version 2.0
4 -%>
5
6 <style type="text/css">
7         .runtime
8         {
9                 color: #37c;
10                 font-weight: bold;
11                 display: inline-block;
12                 width: 100%;
13                 padding-top: 0.5rem;
14         }
15 </style>
16
17 <script type="text/javascript">
18 //<![CDATA[
19         function status_update(json)
20         {
21                         var btn1  = document.getElementById("btn1");
22                         var view  = document.getElementById("value_1");
23                         var input = json.data.travelmate_status;
24
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 || "-";
43         }
44
45         function btn_action(action)
46         {
47                 var btn1 = document.getElementById("btn1");
48                 var btn1_running = document.getElementById("btn1_running");
49
50                 btn1.disabled = true;
51                 running(btn1_running, 1);
52
53                 new XHR.get('<%=luci.dispatcher.build_url("admin", "services", "travelmate")%>/action/' + action.name, null,
54                 function(x)
55                 {
56                         if (!x)
57                         {
58                                 return;
59                         }
60                         btn1.disabled = false;
61                         running(btn1_running, 0);
62                 });
63         }
64
65         function running(element, state)
66         {
67                 if (state === 1)
68                 {
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;
71                 }
72                 else
73                 {
74                         element.innerHTML = '';
75                 }
76         }
77
78         function toggle_qrcode() {
79                 var view = document.getElementById("qrcode");
80                 if (view.style.display === "none") {
81                         view.style.display = "block";
82                 } else {
83                         view.style.display = "none";
84                 }
85         }
86
87         XHR.get('<%=luci.dispatcher.build_url("admin", "services", "travelmate", "status")%>', null,
88         function(x, json_info)
89         {
90                 if (!x || !json_info)
91                 {
92                         return;
93                 }
94                 status_update(json_info)
95         });
96
97         XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "travelmate", "status")%>', null,
98         function(x, json_info)
99         {
100                 if (!x || !json_info)
101                 {
102                         return;
103                 }
104                 status_update(json_info)
105         });
106 //]]>
107 </script>
108
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>
114         </div>
115 </div>
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>
120         </div>
121 </div>
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>
126         </div>
127 </div>
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>
132         </div>
133 </div>
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>
138         </div>
139 </div>
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>
144         </div>
145 </div>
146 <hr />
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>
152         </div>
153 </div>
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()" />
158         </div>
159 </div>
160 <div class="cbi-value" style="margin-bottom: 0px">
161         <span class="cbi-value" style="display: none" id="qrcode">
162 <%-
163                 local fs  = require("nixio.fs")
164                 local uci = require("luci.model.uci").cursor()
165                 local qrcode
166
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 ""}
176
177                         if device and mode == "ap" and disabled ~= "1" then
178                                 if string.match(enc, '^psk') then
179                                         enc = "WPA"
180                                 elseif string.match(enc, '^wep') then
181                                         enc = "WEP"
182                                         if tonumber(key) then
183                                                 key = wep_slots[tonumber(key)]
184                                         end
185                                 elseif enc == "none" then
186                                         enc = "nopass"
187                                         key = "nokey"
188                                 else
189                                         enc = ""
190                                 end
191
192                                 if hidden == "1" then
193                                         hidden = "true"
194                                 end
195
196                                 if ssid and enc and key then
197                                         local e_ssid = string.gsub(ssid,"[\"\\';:, ]",[[\\\%1]])
198                                         local e_key = string.gsub(key,"[\"\\';:, ]",[[\\\%1]])
199
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 .. "';'")
202 -%>
203                 <div class="cbi-value" style="border-bottom: 0px; margin-bottom: 0px; padding: 0.25em 0.6em; text-align: left">
204                         <%=qrcode%>
205                 </div>
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>
208                         <hr />
209                 </div>
210 <%-
211                                         end
212                                 end
213                         end
214                 end)
215                 if not qrcode then
216 -%>
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>
219                 </div>
220 <%-
221                 end
222 -%>
223         </span>
224 </div>