un-cli 0.0.56 → 0.0.57
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 +33 -0
- package/cmd.txt +1 -1
- package/index.mjs +85 -2
- package/package.json +1 -1
package/adminlog.mjs
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
//Author : Hussein Nasser
|
|
3
|
+
//Date : Oct-13-2021
|
|
4
|
+
//Twitter: @hnasr
|
|
5
|
+
import fetch from "node-fetch";
|
|
6
|
+
import { logger } from "./logger.mjs"
|
|
7
|
+
|
|
8
|
+
export class AdminLog {
|
|
9
|
+
|
|
10
|
+
constructor(token, serverUrl)
|
|
11
|
+
{
|
|
12
|
+
this.adminServerUrl = serverUrl + "/admin";
|
|
13
|
+
this.token = token;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
query (codes, serviceName ="*", pageSize = 10000)
|
|
17
|
+
{
|
|
18
|
+
const url = this.adminServerUrl + "/logs/query?f=pjson"
|
|
19
|
+
const level = "DEBUG"
|
|
20
|
+
const filterType="json"
|
|
21
|
+
const token = this.token
|
|
22
|
+
const filter = {
|
|
23
|
+
"codes": codes,
|
|
24
|
+
"services": serviceName
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const queryLogUrl = url + `&token=${token}&level=${level}&filterType=${filterType}&filter=${encodeURIComponent(JSON.stringify(filter))}&pageSize=${pageSize}`
|
|
28
|
+
logger.info(queryLogUrl);
|
|
29
|
+
return fetch(queryLogUrl);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
}
|
package/cmd.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
arlogs --byrule
|
package/index.mjs
CHANGED
|
@@ -2,10 +2,12 @@ import readline from "readline"
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import { Portal } from "./portal.mjs"
|
|
4
4
|
import { UtilityNetwork } from "./utilitynetwork.node.mjs"
|
|
5
|
+
import { AdminLog } from "./adminlog.mjs"
|
|
6
|
+
|
|
5
7
|
import { logger } from "./logger.mjs"
|
|
6
8
|
import fetch from "node-fetch"
|
|
7
9
|
//update version
|
|
8
|
-
let version = "0.0.
|
|
10
|
+
let version = "0.0.57";
|
|
9
11
|
const GENERATE_TOKEN_TIME_MIN = 30;
|
|
10
12
|
|
|
11
13
|
let rl = null;
|
|
@@ -14,7 +16,7 @@ let rl = null;
|
|
|
14
16
|
//uncli --portal https://utilitynetwork.esri.com/portal --service AllStar_oracle --user unadmin --password unadmin.108
|
|
15
17
|
let portal = null;
|
|
16
18
|
let un = null;
|
|
17
|
-
|
|
19
|
+
let adminLog = null;
|
|
18
20
|
|
|
19
21
|
//parse input for parameters
|
|
20
22
|
function parseInput(){
|
|
@@ -98,6 +100,8 @@ async function connect(parameters) {
|
|
|
98
100
|
|
|
99
101
|
const serviceUrl = portal.serverUrl + `/rest/services/${parameters.service}/FeatureServer`
|
|
100
102
|
un = new UtilityNetwork(token, serviceUrl, parameters.gdbversion)
|
|
103
|
+
//create a new admin object (user might not be admin we won't use it until the user call log )
|
|
104
|
+
adminLog = new AdminLog(token, portal.serverUrl)
|
|
101
105
|
console.log("Loading utility network...")
|
|
102
106
|
await un.load();
|
|
103
107
|
console.log("Connected.")
|
|
@@ -172,6 +176,9 @@ const inputs = {
|
|
|
172
176
|
"export subnetworks --deleted": "Export all subnetworks with ACK that are deleted ",
|
|
173
177
|
"count": "Lists the number of rows in all feature layers.",
|
|
174
178
|
"count --system": "Lists the number of rows in system layers.",
|
|
179
|
+
"connect --service": "Connects to the another service",
|
|
180
|
+
"arlogs": "Lists attribute rules execution logs (requires admin)",
|
|
181
|
+
"arlogs --byrule": "Lists attribute rules execution summary by rule (requires admin)",
|
|
175
182
|
"whoami": "Lists the current login info",
|
|
176
183
|
"clear": "Clears this screen",
|
|
177
184
|
"quit": "Exit this program"
|
|
@@ -665,6 +672,82 @@ const inputs = {
|
|
|
665
672
|
|
|
666
673
|
},
|
|
667
674
|
|
|
675
|
+
"^arlogs$": async () => {
|
|
676
|
+
console.log(`Querying attribute rules logs for ${parameters.service} ...`)
|
|
677
|
+
const result= await adminLog.query([102003], parameters.service)
|
|
678
|
+
const jsonRes = await result.json()
|
|
679
|
+
const arMessages = jsonRes.logMessages
|
|
680
|
+
.filter(m => m.message.indexOf("Attribute rule execution complete:") > -1)
|
|
681
|
+
.map (m => JSON.parse(m.message.replace("Attribute rule execution complete:", "")))
|
|
682
|
+
.map( m => {
|
|
683
|
+
m["Elapsed Time (ms)"] = Math.round(m["Elapsed Time"]*1000000)/1000
|
|
684
|
+
// m["Arcade Evaluation Time:"] = Math.round(m["Arcade Evaluation Time:"]*1000,6)
|
|
685
|
+
//m.ArcadeTime = m["Arcade Evaluation Time:"]
|
|
686
|
+
|
|
687
|
+
delete m["Arcade Evaluation Time:"];
|
|
688
|
+
delete m["Elapsed Time"];
|
|
689
|
+
//delete m ['GlobalID'];
|
|
690
|
+
return m
|
|
691
|
+
})
|
|
692
|
+
.sort( (m1, m2) => m2["Elapsed Time (ms)"]- m1["Elapsed Time (ms)"])
|
|
693
|
+
console.table(arMessages)
|
|
694
|
+
/*
|
|
695
|
+
code:102003
|
|
696
|
+
elapsed:''
|
|
697
|
+
machine:'DEV0015932.ESRI.COM'
|
|
698
|
+
message:'requestProperties = {"token":"HfauSFGoSwTMA5KLvsL-I8EORea_KEvz1GcAMNCsvTuzeJ1QuYbQm0EGI7eC2zr1lOm8857U18oZOjG0BeuEwKj7fvCk-_DuWKFvClU5p06SRLE8RjEzPB0gjMTFQnjVnTRmQzZFWXCj1VRssMECQg..","referer":null,"privilege":"ADMINISTER","privileges":["features:user:edit","features:user:fullEdit","features:user:manageVersions","portal:user:viewTracks","premium:user:geocode:stored","premium:user:geocode:temporary","premium:user:networkanalysis:closestfacility","premium:user:networkanalysis:locationallocation","premium:user:networkanalysis:optimizedrouting","premium:user:networkanalysis:origindestinationcostmatrix","premium:user:networkanalysis:routing","premium:user:networkanalysis:servicearea","premium:user:networkanalysis:vehiclerouting","traceNetwork","utilityNetwork","parcelFabric"],"securityProvider":"portal"}'
|
|
699
|
+
methodName:'GetServerEnvironmentRequestProperties'
|
|
700
|
+
process:'30940'
|
|
701
|
+
requestID:'fccb7fba-cba9-4ebb-84b2-cb3645979d8e'
|
|
702
|
+
source:'RedTrolley_Postgres.MapServer'
|
|
703
|
+
thread:'29408'
|
|
704
|
+
time:1634165691074
|
|
705
|
+
type:'DEBUG'
|
|
706
|
+
user:'unadmin'
|
|
707
|
+
*/
|
|
708
|
+
|
|
709
|
+
},
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
"^arlogs --byrule$": async () => {
|
|
713
|
+
console.log(`Querying attribute rules logs for ${parameters.service} ...`)
|
|
714
|
+
const result= await adminLog.query([102003], parameters.service)
|
|
715
|
+
const jsonRes = await result.json()
|
|
716
|
+
const arMessages = jsonRes.logMessages
|
|
717
|
+
.filter(m => m.message.indexOf("Attribute rule execution complete:") > -1)
|
|
718
|
+
.map (m => JSON.parse(m.message.replace("Attribute rule execution complete:", "")))
|
|
719
|
+
.map( m => {
|
|
720
|
+
m["Elapsed Time (ms)"] = Math.round(m["Elapsed Time"]*1000000)/1000
|
|
721
|
+
// m["Arcade Evaluation Time:"] = Math.round(m["Arcade Evaluation Time:"]*1000,6)
|
|
722
|
+
//m.ArcadeTime = m["Arcade Evaluation Time:"]
|
|
723
|
+
|
|
724
|
+
delete m["Arcade Evaluation Time:"];
|
|
725
|
+
delete m["Elapsed Time"];
|
|
726
|
+
//delete m ['GlobalID'];
|
|
727
|
+
return m
|
|
728
|
+
})
|
|
729
|
+
.sort( (m1, m2) => m2["Elapsed Time (ms)"]- m1["Elapsed Time (ms)"])
|
|
730
|
+
.reduce( ( prev, cur ) => {
|
|
731
|
+
if (prev [cur["Rule name"]] === undefined)
|
|
732
|
+
prev [cur["Rule name"]] = 0;
|
|
733
|
+
|
|
734
|
+
prev [cur["Rule name"]] = cur["Elapsed Time (ms)"]
|
|
735
|
+
return prev
|
|
736
|
+
}, {})
|
|
737
|
+
|
|
738
|
+
const rules = Object.keys(arMessages)
|
|
739
|
+
.map(a => {
|
|
740
|
+
|
|
741
|
+
const rule = {}
|
|
742
|
+
rule["Attribute Rule"] = a;
|
|
743
|
+
rule["Total Cost (ms)"] = arMessages[a];
|
|
744
|
+
return rule;
|
|
745
|
+
})
|
|
746
|
+
.sort( (m1, m2) => m2["Total Cost (ms)"] -m1["Total Cost (ms)"])
|
|
747
|
+
console.table(rules)
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
},
|
|
668
751
|
|
|
669
752
|
"^version$": () => console.log(version),
|
|
670
753
|
"^clear$|^cls$": () => console.clear(),
|