un-cli 0.0.71 → 0.0.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.html +246 -179
  2. package/index.mjs +14 -4
  3. package/package.json +1 -1
package/index.html CHANGED
@@ -9,16 +9,32 @@
9
9
  <body>
10
10
 
11
11
  <table>
12
+ <tr>
13
+ <td>
14
+ Admin User
15
+ </td>
16
+ <td colspan =3><input type = 'text' id = 'txtAdmin' value = 'admin'></td>
17
+ </tr>
18
+ <tr>
19
+ <td>
20
+ Admin Password
21
+ </td>
22
+ <td colspan =3><input type = 'password' id = 'txtPassword' value = ''></td>
23
+ </tr>
24
+ <tr>
25
+
26
+ <td colspan =5><button id = 'btnLogin'>Login</button></td>
27
+ </tr>
12
28
  <tr><td>Service</td>
13
29
  <td colspan =3 ><select id ='cmbService'>
14
- <option>(All Services)</option>
30
+
15
31
  </select>
16
32
  </td>
17
33
  </tr>
18
34
 
19
35
  <tr>
20
36
  <td >Age</td>
21
- <td colspan =3><input type ='text' id = 'txtAge' value = '30' style="width:30px"> minutes</td>
37
+ <td colspan =3><input type ='text' id = 'txtAge' value = '10' style="width:30px"> minutes</td>
22
38
  </tr>
23
39
  <tr colspan =4>
24
40
  <td><button id = 'btnTraceLogs'>Trace Logs</button></td>
@@ -26,7 +42,8 @@
26
42
  <td><button id = 'btnUpdateSubnetworkLogs'>Update Subnetwork Logs</button></td>
27
43
  <td><button id = 'btnAR'>Attribute Rules Logs</button></td>
28
44
  <td><button id = 'btnSQLLogs'>SQL Logs</button></td>
29
-
45
+ <td>Message<input id = 'txtFilter' type = 'text'></td>
46
+ <td>User<input id = 'txtUser' type = 'text'></td>
30
47
  </tr>
31
48
 
32
49
  </table>
@@ -39,23 +56,42 @@
39
56
  import { UtilityNetwork } from "./utilitynetwork.node.mjs"
40
57
  import { AdminLog } from "./adminlog.mjs"
41
58
  import logger from "./logger.mjs"
59
+
60
+
42
61
 
43
- const parameters = {
62
+ let parameters = {
44
63
  "user": "unadmin",
45
- "password": "unadmin.109",
64
+ "password": "",
46
65
  "portal": "https://utilitynetwork.esri.com/portal",
47
- "service": "RedTrolley_SQLServer",
66
+ "service": "",
48
67
  "referer": "https://utilitynetwork.esri.com/log"
49
68
  }
69
+
50
70
 
51
71
  let portal;
52
72
  let adminLog = null;
53
73
  let cmbService
54
74
  let token;
75
+ const btnLogin = document.getElementById("btnLogin")
76
+ const txtAdmin = document.getElementById("txtAdmin");
77
+ const txtPassword = document.getElementById("txtPassword")
78
+
79
+ btnLogin.addEventListener("click", () => init())
55
80
  async function init() {
56
-
81
+ try {
82
+
83
+
84
+ parameters.user = txtAdmin.value;
85
+ parameters.password = txtPassword.value;
86
+ parameters.referer = window.location.href;
87
+
57
88
  cmbService = document.getElementById("cmbService")
58
-
89
+ while (cmbService.firstChild) cmbService.removeChild(cmbService.firstChild)
90
+
91
+ const opt = document.createElement("option")
92
+ opt.textContent = "(All Services)"
93
+ cmbService.appendChild (opt)
94
+
59
95
  token = await getToken(parameters);
60
96
  const services = await portal.services()
61
97
  const featureServices = services.services.filter(s => s.type == "FeatureServer")
@@ -64,6 +100,20 @@
64
100
  o.text = s.name;
65
101
  cmbService.appendChild(o);
66
102
  })
103
+
104
+
105
+
106
+ document.getElementById("btnTraceLogs").disabled = false
107
+ document.getElementById("btnValidateLogs").disabled = false
108
+ document.getElementById("btnUpdateSubnetworkLogs").disabled = false
109
+ document.getElementById("btnAR").disabled = false
110
+ document.getElementById("btnSQLLogs").disabled = false
111
+
112
+
113
+ }
114
+ catch(ex){
115
+ alert(`Failed to login to ${parameters.portal} check the user/password and make sure its an admin`)
116
+ }
67
117
  }
68
118
 
69
119
 
@@ -82,42 +132,17 @@
82
132
  const tblResult = document.getElementById("tblResult");
83
133
  //clear
84
134
  while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
85
- tblResult.appendChild(document.createTextNode("Loading...."));
86
135
 
87
136
 
88
137
  parameters.service = cmbService.options[cmbService.selectedIndex].text
89
-
90
- //create a new admin object (user might not be admin we won't use it until the user call log )
91
- adminLog = new AdminLog(token, portal.serverUrl)
92
-
93
- logger.info("Connected.")
94
-
95
-
96
- const topLogCount = 1000;
97
- const pageSize = 10000
98
-
138
+
99
139
  let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
100
140
 
101
141
  console.log(`Querying trace logs for ${parameters.service} for the last ${mins} minutes ...`)
102
- const startTime = Date.now() - mins*60*1000
103
- const endTime = Date.now();
104
- let services = [parameters.service+ ".MapServer"]
105
- if (parameters.service == "(All Services)")
106
- services = "*"
107
- let result= await adminLog.query([102002], services, topLogCount, startTime ,endTime , "VERBOSE")
108
- let jsonRes = await result.json()
109
- let allMessages = [].concat(jsonRes.logMessages)
110
- allMessages = allMessages.filter(m => m.message.indexOf("------ Trace Parameters ----") > -1)
111
- while (jsonRes.hasMore)
112
- {
113
- //start paging
114
- logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
115
- result= await adminLog.query([102002], services, pageSize, jsonRes.endTime, null, "VERBOSE")
116
- jsonRes = await result.json()
117
-
118
- allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("------ Trace Parameters ----") > -1))
119
- }
120
-
142
+
143
+ //page query the admin log
144
+ let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102002], "------ Trace Parameters ----", "VERBOSE")
145
+
121
146
  await populateMessages(allMessages)
122
147
 
123
148
 
@@ -126,49 +151,23 @@
126
151
 
127
152
 
128
153
  async function loadValidateLogs () {
129
- //build table
130
- const tblResult = document.getElementById("tblResult");
131
- //clear
132
- while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
133
- tblResult.appendChild(document.createTextNode("Loading...."));
134
-
135
- parameters.service = cmbService.options[cmbService.selectedIndex].text
136
-
137
-
138
- //create a new admin object (user might not be admin we won't use it until the user call log )
139
- adminLog = new AdminLog(token, portal.serverUrl)
154
+ //build table
155
+ const tblResult = document.getElementById("tblResult");
156
+ //clear
157
+ while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
140
158
 
141
- logger.info("Connected.")
142
-
143
-
144
- const topLogCount = 1000;
145
- const pageSize = 10000
159
+ parameters.service = cmbService.options[cmbService.selectedIndex].text
146
160
 
161
+
147
162
  let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
148
163
 
149
164
  console.log(`Querying validate logs for ${parameters.service} for the last ${mins} minutes ...`)
150
- const startTime = Date.now() - mins*60*1000
151
- const endTime = Date.now();
152
- let services = [parameters.service+ ".MapServer"]
153
- if (parameters.service == "(All Services)")
154
- services = "*"
155
- let result= await adminLog.query([102003], services, topLogCount, startTime ,endTime , "VERBOSE")
156
- let jsonRes = await result.json()
157
- let allMessages = [].concat(jsonRes.logMessages)
158
- allMessages = allMessages.filter(m => m.message.indexOf("-------- Environment ---") > -1 && m.message.indexOf("The network is built.") > -1 && m.methodName == 'BuildEngineLog')
159
- while (jsonRes.hasMore)
160
- {
161
- //start paging
162
- logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
163
- result= await adminLog.query([102003], services, pageSize, jsonRes.endTime, null, "VERBOSE")
164
- jsonRes = await result.json()
165
-
166
- allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("-------- Environment ---") > -1 && m.message.indexOf("------ Trace Parameters ----") == -1))
167
- }
168
-
169
-
170
-
171
-
165
+
166
+ //-1 && m.message.indexOf("The network is built.") > -1 && m.methodName == 'BuildEngineLog')
167
+ //page query the admin log
168
+ let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102003], "The network is built.", "VERBOSE")
169
+
170
+
172
171
  //validate logs missing elapsed populate it
173
172
  allMessages = allMessages.map( m => {
174
173
  try{
@@ -195,45 +194,21 @@ tblResult.appendChild(document.createTextNode("Loading...."));
195
194
 
196
195
 
197
196
  async function loadUpdateSubnetworkLogs () {
198
- //build table
199
- const tblResult = document.getElementById("tblResult");
200
- //clear
201
- while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
202
- tblResult.appendChild(document.createTextNode("Loading...."));
203
-
204
- parameters.service = cmbService.options[cmbService.selectedIndex].text
205
- //create a new admin object (user might not be admin we won't use it until the user call log )
206
- adminLog = new AdminLog(token, portal.serverUrl)
197
+ //build table
198
+ const tblResult = document.getElementById("tblResult");
199
+ //clear
200
+ while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
207
201
 
208
- logger.info("Connected.")
209
-
210
-
211
- const topLogCount = 1000;
212
- const pageSize = 10000
202
+ parameters.service = cmbService.options[cmbService.selectedIndex].text
203
+
204
+
205
+ let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
213
206
 
214
- let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
207
+
208
+ console.log(`Querying subnetwork logs for ${parameters.service} for the last ${mins} minutes ...`)
209
+ let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102003], "---- Subnetwork Parameters ----", "VERBOSE")
215
210
 
216
-
217
- console.log(`Querying subnetwork logs for ${parameters.service} for the last ${mins} minutes ...`)
218
- const startTime = Date.now() - mins*60*1000
219
- const endTime = Date.now();
220
- let services = [parameters.service+ ".MapServer"]
221
- if (parameters.service == "(All Services)")
222
- services = "*"
223
- let result= await adminLog.query([102003], services, topLogCount, startTime ,endTime , "VERBOSE")
224
- let jsonRes = await result.json()
225
- let allMessages = [].concat(jsonRes.logMessages)
226
- allMessages = allMessages.filter(m => m.message.indexOf("---- Subnetwork Parameters ----") > -1)
227
- while (jsonRes.hasMore)
228
- {
229
- //start paging
230
- logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
231
- result= await adminLog.query([102003], services, pageSize, jsonRes.endTime, null, "VERBOSE")
232
- jsonRes = await result.json()
233
-
234
- allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("---- Subnetwork Parameters ----") > -1))
235
- }
236
-
211
+
237
212
  //update subnetwork missing elapsed populate it
238
213
  allMessages = allMessages.map( m => {
239
214
  try{
@@ -265,41 +240,20 @@ async function loadAttributeRules () {
265
240
 
266
241
  //build table
267
242
  const tblResult = document.getElementById("tblResult");
268
- tblResult.appendChild(document.createTextNode("Loading...."));
269
-
243
+ while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
244
+
270
245
  let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
271
246
 
272
247
  parameters.service = cmbService.options[cmbService.selectedIndex].text
273
- //create a new admin object (user might not be admin we won't use it until the user call log )
274
- adminLog = new AdminLog(token, portal.serverUrl)
275
-
248
+
276
249
  let showMaxGuid = true
277
- let showMinGuid = false
278
- const startTime = Date.now() - mins*60*1000
279
- const endTime = Date.now();
280
-
281
- let services = [parameters.service+ ".MapServer"]
282
- if (parameters.service == "(All Services)")
283
- services = "*"
284
-
285
- const pageSize = 10000 //maximum messages per page
250
+ let showMinGuid = false
251
+
286
252
  logger.info(`Querying attribute rules logs for ${parameters.service} in the past ${mins} minutes...`)
287
- let result= await adminLog.query([102003], services, pageSize, startTime ,endTime , "DEBUG")
288
- let jsonRes = await result.json()
289
- let allMessages = [].concat(jsonRes.logMessages)
290
-
291
- while (jsonRes.hasMore && jsonRes.endTime > startTime)
292
- {
293
- //start paging
294
- logger.info(`Aggregating messages... total so far ${allMessages.length} debug entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
295
-
296
-
297
- result= await adminLog.query([102003], services, pageSize, jsonRes.endTime )
298
- jsonRes = await result.json()
299
- allMessages = allMessages.concat(jsonRes.logMessages)
300
- }
253
+ let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102003], "Attribute rule execution complete:", "DEBUG")
301
254
 
302
- const arMessages = allMessages
255
+
256
+ const arMessages = filterMessages(allMessages)
303
257
  .filter(m => m.message.indexOf("Attribute rule execution complete:") > -1)
304
258
  .map (m => JSON.parse(m.message.replace("Attribute rule execution complete:", "")))
305
259
  .map( m => {
@@ -370,7 +324,8 @@ async function loadAttributeRules () {
370
324
  │ Min execution time (m
371
325
 
372
326
  */
373
-
327
+ while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
328
+
374
329
  const header = document.createElement("tr");
375
330
  const cAttributeRule = document.createElement("th");
376
331
  cAttributeRule.textContent = "Attribute Rule"
@@ -439,48 +394,70 @@ async function loadSQLLogs () {
439
394
  const tblResult = document.getElementById("tblResult");
440
395
  //clear
441
396
  while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
442
- tblResult.appendChild(document.createTextNode("Loading...."));
443
-
397
+
444
398
 
445
399
  parameters.service = cmbService.options[cmbService.selectedIndex].text
446
-
447
- //create a new admin object (user might not be admin we won't use it until the user call log )
448
- adminLog = new AdminLog(token, portal.serverUrl)
449
-
450
- logger.info("Connected.")
400
+
401
+
402
+ let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
451
403
 
404
+
405
+ console.log(`Querying cursor sql logs for ${parameters.service} for the last ${mins} minutes ...`)
452
406
 
453
- const topLogCount = 1000;
454
- const pageSize = 10000
407
+ //startTime is the most recent
408
+ //endTime is the oldest
455
409
 
456
- let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
410
+
457
411
 
458
-
459
- console.log(`Querying cursor sql logs for ${parameters.service} for the last ${mins} minutes ...`)
460
- const startTime = Date.now() - mins*60*1000
461
- const endTime = Date.now();
462
- let services = [parameters.service+ ".MapServer"]
463
- if (parameters.service == "(All Services)")
412
+ /*
413
+ const topLogCount = 100;
414
+ const startTime = Date.now()
415
+ const endTime = Date.now() - mins*60*1000
416
+ let services = [theService + ".MapServer"]
417
+ if (theService == "(All Services)")
464
418
  services = "*"
465
- let result= await adminLog.query([102023], services, topLogCount, startTime ,endTime , "DEBUG")
419
+ let result= await adminLog.query([code], services, topLogCount, startTime ,endTime , "DEBUG")
466
420
  let jsonRes = await result.json()
467
421
  let allMessages = [].concat(jsonRes.logMessages)
468
422
  allMessages = allMessages.filter(m => m.message.indexOf("EndCursor;") > -1)
469
423
  while (jsonRes.hasMore)
470
424
  {
471
425
  //start paging
472
- logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
473
- result= await adminLog.query([102023], services, pageSize, jsonRes.endTime, null, "DEBUG")
426
+ logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs between ${new Date(jsonRes.endTime)} and ${new Date(endTime)}`)
427
+ result= await adminLog.query([102023], services, pageSize, jsonRes.endTime, endTime, "DEBUG")
474
428
  jsonRes = await result.json()
475
429
 
476
430
  allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("EndCursor;") > -1))
477
431
  }
432
+ */
433
+
434
+ //page query the admin log
435
+ let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102023], "EndCursor;", "DEBUG")
436
+
437
+
478
438
  console.log ("Filtering messages...")
479
439
 
480
- allMessages = allMessages
440
+ allMessages = filterMessages(allMessages)
481
441
  .map( m=> {
482
- m.dataAccessElapsed = parseFloat(m.message.split(";")[1].split(" ")[1])
483
- m.executeQueryElapsed = parseFloat(m.message.split(";")[2].split(" ")[1])
442
+ m.dataAccessElapsed =0;
443
+ m.executeQueryElapsed = 0;
444
+ const sDataAccess = "DataAccess "
445
+ const idxDataAccess = m.message.indexOf(sDataAccess)
446
+ if (idxDataAccess >=0) {
447
+ const idxNext = m.message.indexOf(" ",idxDataAccess + sDataAccess.length )
448
+ m.dataAccessElapsed = parseInt(m.message.substr( idxDataAccess + sDataAccess.length, idxNext - idxDataAccess - sDataAccess.length))
449
+ }
450
+
451
+ const sExecuteQuery = "ExecuteQuery "
452
+ const idxExecuteQuery = m.message.indexOf(sExecuteQuery)
453
+ if (idxExecuteQuery >=0) {
454
+ const idxNext = m.message.indexOf(" ",idxExecuteQuery + sExecuteQuery.length)
455
+ m.executeQueryElapsed = parseInt(m.message.substr( idxExecuteQuery + sExecuteQuery.length, idxNext - idxExecuteQuery - sExecuteQuery.length))
456
+ }
457
+
458
+
459
+ //m.dataAccessElapsed = parseFloat(m.message.split(";")[1].split(" ")[1])
460
+ //m.executeQueryElapsed = parseFloat(m.message.split(";")[2].split(" ")[1])
484
461
  m.totalExecutionElapsed = m.dataAccessElapsed + m.executeQueryElapsed
485
462
  m.elapsed = parseFloat(m.elapsed); return m;
486
463
 
@@ -489,7 +466,7 @@ tblResult.appendChild(document.createTextNode("Loading...."));
489
466
  .slice(0, 100) ;//first 100
490
467
 
491
468
 
492
- console.log("-----Top 10 SQL----")
469
+ console.log("-----Top SQL----")
493
470
  while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
494
471
 
495
472
  let i =0;
@@ -501,8 +478,8 @@ tblResult.appendChild(document.createTextNode("Loading...."));
501
478
  cTime.textContent = "Time"
502
479
  const cUser = document.createElement("th");
503
480
  cUser.textContent = "User"
504
- const cMethod = document.createElement("th");
505
- cMethod.textContent = "Method"
481
+ const cVersion = document.createElement("th");
482
+ cVersion.textContent = "Version"
506
483
  const cQueryTime = document.createElement("th");
507
484
  cQueryTime.textContent = "Query Time (ms)"
508
485
  cQueryTime.title = "includes search + data access nextRow"
@@ -514,7 +491,7 @@ tblResult.appendChild(document.createTextNode("Loading...."));
514
491
  header.appendChild (cService)
515
492
  header.appendChild (cTime)
516
493
  header.appendChild (cUser)
517
- header.appendChild (cMethod)
494
+ header.appendChild (cVersion)
518
495
  header.appendChild (cQueryTime)
519
496
  header.appendChild (cTotalTime)
520
497
  header.appendChild (cLog)
@@ -544,21 +521,32 @@ tblResult.appendChild(document.createTextNode("Loading...."));
544
521
 
545
522
  const cUser = document.createElement("td");
546
523
  cUser.textContent = m.user
547
- const cMethod = document.createElement("td");
548
- cMethod.textContent = "Cursor"
524
+ const cVersion = document.createElement("td");
525
+ const idxVersion = m.message.indexOf("Version: ")
526
+ if (idxVersion >=0) {
527
+ const idxNext = m.message.indexOf(";",idxVersion)
528
+ cVersion.textContent = m.message.substr( idxVersion + 9, idxNext - idxVersion - 9 )
529
+ }
549
530
  const cQueryTime = document.createElement("td");
550
531
  cQueryTime.textContent = numberWithCommas(m.totalExecutionElapsed)
551
532
  const cTotalTime = document.createElement("td");
552
533
  cTotalTime.textContent = numberWithCommas(Math.round(m.elapsed*1000))
553
534
  const cLog = document.createElement("td");
554
- cLog.textContent = m.message.substr( m.message.indexOf("SQL: ") + 5, 50) + "..."
535
+ const cLogText = document.createElement("input")
536
+ cLogText.type = "text"
537
+ cLogText.style = "width:500px"
538
+ cLogText.value = m.message.substr( m.message.indexOf("SQL: ") + 5, m.message.length)
539
+ cLogText.readOnly= true;
540
+ cLog.appendChild(cLogText)
541
+ //cLog.textContent = m.message.substr( m.message.indexOf("SQL: ") + 5, 50) + "..."
555
542
  cLog.fullLog = m.message;
556
543
  cLog.title = m.message + "\nClick to copy"
557
- cLog.addEventListener("click", e=> {navigator.clipboard.writeText(e.target.fullLog); alert("Copied to clipboard")})
544
+ cLog.addEventListener("click", e=> {navigator.clipboard.writeText(e.target.fullLog); e.target.selectionStart = 0; e.target.selectionEnd = e.target.value.length;
545
+ /* alert("Copied to clipboard") */})
558
546
  logRow.appendChild (cService)
559
547
  logRow.appendChild (cTime)
560
548
  logRow.appendChild (cUser)
561
- logRow.appendChild (cMethod)
549
+ logRow.appendChild (cVersion)
562
550
  logRow.appendChild (cQueryTime)
563
551
  logRow.appendChild (cTotalTime)
564
552
  logRow.appendChild (cLog)
@@ -584,30 +572,50 @@ function numberWithCommas(x) {
584
572
  return x.toLocaleString()
585
573
  }
586
574
 
587
- init();
575
+ //init();
588
576
 
589
577
  const btnTraceLogs = document.getElementById("btnTraceLogs");
590
578
  btnTraceLogs.addEventListener("click", e => loadTraceLogs())
579
+ btnTraceLogs.disabled = true
591
580
 
592
581
  const btnValidateLogs = document.getElementById("btnValidateLogs");
593
582
  btnValidateLogs.addEventListener("click", e => loadValidateLogs())
583
+ btnValidateLogs.disabled = true
594
584
 
595
585
  const btnUpdateSubnetworkLogs = document.getElementById("btnUpdateSubnetworkLogs");
596
586
  btnUpdateSubnetworkLogs.addEventListener("click", e => loadUpdateSubnetworkLogs())
597
-
587
+ btnUpdateSubnetworkLogs.disabled = true
588
+
598
589
  const btnSQLLogs = document.getElementById("btnSQLLogs");
599
590
  btnSQLLogs.addEventListener("click", e => loadSQLLogs())
600
-
591
+ btnSQLLogs.disabled = true
592
+
601
593
  const btnAR = document.getElementById("btnAR");
602
594
  btnAR.addEventListener("click", e => loadAttributeRules())
603
-
604
-
595
+ btnAR.disabled = true
596
+
597
+ function filterMessages (allMessages) {
598
+ const txtFilter = document.getElementById("txtFilter")
599
+ const txtUser = document.getElementById("txtUser")
600
+ if (txtFilter.value == "" && txtUser.value == "") return allMessages;
601
+ //const filtered= allMessages.filter(m => m.message.toUpperCase().indexOf(txtFilter.value.toUpperCase()) > 0 && m.user.toUpperCase().indexOf(txtUser.value.toUpperCase()) > 0)
602
+ const filtered= allMessages.filter(m => {
603
+
604
+ if (m.message.toUpperCase().indexOf(txtFilter.value.toUpperCase()) >= 0
605
+ &&
606
+ m.user.toUpperCase().indexOf(txtUser.value.toUpperCase()) >= 0)
607
+ return true
608
+
609
+ return false
610
+ })
611
+ return filtered
612
+ }
605
613
 
606
614
  async function populateMessages(allTheMessages) {
607
615
 
608
616
  //sort messages
609
617
 
610
- const allMessages = allTheMessages.map(m => {
618
+ const allMessages = filterMessages (allTheMessages).map(m => {
611
619
  const newMessage = Object.assign({}, m);
612
620
  delete newMessage.machine;
613
621
  delete newMessage.type;
@@ -672,6 +680,65 @@ function numberWithCommas(x) {
672
680
  tblResult.appendChild(logRow)
673
681
  })
674
682
  }
683
+
684
+
685
+ async function adminLogQueryWithPaging(mins, theService, code, filter, level){
686
+ const topLogCount = 1000;
687
+ let stop = false;
688
+ const prg = document.createTextNode("Loading.... 0%");
689
+ const btn = document.createElement("button")
690
+ btn.textContent = '🛑'
691
+ btn.addEventListener("click", ()=> stop = true )
692
+ //create a new admin object (user might not be admin we won't use it until the user call log )
693
+ let adminLog = new AdminLog(token, portal.serverUrl)
694
+ tblResult.appendChild(prg);
695
+ tblResult.appendChild(btn)
696
+ const startTime = Date.now()
697
+ const endTime = Date.now() - mins*60*1000
698
+ let services = [theService + ".MapServer"]
699
+ if (theService == "(All Services)")
700
+ services = "*"
701
+ let result= await adminLog.query(code, services, topLogCount, startTime ,endTime , level)
702
+ let jsonRes = await result.json()
703
+ let allMessages = [].concat(jsonRes.logMessages)
704
+ allMessages = allMessages.filter(m => m.message.indexOf(filter) > -1)
705
+ while (jsonRes.hasMore && !stop)
706
+ {
707
+ //start paging
708
+ prg.textContent = "Loading ... " + parseInt((( (startTime - endTime) - (jsonRes.endTime - endTime) ) /((startTime - endTime)))*100) + "%"
709
+ logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs between ${new Date(jsonRes.endTime)} and ${new Date(endTime)}`)
710
+ result= await adminLog.query(code, services, topLogCount, jsonRes.endTime, endTime, level)
711
+ jsonRes = await result.json()
712
+
713
+ allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf(filter) > -1))
714
+ }
715
+
716
+ return allMessages
717
+
718
+ }
719
+
720
+
721
+ /*
722
+ const topLogCount = 100;f
723
+ const startTime = Date.now()
724
+ const endTime = Date.now() - mins*60*1000
725
+ let services = [theService + ".MapServer"]
726
+ if (theService == "(All Services)")
727
+ services = "*"
728
+ let result= await adminLog.query([code], services, topLogCount, startTime ,endTime , "DEBUG")
729
+ let jsonRes = await result.json()
730
+ let allMessages = [].concat(jsonRes.logMessages)
731
+ allMessages = allMessages.filter(m => m.message.indexOf("EndCursor;") > -1)
732
+ while (jsonRes.hasMore)
733
+ {
734
+ //start paging
735
+ logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs between ${new Date(jsonRes.endTime)} and ${new Date(endTime)}`)
736
+ result= await adminLog.query([102023], services, pageSize, jsonRes.endTime, endTime, "DEBUG")
737
+ jsonRes = await result.json()
738
+
739
+ allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("EndCursor;") > -1))
740
+ }
741
+ */
675
742
  </script>
676
743
  </body>
677
744
  </html>
package/index.mjs CHANGED
@@ -7,7 +7,7 @@ import { AdminLog } from "./adminlog.mjs"
7
7
  import logger from "./logger.mjs"
8
8
  import fetch from "node-fetch"
9
9
  //update version
10
- let version = "0.0.71";
10
+ let version = "0.0.72";
11
11
  const GENERATE_TOKEN_TIME_MIN = 30;
12
12
 
13
13
  let rl = null;
@@ -411,23 +411,33 @@ const inputs = {
411
411
  "^update subnetworks --all" : async input => {
412
412
 
413
413
  let subnetworks;
414
+ let more = false;
415
+ let failedSubnetworks = []
414
416
  do {
415
417
 
416
418
  let sort = "asc";
417
419
  if (input.indexOf("--desc") > 0) sort = "desc"
420
+ let failedSubWhereClause = ""
421
+
422
+ if (failedSubnetworks.length > 0 )
423
+ failedSubWhereClause = " AND SUBNETWORKNAME NOT IN (" + failedSubnetworks.join(",") + ")"
418
424
 
419
425
  console.log("Querying all subnetworks that are dirty.");
420
- subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1", `domainnetworkname ${sort},tiername ${sort},subnetworkname ${sort}`);
426
+ subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1 " + failedSubWhereClause, `domainnetworkname ${sort},tiername ${sort},subnetworkname ${sort}`);
421
427
  console.log(`Discovered ${subnetworks.features.length} dirty subnetworks.`);
422
428
 
423
429
  for (let i = 0; i < subnetworks.features.length; i++) {
424
430
  const f = subnetworks.features[i]
425
- console.log("Updating Subnetwork " + v(f.attributes,"subnetworkName"));
431
+ const subnetworkName = v(f.attributes,"subnetworkName")
432
+ console.log("Updating Subnetwork " + subnetworkName);
426
433
 
427
434
  const fromDate = new Date();
428
435
 
429
436
  const subnetworkResult = await un.updateSubnetworks(v(f.attributes,"domainNetworkName"), v(f.attributes,"tierName"), v(f.attributes,"subnetworkName"),false);
430
-
437
+ //check if we have processed this subnetwork (maybe be an error)
438
+ if (subnetworkResult.success == false)
439
+ failedSubnetworks.push("'" + subnetworkName + "'")
440
+
431
441
  const toDate = new Date();
432
442
  const timeEnable = toDate.getTime() - fromDate.getTime();
433
443
  subnetworkResult.duration = numberWithCommas(Math.round(timeEnable)) + " ms"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "un-cli",
3
- "version": "0.0.71",
3
+ "version": "0.0.72",
4
4
  "description": "Command line interface for working with ArcGIS Utility Network Extension",
5
5
  "main": "index.mjs",
6
6
  "bin": {