Added server data collection and charting.

Ylian Saint-Hilaire committed Mar 25, 2019 at 19:59 UTC 3c2fd023bfcc8bb0d9e5ce6a00b72e1d6969f816
7 files changed +549 -508
db.js
+34
@@ -30,6 +30,7 @@ module.exports.CreateDB = function (parent) {
30 var Datastore = null;
31 var expireEventsSeconds = (60 * 60 * 24 * 20); // By default, expire events after 20 days. (Seconds * Minutes * Hours * Days)
32 var expirePowerEventsSeconds = (60 * 60 * 24 * 10); // By default, expire power events after 10 days. (Seconds * Minutes * Hours * Days)
33 + var expireServerStatsSeconds = (60 * 60 * 24 * 30); // By default, expire power events after 30 days. (Seconds * Minutes * Hours * Days)
34 obj.path = require('path');
35 obj.parent = parent;
36 obj.identifier = null;
@@ -39,6 +40,7 @@ module.exports.CreateDB = function (parent) {
40 if (typeof obj.parent.args.dbexpire == 'object') {
41 if (typeof obj.parent.args.dbexpire.events == 'number') { expireEventsSeconds = obj.parent.args.dbexpire.events; }
42 if (typeof obj.parent.args.dbexpire.powerevents == 'number') { expirePowerEventsSeconds = obj.parent.args.dbexpire.powerevents; }
43 + if (typeof obj.parent.args.dbexpire.statsevents == 'number') { expireServerStatsSeconds = obj.parent.args.dbexpire.statsevents; }
44 }
45
46 if (obj.parent.args.mongodb) {
@@ -115,6 +117,29 @@ module.exports.CreateDB = function (parent) {
117
118 // Setup MongoDB smbios collection, no indexes needed
119 obj.smbiosfile = db.collection('smbios'); // Collection containing all smbios information
120 +
121 + // Setup MongoDB server stats collection
122 + obj.serverstatsfile = db.collection('serverstats'); // Collection of server stats
123 + obj.serverstatsfile.getIndexes(function (err, indexes) {
124 + // Check if we need to reset indexes
125 + var indexesByName = {}, indexCount = 0;
126 + for (var i in indexes) { indexesByName[indexes[i].name] = indexes[i]; indexCount++; }
127 + if ((indexCount != 2) || (indexesByName['ExpireTime1'] == null)) {
128 + // Reset all indexes
129 + console.log('Resetting server stats indexes...');
130 + obj.serverstatsfile.dropIndexes(function (err) {
131 + // Create all indexes
132 + obj.serverstatsfile.createIndex({ "time": 1 }, { expireAfterSeconds: expireServerStatsSeconds, name: 'ExpireTime1' });
133 + });
134 + } else if (indexesByName['ExpireTime1'].expireAfterSeconds != expireServerStatsSeconds) {
135 + // Reset the timeout index
136 + console.log('Resetting server stats expire index...');
137 + obj.serverstatsfile.dropIndex("ExpireTime1", function (err) {
138 + // Reset the expire server stats index
139 + obj.serverstatsfile.createIndex({ "time": 1 }, { expireAfterSeconds: expireServerStatsSeconds, name: 'ExpireTime1' });
140 + });
141 + }
142 + });
143 } else {
144 // Use NeDB (The default)
145 obj.databaseType = 1;
@@ -167,6 +192,11 @@ module.exports.CreateDB = function (parent) {
192
193 // Setup the SMBIOS collection
194 obj.smbiosfile = new Datastore({ filename: obj.parent.getConfigFilePath('meshcentral-smbios.db'), autoload: true });
195 +
196 + // Setup the server stats collection and setup indexes
197 + obj.serverstatsfile = new Datastore({ filename: obj.parent.getConfigFilePath('meshcentral-stats.db'), autoload: true });
198 + obj.serverstatsfile.persistence.setAutocompactionInterval(36000);
199 + obj.serverstatsfile.ensureIndex({ fieldName: 'time', expireAfterSeconds: 60 * 60 * 24 * 30 }); // Limit the server stats log to 30 days (Seconds * Minutes * Hours * Days)
200 }
201
202 obj.SetupDatabase = function (func) {
@@ -305,6 +335,10 @@ module.exports.CreateDB = function (parent) {
335 obj.RemoveSMBIOS = function (id) { obj.smbiosfile.remove({ _id: id }); };
336 obj.GetSMBIOS = function (id, func) { obj.smbiosfile.find({ _id: id }, func); };
337
338 + // Database actions on the Server Stats collection
339 + obj.SetServerStats = function (data, func) { obj.serverstatsfile.insert(data, func); };
340 + obj.GetServerStats = function (hours, func) { var t = new Date(); t.setTime(t.getTime() - (60 * 60 * 1000 * hours)); obj.serverstatsfile.find({ time: { $gt: t } }, { _id: 0, cpu: 0 }, func); };
341 +
342 // Read a configuration file from the database
343 obj.getConfigFile = function (path, func) { obj.Get('cfile/' + path, func); }
344
meshcentral.js
+25 -2
@@ -800,6 +800,29 @@ function CreateMeshCentralServer(config, args) {
800 });
801 }
802
803 + // Start collecting server stats every 5 minutes
804 + setInterval(function () {
805 + obj.db.getStats(function (dbstats) {
806 + var data = {
807 + time: new Date(),
808 + mem: process.memoryUsage(),
809 + db: dbstats,
810 + cpu: process.cpuUsage(),
811 + conn: {
812 + ca: Object.keys(obj.webserver.wsagents).length,
813 + cu: Object.keys(obj.webserver.wssessions).length,
814 + us: Object.keys(obj.webserver.wssessions2).length,
815 + rs: obj.webserver.relaySessionCount
816 + }
817 + };
818 + if (obj.mpsserver != null) { data.conn.am = Object.keys(obj.mpsserver.ciraConnections).length; }
819 + obj.db.SetServerStats(data);
820 + });
821 +
822 +
823 +
824 + }, 300000);
825 +
826 //obj.debug(1, 'Server started');
827 if (obj.args.nousers == true) { obj.updateServerState('nousers', '1'); }
828 obj.updateServerState('state', 'running');
@@ -1599,7 +1622,7 @@ function InstallModules(modules, func) {
1622 var missingModules = [];
1623 if (modules.length > 0) {
1624 for (var i in modules) { try { var xxmodule = require(modules[i]); } catch (e) { missingModules.push(modules[i]); } }
1602 - if (missingModules.length > 0) { InstallModule(missingModules.join(' '), InstallModules, modules, func); } else { func(); }
1625 + if (missingModules.length > 0) { InstallModule(missingModules.shift(), InstallModules, modules, func); } else { func(); }
1626 }
1627 }
1628
@@ -1610,7 +1633,7 @@ function InstallModule(modulename, func, tag1, tag2) {
1633 var child_process = require('child_process');
1634
1635 // Looks like we need to keep a global reference to the child process object for this to work correctly.
1613 - InstallModuleChildProcess = child_process.exec('npm install ' + modulename + ' --no-optional --save', { maxBuffer: 512000, timeout: 10000 }, function (error, stdout, stderr) {
1636 + InstallModuleChildProcess = child_process.exec('npm install --no-optional --save ' + modulename, { maxBuffer: 512000, timeout: 10000 }, function (error, stdout, stderr) {
1637 InstallModuleChildProcess = null;
1638 if (error != null) { console.log('ERROR: Unable to install missing package \'' + modulename + '\', make sure npm is installed: ' + error); process.exit(); return; }
1639 func(tag1, tag2);
meshuser.js
+17 -9
@@ -261,17 +261,25 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
261 try { ws.send(JSON.stringify({ action: 'authcookie', cookie: parent.parent.encodeCookie({ userid: user._id, domainid: domain.id }, parent.parent.loginCookieEncryptionKey) })); } catch (ex) { }
262 break;
263 }
264 + case 'servertimelinestats':
265 + {
266 + if ((user.siteadmin & 21) == 0) return; // Only site administrators with "site backup" or "site restore" or "site update" permissions can use this.
267 + if (common.validateInt(command.hours, 0, 24 * 30) == false) return;
268 + db.GetServerStats(command.hours, function (err, docs) {
269 + if (err == null) { ws.send(JSON.stringify({ action: 'servertimelinestats', events: docs })); }
270 + });
271 + break;
272 + }
273 case 'serverstats':
274 {
266 - if ((user.siteadmin & 21) != 0) { // Only site administrators with "site backup" or "site restore" or "site update" permissions can use this.
267 - if (common.validateInt(command.interval, 1000, 1000000) == false) {
268 - // Clear the timer
269 - if (obj.serverStatsTimer != null) { clearInterval(obj.serverStatsTimer); delete obj.serverStatsTimer; }
270 - } else {
271 - // Set the timer
272 - obj.SendServerStats();
273 - obj.serverStatsTimer = setInterval(obj.SendServerStats, command.interval);
274 - }
275 + if ((user.siteadmin & 21) == 0) return; // Only site administrators with "site backup" or "site restore" or "site update" permissions can use this.
276 + if (common.validateInt(command.interval, 1000, 1000000) == false) {
277 + // Clear the timer
278 + if (obj.serverStatsTimer != null) { clearInterval(obj.serverStatsTimer); delete obj.serverStatsTimer; }
279 + } else {
280 + // Set the timer
281 + obj.SendServerStats();
282 + obj.serverStatsTimer = setInterval(obj.SendServerStats, command.interval);
283 }
284 break;
285 }
package - Copy.json deleted
-57
@@ -1,57 +0,0 @@
1 -{
2 - "name": "meshcentral",
3 - "version": "0.3.0-x",
4 - "keywords": [
5 - "Remote Management",
6 - "Intel AMT",
7 - "Active Management",
8 - "Remote Desktop"
9 - ],
10 - "homepage": "http://meshcommander.com",
11 - "description": "Web based remote computer management and file server",
12 - "author": "Ylian Saint-Hilaire <ysainthilaire@hotmail.com>",
13 - "main": "meshcentral.js",
14 - "bin": {
15 - "meshcentral": "./bin/meshcentral"
16 - },
17 - "license": "Apache-2.0",
18 - "files": [
19 - "*.js",
20 - "sample-config.json",
21 - "license.txt",
22 - "readme.txt",
23 - "agents",
24 - "public",
25 - "views",
26 - "bin"
27 - ],
28 - "dependencies": {
29 - "archiver": "^3.0.0",
30 - "authdog": "^0.1.1",
31 - "body-parser": "^1.18.2",
32 - "compression": "^1.7.3",
33 - "connect-redis": "^3.4.0",
34 - "cookie-session": "^2.0.0-beta.3",
35 - "express": "^4.16.4",
36 - "express-handlebars": "^3.0.0",
37 - "express-ws": "^4.0.0",
38 - "ipcheck": "^0.1.0",
39 - "meshcentral": "*",
40 - "minimist": "^1.2.0",
41 - "mongojs": "^2.6.0",
42 - "multiparty": "^4.2.1",
43 - "nedb": "^1.8.0",
44 - "node-forge": "^0.7.6",
45 - "otplib": "^10.0.1",
46 - "ws": "^6.1.2",
47 - "xmldom": "^0.1.27",
48 - "yauzl": "^2.10.0",
49 - "yubikeyotp": "^0.2.0"
50 - },
51 - "devDependencies": {},
52 - "repository": {
53 - "type": "git",
54 - "url": "https://github.com/Ylianst/MeshCentral.git"
55 - },
56 - "readme": "readme.txt"
57 -}
package-lock.json
+345 -429
@@ -1,6 +1,6 @@
1 {
2 "name": "meshcentral",
3 - "version": "0.3.0-u",
3 + "version": "0.3.1-a",
4 "lockfileVersion": 1,
5 "requires": true,
6 "dependencies": {
@@ -9,14 +9,14 @@
9 "resolved": "https://registry.npmjs.org/@davedoesdev/fido2-lib/-/fido2-lib-2.4.0.tgz",
10 "integrity": "sha512-qBNCio4amWMxDe7e8VG3wOo3iu/cFxzLpZ+vzRhLDYbQpZVBhJxFyYXCak33+1qPkDHJOSLZBU7x5jyruU1RMA==",
11 "requires": {
12 - "@peculiar/webcrypto": "^1.0.1",
13 - "asn1js": "^2.0.18",
14 - "cbor": "^4.0.0",
15 - "cose-to-jwk": "^1.1.0",
16 - "jwk-to-pem": "^2.0.0",
17 - "node-jose": "^1.0.0",
18 - "pkijs": "=2.1.58",
19 - "psl": "^1.1.24"
12 + "@peculiar/webcrypto": "1.0.8",
13 + "asn1js": "2.0.22",
14 + "cbor": "4.1.5",
15 + "cose-to-jwk": "1.1.0",
16 + "jwk-to-pem": "2.0.1",
17 + "node-jose": "1.1.3",
18 + "pkijs": "2.1.58",
19 + "psl": "1.1.29"
20 }
21 },
22 "@peculiar/asn1-schema": {
@@ -24,8 +24,8 @@
24 "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-1.0.3.tgz",
25 "integrity": "sha512-Tfgj9eNJ6cTKEtEuidKenLHMx/Q5M8KEE9hnohHqvdpqHJXWYr5RlT3GjAHPjGXy5+mr7sSfuXfzE6aAkEGN7A==",
26 "requires": {
27 - "asn1js": "^2.0.22",
28 - "tslib": "^1.9.3"
27 + "asn1js": "2.0.22",
28 + "tslib": "1.9.3"
29 }
30 },
31 "@peculiar/json-schema": {
@@ -33,7 +33,7 @@
33 "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.5.tgz",
34 "integrity": "sha512-y5XYA3pf9+c+YKVpWnPtQbNmlNCs2ehNHyMLJvq4K5Fjwc1N64YGy7MNecKW3uYLga+sqbGTQSUdOdlnaRRbpA==",
35 "requires": {
36 - "tslib": "^1.9.3"
36 + "tslib": "1.9.3"
37 }
38 },
39 "@peculiar/webcrypto": {
@@ -41,12 +41,12 @@
41 "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.0.8.tgz",
42 "integrity": "sha512-zOCwDimHbQeUgSdBCHnw/69wbA1ks+aUt1MPAttcWNOlXaZjbUppc8shtwX/mzDQYctzNGFlI8Xrayl7lBUe5A==",
43 "requires": {
44 - "@peculiar/asn1-schema": "^1.0.2",
45 - "@peculiar/json-schema": "^1.1.5",
46 - "asn1js": "^2.0.22",
47 - "pvtsutils": "^1.0.4",
48 - "tslib": "^1.9.3",
49 - "webcrypto-core": "^1.0.10"
44 + "@peculiar/asn1-schema": "1.0.3",
45 + "@peculiar/json-schema": "1.1.5",
46 + "asn1js": "2.0.22",
47 + "pvtsutils": "1.0.4",
48 + "tslib": "1.9.3",
49 + "webcrypto-core": "1.0.11"
50 }
51 },
52 "@types/node": {
@@ -59,30 +59,29 @@
59 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
60 "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
61 "requires": {
62 - "mime-types": "~2.1.18",
62 + "mime-types": "2.1.21",
63 "negotiator": "0.6.1"
64 }
65 },
66 "ajv": {
67 - "version": "6.6.1",
68 - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz",
69 - "integrity": "sha1-Y2D17Q2A8jLMKylMNi1dwuU43WE=",
67 + "version": "6.10.0",
68 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
69 + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
70 "requires": {
71 - "fast-deep-equal": "^2.0.1",
72 - "fast-json-stable-stringify": "^2.0.0",
73 - "json-schema-traverse": "^0.4.1",
74 - "uri-js": "^4.2.2"
71 + "fast-deep-equal": "2.0.1",
72 + "fast-json-stable-stringify": "2.0.0",
73 + "json-schema-traverse": "0.4.1",
74 + "uri-js": "4.2.2"
75 }
76 },
77 "align-text": {
78 "version": "0.1.4",
79 "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
80 "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
81 - "optional": true,
81 "requires": {
83 - "kind-of": "^3.0.2",
84 - "longest": "^1.0.1",
85 - "repeat-string": "^1.5.2"
82 + "kind-of": "3.2.2",
83 + "longest": "1.0.1",
84 + "repeat-string": "1.6.1"
85 }
86 },
87 "amdefine": {
@@ -95,13 +94,13 @@
94 "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.0.0.tgz",
95 "integrity": "sha1-ULJijPAyrcvzXTXREbUyTblb+2k=",
96 "requires": {
98 - "archiver-utils": "^2.0.0",
99 - "async": "^2.0.0",
100 - "buffer-crc32": "^0.2.1",
101 - "glob": "^7.0.0",
102 - "readable-stream": "^2.0.0",
103 - "tar-stream": "^1.5.0",
104 - "zip-stream": "^2.0.1"
97 + "archiver-utils": "2.0.0",
98 + "async": "2.6.1",
99 + "buffer-crc32": "0.2.13",
100 + "glob": "7.1.3",
101 + "readable-stream": "2.3.6",
102 + "tar-stream": "1.6.2",
103 + "zip-stream": "2.0.1"
104 },
105 "dependencies": {
106 "async": {
@@ -109,7 +108,7 @@
108 "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
109 "integrity": "sha1-skWiPKcZMAROxT+kaqAKPofGphA=",
110 "requires": {
112 - "lodash": "^4.17.10"
111 + "lodash": "4.17.11"
112 }
113 }
114 }
@@ -119,18 +118,18 @@
118 "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.0.0.tgz",
119 "integrity": "sha1-VjmBiotdidD/xRtyw5KDz0/qFKE=",
120 "requires": {
122 - "glob": "^7.0.0",
123 - "graceful-fs": "^4.1.0",
124 - "lazystream": "^1.0.0",
125 - "lodash.assign": "^4.2.0",
126 - "lodash.defaults": "^4.2.0",
127 - "lodash.difference": "^4.5.0",
128 - "lodash.flatten": "^4.4.0",
129 - "lodash.isplainobject": "^4.0.6",
130 - "lodash.toarray": "^4.4.0",
131 - "lodash.union": "^4.6.0",
132 - "normalize-path": "^3.0.0",
133 - "readable-stream": "^2.0.0"
121 + "glob": "7.1.3",
122 + "graceful-fs": "4.1.15",
123 + "lazystream": "1.0.0",
124 + "lodash.assign": "4.2.0",
125 + "lodash.defaults": "4.2.0",
126 + "lodash.difference": "4.5.0",
127 + "lodash.flatten": "4.4.0",
128 + "lodash.isplainobject": "4.0.6",
129 + "lodash.toarray": "4.4.0",
130 + "lodash.union": "4.6.0",
131 + "normalize-path": "3.0.0",
132 + "readable-stream": "2.3.6"
133 }
134 },
135 "array-flatten": {
@@ -146,9 +145,9 @@
145 "asn1": {
146 "version": "0.2.4",
147 "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
149 - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=",
148 + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
149 "requires": {
151 - "safer-buffer": "~2.1.0"
150 + "safer-buffer": "2.1.2"
151 }
152 },
153 "asn1.js": {
@@ -156,9 +155,9 @@
155 "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
156 "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
157 "requires": {
159 - "bn.js": "^4.0.0",
160 - "inherits": "^2.0.1",
161 - "minimalistic-assert": "^1.0.0"
158 + "bn.js": "4.11.8",
159 + "inherits": "2.0.3",
160 + "minimalistic-assert": "1.0.1"
161 }
162 },
163 "asn1js": {
@@ -166,7 +165,7 @@
165 "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.22.tgz",
166 "integrity": "sha512-mKox8OHPmLZY0FUbd8JYsAu2lQk61yFH8gTq4N7AT7NzmUKISpy0LEjV/AfLyE/SNCUicdMDZUFbocsf/9qOTg==",
167 "requires": {
169 - "pvutils": "^1.0.17"
168 + "pvutils": "1.0.17"
169 }
170 },
171 "assert-plus": {
@@ -189,11 +188,6 @@
188 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
189 "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
190 },
192 - "authdog": {
193 - "version": "0.1.1",
194 - "resolved": "https://registry.npmjs.org/authdog/-/authdog-0.1.1.tgz",
195 - "integrity": "sha1-1uFBImEwCvtvWnuvaMqjy+984a4="
196 - },
191 "aws-sign2": {
192 "version": "0.7.0",
193 "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -202,7 +196,7 @@
196 "aws4": {
197 "version": "1.8.0",
198 "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
205 - "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8="
199 + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
200 },
201 "balanced-match": {
202 "version": "1.0.0",
@@ -224,7 +218,7 @@
218 "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
219 "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
220 "requires": {
227 - "tweetnacl": "^0.14.3"
221 + "tweetnacl": "0.14.5"
222 }
223 },
224 "bignumber.js": {
@@ -237,7 +231,7 @@
231 "resolved": "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz",
232 "integrity": "sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q=",
233 "requires": {
240 - "underscore": "~1.4.4"
234 + "underscore": "1.4.4"
235 }
236 },
237 "bl": {
@@ -245,8 +239,8 @@
239 "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
240 "integrity": "sha1-oWCRFxcQPAdBDO9j71Gzl8Alr5w=",
241 "requires": {
248 - "readable-stream": "^2.3.5",
249 - "safe-buffer": "^5.1.1"
242 + "readable-stream": "2.3.6",
243 + "safe-buffer": "5.1.1"
244 }
245 },
246 "bn.js": {
@@ -260,15 +254,15 @@
254 "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
255 "requires": {
256 "bytes": "3.0.0",
263 - "content-type": "~1.0.4",
257 + "content-type": "1.0.4",
258 "debug": "2.6.9",
265 - "depd": "~1.1.1",
266 - "http-errors": "~1.6.2",
259 + "depd": "1.1.2",
260 + "http-errors": "1.6.3",
261 "iconv-lite": "0.4.19",
268 - "on-finished": "~2.3.0",
262 + "on-finished": "2.3.0",
263 "qs": "6.5.1",
264 "raw-body": "2.3.2",
271 - "type-is": "~1.6.15"
265 + "type-is": "1.6.16"
266 },
267 "dependencies": {
268 "iconv-lite": {
@@ -305,7 +299,7 @@
299 "depd": "1.1.1",
300 "inherits": "2.0.3",
301 "setprototypeof": "1.0.3",
308 - "statuses": ">= 1.3.1 < 2"
302 + "statuses": "1.4.0"
303 }
304 }
305 }
@@ -322,7 +316,7 @@
316 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
317 "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
318 "requires": {
325 - "balanced-match": "^1.0.0",
319 + "balanced-match": "1.0.0",
320 "concat-map": "0.0.1"
321 }
322 },
@@ -341,8 +335,8 @@
335 "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
336 "integrity": "sha1-3Vf6DxCaxZxgJHkETcp7iz0LcdY=",
337 "requires": {
344 - "base64-js": "^1.0.2",
345 - "ieee754": "^1.1.4"
338 + "base64-js": "1.3.0",
339 + "ieee754": "1.1.12"
340 }
341 },
342 "buffer-alloc": {
@@ -350,8 +344,8 @@
344 "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
345 "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=",
346 "requires": {
353 - "buffer-alloc-unsafe": "^1.1.0",
354 - "buffer-fill": "^1.0.0"
347 + "buffer-alloc-unsafe": "1.1.0",
348 + "buffer-fill": "1.0.0"
349 }
350 },
351 "buffer-alloc-unsafe": {
@@ -400,10 +394,10 @@
394 "resolved": "https://registry.npmjs.org/cbor/-/cbor-4.1.5.tgz",
395 "integrity": "sha512-WqpISHl7/kk1u1uoaqctGyGiET3+wGN4A6pPsFCzEBztJJlCVxnMB4JwcuuNSrMiV4V6UBlxMkhNzJrUxDWO1A==",
396 "requires": {
403 - "bignumber.js": "^8.0.2",
404 - "commander": "^2.19.0",
405 - "json-text-sequence": "^0.1",
406 - "nofilter": "^1.0.1"
397 + "bignumber.js": "8.1.1",
398 + "commander": "2.19.0",
399 + "json-text-sequence": "0.1.1",
400 + "nofilter": "1.0.2"
401 }
402 },
403 "center-align": {
@@ -412,8 +406,8 @@
406 "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
407 "optional": true,
408 "requires": {
415 - "align-text": "^0.1.3",
416 - "lazy-cache": "^1.0.3"
409 + "align-text": "0.1.4",
410 + "lazy-cache": "1.0.4"
411 }
412 },
413 "cliui": {
@@ -422,8 +416,8 @@
416 "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
417 "optional": true,
418 "requires": {
425 - "center-align": "^0.1.1",
426 - "right-align": "^0.1.1",
419 + "center-align": "0.1.3",
420 + "right-align": "0.1.3",
421 "wordwrap": "0.0.2"
422 },
423 "dependencies": {
@@ -438,9 +432,9 @@
432 "combined-stream": {
433 "version": "1.0.7",
434 "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
441 - "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=",
435 + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
436 "requires": {
443 - "delayed-stream": "~1.0.0"
437 + "delayed-stream": "1.0.0"
438 }
439 },
440 "commander": {
@@ -453,10 +447,10 @@
447 "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
448 "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
449 "requires": {
456 - "buffer-crc32": "^0.2.1",
457 - "crc32-stream": "^2.0.0",
458 - "normalize-path": "^2.0.0",
459 - "readable-stream": "^2.0.0"
450 + "buffer-crc32": "0.2.13",
451 + "crc32-stream": "2.0.0",
452 + "normalize-path": "2.1.1",
453 + "readable-stream": "2.3.6"
454 },
455 "dependencies": {
456 "normalize-path": {
@@ -464,7 +458,7 @@
458 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
459 "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
460 "requires": {
467 - "remove-trailing-separator": "^1.0.1"
461 + "remove-trailing-separator": "1.1.0"
462 }
463 }
464 }
@@ -474,7 +468,7 @@
468 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
469 "integrity": "sha1-hXqasKfloH2Ng37UP+Le//ZP4hI=",
470 "requires": {
477 - "mime-db": ">= 1.36.0 < 2"
471 + "mime-db": "1.37.0"
472 },
473 "dependencies": {
474 "mime-db": {
@@ -489,13 +483,13 @@
483 "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
484 "integrity": "sha1-J+DhdqryYPfywoE8PkQK258Zk9s=",
485 "requires": {
492 - "accepts": "~1.3.5",
486 + "accepts": "1.3.5",
487 "bytes": "3.0.0",
494 - "compressible": "~2.0.14",
488 + "compressible": "2.0.15",
489 "debug": "2.6.9",
496 - "on-headers": "~1.0.1",
490 + "on-headers": "1.0.1",
491 "safe-buffer": "5.1.2",
498 - "vary": "~1.1.2"
492 + "vary": "1.1.2"
493 },
494 "dependencies": {
495 "accepts": {
@@ -503,7 +497,7 @@
497 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
498 "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
499 "requires": {
506 - "mime-types": "~2.1.18",
500 + "mime-types": "2.1.21",
501 "negotiator": "0.6.1"
502 }
503 },
@@ -517,7 +511,7 @@
511 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
512 "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=",
513 "requires": {
520 - "mime-db": "~1.37.0"
514 + "mime-db": "1.37.0"
515 }
516 },
517 "safe-buffer": {
@@ -537,8 +531,8 @@
531 "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-3.4.0.tgz",
532 "integrity": "sha1-QEDdN1W92/k0ePuEk3p0BSwxuWU=",
533 "requires": {
540 - "debug": "^4.0.1",
541 - "redis": "^2.8.0"
534 + "debug": "4.1.0",
535 + "redis": "2.8.0"
536 },
537 "dependencies": {
538 "debug": {
@@ -546,7 +540,7 @@
540 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
541 "integrity": "sha1-NzaHv/pnizixzZH4YbY4UANd3Ic=",
542 "requires": {
549 - "ms": "^2.1.1"
543 + "ms": "2.1.1"
544 }
545 },
546 "ms": {
@@ -578,7 +572,7 @@
572 "requires": {
573 "cookies": "0.7.1",
574 "debug": "3.1.0",
581 - "on-headers": "~1.0.1",
575 + "on-headers": "1.0.1",
576 "safe-buffer": "5.1.1"
577 },
578 "dependencies": {
@@ -602,8 +596,8 @@
596 "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.1.tgz",
597 "integrity": "sha1-fIphX1SBxhq58WyDNzG8uPZjuZs=",
598 "requires": {
605 - "depd": "~1.1.1",
606 - "keygrip": "~1.0.2"
599 + "depd": "1.1.2",
600 + "keygrip": "1.0.2"
601 }
602 },
603 "core-util-is": {
@@ -616,7 +610,7 @@
610 "resolved": "https://registry.npmjs.org/cose-to-jwk/-/cose-to-jwk-1.1.0.tgz",
611 "integrity": "sha512-DbR/XPptfo+kcoA77jWPTe4JS0MrpOXAg0sgVr2FeZMnTGGpppOL072e2hgPHTVbSoMkt5l0qDv/k2xCn+79Cg==",
612 "requires": {
619 - "cbor": "^4.0.0"
613 + "cbor": "4.1.5"
614 }
615 },
616 "crc": {
@@ -624,7 +618,7 @@
618 "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
619 "integrity": "sha1-rWAmnCyFb4wpnixMwN5FVpFAVsY=",
620 "requires": {
627 - "buffer": "^5.1.0"
621 + "buffer": "5.2.1"
622 }
623 },
624 "crc32-stream": {
@@ -632,8 +626,8 @@
626 "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
627 "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
628 "requires": {
635 - "crc": "^3.4.4",
636 - "readable-stream": "^2.0.0"
629 + "crc": "3.8.0",
630 + "readable-stream": "2.3.6"
631 }
632 },
633 "dashdash": {
@@ -641,7 +635,7 @@
635 "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
636 "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
637 "requires": {
644 - "assert-plus": "^1.0.0"
638 + "assert-plus": "1.0.0"
639 }
640 },
641 "debug": {
@@ -663,8 +657,8 @@
657 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
658 "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
659 "requires": {
666 - "foreach": "^2.0.5",
667 - "object-keys": "^1.0.8"
660 + "foreach": "2.0.5",
661 + "object-keys": "1.0.11"
662 }
663 },
664 "delayed-stream": {
@@ -702,8 +696,8 @@
696 "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
697 "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
698 "requires": {
705 - "jsbn": "~0.1.0",
706 - "safer-buffer": "^2.1.0"
699 + "jsbn": "0.1.1",
700 + "safer-buffer": "2.1.2"
701 }
702 },
703 "ee-first": {
@@ -716,13 +710,13 @@
710 "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
711 "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
712 "requires": {
719 - "bn.js": "^4.4.0",
720 - "brorand": "^1.0.1",
721 - "hash.js": "^1.0.0",
722 - "hmac-drbg": "^1.0.0",
723 - "inherits": "^2.0.1",
724 - "minimalistic-assert": "^1.0.0",
725 - "minimalistic-crypto-utils": "^1.0.0"
713 + "bn.js": "4.11.8",
714 + "brorand": "1.1.0",
715 + "hash.js": "1.1.7",
716 + "hmac-drbg": "1.0.1",
717 + "inherits": "2.0.3",
718 + "minimalistic-assert": "1.0.1",
719 + "minimalistic-crypto-utils": "1.0.1"
720 }
721 },
722 "encodeurl": {
@@ -735,29 +729,7 @@
729 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
730 "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=",
731 "requires": {
738 - "once": "^1.4.0"
739 - }
740 - },
741 - "es-abstract": {
742 - "version": "1.12.0",
743 - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
744 - "integrity": "sha1-nbvdJ8aFbwABQhyhh4LXhr+KYWU=",
745 - "requires": {
746 - "es-to-primitive": "^1.1.1",
747 - "function-bind": "^1.1.1",
748 - "has": "^1.0.1",
749 - "is-callable": "^1.1.3",
750 - "is-regex": "^1.0.4"
751 - }
752 - },
753 - "es-to-primitive": {
754 - "version": "1.2.0",
755 - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
756 - "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=",
757 - "requires": {
758 - "is-callable": "^1.1.4",
759 - "is-date-object": "^1.0.1",
760 - "is-symbol": "^1.0.2"
732 + "once": "1.4.0"
733 }
734 },
735 "es6-promise": {
@@ -780,36 +752,36 @@
752 "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
753 "integrity": "sha1-/d72GSYQniTFFeqX/S8b2/Yt8S4=",
754 "requires": {
783 - "accepts": "~1.3.5",
755 + "accepts": "1.3.5",
756 "array-flatten": "1.1.1",
757 "body-parser": "1.18.3",
758 "content-disposition": "0.5.2",
787 - "content-type": "~1.0.4",
759 + "content-type": "1.0.4",
760 "cookie": "0.3.1",
761 "cookie-signature": "1.0.6",
762 "debug": "2.6.9",
791 - "depd": "~1.1.2",
792 - "encodeurl": "~1.0.2",
793 - "escape-html": "~1.0.3",
794 - "etag": "~1.8.1",
763 + "depd": "1.1.2",
764 + "encodeurl": "1.0.2",
765 + "escape-html": "1.0.3",
766 + "etag": "1.8.1",
767 "finalhandler": "1.1.1",
768 "fresh": "0.5.2",
769 "merge-descriptors": "1.0.1",
798 - "methods": "~1.1.2",
799 - "on-finished": "~2.3.0",
800 - "parseurl": "~1.3.2",
770 + "methods": "1.1.2",
771 + "on-finished": "2.3.0",
772 + "parseurl": "1.3.2",
773 "path-to-regexp": "0.1.7",
802 - "proxy-addr": "~2.0.4",
774 + "proxy-addr": "2.0.4",
775 "qs": "6.5.2",
804 - "range-parser": "~1.2.0",
776 + "range-parser": "1.2.0",
777 "safe-buffer": "5.1.2",
778 "send": "0.16.2",
779 "serve-static": "1.13.2",
780 "setprototypeof": "1.1.0",
809 - "statuses": "~1.4.0",
810 - "type-is": "~1.6.16",
781 + "statuses": "1.4.0",
782 + "type-is": "1.6.16",
783 "utils-merge": "1.0.1",
812 - "vary": "~1.1.2"
784 + "vary": "1.1.2"
785 },
786 "dependencies": {
787 "body-parser": {
@@ -818,15 +790,15 @@
790 "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
791 "requires": {
792 "bytes": "3.0.0",
821 - "content-type": "~1.0.4",
793 + "content-type": "1.0.4",
794 "debug": "2.6.9",
823 - "depd": "~1.1.2",
824 - "http-errors": "~1.6.3",
795 + "depd": "1.1.2",
796 + "http-errors": "1.6.3",
797 "iconv-lite": "0.4.23",
826 - "on-finished": "~2.3.0",
798 + "on-finished": "2.3.0",
799 "qs": "6.5.2",
800 "raw-body": "2.3.3",
829 - "type-is": "~1.6.16"
801 + "type-is": "1.6.16"
802 }
803 },
804 "safe-buffer": {
@@ -841,11 +813,11 @@
813 "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.0.0.tgz",
814 "integrity": "sha1-gKBwu4GbCeSvLKbQeA91zgXnXC8=",
815 "requires": {
844 - "glob": "^6.0.4",
845 - "graceful-fs": "^4.1.2",
846 - "handlebars": "^4.0.5",
847 - "object.assign": "^4.0.3",
848 - "promise": "^7.0.0"
816 + "glob": "6.0.4",
817 + "graceful-fs": "4.1.11",
818 + "handlebars": "4.0.11",
819 + "object.assign": "4.1.0",
820 + "promise": "7.3.1"
821 },
822 "dependencies": {
823 "glob": {
@@ -853,11 +825,11 @@
825 "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
826 "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
827 "requires": {
856 - "inflight": "^1.0.4",
857 - "inherits": "2",
858 - "minimatch": "2 || 3",
859 - "once": "^1.3.0",
860 - "path-is-absolute": "^1.0.0"
828 + "inflight": "1.0.6",
829 + "inherits": "2.0.3",
830 + "minimatch": "3.0.4",
831 + "once": "1.4.0",
832 + "path-is-absolute": "1.0.1"
833 }
834 },
835 "graceful-fs": {
@@ -872,7 +844,7 @@
844 "resolved": "https://registry.npmjs.org/express-ws/-/express-ws-4.0.0.tgz",
845 "integrity": "sha1-2r2NyXRRZBiQKkH+bjDtlJtNNsQ=",
846 "requires": {
875 - "ws": "^5.2.0"
847 + "ws": "5.2.2"
848 },
849 "dependencies": {
850 "ws": {
@@ -880,7 +852,7 @@
852 "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
853 "integrity": "sha1-3/7xSGa46NyRM1glFNG++vlumA8=",
854 "requires": {
883 - "async-limiter": "~1.0.0"
855 + "async-limiter": "1.0.0"
856 }
857 }
858 }
@@ -888,7 +860,7 @@
860 "extend": {
861 "version": "3.0.2",
862 "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
891 - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo="
863 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
864 },
865 "extsprintf": {
866 "version": "1.3.0",
@@ -910,7 +882,7 @@
882 "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
883 "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
884 "requires": {
913 - "pend": "~1.2.0"
885 + "pend": "1.2.0"
886 }
887 },
888 "finalhandler": {
@@ -919,12 +891,12 @@
891 "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=",
892 "requires": {
893 "debug": "2.6.9",
922 - "encodeurl": "~1.0.2",
923 - "escape-html": "~1.0.3",
924 - "on-finished": "~2.3.0",
925 - "parseurl": "~1.3.2",
926 - "statuses": "~1.4.0",
927 - "unpipe": "~1.0.0"
894 + "encodeurl": "1.0.2",
895 + "escape-html": "1.0.3",
896 + "on-finished": "2.3.0",
897 + "parseurl": "1.3.2",
898 + "statuses": "1.4.0",
899 + "unpipe": "1.0.0"
900 }
901 },
902 "foreach": {
@@ -940,11 +912,11 @@
912 "form-data": {
913 "version": "2.3.3",
914 "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
943 - "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=",
915 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
916 "requires": {
945 - "asynckit": "^0.4.0",
946 - "combined-stream": "^1.0.6",
947 - "mime-types": "^2.1.12"
917 + "asynckit": "0.4.0",
918 + "combined-stream": "1.0.7",
919 + "mime-types": "2.1.21"
920 }
921 },
922 "forwarded": {
@@ -977,7 +949,7 @@
949 "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
950 "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
951 "requires": {
980 - "assert-plus": "^1.0.0"
952 + "assert-plus": "1.0.0"
953 }
954 },
955 "glob": {
@@ -985,12 +957,12 @@
957 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
958 "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=",
959 "requires": {
988 - "fs.realpath": "^1.0.0",
989 - "inflight": "^1.0.4",
990 - "inherits": "2",
991 - "minimatch": "^3.0.4",
992 - "once": "^1.3.0",
993 - "path-is-absolute": "^1.0.0"
960 + "fs.realpath": "1.0.0",
961 + "inflight": "1.0.6",
962 + "inherits": "2.0.3",
963 + "minimatch": "3.0.4",
964 + "once": "1.4.0",
965 + "path-is-absolute": "1.0.1"
966 }
967 },
968 "graceful-fs": {
@@ -1003,10 +975,10 @@
975 "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
976 "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
977 "requires": {
1006 - "async": "^1.4.0",
1007 - "optimist": "^0.6.1",
1008 - "source-map": "^0.4.4",
1009 - "uglify-js": "^2.6"
978 + "async": "1.5.2",
979 + "optimist": "0.6.1",
980 + "source-map": "0.4.4",
981 + "uglify-js": "2.8.29"
982 },
983 "dependencies": {
984 "async": {
@@ -1024,18 +996,10 @@
996 "har-validator": {
997 "version": "5.1.3",
998 "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
1027 - "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=",
999 + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
1000 "requires": {
1029 - "ajv": "^6.5.5",
1030 - "har-schema": "^2.0.0"
1031 - }
1032 - },
1033 - "has": {
1034 - "version": "1.0.3",
1035 - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1036 - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
1037 - "requires": {
1038 - "function-bind": "^1.1.1"
1001 + "ajv": "6.10.0",
1002 + "har-schema": "2.0.0"
1003 }
1004 },
1005 "has-symbols": {
@@ -1048,8 +1012,8 @@
1012 "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
1013 "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
1014 "requires": {
1051 - "inherits": "^2.0.3",
1052 - "minimalistic-assert": "^1.0.1"
1015 + "inherits": "2.0.3",
1016 + "minimalistic-assert": "1.0.1"
1017 }
1018 },
1019 "hmac-drbg": {
@@ -1057,9 +1021,9 @@
1021 "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
1022 "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
1023 "requires": {
1060 - "hash.js": "^1.0.3",
1061 - "minimalistic-assert": "^1.0.0",
1062 - "minimalistic-crypto-utils": "^1.0.1"
1024 + "hash.js": "1.1.7",
1025 + "minimalistic-assert": "1.0.1",
1026 + "minimalistic-crypto-utils": "1.0.1"
1027 }
1028 },
1029 "http-errors": {
@@ -1067,10 +1031,10 @@
1031 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1032 "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
1033 "requires": {
1070 - "depd": "~1.1.2",
1034 + "depd": "1.1.2",
1035 "inherits": "2.0.3",
1036 "setprototypeof": "1.1.0",
1073 - "statuses": ">= 1.4.0 < 2"
1037 + "statuses": "1.4.0"
1038 }
1039 },
1040 "http-signature": {
@@ -1078,9 +1042,9 @@
1042 "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1043 "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1044 "requires": {
1081 - "assert-plus": "^1.0.0",
1082 - "jsprim": "^1.2.2",
1083 - "sshpk": "^1.7.0"
1045 + "assert-plus": "1.0.0",
1046 + "jsprim": "1.4.1",
1047 + "sshpk": "1.16.1"
1048 }
1049 },
1050 "iconv-lite": {
@@ -1088,7 +1052,7 @@
1052 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
1053 "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=",
1054 "requires": {
1091 - "safer-buffer": ">= 2.1.2 < 3"
1055 + "safer-buffer": "2.1.2"
1056 }
1057 },
1058 "ieee754": {
@@ -1106,8 +1070,8 @@
1070 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1071 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1072 "requires": {
1109 - "once": "^1.3.0",
1110 - "wrappy": "1"
1073 + "once": "1.4.0",
1074 + "wrappy": "1.0.2"
1075 }
1076 },
1077 "inherits": {
@@ -1128,34 +1092,7 @@
1092 "is-buffer": {
1093 "version": "1.1.6",
1094 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1131 - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
1132 - "optional": true
1133 - },
1134 - "is-callable": {
1135 - "version": "1.1.4",
1136 - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
1137 - "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU="
1138 - },
1139 - "is-date-object": {
1140 - "version": "1.0.1",
1141 - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
1142 - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
1143 - },
1144 - "is-regex": {
1145 - "version": "1.0.4",
1146 - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
1147 - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
1148 - "requires": {
1149 - "has": "^1.0.1"
1150 - }
1151 - },
1152 - "is-symbol": {
1153 - "version": "1.0.2",
1154 - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
1155 - "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=",
1156 - "requires": {
1157 - "has-symbols": "^1.0.0"
1158 - }
1095 + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4="
1096 },
1097 "is-typedarray": {
1098 "version": "1.0.0",
@@ -1185,7 +1122,7 @@
1122 "json-schema-traverse": {
1123 "version": "0.4.1",
1124 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1188 - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
1125 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
1126 },
1127 "json-stringify-safe": {
1128 "version": "5.0.1",
@@ -1216,9 +1153,9 @@
1153 "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.1.tgz",
1154 "integrity": "sha512-KKu0WuDDjqw2FlRFp9/vk9TMO/KvgpZVKzdhhYcNyy5OwE8dw9lOK5OQTQHIJ7m+HioI/4P44sAtVuDrQ8KQfw==",
1155 "requires": {
1219 - "asn1.js": "^4.5.2",
1220 - "elliptic": "^6.2.3",
1221 - "safe-buffer": "^5.0.1"
1156 + "asn1.js": "4.10.1",
1157 + "elliptic": "6.4.1",
1158 + "safe-buffer": "5.1.1"
1159 }
1160 },
1161 "keygrip": {
@@ -1230,9 +1167,8 @@
1167 "version": "3.2.2",
1168 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1169 "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1233 - "optional": true,
1170 "requires": {
1235 - "is-buffer": "^1.1.5"
1171 + "is-buffer": "1.1.6"
1172 }
1173 },
1174 "lazy-cache": {
@@ -1246,7 +1182,7 @@
1182 "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
1183 "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
1184 "requires": {
1249 - "readable-stream": "^2.0.5"
1185 + "readable-stream": "2.3.6"
1186 }
1187 },
1188 "lie": {
@@ -1254,7 +1190,7 @@
1190 "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
1191 "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
1192 "requires": {
1257 - "immediate": "~3.0.5"
1193 + "immediate": "3.0.6"
1194 }
1195 },
1196 "localforage": {
@@ -1313,8 +1249,7 @@
1249 "longest": {
1250 "version": "1.0.1",
1251 "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
1316 - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
1317 - "optional": true
1252 + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
1253 },
1254 "media-typer": {
1255 "version": "0.3.0",
@@ -1346,7 +1281,7 @@
1281 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
1282 "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=",
1283 "requires": {
1349 - "mime-db": "~1.37.0"
1284 + "mime-db": "1.37.0"
1285 }
1286 },
1287 "minimalistic-assert": {
@@ -1364,7 +1299,7 @@
1299 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1300 "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
1301 "requires": {
1367 - "brace-expansion": "^1.1.7"
1302 + "brace-expansion": "1.1.8"
1303 }
1304 },
1305 "minimist": {
@@ -1407,13 +1342,13 @@
1342 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz",
1343 "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=",
1344 "requires": {
1410 - "buffer-shims": "~1.0.0",
1411 - "core-util-is": "~1.0.0",
1412 - "inherits": "~2.0.1",
1413 - "isarray": "~1.0.0",
1414 - "process-nextick-args": "~1.0.6",
1415 - "string_decoder": "~1.0.0",
1416 - "util-deprecate": "~1.0.1"
1345 + "buffer-shims": "1.0.0",
1346 + "core-util-is": "1.0.2",
1347 + "inherits": "2.0.3",
1348 + "isarray": "1.0.0",
1349 + "process-nextick-args": "1.0.7",
1350 + "string_decoder": "1.0.3",
1351 + "util-deprecate": "1.0.2"
1352 }
1353 },
1354 "string_decoder": {
@@ -1421,7 +1356,7 @@
1356 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
1357 "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
1358 "requires": {
1424 - "safe-buffer": "~5.1.0"
1359 + "safe-buffer": "5.1.1"
1360 }
1361 }
1362 }
@@ -1431,8 +1366,8 @@
1366 "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.20.tgz",
1367 "integrity": "sha512-IN57CX5/Q1bhDq6ShAR6gIv4koFsZP7L8WOK1S0lR0pVDQaScffSMV5jxubLsmZ7J+UdqmykKw4r9hG3XQEGgQ==",
1368 "requires": {
1434 - "bson": "~1.0.4",
1435 - "require_optional": "~1.0.0"
1369 + "bson": "1.0.9",
1370 + "require_optional": "1.0.1"
1371 }
1372 },
1373 "mongojs": {
@@ -1440,14 +1375,14 @@
1375 "resolved": "https://registry.npmjs.org/mongojs/-/mongojs-2.6.0.tgz",
1376 "integrity": "sha512-r6tj71DjYcaRTi2jpa+CA6Iq72cTZclB2JKy+Zub+0JPTEq/l2plsAYfF2eHqSYBtZbKNcObvhGYk9E9UKZWJg==",
1377 "requires": {
1443 - "each-series": "^1.0.0",
1444 - "mongodb": "^2.2.31",
1445 - "once": "^1.4.0",
1446 - "parse-mongo-url": "^1.1.1",
1447 - "readable-stream": "^2.3.3",
1448 - "thunky": "^1.0.2",
1449 - "to-mongodb-core": "^2.0.0",
1450 - "xtend": "^4.0.1"
1378 + "each-series": "1.0.0",
1379 + "mongodb": "2.2.36",
1380 + "once": "1.4.0",
1381 + "parse-mongo-url": "1.1.1",
1382 + "readable-stream": "2.3.6",
1383 + "thunky": "1.0.3",
1384 + "to-mongodb-core": "2.0.0",
1385 + "xtend": "4.0.1"
1386 }
1387 },
1388 "ms": {
@@ -1461,7 +1396,7 @@
1396 "integrity": "sha1-2bbEbYuN6rHucMc0sK93HdRuCxM=",
1397 "requires": {
1398 "fd-slicer": "1.1.0",
1464 - "http-errors": "~1.7.0",
1399 + "http-errors": "1.7.1",
1400 "safe-buffer": "5.1.2",
1401 "uid-safe": "2.1.5"
1402 },
@@ -1471,7 +1406,7 @@
1406 "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
1407 "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
1408 "requires": {
1474 - "pend": "~1.2.0"
1409 + "pend": "1.2.0"
1410 }
1411 },
1412 "http-errors": {
@@ -1479,10 +1414,10 @@
1414 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.1.tgz",
1415 "integrity": "sha1-ak/+XTUYjhw5+HJTRpBYWFLh8Cc=",
1416 "requires": {
1482 - "depd": "~1.1.2",
1417 + "depd": "1.1.2",
1418 "inherits": "2.0.3",
1419 "setprototypeof": "1.1.0",
1485 - "statuses": ">= 1.5.0 < 2",
1420 + "statuses": "1.5.0",
1421 "toidentifier": "1.0.0"
1422 }
1423 },
@@ -1505,9 +1440,9 @@
1440 "requires": {
1441 "async": "0.2.10",
1442 "binary-search-tree": "0.2.5",
1508 - "localforage": "^1.3.0",
1509 - "mkdirp": "~0.5.1",
1510 - "underscore": "~1.4.4"
1443 + "localforage": "1.5.6",
1444 + "mkdirp": "0.5.1",
1445 + "underscore": "1.4.4"
1446 }
1447 },
1448 "negotiator": {
@@ -1518,19 +1453,19 @@
1453 "node-forge": {
1454 "version": "0.7.6",
1455 "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
1521 - "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw=="
1456 + "integrity": "sha1-/fO0GK7h+U8O9kLNY0hsd8qXJKw="
1457 },
1458 "node-jose": {
1459 "version": "1.1.3",
1460 "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-1.1.3.tgz",
1461 "integrity": "sha512-kupfi4uGWhRjnOmtie2T64cLge5a1TZyalEa8uWWWBgtKBcu41A4IGKpI9twZAxRnmviamEUQRK7LSyfFb2w8A==",
1462 "requires": {
1528 - "base64url": "^3.0.1",
1529 - "es6-promise": "^4.2.6",
1530 - "lodash": "^4.17.11",
1531 - "long": "^4.0.0",
1532 - "node-forge": "^0.8.1",
1533 - "uuid": "^3.3.2"
1463 + "base64url": "3.0.1",
1464 + "es6-promise": "4.2.6",
1465 + "lodash": "4.17.11",
1466 + "long": "4.0.0",
1467 + "node-forge": "0.8.2",
1468 + "uuid": "3.3.2"
1469 },
1470 "dependencies": {
1471 "es6-promise": {
@@ -1550,7 +1485,7 @@
1485 "resolved": "https://registry.npmjs.org/node-windows/-/node-windows-0.1.14.tgz",
1486 "integrity": "sha1-MbsFA9o7xjfyv6qLJmZAouktiR8=",
1487 "requires": {
1553 - "optimist": "~0.6.0",
1488 + "optimist": "0.6.1",
1489 "xml": "0.0.12"
1490 }
1491 },
@@ -1567,7 +1502,7 @@
1502 "oauth-sign": {
1503 "version": "0.9.0",
1504 "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1570 - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU="
1505 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
1506 },
1507 "object-keys": {
1508 "version": "1.0.11",
@@ -1579,19 +1514,10 @@
1514 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1515 "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=",
1516 "requires": {
1582 - "define-properties": "^1.1.2",
1583 - "function-bind": "^1.1.1",
1584 - "has-symbols": "^1.0.0",
1585 - "object-keys": "^1.0.11"
1586 - }
1587 - },
1588 - "object.getownpropertydescriptors": {
1589 - "version": "2.0.3",
1590 - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
1591 - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
1592 - "requires": {
1593 - "define-properties": "^1.1.2",
1594 - "es-abstract": "^1.5.1"
1517 + "define-properties": "1.1.2",
1518 + "function-bind": "1.1.1",
1519 + "has-symbols": "1.0.0",
1520 + "object-keys": "1.0.11"
1521 }
1522 },
1523 "on-finished": {
@@ -1612,7 +1538,7 @@
1538 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1539 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1540 "requires": {
1615 - "wrappy": "1"
1541 + "wrappy": "1.0.2"
1542 }
1543 },
1544 "optimist": {
@@ -1620,8 +1546,8 @@
1546 "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1547 "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
1548 "requires": {
1623 - "minimist": "~0.0.1",
1624 - "wordwrap": "~0.0.2"
1549 + "minimist": "0.0.10",
1550 + "wordwrap": "0.0.3"
1551 },
1552 "dependencies": {
1553 "minimist": {
@@ -1632,9 +1558,9 @@
1558 }
1559 },
1560 "otplib": {
1635 - "version": "10.0.1",
1636 - "resolved": "https://registry.npmjs.org/otplib/-/otplib-10.0.1.tgz",
1637 - "integrity": "sha1-03/NEyAymMC5STfVXFo1J+2HeHU=",
1561 + "version": "11.0.0",
1562 + "resolved": "https://registry.npmjs.org/otplib/-/otplib-11.0.0.tgz",
1563 + "integrity": "sha512-B9qxrYj0FU22nF39XOcKiK+yHdeg4uoensQQsRRlVnGJ26jugZNmJS2Wc9VinR+SjTfVpjDhzxZzpcXzlRkk5Q==",
1564 "requires": {
1565 "thirty-two": "1.0.2"
1566 }
@@ -1674,9 +1600,9 @@
1600 "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-2.1.58.tgz",
1601 "integrity": "sha512-HEcJ4SbZNdyB7Jb1G7Ot3Y/gd7kZyTDJBMIIZOFselrKrCouhGbQu4rm9Lg8bumBACckq724G9uNsZbNJ6d2gw==",
1602 "requires": {
1677 - "asn1js": "^2.0.22",
1678 - "bytestreamjs": "^1.0.27",
1679 - "pvutils": "^1.0.17"
1603 + "asn1js": "2.0.22",
1604 + "bytestreamjs": "1.0.27",
1605 + "pvutils": "1.0.17"
1606 },
1607 "dependencies": {
1608 "asn1js": {
@@ -1684,7 +1610,7 @@
1610 "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.22.tgz",
1611 "integrity": "sha512-mKox8OHPmLZY0FUbd8JYsAu2lQk61yFH8gTq4N7AT7NzmUKISpy0LEjV/AfLyE/SNCUicdMDZUFbocsf/9qOTg==",
1612 "requires": {
1687 - "pvutils": "^1.0.17"
1613 + "pvutils": "1.0.17"
1614 }
1615 }
1616 }
@@ -1699,7 +1625,7 @@
1625 "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
1626 "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
1627 "requires": {
1702 - "asap": "~2.0.3"
1628 + "asap": "2.0.6"
1629 }
1630 },
1631 "proxy-addr": {
@@ -1707,7 +1633,7 @@
1633 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
1634 "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=",
1635 "requires": {
1710 - "forwarded": "~0.1.2",
1636 + "forwarded": "0.1.2",
1637 "ipaddr.js": "1.8.0"
1638 }
1639 },
@@ -1719,15 +1645,15 @@
1645 "punycode": {
1646 "version": "2.1.1",
1647 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1722 - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
1648 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1649 },
1650 "pvtsutils": {
1651 "version": "1.0.4",
1652 "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.0.4.tgz",
1653 "integrity": "sha512-lBDyLfPIWZjxHr6Nnl83/iaZgVLczDcpEqWdqRnghzBKXifRU/7D5T6JPYWUAm0sJdFeF9+sNTKto6dj/3P/Kg==",
1654 "requires": {
1729 - "@types/node": "^10.12.15",
1730 - "tslib": "^1.9.3"
1655 + "@types/node": "10.14.3",
1656 + "tslib": "1.9.3"
1657 }
1658 },
1659 "pvutils": {
@@ -1766,13 +1692,13 @@
1692 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1693 "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
1694 "requires": {
1769 - "core-util-is": "~1.0.0",
1770 - "inherits": "~2.0.3",
1771 - "isarray": "~1.0.0",
1772 - "process-nextick-args": "~2.0.0",
1773 - "safe-buffer": "~5.1.1",
1774 - "string_decoder": "~1.1.1",
1775 - "util-deprecate": "~1.0.1"
1695 + "core-util-is": "1.0.2",
1696 + "inherits": "2.0.3",
1697 + "isarray": "1.0.0",
1698 + "process-nextick-args": "2.0.0",
1699 + "safe-buffer": "5.1.1",
1700 + "string_decoder": "1.1.1",
1701 + "util-deprecate": "1.0.2"
1702 }
1703 },
1704 "redis": {
@@ -1780,9 +1706,9 @@
1706 "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
1707 "integrity": "sha1-ICKI4/WMSfYHnZevehDhMDrhSwI=",
1708 "requires": {
1783 - "double-ended-queue": "^2.1.0-0",
1784 - "redis-commands": "^1.2.0",
1785 - "redis-parser": "^2.6.0"
1709 + "double-ended-queue": "2.1.0-0",
1710 + "redis-commands": "1.4.0",
1711 + "redis-parser": "2.6.0"
1712 }
1713 },
1714 "redis-commands": {
@@ -1803,40 +1729,39 @@
1729 "repeat-string": {
1730 "version": "1.6.1",
1731 "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1806 - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
1807 - "optional": true
1732 + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
1733 },
1734 "request": {
1735 "version": "2.88.0",
1736 "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
1812 - "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=",
1813 - "requires": {
1814 - "aws-sign2": "~0.7.0",
1815 - "aws4": "^1.8.0",
1816 - "caseless": "~0.12.0",
1817 - "combined-stream": "~1.0.6",
1818 - "extend": "~3.0.2",
1819 - "forever-agent": "~0.6.1",
1820 - "form-data": "~2.3.2",
1821 - "har-validator": "~5.1.0",
1822 - "http-signature": "~1.2.0",
1823 - "is-typedarray": "~1.0.0",
1824 - "isstream": "~0.1.2",
1825 - "json-stringify-safe": "~5.0.1",
1826 - "mime-types": "~2.1.19",
1827 - "oauth-sign": "~0.9.0",
1828 - "performance-now": "^2.1.0",
1829 - "qs": "~6.5.2",
1830 - "safe-buffer": "^5.1.2",
1831 - "tough-cookie": "~2.4.3",
1832 - "tunnel-agent": "^0.6.0",
1833 - "uuid": "^3.3.2"
1737 + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
1738 + "requires": {
1739 + "aws-sign2": "0.7.0",
1740 + "aws4": "1.8.0",
1741 + "caseless": "0.12.0",
1742 + "combined-stream": "1.0.7",
1743 + "extend": "3.0.2",
1744 + "forever-agent": "0.6.1",
1745 + "form-data": "2.3.3",
1746 + "har-validator": "5.1.3",
1747 + "http-signature": "1.2.0",
1748 + "is-typedarray": "1.0.0",
1749 + "isstream": "0.1.2",
1750 + "json-stringify-safe": "5.0.1",
1751 + "mime-types": "2.1.21",
1752 + "oauth-sign": "0.9.0",
1753 + "performance-now": "2.1.0",
1754 + "qs": "6.5.2",
1755 + "safe-buffer": "5.1.2",
1756 + "tough-cookie": "2.4.3",
1757 + "tunnel-agent": "0.6.0",
1758 + "uuid": "3.3.2"
1759 },
1760 "dependencies": {
1761 "safe-buffer": {
1762 "version": "5.1.2",
1763 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1839 - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
1764 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1765 }
1766 }
1767 },
@@ -1845,8 +1770,8 @@
1770 "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
1771 "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
1772 "requires": {
1848 - "resolve-from": "^2.0.0",
1849 - "semver": "^5.1.0"
1773 + "resolve-from": "2.0.0",
1774 + "semver": "5.6.0"
1775 }
1776 },
1777 "resolve-from": {
@@ -1860,7 +1785,7 @@
1785 "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
1786 "optional": true,
1787 "requires": {
1863 - "align-text": "^0.1.1"
1788 + "align-text": "0.1.4"
1789 }
1790 },
1791 "safe-buffer": {
@@ -1884,18 +1809,18 @@
1809 "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=",
1810 "requires": {
1811 "debug": "2.6.9",
1887 - "depd": "~1.1.2",
1888 - "destroy": "~1.0.4",
1889 - "encodeurl": "~1.0.2",
1890 - "escape-html": "~1.0.3",
1891 - "etag": "~1.8.1",
1812 + "depd": "1.1.2",
1813 + "destroy": "1.0.4",
1814 + "encodeurl": "1.0.2",
1815 + "escape-html": "1.0.3",
1816 + "etag": "1.8.1",
1817 "fresh": "0.5.2",
1893 - "http-errors": "~1.6.2",
1818 + "http-errors": "1.6.3",
1819 "mime": "1.4.1",
1820 "ms": "2.0.0",
1896 - "on-finished": "~2.3.0",
1897 - "range-parser": "~1.2.0",
1898 - "statuses": "~1.4.0"
1821 + "on-finished": "2.3.0",
1822 + "range-parser": "1.2.0",
1823 + "statuses": "1.4.0"
1824 }
1825 },
1826 "serve-static": {
@@ -1903,9 +1828,9 @@
1828 "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
1829 "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=",
1830 "requires": {
1906 - "encodeurl": "~1.0.2",
1907 - "escape-html": "~1.0.3",
1908 - "parseurl": "~1.3.2",
1831 + "encodeurl": "1.0.2",
1832 + "escape-html": "1.0.3",
1833 + "parseurl": "1.3.2",
1834 "send": "0.16.2"
1835 }
1836 },
@@ -1919,23 +1844,23 @@
1844 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
1845 "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
1846 "requires": {
1922 - "amdefine": ">=0.0.4"
1847 + "amdefine": "1.0.1"
1848 }
1849 },
1850 "sshpk": {
1926 - "version": "1.15.2",
1927 - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
1928 - "integrity": "sha1-yUbWvZsaOdDoY1dj9SQtbtbctik=",
1851 + "version": "1.16.1",
1852 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1853 + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1854 "requires": {
1930 - "asn1": "~0.2.3",
1931 - "assert-plus": "^1.0.0",
1932 - "bcrypt-pbkdf": "^1.0.0",
1933 - "dashdash": "^1.12.0",
1934 - "ecc-jsbn": "~0.1.1",
1935 - "getpass": "^0.1.1",
1936 - "jsbn": "~0.1.0",
1937 - "safer-buffer": "^2.0.2",
1938 - "tweetnacl": "~0.14.0"
1855 + "asn1": "0.2.4",
1856 + "assert-plus": "1.0.0",
1857 + "bcrypt-pbkdf": "1.0.2",
1858 + "dashdash": "1.14.1",
1859 + "ecc-jsbn": "0.1.2",
1860 + "getpass": "0.1.7",
1861 + "jsbn": "0.1.1",
1862 + "safer-buffer": "2.1.2",
1863 + "tweetnacl": "0.14.5"
1864 }
1865 },
1866 "statuses": {
@@ -1948,7 +1873,7 @@
1873 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1874 "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
1875 "requires": {
1951 - "safe-buffer": "~5.1.0"
1876 + "safe-buffer": "5.1.1"
1877 }
1878 },
1879 "tar-stream": {
@@ -1956,13 +1881,13 @@
1881 "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
1882 "integrity": "sha1-jqVdqzeXIlPZqa+Q/c1VmuQ1xVU=",
1883 "requires": {
1959 - "bl": "^1.0.0",
1960 - "buffer-alloc": "^1.2.0",
1961 - "end-of-stream": "^1.0.0",
1962 - "fs-constants": "^1.0.0",
1963 - "readable-stream": "^2.3.0",
1964 - "to-buffer": "^1.1.1",
1965 - "xtend": "^4.0.0"
1884 + "bl": "1.2.2",
1885 + "buffer-alloc": "1.2.0",
1886 + "end-of-stream": "1.4.1",
1887 + "fs-constants": "1.0.0",
1888 + "readable-stream": "2.3.6",
1889 + "to-buffer": "1.1.1",
1890 + "xtend": "4.0.1"
1891 }
1892 },
1893 "thirty-two": {
@@ -1993,10 +1918,10 @@
1918 "tough-cookie": {
1919 "version": "2.4.3",
1920 "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
1996 - "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=",
1921 + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
1922 "requires": {
1998 - "psl": "^1.1.24",
1999 - "punycode": "^1.4.1"
1923 + "psl": "1.1.29",
1924 + "punycode": "1.4.1"
1925 },
1926 "dependencies": {
1927 "punycode": {
@@ -2016,7 +1941,7 @@
1941 "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1942 "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1943 "requires": {
2019 - "safe-buffer": "^5.0.1"
1944 + "safe-buffer": "5.1.1"
1945 }
1946 },
1947 "tweetnacl": {
@@ -2030,7 +1955,7 @@
1955 "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=",
1956 "requires": {
1957 "media-typer": "0.3.0",
2033 - "mime-types": "~2.1.18"
1958 + "mime-types": "2.1.21"
1959 }
1960 },
1961 "uglify-js": {
@@ -2039,9 +1964,9 @@
1964 "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
1965 "optional": true,
1966 "requires": {
2042 - "source-map": "~0.5.1",
2043 - "uglify-to-browserify": "~1.0.0",
2044 - "yargs": "~3.10.0"
1967 + "source-map": "0.5.7",
1968 + "uglify-to-browserify": "1.0.2",
1969 + "yargs": "3.10.0"
1970 },
1971 "dependencies": {
1972 "source-map": {
@@ -2063,7 +1988,7 @@
1988 "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
1989 "integrity": "sha1-Kz1cckDo/C5Y+Komnl7knAhXvTo=",
1990 "requires": {
2066 - "random-bytes": "~1.0.0"
1991 + "random-bytes": "1.0.0"
1992 }
1993 },
1994 "underscore": {
@@ -2079,9 +2004,9 @@
2004 "uri-js": {
2005 "version": "4.2.2",
2006 "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
2082 - "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
2007 + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
2008 "requires": {
2084 - "punycode": "^2.1.0"
2009 + "punycode": "2.1.1"
2010 }
2011 },
2012 "util-deprecate": {
@@ -2089,15 +2014,6 @@
2014 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2015 "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2016 },
2092 - "util.promisify": {
2093 - "version": "1.0.0",
2094 - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
2095 - "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=",
2096 - "requires": {
2097 - "define-properties": "^1.1.2",
2098 - "object.getownpropertydescriptors": "^2.0.3"
2099 - }
2100 - },
2017 "utils-merge": {
2018 "version": "1.0.1",
2019 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -2118,9 +2034,9 @@
2034 "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2035 "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2036 "requires": {
2121 - "assert-plus": "^1.0.0",
2037 + "assert-plus": "1.0.0",
2038 "core-util-is": "1.0.2",
2123 - "extsprintf": "^1.2.0"
2039 + "extsprintf": "1.3.0"
2040 }
2041 },
2042 "webcrypto-core": {
@@ -2128,8 +2044,8 @@
2044 "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.0.11.tgz",
2045 "integrity": "sha512-cHxOMKNzRkPlCcQyGTuyaZmAVZlbby0lH9ASaFk5w8x/i3Q809sISA28AMVnkebW2ekcQ2+UtdaVBFUf58xjyA==",
2046 "requires": {
2131 - "pvtsutils": "^1.0.3",
2132 - "tslib": "^1.9.3"
2047 + "pvtsutils": "1.0.4",
2048 + "tslib": "1.9.3"
2049 }
2050 },
2051 "window-size": {
@@ -2153,7 +2069,7 @@
2069 "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz",
2070 "integrity": "sha1-PMdGLph5LwrGeUJBSJA97TucOtg=",
2071 "requires": {
2156 - "async-limiter": "~1.0.0"
2072 + "async-limiter": "1.0.0"
2073 }
2074 },
2075 "xml": {
@@ -2177,9 +2093,9 @@
2093 "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
2094 "optional": true,
2095 "requires": {
2180 - "camelcase": "^1.0.2",
2181 - "cliui": "^2.1.0",
2182 - "decamelize": "^1.0.0",
2096 + "camelcase": "1.2.1",
2097 + "cliui": "2.1.0",
2098 + "decamelize": "1.2.0",
2099 "window-size": "0.1.0"
2100 }
2101 },
@@ -2188,8 +2104,8 @@
2104 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
2105 "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
2106 "requires": {
2191 - "buffer-crc32": "~0.2.3",
2192 - "fd-slicer": "~1.1.0"
2107 + "buffer-crc32": "0.2.13",
2108 + "fd-slicer": "1.1.0"
2109 }
2110 },
2111 "yubikeyotp": {
@@ -2197,7 +2113,7 @@
2113 "resolved": "https://registry.npmjs.org/yubikeyotp/-/yubikeyotp-0.2.0.tgz",
2114 "integrity": "sha1-i9xREizQDtjJGbnJyuuoUbJyqn0=",
2115 "requires": {
2200 - "request": "*"
2116 + "request": "2.88.0"
2117 }
2118 },
2119 "zip-stream": {
@@ -2205,9 +2121,9 @@
2121 "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.0.1.tgz",
2122 "integrity": "sha1-SKBiSIr+kd2kL4I3APrliXU8zTQ=",
2123 "requires": {
2208 - "archiver-utils": "^2.0.0",
2209 - "compress-commons": "^1.2.0",
2210 - "readable-stream": "^2.0.0"
2124 + "archiver-utils": "2.0.0",
2125 + "compress-commons": "1.2.2",
2126 + "readable-stream": "2.3.6"
2127 }
2128 }
2129 }
package.json
+1 -1
@@ -1,6 +1,6 @@
1 {
2 "name": "meshcentral",
3 - "version": "0.3.1-a",
3 + "version": "0.3.1-c",
4 "keywords": [
5 "Remote Management",
6 "Intel AMT",
views/default.handlebars
+127 -10
@@ -141,6 +141,7 @@
141 <table id=ServerSubMenu style=width:100%;height:22px cellpadding=0 cellspacing=0 class=style1>
142 <tr>
143 <td id=ServerGeneral style=width:100px;height:24px;cursor:pointer class=style3x onclick=go(6)>General</td>
144 + <td id=ServerStats style=width:100px;height:24px;cursor:pointer class=style3x onclick=go(40)>Stats</td>
145 <td id=ServerConsole style=width:100px;height:24px;cursor:pointer class=style3x onclick=go(115)>Console</td>
146 <td class=style3 style=height:24px>&nbsp;</td>
147 </tr>
@@ -743,6 +744,29 @@
744 </div>
745 <div id=p31events style="max-height:calc(100vh - 267px);overflow-y:scroll"></div>
746 </div>
747 + <div id=p40 style="display:none">
748 + <h1>My Server Stats</h1>
749 + <div style=width:100%;height:24px;background-color:#d3d9d6;margin-bottom:4px>
750 + <div style="float:right">
751 + <select id=p40type onchange=updateServerTimelineStats()>
752 + <option value=0>Connections</option>
753 + <option value=1>Memory</option>
754 + <option value=2>Database</option>
755 + </select>&nbsp;
756 + <select id=p40time onchange=updateServerTimelineHours()>
757 + <option value=1>Last hour</option>
758 + <option value=4>Last 3 hours</option>
759 + <option value=24>Last day</option>
760 + <option value=168>Last week</option>
761 + <option value=5040>Last 30 days</option>
762 + </select>&nbsp;
763 + </div>
764 + <div>
765 + &nbsp;<input value="Refresh" type="button" onclick="refreshServerTimelineStats()" />
766 + </div>
767 + </div>
768 + <canvas id=serverMainStats style="height:calc(100vh - 250px);width:100%"></canvas>
769 + </div>
770 <br id="column_l_bottomgap" />
771 </div>
772 <div id=footer class=noselect>
@@ -1014,8 +1038,9 @@
1038 for (var c = 1; c < 27; c++) x += "<option value='" + c + "'>Ctrl-" + String.fromCharCode(64 + c) + " (" + c + ")</option>";
1039 QH('specialkeylist', x);
1040
1017 - // Setup server stats panel
1018 - setupServerStats();
1041 + // Setup server stats panels
1042 + setupGeneralServerStats();
1043 + setupServerTimelineStats();
1044 }
1045
1046 // Toggle the web page to full screen
@@ -1209,7 +1234,11 @@
1234 function onMessage(server, message) {
1235 switch (message.action) {
1236 case 'serverstats': {
1212 - updateServerStats(message);
1237 + updateGeneralServerStats(message);
1238 + break;
1239 + }
1240 + case 'servertimelinestats': {
1241 + setServerTimelineStats(message.events);
1242 break;
1243 }
1244 case 'authcookie': {
@@ -7169,10 +7198,10 @@
7198 }
7199
7200 //
7172 - // Server Statistics
7201 + // MyServer General
7202 //
7203
7175 - function setupServerStats() {
7204 + function setupGeneralServerStats() {
7205 window.serverStatCpu = new Chart(document.getElementById('serverCpuChart').getContext('2d'), {
7206 type: 'doughnut',
7207 data: { datasets: [{ data: [0, 0], backgroundColor: ['#AAAAAA', '#00AA00'] }], labels: ['Used', 'Free'] },
@@ -7186,7 +7215,7 @@
7215 }
7216
7217 var lastServerStats = null;
7189 - function updateServerStats(message) {
7218 + function updateGeneralServerStats(message) {
7219 if (message != null) { lastServerStats = message; } else { message = lastServerStats; }
7220 if (message == null) return;
7221
@@ -7220,6 +7249,91 @@
7249 QH('serverStatsTable', x);
7250 }
7251
7252 + //
7253 + // MyServer Stats
7254 + //
7255 +
7256 + var serverTimelineStats = null;
7257 + var serverTimelineConfig = {
7258 + type: 'line',
7259 + data: { labels: [], datasets: [{ label: '', backgroundColor: 'rgba(255, 99, 132, .5)', borderColor: 'rgb(255, 99, 132)', data: [], fill: true }] },
7260 + options: {
7261 + responsive: true,
7262 + scales: {
7263 + xAxes: [{ type: 'time', time: { tooltipFormat: 'll HH:mm' }, display: true, scaleLabel: { display: false, labelString: '' } }],
7264 + yAxes: [{ display: true, scaleLabel: { display: true, labelString: '' } }]
7265 + }
7266 + }
7267 + };
7268 +
7269 + function refreshServerTimelineStats(stats) { meshserver.send({ action: 'servertimelinestats', hours: 24 }); }
7270 + function pastDate(hours) { var t = new Date(); t.setTime(t.getTime() - (60 * 60 * 1000 * hours)); return t; }
7271 + function setServerTimelineStats(stats) { serverTimelineStats = stats; updateServerTimelineStats(); }
7272 + function updateServerTimelineHours() { serverTimelineConfig.data.labels = [pastDate(0), pastDate(Q('p40time').value)]; window.serverMainStats.update(); }
7273 + function setupServerTimelineStats() { window.serverMainStats = new Chart(document.getElementById('serverMainStats').getContext('2d'), serverTimelineConfig); }
7274 +
7275 + function updateServerTimelineStats() {
7276 + var data, chartType = Q('p40type').value;
7277 + if (chartType == 0) { // Connections
7278 + serverTimelineConfig.options.scales.yAxes[0].scaleLabel.labelString = 'Connection Count';
7279 + data = {
7280 + labels: [pastDate(0), pastDate(Q('p40time').value)],
7281 + datasets: [
7282 + { label: 'Agents', data: [], backgroundColor: 'rgba(158, 151, 16, .1)', borderColor: 'rgb(158, 151, 16)', fill: true },
7283 + { label: 'Users', data: [], backgroundColor: 'rgba(16, 84, 158, .1)', borderColor: 'rgb(16, 84, 158)', fill: true },
7284 + { label: 'User Sessions', data: [], backgroundColor: 'rgba(255, 99, 132, .1)', borderColor: 'rgb(255, 99, 132)', fill: true },
7285 + { label: 'Relay Sessions', data: [], backgroundColor: 'rgba(39, 158, 16, .1)', borderColor: 'rgb(39, 158, 16)', fill: true },
7286 + { label: 'Intel AMT', data: [], backgroundColor: 'rgba(134, 16, 158, .1)', borderColor: 'rgb(134, 16, 158)', fill: true }
7287 + ]
7288 + };
7289 + for (var i = 0; i < serverTimelineStats.length; i++) {
7290 + if (serverTimelineStats[i].conn) {
7291 + data.datasets[0].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].conn.ca });
7292 + data.datasets[1].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].conn.cu });
7293 + data.datasets[2].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].conn.us });
7294 + data.datasets[3].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].conn.rs });
7295 + if (serverTimelineStats[i].conn.am != null) { data.datasets[4].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].conn.am }); }
7296 + }
7297 + }
7298 + } else if (chartType == 1) { // Memory
7299 + serverTimelineConfig.options.scales.yAxes[0].scaleLabel.labelString = 'Megabytes';
7300 + data = {
7301 + labels: [pastDate(0), pastDate(Q('p40time').value)],
7302 + datasets: [
7303 + { label: 'External', data: [], backgroundColor: 'rgba(158, 151, 16, .1)', borderColor: 'rgb(158, 151, 16)', fill: true },
7304 + { label: 'Heap Used', data: [], backgroundColor: 'rgba(16, 84, 158, .1)', borderColor: 'rgb(16, 84, 158)', fill: true },
7305 + { label: 'Heap Total', data: [], backgroundColor: 'rgba(255, 99, 132, .1)', borderColor: 'rgb(255, 99, 132)', fill: true },
7306 + { label: 'RSS', data: [], backgroundColor: 'rgba(39, 158, 16, .1)', borderColor: 'rgb(39, 158, 16)', fill: true }
7307 + ]
7308 + };
7309 + for (var i = 0; i < serverTimelineStats.length; i++) {
7310 + data.datasets[0].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].mem.external / (1024 * 1024) });
7311 + data.datasets[1].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].mem.heapUsed / (1024 * 1024) });
7312 + data.datasets[2].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].mem.heapTotal / (1024 * 1024) });
7313 + data.datasets[3].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].mem.rss / (1024 * 1024) });
7314 + }
7315 + } else if (chartType == 2) { // Database
7316 + serverTimelineConfig.options.scales.yAxes[0].scaleLabel.labelString = 'Records';
7317 + data = {
7318 + labels: [pastDate(0), pastDate(Q('p40time').value)],
7319 + datasets: [
7320 + { label: 'Groups', data: [], backgroundColor: 'rgba(158, 151, 16, .1)', borderColor: 'rgb(158, 151, 16)', fill: true },
7321 + { label: 'Devices', data: [], backgroundColor: 'rgba(16, 84, 158, .1)', borderColor: 'rgb(16, 84, 158)', fill: true },
7322 + { label: 'Users', data: [], backgroundColor: 'rgba(255, 99, 132, .1)', borderColor: 'rgb(255, 99, 132)', fill: true },
7323 + { label: 'Records', data: [], backgroundColor: 'rgba(39, 158, 16, .1)', borderColor: 'rgb(39, 158, 16)', fill: true }
7324 + ]
7325 + };
7326 + for (var i = 0; i < serverTimelineStats.length; i++) {
7327 + data.datasets[0].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].db.meshes });
7328 + data.datasets[1].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].db.nodes });
7329 + data.datasets[2].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].db.users });
7330 + data.datasets[3].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].db.total });
7331 + }
7332 + }
7333 + serverTimelineConfig.data = data;
7334 + window.serverMainStats.update();
7335 + }
7336 +
7337 //
7338 // POPUP DIALOG
7339 //
@@ -7274,7 +7388,7 @@
7388 function go(x) {
7389 if (xxdialogMode || xxcurrentView == x) return;
7390 // Edit this line when adding a new screen
7277 - for (var i = 0; i < 32; i++) { QV('p' + i, i == x); }
7391 + for (var i = 0; i < 41; i++) { QV('p' + i, i == x); }
7392 xxcurrentView = x;
7393
7394 // Remove left bar selection
@@ -7307,7 +7421,7 @@
7421
7422 // My Server
7423 QS('MainMenuMyServer').backgroundColor = (((x == 6) || (x == 115)) ? "#003366" : "#808080");
7310 - if (((x == 6) || (x == 115))) { Q('LeftMenuMyServer').classList.add('lbbuttonsel', 'lbbuttonsel2'); }
7424 + if (((x == 6) || (x == 115) || (x == 40))) { Q('LeftMenuMyServer').classList.add('lbbuttonsel', 'lbbuttonsel2'); }
7425
7426 // column_l max-height
7427 if (webPageFullScreen) {
@@ -7326,8 +7440,8 @@
7440 QV('UserDummyMenuSpan', (x < 10) && (x != 6) && webPageFullScreen);
7441 QV('MeshSubMenuSpan', x >= 20 && x < 30);
7442 QV('UserSubMenuSpan', x >= 30 && x < 40);
7329 - QV('ServerSubMenuSpan', x == 6 || x == 115);
7330 - var panels = { 10: 'MainDev', 11: 'MainDevDesktop', 12: 'MainDevTerminal', 13: 'MainDevFiles', 14: 'MainDevAmt', 15: 'MainDevConsole', 20: 'MeshGeneral', 30: 'UserGeneral', 31: 'UserEvents', 6: 'ServerGeneral', 115: 'ServerConsole' };
7443 + QV('ServerSubMenuSpan', x == 6 || x == 115 || x == 40);
7444 + var panels = { 10: 'MainDev', 11: 'MainDevDesktop', 12: 'MainDevTerminal', 13: 'MainDevFiles', 14: 'MainDevAmt', 15: 'MainDevConsole', 20: 'MeshGeneral', 30: 'UserGeneral', 31: 'UserEvents', 6: 'ServerGeneral', 40: 'ServerStats', 115: 'ServerConsole' };
7445 for (var i in panels) {
7446 Q(panels[i]).classList.remove('style3x');
7447 Q(panels[i]).classList.remove('style3sel');
@@ -7342,6 +7456,9 @@
7456
7457 if (x == 1) masterUpdate(4);
7458
7459 + // Fetch the server timeline stats if needed
7460 + if ((x == 40) && (serverTimelineStats == null)) { refreshServerTimelineStats(); }
7461 +
7462 // Update the web page title
7463 if ((currentNode) && (x >= 10) && (x < 20)) { document.title = 'MeshCentral - ' + currentNode.name; } else { document.title = 'MeshCentral'; }
7464 }