diff --git a/app/core/utils/clients/emcmd.ts b/app/core/utils/clients/emcmd.ts index d9e2a6dfe..cb9d4ded4 100644 --- a/app/core/utils/clients/emcmd.ts +++ b/app/core/utils/clients/emcmd.ts @@ -3,7 +3,7 @@ * Written by: Alexis Tyler */ -import request from 'request-promise'; +import request from 'request-promise-native'; import { envs } from '../../envs'; import { coreLogger } from '../../log'; import { catchHandlers } from '..'; diff --git a/app/core/utils/misc/get-node-service.ts b/app/core/utils/misc/get-node-service.ts index 7c92cde99..67d388d52 100644 --- a/app/core/utils/misc/get-node-service.ts +++ b/app/core/utils/misc/get-node-service.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import path from 'path'; import execa from 'execa'; import { JSONSchemaForNPMPackageJsonFiles as PackageJson} from '@schemastore/package'; -import { coreLogger, log } from '../../log'; +import { coreLogger } from '../../log'; import { User } from '../../types'; import { CacheManager } from '../../cache-manager'; import { cleanStdout, ensurePermission } from '../../utils'; @@ -35,7 +35,17 @@ export const getNodeService = async (user: User, namespace: string): Promise { const uptime = await execa('ps', ['-p', String(pid), '-o', 'etimes', '--no-headers']) .then(cleanStdout) - .catch(() => ''); + .catch(async error => { + // No clue why this failed + if (!error.stderr.includes('keyword not found')) { + return ''; + } + + // Retry with macos way + // Borrowed from https://stackoverflow.com/a/28856613 + const command = `ps -p ${pid} -oetime= | tr '-' ':' | awk -F: '{ total=0; m=1; } { for (i=0; i < NF; i++) {total += $(NF-i)*m; m *= i >= 2 ? 24 : 60 }} {print total}'`; + return execa.command(command, { shell: true }).then(cleanStdout).catch(() => ''); + }); const parsedUptime = Number.parseInt(uptime, 10); return parsedUptime >= 0 ? parsedUptime : -1; @@ -64,9 +74,9 @@ export const getNodeService = async (user: User, namespace: string): Promise { const foundProcess = stdout.split(/\n/).find(line => { - const field = line.split(/\s+/)[4]; + const field = line.trim().split(/\s+/)[4]; return field === namespace; - }); + })?.trim(); return foundProcess ? foundProcess.split(/\s/)[0] : ''; }); } @@ -79,6 +89,8 @@ export const getNodeService = async (user: User, namespace: string): Promise= 1; + coreLogger.silly('%s version=%s uptime=%s online=%s', namespace, version, uptime, online); + return { online, uptime, diff --git a/dynamix.unraid.net.plg b/dynamix.unraid.net.plg index b96a5c170..b64b2c6a2 100644 --- a/dynamix.unraid.net.plg +++ b/dynamix.unraid.net.plg @@ -228,6 +228,9 @@ startdebug() { export $(egrep -v '^#' $node_base_directory/node-api/.env | xargs) fi + # Print report + report + # Start node-api ENVIRONMENT=$(echo $env) DEBUG=true node $node_base_directory/node-api/index.js } @@ -275,6 +278,9 @@ _install() { tar -C $node_base_directory/${download} -xzf /boot/config/plugins/Unraid.net/unraid-${download}.tgz --strip 1 done + # Copy env file + cp $node_base_directory/node-api/.env.$env $node_base_directory/node-api/.env + # Copy across wc files rm -rf /usr/local/emhttp/webGui/wc mkdir -p /usr/local/emhttp/webGui/wc diff --git a/index.js b/index.js index 4a7b8021f..5cf0e924e 100644 --- a/index.js +++ b/index.js @@ -1,16 +1,30 @@ -// If this isn't installed we'll just ignore it -try { - // Load source maps - require('source-map-support').install({ +const tryRequire = (name, onFail) => { + try { + return require(name); + } catch { + onFail(); + } +}; + +// Load source maps +const sourceMaps = tryRequire('source-map-support'); +if (sourceMaps) { + sourceMaps.install({ handleUncaughtExceptions: false }); -} catch {} +} // Ensure we're in the right starting directory process.chdir(__dirname); +// Load .env file +require('dotenv').config(); + // Load process -require('./dist/index'); +require('./dist/index', () => { + // Failed to load main file + process.exit(1); +}); if (process.env.NO_DAEMON || !process.env.DEBUG) { // Convert process into daemon diff --git a/package-lock.json b/package-lock.json index 9ef167146..24d173266 100644 --- a/package-lock.json +++ b/package-lock.json @@ -920,17 +920,6 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, "@schemastore/package": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@schemastore/package/-/package-0.0.6.tgz", @@ -1126,12 +1115,6 @@ "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, "@types/express": { "version": "4.17.9", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz", @@ -2548,7 +2531,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, "requires": { "file-uri-to-path": "1.0.0" } @@ -2565,7 +2547,8 @@ "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "optional": true }, "blueimp-md5": { "version": "2.18.0", @@ -3259,12 +3242,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, - "cac": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.6.1.tgz", - "integrity": "sha512-uhki4T3Ax68hw7Dufi0bATVAF8ayBSwOKUEJHjObPrUN4tlQ8Lf7oljpTje/mArLxYN0D743c2zJt4C1bVTCqg==", - "dev": true - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -6185,8 +6162,7 @@ "dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, "dotgitignore": { "version": "2.1.0", @@ -7245,12 +7221,6 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -7626,8 +7596,7 @@ "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "filename-regex": { "version": "2.0.1", @@ -10065,12 +10034,6 @@ "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" }, - "joycon": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", - "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==", - "dev": true - }, "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -10443,6 +10406,17 @@ "chalk": "^4.0.0" } }, + "logger": { + "version": "github:unraid/logger#edce88bda6926e5e4480646c69a1787669216494", + "from": "github:unraid/logger#master", + "requires": { + "ain2": "^3.0.0", + "chalk": "^4.1.0", + "get-current-line": "^6.3.0", + "number-to-color": "^0.4.1", + "redact-secrets": "github:OmgImAlexis/redact-secrets#master" + } + }, "loglevel": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", @@ -11175,8 +11149,7 @@ "nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, "nanoassert": { "version": "1.1.0", @@ -12866,17 +12839,6 @@ } } }, - "request-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", - "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", - "requires": { - "bluebird": "^3.5.0", - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, "request-promise-core": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", @@ -12892,6 +12854,16 @@ } } }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -13025,65 +12997,6 @@ "inherits": "^2.0.1" } }, - "rollup": { - "version": "2.33.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.33.3.tgz", - "integrity": "sha512-RpayhPTe4Gu/uFGCmk7Gp5Z9Qic2VsqZ040G+KZZvsZYdcuWaJg678JeDJJvJeEQXminu24a2au+y92CUWVd+w==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - } - }, - "rollup-plugin-dts": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-1.4.14.tgz", - "integrity": "sha512-H33aGCUbp/Lm+tbkG5gZePnuWvvaafkwh7Uh4RYJs0/ChOfWlENCby1wOn+xBVsCzpV/g/+OVYqgzVjT80dNJg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4" - } - }, - "rollup-plugin-typescript2": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.27.3.tgz", - "integrity": "sha512-gmYPIFmALj9D3Ga1ZbTZAKTXq1JKlTQBtj299DXhqYz9cL3g/AQfUvbb2UhH+Nf++cCq941W2Mv7UcrcgLzJJg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "find-cache-dir": "^3.3.1", - "fs-extra": "8.1.0", - "resolve": "1.17.0", - "tslib": "2.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", - "dev": true - } - } - }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -14637,28 +14550,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "tsup": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-2.0.3.tgz", - "integrity": "sha512-C9sUuBKtfPeUWT2UxNti7v2ptuC8AnBp5Mj+fiCOBJP+O37sdmrohM0tGlJnYezDhbsXlIpsi7GhxfyO+lfFLA==", - "dev": true, - "requires": { - "cac": "^6.5.12", - "joycon": "^2.2.5", - "rollup": "^2.20.0", - "rollup-plugin-dts": "^1.4.7", - "rollup-plugin-typescript2": "^0.27.1", - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } - } - }, "tsutils": { "version": "3.17.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", @@ -14848,10 +14739,9 @@ "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==" }, "unix-dgram": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.4.tgz", - "integrity": "sha512-7tpK6x7ls7J7pDrrAU63h93R0dVhRbPwiRRCawR10cl+2e1VOvF3bHlVJc6WI1dl/8qk5He673QU+Ogv7bPNaw==", - "optional": true, + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.3.tgz", + "integrity": "sha512-Bay5CkSLcdypcBCsxvHEvaG3mftzT5FlUnRToPWEAVxwYI8NI/8zSJ/Gknlp86MPhV6hBA8I8TBsETj2tssoHQ==", "requires": { "bindings": "^1.3.0", "nan": "^2.13.2" diff --git a/package.json b/package.json index 27acd7baf..2c219d866 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "author": "Alexis Tyler (https://wvvw.me/)", "license": "UNLICENSED", "scripts": { - "build": "tsc", + "build": "npx tsup ./app/index.ts", "bundle-dependencies": "bundle-dependencies update", "copy-schemas": "cpx app/**/*.graphql dist", "clean": "modclean --no-progress --run --path .", @@ -59,6 +59,7 @@ "dl-tgz": "^0.7.1", "dockerode": "^3.2.1", "dot-prop": "^6.0.0", + "dotenv": "^8.2.0", "execa": "^4.1.0", "express": "^4.17.1", "express-list-endpoints": "^5.0.0", @@ -103,7 +104,7 @@ "pretty-ms": "^7.0.1", "redact-secrets": "OmgImAlexis/redact-secrets#master", "request": "^2.88.2", - "request-promise": "^4.2.6", + "request-promise-native": "^1.0.9", "semver": "^7.3.2", "sendmail": "^1.6.1", "set-interval-async": "^1.0.33", @@ -112,6 +113,7 @@ "subscriptions-transport-ws": "^0.9.18", "systeminformation": "^4.29.3", "tracer": "^1.1.4", + "unix-dgram": "^2.0.3", "upcast": "^4.0.0", "uuid": "^8.3.1", "uuid-apikey": "^1.5.1" @@ -137,7 +139,6 @@ "standard-version": "^9.0.0", "supertest": "^6.0.1", "ts-node": "9.0.0", - "tsup": "2.0.3", "typescript": "4.0.3", "typescript-coverage-report": "^0.1.3", "xo": "0.33.1" @@ -188,6 +189,7 @@ "dl-tgz", "dockerode", "dot-prop", + "dotenv", "execa", "express", "express-list-endpoints", @@ -207,6 +209,7 @@ "htpasswd-js", "ini", "lodash.get", + "logger", "map-obj", "merge-graphql-schemas", "micromongo", @@ -231,7 +234,7 @@ "pretty-ms", "redact-secrets", "request", - "request-promise", + "request-promise-native", "semver", "sendmail", "set-interval-async", @@ -240,8 +243,9 @@ "subscriptions-transport-ws", "systeminformation", "tracer", + "unix-dgram", "upcast", "uuid", "uuid-apikey" ] -} +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 778dfa34b..b0e832902 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "skipLibCheck": true, /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ // "lib": [], /* Specify library files to be included in the compilation. */ "allowJs": false, /* Allow javascript files to be compiled. */