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 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
- count --system
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.56";
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(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "un-cli",
3
- "version": "0.0.56",
3
+ "version": "0.0.57",
4
4
  "description": "Command line interface for working with ArcGIS Utility Network Extension",
5
5
  "main": "index.mjs",
6
6
  "bin": {