From c50e01346030406c7d1433863a6b7da1914ecdaf Mon Sep 17 00:00:00 2001 From: Yiming Date: Thu, 1 Feb 2024 22:23:40 +0800 Subject: [PATCH] fix: avoid generating error log when getting machine id (#977) --- packages/schema/package.json | 1 - packages/schema/src/telemetry.ts | 2 +- packages/schema/src/utils/machine-id-utils.ts | 69 ++++++++++++++++++- pnpm-lock.yaml | 9 +-- 4 files changed, 68 insertions(+), 13 deletions(-) diff --git a/packages/schema/package.json b/packages/schema/package.json index 011aa42bc..49e80e15e 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -90,7 +90,6 @@ "langium": "1.2.0", "lower-case-first": "^2.0.2", "mixpanel": "^0.17.0", - "node-machine-id": "^1.1.12", "ora": "^5.4.1", "pluralize": "^8.0.0", "pretty-repl": "^4.0.0", diff --git a/packages/schema/src/telemetry.ts b/packages/schema/src/telemetry.ts index 3166a5f9b..9cd8ba386 100644 --- a/packages/schema/src/telemetry.ts +++ b/packages/schema/src/telemetry.ts @@ -8,8 +8,8 @@ import sleep from 'sleep-promise'; import { CliError } from './cli/cli-error'; import { TELEMETRY_TRACKING_TOKEN } from './constants'; import isDocker from './utils/is-docker'; -import { getVersion } from './utils/version-utils'; import { getMachineId } from './utils/machine-id-utils'; +import { getVersion } from './utils/version-utils'; /** * Telemetry events diff --git a/packages/schema/src/utils/machine-id-utils.ts b/packages/schema/src/utils/machine-id-utils.ts index db07f3ed3..63323a543 100644 --- a/packages/schema/src/utils/machine-id-utils.ts +++ b/packages/schema/src/utils/machine-id-utils.ts @@ -1,10 +1,73 @@ -import { machineIdSync } from "node-machine-id"; +// modified from https://github.com/automation-stack/node-machine-id + +import { execSync } from 'child_process'; +import { createHash } from 'crypto'; import { v4 as uuid } from 'uuid'; +const { platform } = process; +const win32RegBinPath = { + native: '%windir%\\System32', + mixed: '%windir%\\sysnative\\cmd.exe /c %windir%\\System32', +}; +const guid = { + darwin: 'ioreg -rd1 -c IOPlatformExpertDevice', + win32: + `${win32RegBinPath[isWindowsProcessMixedOrNativeArchitecture()]}\\REG.exe ` + + 'QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography ' + + '/v MachineGuid', + linux: '( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname 2> /dev/null) | head -n 1 || :', + freebsd: 'kenv -q smbios.system.uuid || sysctl -n kern.hostuuid', +}; + +function isWindowsProcessMixedOrNativeArchitecture() { + // eslint-disable-next-line no-prototype-builtins + if (process.arch === 'ia32' && process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432')) { + return 'mixed'; + } + return 'native'; +} + +function hash(guid: string): string { + return createHash('sha256').update(guid).digest('hex'); +} + +function expose(result: string): string { + switch (platform) { + case 'darwin': + return result + .split('IOPlatformUUID')[1] + .split('\n')[0] + .replace(/=|\s+|"/gi, '') + .toLowerCase(); + case 'win32': + return result + .toString() + .split('REG_SZ')[1] + .replace(/\r+|\n+|\s+/gi, '') + .toLowerCase(); + case 'linux': + return result + .toString() + .replace(/\r+|\n+|\s+/gi, '') + .toLowerCase(); + case 'freebsd': + return result + .toString() + .replace(/\r+|\n+|\s+/gi, '') + .toLowerCase(); + default: + throw new Error(`Unsupported platform: ${process.platform}`); + } +} + export function getMachineId() { - // machineIdSync() is not compatible with non-shell hosts such as Vercel + if (!(platform in guid)) { + return uuid(); + } try { - return machineIdSync(); + const value = execSync(guid[platform as keyof typeof guid]); + const id = expose(value.toString()); + return hash(id); } catch { return uuid(); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88968bb7f..d501a52ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -492,9 +492,6 @@ importers: mixpanel: specifier: ^0.17.0 version: 0.17.0 - node-machine-id: - specifier: ^1.1.12 - version: 1.1.12 ora: specifier: ^5.4.1 version: 5.4.1 @@ -11217,10 +11214,6 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - dev: false - /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} dev: true