diff --git a/packages/cli-repl/package-lock.json b/packages/cli-repl/package-lock.json index 3068f83d09..3034afff5b 100644 --- a/packages/cli-repl/package-lock.json +++ b/packages/cli-repl/package-lock.json @@ -309,6 +309,11 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" + }, "fast-redact": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.0.0.tgz", diff --git a/packages/cli-repl/package.json b/packages/cli-repl/package.json index 5f6a136390..e2a5ad2fff 100644 --- a/packages/cli-repl/package.json +++ b/packages/cli-repl/package.json @@ -49,6 +49,7 @@ "analytics-node": "^3.4.0-beta.1", "ansi-escape-sequences": "^5.1.2", "bson": "^4.0.4", + "fast-json-parse": "^1.0.3", "is-recoverable-error": "^1.0.0", "lodash.set": "^4.3.2", "minimist": "^1.2.5", diff --git a/packages/cli-repl/src/cli-repl.ts b/packages/cli-repl/src/cli-repl.ts index b03f9aab19..2c4c71e289 100644 --- a/packages/cli-repl/src/cli-repl.ts +++ b/packages/cli-repl/src/cli-repl.ts @@ -2,19 +2,22 @@ import { CliServiceProvider, NodeOptions } from '@mongosh/service-provider-server'; import formatOutput, { formatError } from './format-output'; +import { LineByLineInput } from './line-by-line-input'; +import { TELEMETRY, MONGOSH_WIKI } from './constants'; import ShellEvaluator from '@mongosh/shell-evaluator'; import isRecoverableError from 'is-recoverable-error'; import { MongoshWarning } from '@mongosh/errors'; import { changeHistory } from '@mongosh/history'; import { REPLServer, Recoverable } from 'repl'; import getConnectInfo from './connect-info'; -import { TELEMETRY, MONGOSH_WIKI } from './constants'; +import jsonParse from 'fast-json-parse'; import CliOptions from './cli-options'; import completer from './completer'; import i18n from '@mongosh/i18n'; import { ObjectId } from 'bson'; import repl from 'pretty-repl'; import Nanobus from 'nanobus'; +import { redactPwd } from '.'; import logger from './logger'; import mkdirp from 'mkdirp'; import clr from './clr'; @@ -23,8 +26,6 @@ import util from 'util'; import read from 'read'; import os from 'os'; import fs from 'fs'; -import { redactPwd } from '.'; -import { LineByLineInput } from './line-by-line-input'; /** * Connecting text key. @@ -243,17 +244,25 @@ class CliRepl { try { fd = fs.openSync(configPath, 'wx'); - this.userId = new ObjectId(Date.now()); + this.userId = new ObjectId(Date.now()).toString(); this.enableTelemetry = true; this.disableGreetingMessage = false; this.bus.emit('mongosh:new-user', this.userId, this.enableTelemetry); this.writeConfigFileSync(configPath); } catch (err) { if (err.code === 'EEXIST') { - const config = JSON.parse(fs.readFileSync(configPath, 'utf8')); - this.userId = config.userId; + // make sure we catch errors for json parse and always have err and + // value on config result + const config = jsonParse(fs.readFileSync(configPath, 'utf8')); + + if (config.err) { + this.bus.emit('mongosh:error', 'Unable to parse user config', err); + return; + } + + this.userId = config.value.userId; this.disableGreetingMessage = true; - this.enableTelemetry = config.enableTelemetry; + this.enableTelemetry = config.value.enableTelemetry; this.bus.emit('mongosh:update-user', this.userId, this.enableTelemetry); return; } diff --git a/packages/cli-repl/src/connect-info.spec.ts b/packages/cli-repl/src/connect-info.spec.ts index cd80f97678..7c829af218 100644 --- a/packages/cli-repl/src/connect-info.spec.ts +++ b/packages/cli-repl/src/connect-info.spec.ts @@ -85,6 +85,7 @@ describe('getConnectInfo', function() { is_genuine: true, non_genuine_server_name: 'mongodb', server_arch: 'x86_64', + node_version: process.version, server_os: 'osx', uri: ATLAS_URI }; @@ -107,6 +108,7 @@ describe('getConnectInfo', function() { is_genuine: true, non_genuine_server_name: 'mongodb', server_arch: 'x86_64', + node_version: process.version, server_os: 'osx', uri: ATLAS_URI }; diff --git a/packages/cli-repl/src/connect-info.ts b/packages/cli-repl/src/connect-info.ts index 4f0d3e9b6a..c061b8d19a 100644 --- a/packages/cli-repl/src/connect-info.ts +++ b/packages/cli-repl/src/connect-info.ts @@ -15,6 +15,7 @@ interface ConnectInfo { dl_version?: string; is_genuine: boolean; non_genuine_server_name: string; + node_version: string; uri: string; } @@ -42,6 +43,7 @@ export default function getConnectInfo(uri: string, buildInfo: any, cmdLineOpts: auth_type, is_data_lake, dl_version, + node_version: process.version, is_genuine, non_genuine_server_name }; diff --git a/packages/cli-repl/src/logger.ts b/packages/cli-repl/src/logger.ts index ba1e6d2068..99847d0624 100644 --- a/packages/cli-repl/src/logger.ts +++ b/packages/cli-repl/src/logger.ts @@ -47,6 +47,7 @@ interface ConnectEvent { dl_version?: string; is_genuine: boolean; non_genuine_server_name: string; + node_version: string; uri: string; } @@ -57,7 +58,7 @@ NoopAnalytics.prototype.identify = function(): void {}; NoopAnalytics.prototype.track = function(): void {}; export default function logger(bus: any, logDir: string): void { - const session_id = new ObjectId(Date.now()); + const session_id = new ObjectId(Date.now()).toString(); const logDest = path.join(logDir, `${session_id}_log`); const log = pino({ name: 'monogsh' }, pino.destination(logDest)); console.log(`Current sessionID: ${session_id}`); @@ -67,7 +68,6 @@ export default function logger(bus: any, logDir: string): void { let analytics = new NoopAnalytics(); try { // this file gets written as a part of a release - log.warn(require('./analytics-config.js').SEGMENT_API_KEY); analytics = new Analytics(require('./analytics-config.js').SEGMENT_API_KEY); } catch (e) { bus.emit('mongosh:error', e); @@ -97,6 +97,7 @@ export default function logger(bus: any, logDir: string): void { bus.on('mongosh:update-user', function(id, enableTelemetry) { userId = id; telemetry = enableTelemetry; + if (telemetry) analytics.identify({ userId }); log.info('mongosh:update-user', { enableTelemetry }); }); diff --git a/packages/java-shell/package-lock.json b/packages/java-shell/package-lock.json index 2a95677db8..0649fafbed 100644 --- a/packages/java-shell/package-lock.json +++ b/packages/java-shell/package-lock.json @@ -940,9 +940,9 @@ "dev": true }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-wHMFZ6HTLGlB9f/WsQBs5OwMQJoLXYuJUzbA+j+hRBf7+Y8KcXpatzIviIcTy1OAyhWQp08nyiPO8Dnv0z4Sww==", "dev": true, "requires": { "create-hash": "^1.1.2",