un-cli 0.0.67 → 0.0.70
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/adminlog.mjs +12 -3
- package/cmd.txt +1 -2
- package/index.html +677 -0
- package/index.mjs +221 -147
- package/logger.mjs +8 -1
- package/makerequest.mjs +14 -2
- package/package.json +2 -4
- package/portal.mjs +5 -4
- package/utilitynetwork.node.mjs +11 -7
package/index.mjs
CHANGED
|
@@ -4,10 +4,10 @@ import { Portal } from "./portal.mjs"
|
|
|
4
4
|
import { UtilityNetwork } from "./utilitynetwork.node.mjs"
|
|
5
5
|
import { AdminLog } from "./adminlog.mjs"
|
|
6
6
|
|
|
7
|
-
import
|
|
7
|
+
import logger from "./logger.mjs"
|
|
8
8
|
import fetch from "node-fetch"
|
|
9
9
|
//update version
|
|
10
|
-
let version = "0.0.
|
|
10
|
+
let version = "0.0.70";
|
|
11
11
|
const GENERATE_TOKEN_TIME_MIN = 30;
|
|
12
12
|
|
|
13
13
|
let rl = null;
|
|
@@ -387,15 +387,14 @@ const inputs = {
|
|
|
387
387
|
|
|
388
388
|
"^update subnetworks --deleted$" : async () => {
|
|
389
389
|
console.log("Querying all subnetworks that are dirty and deleted.");
|
|
390
|
-
let subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1 and isdeleted=1");
|
|
390
|
+
let subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1 and isdeleted=1","domainnetworkname,tiername,subnetworkname");
|
|
391
391
|
console.log(`Discovered ${subnetworks.features.length} dirty deleted subnetworks.`);
|
|
392
392
|
for (let i = 0; i < subnetworks.features.length; i++) {
|
|
393
393
|
const f = subnetworks.features[i]
|
|
394
394
|
console.log("Updating Subnetwork " + v(f.attributes,"subnetworkName"));
|
|
395
395
|
|
|
396
396
|
const fromDate = new Date();
|
|
397
|
-
|
|
398
|
-
|
|
397
|
+
|
|
399
398
|
const subnetworkResult = await un.updateSubnetworks(v(f.attributes,"domainNetworkName"), v(f.attributes,"tierName"), v(f.attributes,"subnetworkName"),false);
|
|
400
399
|
|
|
401
400
|
//code
|
|
@@ -409,31 +408,39 @@ const inputs = {
|
|
|
409
408
|
}
|
|
410
409
|
},
|
|
411
410
|
|
|
412
|
-
"^update subnetworks --all
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
console.log(`Discovered ${subnetworks.features.length} dirty subnetworks.`);
|
|
411
|
+
"^update subnetworks --all" : async input => {
|
|
412
|
+
|
|
413
|
+
do {
|
|
416
414
|
|
|
415
|
+
let sort = "asc";
|
|
416
|
+
if (input.indexOf("--desc") > 0) sort = "desc"
|
|
417
417
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
console.log(
|
|
421
|
-
|
|
422
|
-
const fromDate = new Date();
|
|
423
|
-
|
|
418
|
+
console.log("Querying all subnetworks that are dirty.");
|
|
419
|
+
let subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1", `domainnetworkname ${sort},tiername ${sort},subnetworkname ${sort}`);
|
|
420
|
+
console.log(`Discovered ${subnetworks.features.length} dirty subnetworks.`);
|
|
424
421
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
422
|
+
for (let i = 0; i < subnetworks.features.length; i++) {
|
|
423
|
+
const f = subnetworks.features[i]
|
|
424
|
+
console.log("Updating Subnetwork " + v(f.attributes,"subnetworkName"));
|
|
425
|
+
|
|
426
|
+
const fromDate = new Date();
|
|
427
|
+
|
|
428
|
+
const subnetworkResult = await un.updateSubnetworks(v(f.attributes,"domainNetworkName"), v(f.attributes,"tierName"), v(f.attributes,"subnetworkName"),false);
|
|
429
|
+
|
|
430
|
+
const toDate = new Date();
|
|
431
|
+
const timeEnable = toDate.getTime() - fromDate.getTime();
|
|
432
|
+
subnetworkResult.duration = numberWithCommas(Math.round(timeEnable)) + " ms"
|
|
433
|
+
|
|
434
|
+
console.log(`Result ${JSON.stringify(subnetworkResult)}`)
|
|
435
|
+
}
|
|
430
436
|
|
|
431
|
-
|
|
432
|
-
|
|
437
|
+
}
|
|
438
|
+
while (subnetworks.features.length > 0)
|
|
439
|
+
|
|
433
440
|
},
|
|
434
441
|
"^update subnetworks --all --async$" : async () => {
|
|
435
442
|
console.log("Querying all subnetworks that are dirty.");
|
|
436
|
-
let subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1");
|
|
443
|
+
let subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1", "domainnetworkname,tiername,subnetworkname");
|
|
437
444
|
console.log(`Discovered ${subnetworks.features.length} dirty subnetworks.`);
|
|
438
445
|
for (let i = 0; i < subnetworks.features.length; i++) {
|
|
439
446
|
const f = subnetworks.features[i]
|
|
@@ -443,8 +450,7 @@ const inputs = {
|
|
|
443
450
|
}
|
|
444
451
|
},
|
|
445
452
|
"^export subnetworks --all --folder .*$|^export subnetworks --all$" : async input => {
|
|
446
|
-
|
|
447
|
-
|
|
453
|
+
|
|
448
454
|
//create folder
|
|
449
455
|
const file = input.match(/--folder .*/gm)
|
|
450
456
|
let inputDir = "Exported"
|
|
@@ -452,40 +458,49 @@ const inputs = {
|
|
|
452
458
|
inputDir = file[0].replace("--folder ", "")
|
|
453
459
|
//create directory if doesn't exists
|
|
454
460
|
if (!fs.existsSync(inputDir)) fs.mkdirSync(inputDir)
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
461
|
+
|
|
462
|
+
do {
|
|
463
|
+
|
|
464
|
+
console.log("Querying all subnetworks that are clean.");
|
|
465
|
+
let subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=0","domainnetworkname,tiername,subnetworkname");
|
|
466
|
+
console.log(`Discovered ${subnetworks.features.length} subnetworks that can be exported.`);
|
|
467
|
+
for (let i = 0; i < subnetworks.features.length; i++) {
|
|
468
|
+
const f = subnetworks.features[i]
|
|
469
|
+
const subnetworkName = v(f.attributes,"subnetworkName")
|
|
470
|
+
console.log("Exporting subnetworks " + v(f.attributes,"subnetworkName"));
|
|
471
|
+
|
|
472
|
+
const fromDate = new Date();
|
|
473
|
+
|
|
474
|
+
const subnetworkResult = await un.exportSubnetworks(v(f.attributes,"domainNetworkName"), v(f.attributes,"tierName"), v(f.attributes,"subnetworkName"),false);
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
//code
|
|
478
|
+
|
|
479
|
+
const toDate = new Date();
|
|
480
|
+
const timeEnable = toDate.getTime() - fromDate.getTime();
|
|
481
|
+
subnetworkResult.duration = numberWithCommas(timeEnable) + " ms"
|
|
482
|
+
//if undefined exit
|
|
483
|
+
if (!subnetworkResult.url)
|
|
484
|
+
{
|
|
485
|
+
console.log("Export subnetwork failed " + JSON.stringify(subnetworkResult))
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
//fetch the json and write it to disk
|
|
490
|
+
const subContent = await fetch(subnetworkResult.url);
|
|
491
|
+
//check if the response is 200 only then attempt to parse to json
|
|
492
|
+
//although the response is json, its easier to treat it as text (handle error cases) since we will only write it to disk.
|
|
493
|
+
// if we want to do something with the response then make it json
|
|
494
|
+
const jsonExport = await subContent.text();
|
|
495
|
+
fs.writeFileSync(`${inputDir}/${subnetworkName}.json`, jsonExport)
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
console.log(`Result ${JSON.stringify(subnetworkResult)} written to file ${process.cwd()}/${inputDir}/${subnetworkName}.json`)
|
|
499
|
+
|
|
500
|
+
}
|
|
488
501
|
}
|
|
502
|
+
while (subnetworks.features.length > 0)
|
|
503
|
+
|
|
489
504
|
},
|
|
490
505
|
|
|
491
506
|
|
|
@@ -501,7 +516,7 @@ const inputs = {
|
|
|
501
516
|
|
|
502
517
|
|
|
503
518
|
console.log("Querying all subnetworks that are clean and not exported.");
|
|
504
|
-
let subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty = 0 and (LASTACKEXPORTSUBNETWORK is null or LASTACKEXPORTSUBNETWORK < LASTUPDATESUBNETWORK)");
|
|
519
|
+
let subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty = 0 and (LASTACKEXPORTSUBNETWORK is null or LASTACKEXPORTSUBNETWORK < LASTUPDATESUBNETWORK)","domainnetworkname,tiername,subnetworkname");
|
|
505
520
|
console.log(`Discovered ${subnetworks.features.length} subnetworks that can be exported.`);
|
|
506
521
|
for (let i = 0; i < subnetworks.features.length; i++) {
|
|
507
522
|
const f = subnetworks.features[i]
|
|
@@ -579,6 +594,14 @@ const inputs = {
|
|
|
579
594
|
const subnetworkName = v(f.attributes,"subnetworkName")
|
|
580
595
|
console.log(`Exporting subnetwork ${subnetworkName}` );
|
|
581
596
|
const subnetworkResult = await un.exportSubnetworks(v(f.attributes,"domainNetworkName"), v(f.attributes,"tierName"), v(f.attributes,"subnetworkName"),false);
|
|
597
|
+
|
|
598
|
+
//if undefined exit
|
|
599
|
+
if (!subnetworkResult.url)
|
|
600
|
+
{
|
|
601
|
+
console.log("Export subnetwork failed " + JSON.stringify(subnetworkResult))
|
|
602
|
+
continue;
|
|
603
|
+
}
|
|
604
|
+
|
|
582
605
|
//fetch the json and write it to disk
|
|
583
606
|
const subContent = await fetch(subnetworkResult.url);
|
|
584
607
|
const jsonExport = await subContent.text();
|
|
@@ -755,16 +778,30 @@ const inputs = {
|
|
|
755
778
|
|
|
756
779
|
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("------ Trace Parameters ----") > -1))
|
|
757
780
|
}
|
|
758
|
-
|
|
781
|
+
|
|
782
|
+
allMessages = allMessages.map(m => {
|
|
759
783
|
const newMessage = Object.assign({}, m);
|
|
760
|
-
delete newMessage.message
|
|
761
784
|
delete newMessage.source;
|
|
762
785
|
delete newMessage.machine;
|
|
763
786
|
delete newMessage.type;
|
|
787
|
+
delete newMessage.code;
|
|
764
788
|
delete newMessage.requestID;
|
|
789
|
+
delete newMessage.process;
|
|
765
790
|
delete newMessage.thread;
|
|
766
|
-
|
|
791
|
+
newMessage.elapsedms = parseInt (parseFloat(newMessage.elapsed) * 1000)
|
|
792
|
+
newMessage.time = new Date(newMessage.time).toLocaleString()
|
|
793
|
+
delete newMessage.elapsed
|
|
794
|
+
return newMessage;
|
|
795
|
+
})
|
|
796
|
+
.sort( (m1,m2) => m2.elapsedms - m1.elapsedms)
|
|
797
|
+
|
|
798
|
+
const summaryMessages = allMessages.map(m => {const newM = Object.assign({}, m); delete newM.message; return newM})
|
|
799
|
+
console.table(summaryMessages)
|
|
767
800
|
|
|
801
|
+
allMessages.forEach(m => {
|
|
802
|
+
const newMessage = Object.assign({}, m);
|
|
803
|
+
delete newMessage.message
|
|
804
|
+
|
|
768
805
|
console.table([newMessage])
|
|
769
806
|
console.log(m.message)
|
|
770
807
|
})
|
|
@@ -783,37 +820,76 @@ const inputs = {
|
|
|
783
820
|
if (inputParam != null && inputParam.length > 0)
|
|
784
821
|
mins = inputParam[0].replace("--age ", "")
|
|
785
822
|
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
823
|
+
|
|
824
|
+
console.log(`Querying validate logs for ${parameters.service} for the last ${mins} minutes ...`)
|
|
825
|
+
const startTime = Date.now() - mins*60*1000
|
|
826
|
+
const endTime = Date.now();
|
|
827
|
+
let result= await adminLog.query([102003], [parameters.service+ ".MapServer"], topLogCount, startTime ,endTime , "VERBOSE")
|
|
828
|
+
let jsonRes = await result.json()
|
|
829
|
+
let allMessages = [].concat(jsonRes.logMessages)
|
|
830
|
+
allMessages = allMessages.filter(m => m.message.indexOf("-------- Environment ---") > -1 && m.message.indexOf("The network is built.") > -1 && m.methodName == 'BuildEngineLog')
|
|
831
|
+
while (jsonRes.hasMore)
|
|
832
|
+
{
|
|
833
|
+
//start paging
|
|
834
|
+
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
|
|
835
|
+
let services = [parameters.service + ".MapServer"]
|
|
836
|
+
result= await adminLog.query([102003], services, pageSize, jsonRes.endTime, null, "VERBOSE")
|
|
837
|
+
jsonRes = await result.json()
|
|
838
|
+
|
|
839
|
+
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("-------- Environment ---") > -1 && m.message.indexOf("------ Trace Parameters ----") == -1))
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
|
|
844
|
+
|
|
845
|
+
//validate logs missing elapsed populate it
|
|
846
|
+
allMessages = allMessages.map( m => {
|
|
847
|
+
try{
|
|
848
|
+
|
|
849
|
+
//The network is built. 0.093 seconds (4.982 total) - 29 MB memory
|
|
850
|
+
|
|
851
|
+
let re = /The network is built. [-+]?([0-9]*\.[0-9]+|[0-9]+) seconds \([-+]?([0-9]*\.[0-9]+|[0-9]+) total\)/;
|
|
852
|
+
let res = re.exec(m.message)
|
|
853
|
+
if (res && res.length > 1)
|
|
854
|
+
m.elapsed = res[2]
|
|
855
|
+
|
|
856
|
+
return m;
|
|
857
|
+
}
|
|
858
|
+
catch(ex){
|
|
859
|
+
return m;
|
|
860
|
+
}
|
|
861
|
+
})
|
|
802
862
|
|
|
803
863
|
|
|
804
|
-
|
|
864
|
+
|
|
865
|
+
allMessages = allMessages.map(m => {
|
|
805
866
|
const newMessage = Object.assign({}, m);
|
|
806
|
-
delete newMessage.message
|
|
807
867
|
delete newMessage.source;
|
|
808
868
|
delete newMessage.machine;
|
|
809
869
|
delete newMessage.type;
|
|
870
|
+
delete newMessage.code;
|
|
810
871
|
delete newMessage.requestID;
|
|
872
|
+
delete newMessage.process;
|
|
811
873
|
delete newMessage.thread;
|
|
812
|
-
|
|
874
|
+
newMessage.elapsedms = parseInt (parseFloat(newMessage.elapsed) * 1000)
|
|
875
|
+
newMessage.time = new Date(newMessage.time).toLocaleString()
|
|
876
|
+
delete newMessage.elapsed
|
|
877
|
+
return newMessage;
|
|
878
|
+
})
|
|
879
|
+
.sort( (m1,m2) => m2.elapsedms - m1.elapsedms)
|
|
813
880
|
|
|
881
|
+
const summaryMessages = allMessages.map(m => {const newM = Object.assign({}, m); delete newM.message; return newM})
|
|
882
|
+
console.table(summaryMessages)
|
|
883
|
+
|
|
884
|
+
allMessages.forEach(m => {
|
|
885
|
+
const newMessage = Object.assign({}, m);
|
|
886
|
+
delete newMessage.message
|
|
887
|
+
|
|
814
888
|
console.table([newMessage])
|
|
815
889
|
console.log(m.message)
|
|
816
890
|
})
|
|
891
|
+
|
|
892
|
+
|
|
817
893
|
|
|
818
894
|
},
|
|
819
895
|
|
|
@@ -845,20 +921,59 @@ const inputs = {
|
|
|
845
921
|
|
|
846
922
|
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("---- Subnetwork Parameters ----") > -1))
|
|
847
923
|
}
|
|
848
|
-
|
|
924
|
+
|
|
925
|
+
|
|
926
|
+
|
|
927
|
+
//update subnetwork missing elapsed populate it
|
|
928
|
+
allMessages = allMessages.map( m => {
|
|
929
|
+
try{
|
|
930
|
+
|
|
931
|
+
let re = /Total \([-+]?([0-9]*\.[0-9]+|[0-9]+) seconds\)/;
|
|
932
|
+
let res = re.exec(m.message)
|
|
933
|
+
if (res && res.length > 1)
|
|
934
|
+
m.elapsed = res[1]
|
|
935
|
+
|
|
936
|
+
re = /Total update subnetwork time \([-+]?([0-9]*\.[0-9]+|[0-9]+) seconds\)/;
|
|
937
|
+
res = re.exec(m.message)
|
|
938
|
+
if (res && res.length > 1)
|
|
939
|
+
m.elapsed = res[1]
|
|
940
|
+
|
|
941
|
+
return m;
|
|
942
|
+
}
|
|
943
|
+
catch(ex){
|
|
944
|
+
return m;
|
|
945
|
+
}
|
|
946
|
+
})
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
allMessages = allMessages.map(m => {
|
|
849
950
|
const newMessage = Object.assign({}, m);
|
|
850
|
-
delete newMessage.message
|
|
851
951
|
delete newMessage.source;
|
|
852
952
|
delete newMessage.machine;
|
|
853
953
|
delete newMessage.type;
|
|
954
|
+
delete newMessage.code;
|
|
854
955
|
delete newMessage.requestID;
|
|
956
|
+
delete newMessage.process;
|
|
855
957
|
delete newMessage.thread;
|
|
856
|
-
|
|
958
|
+
newMessage.elapsedms = parseInt (parseFloat(newMessage.elapsed) * 1000)
|
|
959
|
+
newMessage.time = new Date(newMessage.time).toLocaleString()
|
|
960
|
+
delete newMessage.elapsed
|
|
961
|
+
return newMessage;
|
|
962
|
+
})
|
|
963
|
+
.sort( (m1,m2) => m2.elapsedms - m1.elapsedms)
|
|
857
964
|
|
|
965
|
+
const summaryMessages = allMessages.map(m => {const newM = Object.assign({}, m); delete newM.message; return newM})
|
|
966
|
+
console.table(summaryMessages)
|
|
967
|
+
|
|
968
|
+
allMessages.forEach(m => {
|
|
969
|
+
const newMessage = Object.assign({}, m);
|
|
970
|
+
delete newMessage.message
|
|
971
|
+
|
|
858
972
|
console.table([newMessage])
|
|
859
973
|
console.log(m.message)
|
|
860
974
|
})
|
|
861
975
|
|
|
976
|
+
|
|
862
977
|
},
|
|
863
978
|
|
|
864
979
|
|
|
@@ -893,12 +1008,12 @@ const inputs = {
|
|
|
893
1008
|
allMessages = allMessages
|
|
894
1009
|
.map( m=> {
|
|
895
1010
|
m.dataAccessElapsed = parseFloat(m.message.split(";")[1].split(" ")[1])
|
|
896
|
-
m.
|
|
897
|
-
m.
|
|
1011
|
+
m.executeQueryElapsed = parseFloat(m.message.split(";")[2].split(" ")[1])
|
|
1012
|
+
m.totalExecutionElapsed = m.dataAccessElapsed + m.executeQueryElapsed
|
|
898
1013
|
m.elapsed = parseFloat(m.elapsed); return m;
|
|
899
1014
|
|
|
900
1015
|
})
|
|
901
|
-
.sort( (m1,m2) => m2.
|
|
1016
|
+
.sort( (m1,m2) => m2.totalExecutionElapsed - m1.totalExecutionElapsed)
|
|
902
1017
|
.slice(0, 10) ;//first 10
|
|
903
1018
|
|
|
904
1019
|
|
|
@@ -908,11 +1023,12 @@ const inputs = {
|
|
|
908
1023
|
{
|
|
909
1024
|
|
|
910
1025
|
const x = m.message.split(";")
|
|
1026
|
+
x.shift()
|
|
911
1027
|
console.log(`id: ${i++}`)
|
|
912
1028
|
console.log(`\tAt: ${new Date(m.time)} (${m.time})`)
|
|
913
1029
|
console.log(`\tUser: ${m.user}`)
|
|
914
|
-
console.log(`\
|
|
915
|
-
console.log(`\
|
|
1030
|
+
console.log(`\tTotal Time: ${numberWithCommas(Math.round(m.elapsed*1000))} ms (Total time the cursor was opened)`)
|
|
1031
|
+
console.log(`\tQuery Time: ${numberWithCommas(m.totalExecutionElapsed)} ms (includes search + data access nextRow)`)
|
|
916
1032
|
console.log(`\tQuery:`)
|
|
917
1033
|
x.forEach(a => console.log(`\t${a}`))
|
|
918
1034
|
console.log(`\n`)
|
|
@@ -922,60 +1038,6 @@ const inputs = {
|
|
|
922
1038
|
},
|
|
923
1039
|
|
|
924
1040
|
|
|
925
|
-
|
|
926
|
-
"^cursorlogs --age": async input => {
|
|
927
|
-
const topLogCount = 1000;
|
|
928
|
-
const pageSize = 10000
|
|
929
|
-
|
|
930
|
-
const inputParam = input.match(/--age .*/gm)
|
|
931
|
-
let mins = 30; //query logs for the last 30 minutes
|
|
932
|
-
if (inputParam != null && inputParam.length > 0)
|
|
933
|
-
mins = inputParam[0].replace("--age ", "")
|
|
934
|
-
|
|
935
|
-
console.log(`Querying cursor sql logs for ${parameters.service} for the last ${mins} minutes ...`)
|
|
936
|
-
const startTime = Date.now() - mins*60*1000
|
|
937
|
-
const endTime = Date.now();
|
|
938
|
-
let result= await adminLog.query([102023], [parameters.service+ ".MapServer"], topLogCount, startTime ,endTime , "DEBUG")
|
|
939
|
-
let jsonRes = await result.json()
|
|
940
|
-
let allMessages = [].concat(jsonRes.logMessages)
|
|
941
|
-
allMessages = allMessages.filter(m => m.message.indexOf("EndCursor;") > -1)
|
|
942
|
-
while (jsonRes.hasMore)
|
|
943
|
-
{
|
|
944
|
-
//start paging
|
|
945
|
-
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
|
|
946
|
-
result= await adminLog.query([102023], [parameters.service + ".MapServer"], pageSize, jsonRes.endTime, null, "DEBUG")
|
|
947
|
-
jsonRes = await result.json()
|
|
948
|
-
|
|
949
|
-
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("EndCursor;") > -1))
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
//
|
|
954
|
-
allMessages= allMessages.map(m => {
|
|
955
|
-
|
|
956
|
-
const r= m.message.split (";")
|
|
957
|
-
delete r[0];
|
|
958
|
-
delete r[1];
|
|
959
|
-
delete r[3];
|
|
960
|
-
return r;
|
|
961
|
-
|
|
962
|
-
const newMessage = Object.assign({}, m);
|
|
963
|
-
|
|
964
|
-
delete newMessage.source;
|
|
965
|
-
delete newMessage.machine;
|
|
966
|
-
delete newMessage.type;
|
|
967
|
-
delete newMessage.requestID;
|
|
968
|
-
delete newMessage.methodName;
|
|
969
|
-
delete newMessage.process;
|
|
970
|
-
delete newMessage.thread;
|
|
971
|
-
delete newMessage.time;
|
|
972
|
-
delete newMessage.code;
|
|
973
|
-
|
|
974
|
-
return newMessage
|
|
975
|
-
|
|
976
|
-
})
|
|
977
|
-
console.table(allMessages)
|
|
978
|
-
},
|
|
979
1041
|
|
|
980
1042
|
|
|
981
1043
|
"^arlogs --byrule": async input => {
|
|
@@ -990,17 +1052,29 @@ const inputs = {
|
|
|
990
1052
|
if (inputParam != null && inputParam.length > 0 && inputParam[0].indexOf("--minguid") > -1)
|
|
991
1053
|
showMinGuid = true
|
|
992
1054
|
|
|
1055
|
+
|
|
1056
|
+
const ageInputParam = input.match(/--age [0-9]*/)
|
|
1057
|
+
let mins = 30; //query logs for the last 30 minutes
|
|
1058
|
+
if (ageInputParam != null && ageInputParam.length > 0)
|
|
1059
|
+
mins = ageInputParam[0].replace("--age ", "")
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
const startTime = Date.now() - mins*60*1000
|
|
1063
|
+
const endTime = Date.now();
|
|
1064
|
+
|
|
993
1065
|
const pageSize = 10000 //maximum messages per page
|
|
994
|
-
logger.info(`Querying attribute rules logs for ${parameters.service} ...`)
|
|
995
|
-
let result= await adminLog.query([102003], [parameters.service + ".MapServer"], pageSize)
|
|
1066
|
+
logger.info(`Querying attribute rules logs for ${parameters.service} in the past ${mins} minutes...`)
|
|
1067
|
+
let result= await adminLog.query([102003], [parameters.service + ".MapServer"], pageSize, startTime ,endTime , "DEBUG")
|
|
996
1068
|
let jsonRes = await result.json()
|
|
997
1069
|
let allMessages = [].concat(jsonRes.logMessages)
|
|
998
1070
|
|
|
999
|
-
while (jsonRes.hasMore)
|
|
1071
|
+
while (jsonRes.hasMore && jsonRes.endTime > startTime)
|
|
1000
1072
|
{
|
|
1001
1073
|
//start paging
|
|
1002
1074
|
logger.info(`Aggregating messages... total so far ${allMessages.length} debug entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
|
|
1003
|
-
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
result= await adminLog.query([102003], [parameters.service + ".MapServer"], pageSize, jsonRes.endTime )
|
|
1004
1078
|
jsonRes = await result.json()
|
|
1005
1079
|
allMessages = allMessages.concat(jsonRes.logMessages)
|
|
1006
1080
|
}
|
package/logger.mjs
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
const logger = {}
|
|
2
|
+
logger.info = console.log
|
|
3
|
+
logger.error = console.error
|
|
4
|
+
|
|
5
|
+
export default logger;
|
|
6
|
+
|
|
7
|
+
/*
|
|
1
8
|
import winston from "winston"
|
|
2
9
|
|
|
3
10
|
export const logger = winston.createLogger();
|
|
@@ -5,4 +12,4 @@ export const logger = winston.createLogger();
|
|
|
5
12
|
logger.add(
|
|
6
13
|
new winston.transports.Console({"format": winston.format.json()})
|
|
7
14
|
);
|
|
8
|
-
|
|
15
|
+
*/
|
package/makerequest.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
|
|
2
3
|
|
|
3
4
|
export function makeRequest (opts) {
|
|
4
5
|
|
|
@@ -24,7 +25,18 @@ export function makeRequest (opts) {
|
|
|
24
25
|
Object.keys(opts.headers).forEach( key => headers[key] = opts.headers[key] )
|
|
25
26
|
|
|
26
27
|
//console.log(opts)
|
|
27
|
-
|
|
28
|
+
|
|
29
|
+
let f;
|
|
30
|
+
try {
|
|
31
|
+
const nodeFetch = await import ("node-fetch");
|
|
32
|
+
f = nodeFetch.default;
|
|
33
|
+
}
|
|
34
|
+
catch(ex) {
|
|
35
|
+
f = fetch;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
const result = await f(opts.url, {
|
|
28
40
|
"method" : opts.method,
|
|
29
41
|
"headers": headers,
|
|
30
42
|
"body": params
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "un-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.70",
|
|
4
4
|
"description": "Command line interface for working with ArcGIS Utility Network Extension",
|
|
5
5
|
"main": "index.mjs",
|
|
6
6
|
"bin": {
|
|
@@ -17,8 +17,6 @@
|
|
|
17
17
|
"author": "Hussein Nasser",
|
|
18
18
|
"license": "ISC",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"node-fetch": "^2.6.0"
|
|
21
|
-
"progress": "^2.0.3",
|
|
22
|
-
"winston": "^3.2.1"
|
|
20
|
+
"node-fetch": "^2.6.0"
|
|
23
21
|
}
|
|
24
22
|
}
|
package/portal.mjs
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { makeRequest } from "./makerequest.mjs"
|
|
2
|
-
import
|
|
2
|
+
import logger from "./logger.mjs"
|
|
3
3
|
|
|
4
4
|
export class Portal{
|
|
5
5
|
|
|
6
|
-
constructor(url, username, password, expiration = 300, serverUrl = undefined)
|
|
6
|
+
constructor(url, username, password, expiration = 300, serverUrl = undefined, referer)
|
|
7
7
|
{
|
|
8
8
|
this.url = url;
|
|
9
9
|
this.username = username;
|
|
10
10
|
this.password = password;
|
|
11
11
|
this.expiration = expiration;
|
|
12
12
|
this.serverUrl = serverUrl;
|
|
13
|
+
this.referer = referer
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
|
|
@@ -25,7 +26,7 @@ export class Portal{
|
|
|
25
26
|
const postJson = {
|
|
26
27
|
username: self.username,
|
|
27
28
|
password: self.password,
|
|
28
|
-
referer:
|
|
29
|
+
referer: self.referer,
|
|
29
30
|
expiration: self.expiration,
|
|
30
31
|
f: "json"
|
|
31
32
|
}
|
|
@@ -71,7 +72,7 @@ export class Portal{
|
|
|
71
72
|
token: self.token
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
const serversUrl = self.url +
|
|
75
|
+
const serversUrl = self.url + `/sharing/rest/portals/self/servers?token=${self.token}`
|
|
75
76
|
logger.info( "About to query federated servers");
|
|
76
77
|
|
|
77
78
|
//query for federated servers.
|