@@ -24,6 +24,7 @@ const cleanServerUrl = (server) => {
24
24
const serverRegex = / ( ( ( [ 0 - 9 ] | [ 1 - 9 ] [ 0 - 9 ] | 1 [ 0 - 9 ] { 2 } | 2 [ 0 - 4 ] [ 0 - 9 ] | 2 5 [ 0 - 5 ] ) \. ) { 3 } ( [ 0 - 9 ] | [ 1 - 9 ] [ 0 - 9 ] | 1 [ 0 - 9 ] { 2 } | 2 [ 0 - 4 ] [ 0 - 9 ] | 2 5 [ 0 - 5 ] ) | ( ( [ a - z A - Z 0 - 9 ] | [ a - z A - Z 0 - 9 ] [ a - z A - Z 0 - 9 \- ] * [ a - z A - Z 0 - 9 ] ) \. ) * ( [ A - Z a - z 0 - 9 ] | [ A - Z a - z 0 - 9 ] [ A - Z a - z 0 - 9 \- ] * [ A - Z a - z 0 - 9 ] ) ) : (?: 6 5 5 3 [ 0 - 5 ] | 6 5 5 [ 0 - 2 ] [ 0 - 9 ] | 6 5 [ 0 - 4 ] [ 0 - 9 ] { 2 } | 6 [ 0 - 4 ] [ 0 - 9 ] { 3 } | [ 1 - 5 ] [ 0 - 9 ] { 4 } | [ 1 - 9 ] [ 0 - 9 ] { 1 , 3 } | [ 0 - 9 ] ) $ /
25
25
26
26
const base64Encode = str => Buffer . from ( str ) . toString ( 'base64' )
27
+ const base64Decode = str => Buffer . from ( str , 'base64' ) . toString ( 'utf8' )
27
28
28
29
const tableOptions = {
29
30
hasBorder : true ,
@@ -34,11 +35,24 @@ const tableOptions = {
34
35
firstColumnTextAttr : { color : 'yellow' }
35
36
}
36
37
38
+ const percentToColor = percent => percent > .7 ? '^G' : ( percent > .5 ? '^Y' : ( percent > .30 ? '^y' : '^r' ) )
39
+
40
+ const bar = ( percent , width ) => {
41
+ const partials = [ '▏' , '▎' , '▍' , '▌' , '▋' , '▊' , '▉' ]
42
+ let ticks = percent * width
43
+ if ( ticks < 0 ) {
44
+ ticks = 0
45
+ }
46
+ let filled = Math . floor ( ticks )
47
+ let open = bar . width - filled - 1
48
+ return ( percentToColor ( percent ) + '▉' ) . repeat ( filled ) + partials [ Math . floor ( ( ticks - filled ) * partials . length ) ] + ' ' . repeat ( open )
49
+ }
50
+
37
51
function logRequest ( request ) {
38
52
let url = new URL ( request . url ) ;
39
53
console . log ( `> ${ request . method . toUpperCase ( ) } ${ url . path } ` )
40
54
console . log ( `> Host: ${ url . host } ` )
41
-
55
+
42
56
let headers = { }
43
57
headers = Object . assign ( headers , request . headers . common ) ;
44
58
headers = Object . assign ( headers , request . headers [ request . method ] ) ;
@@ -50,9 +64,10 @@ function logRequest(request) {
50
64
for ( let [ header , value ] of Object . entries ( headers ) ) {
51
65
console . log ( `> ${ header } : ${ value } ` )
52
66
}
53
-
67
+
54
68
console . log ( '>' )
55
69
console . log ( util . inspect ( request . data , { showHidden : false , depth : null } ) )
70
+ console . log ( '' )
56
71
}
57
72
58
73
function logResponse ( response ) {
@@ -62,6 +77,7 @@ function logResponse(response) {
62
77
}
63
78
console . log ( '<' )
64
79
console . log ( util . inspect ( response . data , { showHidden : false , depth : null } ) )
80
+ console . log ( '' )
65
81
}
66
82
67
83
function handleRequestError ( error , verbose )
@@ -84,14 +100,15 @@ module.exports = class API {
84
100
this . host = host
85
101
this . key = key
86
102
this . userId = userId
87
-
103
+ this . verbose = verbose
104
+
88
105
axios . interceptors . request . use ( request => {
89
106
if ( verbose ) {
90
107
logRequest ( request )
91
108
}
92
109
return request
93
110
} )
94
-
111
+
95
112
axios . interceptors . response . use ( response => {
96
113
if ( verbose ) {
97
114
logResponse ( response )
@@ -131,33 +148,33 @@ module.exports = class API {
131
148
} ,
132
149
}
133
150
)
134
-
151
+
135
152
const data = response . data ;
136
-
153
+
137
154
if ( 'error' in data . payload ) {
138
155
let { code, message} = data . payload . error ;
139
-
156
+
140
157
switch ( code ) {
141
158
case 5001 :
142
159
console . error ( 'Incorrect shared key provided.' )
143
160
break ;
144
161
}
145
-
162
+
146
163
return
147
164
}
148
-
165
+
149
166
const system = data . payload . all . system
150
167
const digest = data . payload . all . digest
151
168
const hw = system . hardware
152
169
const fw = system . firmware
153
-
170
+
154
171
let rows = [
155
172
[ 'Device' , `${ hw . type } ${ hw . subType } ${ hw . chipType } (hardware:${ hw . version } firmware:${ fw . version } )` ] ,
156
173
[ 'UUID' , hw . uuid ] ,
157
174
[ 'Mac address' , hw . macAddress ] ,
158
175
[ 'WIFI' , `${ fw . innerIp } (${ fw . wifiMac } )` ] ,
159
176
] ;
160
-
177
+
161
178
if ( fw . server ) {
162
179
rows . push (
163
180
[ 'MQTT broker' , `${ fw . server } :${ fw . port } ` ] ,
@@ -168,37 +185,81 @@ module.exports = class API {
168
185
[ 'Status' , `^BConfiguration` ]
169
186
)
170
187
}
171
-
188
+
172
189
rows . push (
173
190
[ 'Credentials' , `User: ^C${ fw . userId } \nPassword: ^C${ this . calculateDevicePassword ( hw . macAddress , fw . userId ) } ` ]
174
191
)
175
-
176
- if ( digest . togglex ) {
177
- let row = [ 'Switch state' ]
178
- let col = [ ]
179
- for ( let sw of digest . togglex ) {
180
- let ch = [ ] ;
181
- if ( digest . togglex . length > 1 ) {
182
- ch . push ( `Channel ${ sw . channel } :` ) ;
183
- }
184
- ch . push ( sw . onoff == 0 ? '^ROff' : '^GOn' )
185
-
186
- const switchUpdateDate = new Date ( ) ;
187
- switchUpdateDate . setTime ( sw . lmTime * 1000 ) // put time into ms not seconds
188
- ch . push ( `(${ new Intl . DateTimeFormat ( process . env . LC_TIME , { dateStyle : 'full' , timeStyle : 'long' } ) . format ( switchUpdateDate ) } )` )
189
-
190
- col . push ( ch . join ( '^ ' ) )
192
+
193
+ term . table (
194
+ rows ,
195
+ tableOptions
196
+ )
197
+ } catch ( error ) {
198
+ handleRequestError ( error , this . verbose )
199
+ }
200
+ }
201
+
202
+ async deviceWifiList ( ) {
203
+ const packet = this . signPacket ( {
204
+ 'header' : {
205
+ 'method' : 'GET' ,
206
+ 'namespace' : 'Appliance.Config.WifiList'
207
+ } ,
208
+ 'payload' : { }
209
+ } )
210
+
211
+ try {
212
+ let spinner = await term . spinner ( { animation :'dotSpinner' , rightPadding : ' ' } )
213
+ term ( 'Getting WIFI list…\n' )
214
+
215
+ const response = await axios . post (
216
+ `http://${ this . host } /config` ,
217
+ packet ,
218
+ {
219
+ headers : {
220
+ 'Content-Type' : 'application/json'
221
+ } ,
222
+ }
223
+ )
224
+
225
+
226
+ spinner . animate ( false )
227
+
228
+ const data = response . data ;
229
+
230
+ if ( 'error' in data . payload ) {
231
+ let { code, message} = data . payload . error ;
232
+
233
+ switch ( code ) {
234
+ case 5001 :
235
+ console . error ( 'Incorrect shared key provided.' )
236
+ break ;
191
237
}
192
- row . push ( col . join ( "\n" ) ) ;
193
- rows . push ( row )
238
+
239
+ return
194
240
}
195
-
241
+
242
+ const wifiList = data . payload . wifiList
243
+
244
+ let rows = [
245
+ [ 'SSID' , 'Signal strength' ] ,
246
+ ] ;
247
+
248
+ for ( const ap of wifiList ) {
249
+ const decodedSsid = base64Decode ( ap . ssid ) ;
250
+ rows . push ( [ decodedSsid ? decodedSsid : `<hidden ${ ap . bssid } >` , bar ( ( ap . signal / 100 ) , 20 ) ] )
251
+ }
252
+
253
+ let thisTableOptions = tableOptions
254
+ thisTableOptions . firstColumnTextAttr = { color : 'cyan' }
255
+ thisTableOptions . firstRowTextAttr = { color : 'yellow' }
256
+
196
257
term . table (
197
258
rows ,
198
259
tableOptions
199
260
)
200
261
} catch ( error ) {
201
- handleRequestError ( error )
262
+ handleRequestError ( error , this . verbose )
202
263
}
203
264
}
204
265
@@ -212,12 +273,12 @@ module.exports = class API {
212
273
port : url . port
213
274
}
214
275
} )
215
-
276
+
216
277
// make sure we set a failover server
217
278
if ( servers . length == 1 ) {
218
279
servers . push ( servers [ 0 ] ) ;
219
280
}
220
-
281
+
221
282
term . table (
222
283
[
223
284
[ 'Primary MQTT broker' , `${ servers [ 0 ] . host } :${ servers [ 0 ] . port } ` ] ,
@@ -260,14 +321,14 @@ module.exports = class API {
260
321
}
261
322
)
262
323
} catch ( error ) {
263
- handleRequestError ( error )
324
+ handleRequestError ( error , this . verbose )
264
325
}
265
326
}
266
327
267
328
async configureWifiCredentials ( credentials ) {
268
329
const ssid = base64Encode ( credentials . ssid )
269
330
const password = base64Encode ( credentials . password )
270
-
331
+
271
332
const packet = this . signPacket ( {
272
333
'header' : {
273
334
'method' : 'SET' ,
@@ -280,7 +341,7 @@ module.exports = class API {
280
341
}
281
342
}
282
343
} )
283
-
344
+
284
345
term . table (
285
346
[
286
347
[ 'Encoded WIFI SSID' , `${ ssid } ` ] ,
@@ -300,10 +361,10 @@ module.exports = class API {
300
361
}
301
362
)
302
363
} catch ( error ) {
303
- handleRequestError ( error )
364
+ handleRequestError ( error , this . verbose )
304
365
}
305
366
}
306
-
367
+
307
368
calculateDevicePassword ( macAddress , user = null ) {
308
369
return `${ user } _${ md5 ( macAddress + this . key ) } `
309
370
}
0 commit comments