diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index 6b5d70c78..4fc612012 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -15,6 +15,7 @@ const processArgs = require('../utility/processArgs'); const { safeJsonParse, getLogger } = require('dbgate-tools'); const platformInfo = require('../utility/platformInfo'); const { connectionHasPermission, testConnectionPermission } = require('../utility/hasPermission'); +const pipeForkLogs = require('../utility/pipeForkLogs'); const logger = getLogger('connections'); @@ -205,13 +206,20 @@ module.exports = { test_meta: true, test(connection) { - const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ - '--is-forked-api', - '--start-process', - 'connectProcess', - ...processArgs.getPassArgs(), - // ...process.argv.slice(3), - ]); + const subprocess = fork( + global['API_PACKAGE'] || process.argv[1], + [ + '--is-forked-api', + '--start-process', + 'connectProcess', + ...processArgs.getPassArgs(), + // ...process.argv.slice(3), + ], + { + stdio: ['ignore', 'pipe', 'pipe', 'ipc'], + } + ); + pipeForkLogs(subprocess); subprocess.send(connection); return new Promise(resolve => { subprocess.on('message', resp => { diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index 28e1fbf39..c9e0caa91 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -29,6 +29,7 @@ const diff2htmlPage = require('../utility/diff2htmlPage'); const processArgs = require('../utility/processArgs'); const { testConnectionPermission } = require('../utility/hasPermission'); const { MissingCredentialsError } = require('../utility/exceptions'); +const pipeForkLogs = require('../utility/pipeForkLogs'); const logger = getLogger('databaseConnections'); @@ -88,13 +89,20 @@ module.exports = { if (connection.passwordMode == 'askPassword' || connection.passwordMode == 'askUser') { throw new MissingCredentialsError({ conid, passwordMode: connection.passwordMode }); } - const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ - '--is-forked-api', - '--start-process', - 'databaseConnectionProcess', - ...processArgs.getPassArgs(), - // ...process.argv.slice(3), - ]); + const subprocess = fork( + global['API_PACKAGE'] || process.argv[1], + [ + '--is-forked-api', + '--start-process', + 'databaseConnectionProcess', + ...processArgs.getPassArgs(), + // ...process.argv.slice(3), + ], + { + stdio: ['ignore', 'pipe', 'pipe', 'ipc'], + } + ); + pipeForkLogs(subprocess); const lastClosed = this.closed[`${conid}/${database}`]; const newOpened = { conid, diff --git a/packages/api/src/controllers/serverConnections.js b/packages/api/src/controllers/serverConnections.js index 5417a2ce4..dd1c9104d 100644 --- a/packages/api/src/controllers/serverConnections.js +++ b/packages/api/src/controllers/serverConnections.js @@ -10,6 +10,7 @@ const config = require('./config'); const processArgs = require('../utility/processArgs'); const { testConnectionPermission } = require('../utility/hasPermission'); const { MissingCredentialsError } = require('../utility/exceptions'); +const pipeForkLogs = require('../utility/pipeForkLogs'); module.exports = { opened: [], @@ -53,13 +54,20 @@ module.exports = { if (connection.passwordMode == 'askPassword' || connection.passwordMode == 'askUser') { throw new MissingCredentialsError({ conid, passwordMode: connection.passwordMode }); } - const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ - '--is-forked-api', - '--start-process', - 'serverConnectionProcess', - ...processArgs.getPassArgs(), - // ...process.argv.slice(3), - ]); + const subprocess = fork( + global['API_PACKAGE'] || process.argv[1], + [ + '--is-forked-api', + '--start-process', + 'serverConnectionProcess', + ...processArgs.getPassArgs(), + // ...process.argv.slice(3), + ], + { + stdio: ['ignore', 'pipe', 'pipe', 'ipc'], + } + ); + pipeForkLogs(subprocess); const newOpened = { conid, subprocess, diff --git a/packages/api/src/controllers/sessions.js b/packages/api/src/controllers/sessions.js index 8722ba7a4..b4db80ada 100644 --- a/packages/api/src/controllers/sessions.js +++ b/packages/api/src/controllers/sessions.js @@ -9,6 +9,7 @@ const { handleProcessCommunication } = require('../utility/processComm'); const processArgs = require('../utility/processArgs'); const { appdir } = require('../utility/directories'); const { getLogger } = require('dbgate-tools'); +const pipeForkLogs = require('../utility/pipeForkLogs'); const logger = getLogger('sessions'); @@ -85,13 +86,20 @@ module.exports = { async create({ conid, database }) { const sesid = uuidv1(); const connection = await connections.getCore({ conid }); - const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ - '--is-forked-api', - '--start-process', - 'sessionProcess', - ...processArgs.getPassArgs(), - // ...process.argv.slice(3), - ]); + const subprocess = fork( + global['API_PACKAGE'] || process.argv[1], + [ + '--is-forked-api', + '--start-process', + 'sessionProcess', + ...processArgs.getPassArgs(), + // ...process.argv.slice(3), + ], + { + stdio: ['ignore', 'pipe', 'pipe', 'ipc'], + } + ); + pipeForkLogs(subprocess); const newOpened = { conid, database, diff --git a/packages/api/src/utility/DatastoreProxy.js b/packages/api/src/utility/DatastoreProxy.js index 0da243170..7bd8889d1 100644 --- a/packages/api/src/utility/DatastoreProxy.js +++ b/packages/api/src/utility/DatastoreProxy.js @@ -2,6 +2,7 @@ const { fork } = require('child_process'); const uuidv1 = require('uuid/v1'); const { handleProcessCommunication } = require('./processComm'); const processArgs = require('../utility/processArgs'); +const pipeForkLogs = require('./pipeForkLogs'); class DatastoreProxy { constructor(file) { @@ -30,13 +31,20 @@ class DatastoreProxy { async ensureSubprocess() { if (!this.subprocess) { - this.subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ - '--is-forked-api', - '--start-process', - 'jslDatastoreProcess', - ...processArgs.getPassArgs(), - // ...process.argv.slice(3), - ]); + this.subprocess = fork( + global['API_PACKAGE'] || process.argv[1], + [ + '--is-forked-api', + '--start-process', + 'jslDatastoreProcess', + ...processArgs.getPassArgs(), + // ...process.argv.slice(3), + ], + { + stdio: ['ignore', 'pipe', 'pipe', 'ipc'], + } + ); + pipeForkLogs(this.subprocess); this.subprocess.on('message', message => { // @ts-ignore diff --git a/packages/api/src/utility/pipeForkLogs.js b/packages/api/src/utility/pipeForkLogs.js new file mode 100644 index 000000000..1db7b098d --- /dev/null +++ b/packages/api/src/utility/pipeForkLogs.js @@ -0,0 +1,15 @@ +const byline = require('byline'); +const { safeJsonParse, getLogger } = require('dbgate-tools'); +const logger = getLogger(); + +const logDispatcher = method => data => { + const json = safeJsonParse(data.toString()); + logger[method](json || data.toString()); +}; + +function pipeForkLogs(subprocess) { + byline(subprocess.stdout).on('data', logDispatcher('info')); + byline(subprocess.stderr).on('data', logDispatcher('error')); +} + +module.exports = pipeForkLogs; diff --git a/packages/api/src/utility/sshTunnel.js b/packages/api/src/utility/sshTunnel.js index 38f7344f9..45aafea73 100644 --- a/packages/api/src/utility/sshTunnel.js +++ b/packages/api/src/utility/sshTunnel.js @@ -6,6 +6,7 @@ const lock = new AsyncLock(); const { fork } = require('child_process'); const processArgs = require('../utility/processArgs'); const { getLogger } = require('dbgate-tools'); +const pipeForkLogs = require('./pipeForkLogs'); const logger = getLogger('sshTunnel'); const sshTunnelCache = {}; @@ -23,12 +24,14 @@ const CONNECTION_FIELDS = [ const TUNNEL_FIELDS = [...CONNECTION_FIELDS, 'server', 'port']; function callForwardProcess(connection, tunnelConfig, tunnelCacheKey) { - let subprocess = fork(global['API_PACKAGE'] || process.argv[1], [ - '--is-forked-api', - '--start-process', - 'sshForwardProcess', - ...processArgs.getPassArgs(), - ]); + let subprocess = fork( + global['API_PACKAGE'] || process.argv[1], + ['--is-forked-api', '--start-process', 'sshForwardProcess', ...processArgs.getPassArgs()], + { + stdio: ['ignore', 'pipe', 'pipe', 'ipc'], + } + ); + pipeForkLogs(subprocess); subprocess.send({ msgtype: 'connect',