un-cli 0.0.75 → 0.0.76

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.
package/cmd.txt CHANGED
@@ -1,2 +1,2 @@
1
- updateisconnected
1
+ topology --validate --fishnet
2
2
  exit
package/index.html CHANGED
@@ -44,6 +44,8 @@
44
44
  <td><button id = 'btnSQLLogs'>SQL Logs</button></td>
45
45
  <td>Message<input id = 'txtFilter' type = 'text'></td>
46
46
  <td>User<input id = 'txtUser' type = 'text'></td>
47
+ <td>Start Time<input id = 'txtStartTime' type = 'text'></td>
48
+ <td>End Time<input id = 'txtEndTime' type = 'text'></td>
47
49
  </tr>
48
50
 
49
51
  </table>
@@ -129,7 +131,7 @@
129
131
 
130
132
 
131
133
  async function loadTraceLogs () {
132
-
134
+
133
135
  //build table
134
136
  const tblResult = document.getElementById("tblResult");
135
137
  //clear
@@ -143,9 +145,110 @@
143
145
  console.log(`Querying trace logs for ${parameters.service} for the last ${mins} minutes ...`)
144
146
 
145
147
  //page query the admin log
146
- let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102002], "------ Trace Parameters ----", "VERBOSE")
148
+ let allTheMessages = await adminLogQueryWithPaging(mins, parameters.service, [102002], "------ Trace Parameters ----", "VERBOSE")
149
+
150
+ let allMessages = filterMessages (allTheMessages).map(m => {
151
+ const newMessage = Object.assign({}, m);
152
+ delete newMessage.machine;
153
+ delete newMessage.type;
154
+ delete newMessage.code;
155
+ delete newMessage.requestID;
156
+ delete newMessage.process;
157
+ delete newMessage.thread;
158
+ newMessage.elapsedms = parseInt (parseFloat(newMessage.elapsed) * 1000)
159
+ newMessage.time = new Date(newMessage.time).toLocaleString()
160
+ delete newMessage.elapsed
161
+
162
+ try{
163
+
164
+ //Total Trace Time (4.745 seconds)
165
+
166
+ let re = /Total Trace Time \([-+]?([0-9]*\.[0-9]+|[0-9]+) seconds\)/;
167
+ let res = re.exec(m.message)
168
+ if (res && res.length > 1)
169
+ newMessage.traceTime = parseFloat(res[1])*1000
170
+
171
+ let re1 = /Trace Type: .\w.*/;
172
+ let res1 = re1.exec(m.message)
173
+ if (res1 && res1.length > 0)
174
+ newMessage.traceType = res1[0].replace("Trace Type: ","")
147
175
 
148
- await populateMessages(allMessages)
176
+ }
177
+ catch(ex){
178
+ console.error(ex)
179
+ }
180
+
181
+
182
+ return newMessage;
183
+ })
184
+ .sort( (m1,m2) => m2.elapsedms - m1.elapsedms)
185
+
186
+ //clear
187
+ while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
188
+
189
+ const header = document.createElement("tr");
190
+ const cService = document.createElement("th");
191
+ cService.textContent = "Source"
192
+ const cTime = document.createElement("th");
193
+ cTime.textContent = "Time"
194
+ const cUser = document.createElement("th");
195
+ cUser.textContent = "User"
196
+ const cMethod = document.createElement("th");
197
+ cMethod.textContent = "Method"
198
+ const cElapsedMS = document.createElement("th");
199
+ cElapsedMS.textContent = "Elapsed (ms)"
200
+ const cTraceType = document.createElement("th");
201
+ cTraceType.textContent = "Trace Type"
202
+ const cTraceTime = document.createElement("th");
203
+ cTraceTime.textContent = "Trace Time"
204
+ const cLog = document.createElement("th");
205
+ cLog.textContent = "Full Log"
206
+ header.appendChild (cService)
207
+ header.appendChild (cTime)
208
+ header.appendChild (cUser)
209
+ header.appendChild (cMethod)
210
+ header.appendChild (cTraceType)
211
+ header.appendChild (cTraceTime)
212
+ header.appendChild (cElapsedMS)
213
+
214
+ header.appendChild (cLog)
215
+ tblResult.appendChild(header)
216
+ allMessages.forEach(m => {
217
+ const logRow = document.createElement("tr");
218
+ const cService = document.createElement("td");
219
+ cService.textContent = m.source.replace(".MapServer", "")
220
+ const cTime = document.createElement("td");
221
+ cTime.textContent = m.time
222
+ const cUser = document.createElement("td");
223
+ cUser.textContent = m.user
224
+ const cMethod = document.createElement("td");
225
+ cMethod.textContent = m.methodName
226
+ const cElapsedMS = document.createElement("td");
227
+ cElapsedMS.textContent = m.elapsedms
228
+ const cTraceType = document.createElement("td");
229
+ cTraceType.textContent = m.traceType
230
+ const cTraceTime = document.createElement("td");
231
+ cTraceTime.textContent = m.traceTime
232
+
233
+ const cLog = document.createElement("td");
234
+ cLog.textContent = "..."
235
+ cLog.fullLog = m.message;
236
+ cLog.addEventListener("click", e=> {navigator.clipboard.writeText(e.target.fullLog); alert("Copied to clipboard")})
237
+ logRow.appendChild (cService)
238
+ logRow.appendChild (cTime)
239
+ logRow.appendChild (cUser)
240
+ logRow.appendChild (cMethod)
241
+ logRow.appendChild (cTraceType)
242
+ logRow.appendChild (cTraceTime)
243
+ logRow.appendChild (cElapsedMS)
244
+
245
+ logRow.appendChild (cLog)
246
+ tblResult.appendChild(logRow)
247
+ })
248
+
249
+
250
+
251
+ //await populateMessages(allMessages)
149
252
 
150
253
 
151
254
  }
@@ -208,31 +311,114 @@ async function loadUpdateSubnetworkLogs () {
208
311
 
209
312
 
210
313
  console.log(`Querying subnetwork logs for ${parameters.service} for the last ${mins} minutes ...`)
211
- let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102003], "---- Subnetwork Parameters ----", "VERBOSE")
314
+ let allTheMessages = await adminLogQueryWithPaging(mins, parameters.service, [102003], "---- Subnetwork Parameters ----", "VERBOSE")
212
315
 
316
+
213
317
 
214
- //update subnetwork missing elapsed populate it
215
- allMessages = allMessages.map( m => {
216
- try{
318
+ let allMessages = filterMessages (allTheMessages).map(m => {
319
+
320
+ const newMessage = Object.assign({}, m);
321
+ try{
322
+
323
+ delete newMessage.machine;
324
+ delete newMessage.type;
325
+ delete newMessage.code;
326
+ delete newMessage.requestID;
327
+ delete newMessage.process;
328
+ delete newMessage.thread;
329
+
330
+
331
+ let re = /Total \([-+]?([0-9]*\.[0-9]+|[0-9]+) seconds\)/;
332
+ let res = re.exec(m.message)
333
+ if (res && res.length > 0)
334
+ newMessage.elapsed = res[1]
335
+
336
+ re = /Total update subnetwork time \([-+]?([0-9]*\.[0-9]+|[0-9]+) seconds\)/;
337
+ res = re.exec(m.message)
338
+ if (res && res.length > 0)
339
+ newMessage.elapsed = res[1]
217
340
 
218
- let re = /Total \([-+]?([0-9]*\.[0-9]+|[0-9]+) seconds\)/;
219
- let res = re.exec(m.message)
220
- if (res && res.length > 1)
221
- m.elapsed = res[1]
222
-
223
- re = /Total update subnetwork time \([-+]?([0-9]*\.[0-9]+|[0-9]+) seconds\)/;
224
- res = re.exec(m.message)
225
- if (res && res.length > 1)
226
- m.elapsed = res[1]
227
-
228
- return m;
341
+
342
+ let re1 = /Subnetwork name: .*/;
343
+ let res1 = re1.exec(m.message)
344
+ if (res1 && res1.length > 0)
345
+ newMessage.subnetworkName = res1[0].replace("Subnetwork name: ","")
346
+
347
+
348
+ newMessage.elapsedms = parseInt (parseFloat(newMessage.elapsed) * 1000)
349
+ newMessage.time = new Date(newMessage.time).toLocaleString()
350
+ delete newMessage.elapsed
351
+
352
+
229
353
  }
230
354
  catch(ex){
231
- return m;
355
+ console.error(ex)
356
+ }
357
+ finally {
358
+ return newMessage;
232
359
  }
360
+
361
+ })
362
+ .sort( (m1,m2) => m2.elapsedms - m1.elapsedms)
363
+
364
+ //clear
365
+ while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
366
+
367
+ const header = document.createElement("tr");
368
+ const cService = document.createElement("th");
369
+ cService.textContent = "Source"
370
+ const cTime = document.createElement("th");
371
+ cTime.textContent = "Time"
372
+ const cUser = document.createElement("th");
373
+ cUser.textContent = "User"
374
+ const cMethod = document.createElement("th");
375
+ cMethod.textContent = "Method"
376
+ const cElapsedMS = document.createElement("th");
377
+ cElapsedMS.textContent = "Elapsed (ms)"
378
+ const cSubnetworkName = document.createElement("th");
379
+ cSubnetworkName.textContent = "Subnetwork Name"
380
+ const cLog = document.createElement("th");
381
+ cLog.textContent = "Full Log"
382
+ header.appendChild (cService)
383
+ header.appendChild (cTime)
384
+ header.appendChild (cUser)
385
+ header.appendChild (cMethod)
386
+ header.appendChild (cSubnetworkName)
387
+ header.appendChild (cElapsedMS)
388
+
389
+ header.appendChild (cLog)
390
+ tblResult.appendChild(header)
391
+ allMessages.forEach(m => {
392
+ const logRow = document.createElement("tr");
393
+ const cService = document.createElement("td");
394
+ cService.textContent = m.source.replace(".MapServer", "")
395
+ const cTime = document.createElement("td");
396
+ cTime.textContent = m.time
397
+ const cUser = document.createElement("td");
398
+ cUser.textContent = m.user
399
+ const cMethod = document.createElement("td");
400
+ cMethod.textContent = m.methodName
401
+ const cElapsedMS = document.createElement("td");
402
+ cElapsedMS.textContent = m.elapsedms
403
+ const cSubnetworkName = document.createElement("td");
404
+ cSubnetworkName.textContent = m.subnetworkName
405
+
406
+ const cLog = document.createElement("td");
407
+ cLog.textContent = "..."
408
+ cLog.fullLog = m.message;
409
+ cLog.addEventListener("click", e=> {navigator.clipboard.writeText(e.target.fullLog); alert("Copied to clipboard")})
410
+ logRow.appendChild (cService)
411
+ logRow.appendChild (cTime)
412
+ logRow.appendChild (cUser)
413
+ logRow.appendChild (cMethod)
414
+ logRow.appendChild (cSubnetworkName)
415
+ logRow.appendChild (cElapsedMS)
416
+
417
+ logRow.appendChild (cLog)
418
+ tblResult.appendChild(logRow)
233
419
  })
234
- await populateMessages(allMessages)
235
420
 
421
+
236
422
 
237
423
  }
238
424
 
@@ -666,8 +852,16 @@ function numberWithCommas(x) {
666
852
  let adminLog = new AdminLog(token, portal.serverUrl)
667
853
  tblResult.appendChild(prg);
668
854
  tblResult.appendChild(btn)
669
- const startTime = Date.now()
670
- const endTime = Date.now() - mins*60*1000
855
+ let startTime = Date.now()
856
+ const txtStartTime = document.getElementById("txtStartTime")
857
+ if (txtStartTime.value != "")
858
+ startTime = new Date(txtStartTime.value).getTime()
859
+
860
+ let endTime = startTime - mins*60*1000
861
+ const txtEndTime = document.getElementById("txtEndTime")
862
+ if (txtEndTime.value != "")
863
+ endTime = new Date(txtEndTime.value).getTime()
864
+
671
865
  let services = [theService + ".MapServer"]
672
866
  if (theService == "(All Services)")
673
867
  services = "*"
package/index.mjs CHANGED
@@ -86,7 +86,7 @@ async function regenerateToken(parameters) {
86
86
  async function connect(parameters) {
87
87
  try{
88
88
  //print the parameters
89
- logger.info(parameters);
89
+ logger.info(JSON.stringify(parameters));
90
90
  //connect to portal
91
91
 
92
92
  const token = await getToken(parameters);
@@ -316,10 +316,12 @@ const inputs = {
316
316
  //progress
317
317
  //timeouts
318
318
  //in case failure you don't lose everything
319
- "^topology --validate -fn$": async () => {
319
+ "^topology --validate --fishnet$": async () => {
320
320
  logger.info("Validating Network topology ...");
321
321
 
322
- const fullExtent = un.featureServiceJson.fullExtent;
322
+ const fullExtent = un.layerDefinition.extent;
323
+ //console.log(`add_env(${ JSON.stringify(fullExtent)})`)
324
+
323
325
  /*
324
326
  fullExtent.xmin = 0;
325
327
  fullExtent.xmax = 100;
@@ -328,13 +330,14 @@ const inputs = {
328
330
  https://desktop.arcgis.com/en/arcmap/10.3/tools/cartography-toolbox/create-cartographic-partitions.htm
329
331
  */
330
332
  //fish net
331
- const grids = 4;
333
+ const grids = 5; //divide the grid 5 x 5
332
334
  const dx = (fullExtent.xmax - fullExtent.xmin) / grids;
333
335
  const dy = (fullExtent.ymax - fullExtent.ymin) / grids;
334
-
335
- const extents = [];
336
+
337
+ const fishnet = [];
336
338
  for (let i =0; i < grids; i ++) {
337
-
339
+ const row = [];
340
+
338
341
  for (let j = 0; j < grids; j++) {
339
342
  const extent = {
340
343
  "xmin": fullExtent.xmin + j*dx,
@@ -343,24 +346,47 @@ const inputs = {
343
346
  "ymax": fullExtent.ymin + i*dy + dy,
344
347
  "spatialReference": fullExtent.spatialReference
345
348
  }
346
- extents.push(extent);
349
+ row.push({"content": " ", "extent": extent});
350
+
347
351
  }
352
+ fishnet.push(row);
348
353
  }
349
354
 
350
- extents.forEach(async e => {
351
- const fromDate = new Date();
352
355
 
353
- const result = await un.validateNetworkTopology("sde.DEFAULT", e)
354
- const toDate = new Date();
355
- const timeEnable = toDate.getTime() - fromDate.getTime();
356
- const duration = numberWithCommas(Math.round(timeEnable)) + " ms"
357
- console.clear()
358
- logger.info("Validating extent " + e.xmin)
359
- console.table({duration})
360
356
 
361
- })
362
-
363
-
357
+ for (let i = 0; i < fishnet.length; i ++) {
358
+
359
+ for (let j = 0 ; j < fishnet[i].length; j++) {
360
+
361
+ fishnet[i][j].content = '⚙️'
362
+ const e = fishnet[i][j].extent
363
+
364
+ try {
365
+
366
+
367
+ const fromDate = new Date();
368
+ console.log("Validating Extent " + JSON.stringify(e));
369
+ printFishnet(fishnet)
370
+
371
+ const result = await un.validateNetworkTopology( e)
372
+ const toDate = new Date();
373
+ const timeEnable = toDate.getTime() - fromDate.getTime();
374
+ const duration = numberWithCommas(Math.round(timeEnable)) + " ms"
375
+ result.duration = duration
376
+ console.table(result)
377
+ //console.log(`add_env(${ JSON.stringify(e)})`)
378
+ fishnet[i][j].content = '✔️'
379
+
380
+ }
381
+ catch(ex){
382
+ console.log(JSON.stringify(ex))
383
+ }
384
+
385
+ }
386
+
387
+ }
388
+ console.log("Done")
389
+
364
390
  },
365
391
 
366
392
  "^topology --validate$": async () => {
@@ -1407,3 +1433,27 @@ export async function run (){
1407
1433
 
1408
1434
 
1409
1435
 
1436
+ function printFishnet(fishnet) {
1437
+
1438
+ //y is flipped x is ok
1439
+ //i = 0 that is i = fishnet.length -1
1440
+ for (let i =0; i < fishnet.length ; i++){
1441
+
1442
+ for (let j = 0; j < fishnet[i].length;j++)
1443
+ process.stdout.write("+------");
1444
+
1445
+ process.stdout.write("+\n")
1446
+
1447
+ for (let j = 0; j < fishnet[i].length;j++)
1448
+ process.stdout.write(`| ${fishnet[fishnet.length - 1 - i][j].content} `);
1449
+
1450
+ process.stdout.write("|\n")
1451
+ }
1452
+
1453
+
1454
+ for (let j = 0; j < fishnet.length;j++)
1455
+ process.stdout.write("+------");
1456
+
1457
+ process.stdout.write("+\n\n")
1458
+
1459
+ }
package/makerequest.mjs CHANGED
@@ -29,7 +29,7 @@ export function makeRequest (opts) {
29
29
  let f;
30
30
  try {
31
31
 
32
- const nodeFetch = await import ("node-fetch");
32
+ let nodeFetch = await import ("node-fetch");
33
33
  f = nodeFetch.default;
34
34
  }
35
35
  catch(ex) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "un-cli",
3
- "version": "0.0.75",
3
+ "version": "0.0.76",
4
4
  "description": "Command line interface for working with ArcGIS Utility Network Extension",
5
5
  "main": "index.mjs",
6
6
  "bin": {