diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index c9e0caa91..016078e05 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -140,7 +140,12 @@ module.exports = { const msgid = uuidv1(); const promise = new Promise((resolve, reject) => { this.requests[msgid] = [resolve, reject]; - conn.subprocess.send({ msgid, ...message }); + try { + conn.subprocess.send({ msgid, ...message }); + } catch (err) { + logger.error({ err }, 'Error sending request do process'); + this.close(conn.conid, conn.database); + } }); return promise; }, @@ -289,6 +294,7 @@ module.exports = { if (existing) { existing.subprocess.send({ msgtype: 'ping' }); } else { + // @ts-ignore existing = await this.ensureOpened(conid, database); } @@ -319,7 +325,13 @@ module.exports = { const existing = this.opened.find(x => x.conid == conid && x.database == database); if (existing) { existing.disconnected = true; - if (kill) existing.subprocess.kill(); + if (kill) { + try { + existing.subprocess.kill(); + } catch (err) { + logger.error({ err }, 'Error killing subprocess'); + } + } this.opened = this.opened.filter(x => x.conid != conid || x.database != database); this.closed[`${conid}/${database}`] = { status: { diff --git a/packages/api/src/controllers/serverConnections.js b/packages/api/src/controllers/serverConnections.js index dd1c9104d..fd7136d0f 100644 --- a/packages/api/src/controllers/serverConnections.js +++ b/packages/api/src/controllers/serverConnections.js @@ -11,6 +11,9 @@ const processArgs = require('../utility/processArgs'); const { testConnectionPermission } = require('../utility/hasPermission'); const { MissingCredentialsError } = require('../utility/exceptions'); const pipeForkLogs = require('../utility/pipeForkLogs'); +const { getLogger } = require('dbgate-tools'); + +const logger = getLogger('serverConnection'); module.exports = { opened: [], @@ -102,7 +105,13 @@ module.exports = { const existing = this.opened.find(x => x.conid == conid); if (existing) { existing.disconnected = true; - if (kill) existing.subprocess.kill(); + if (kill) { + try { + existing.subprocess.kill(); + } catch (err) { + logger.error({ err }, 'Error killing subprocess'); + } + } this.opened = this.opened.filter(x => x.conid != conid); this.closed[conid] = { ...existing.status, @@ -152,7 +161,12 @@ module.exports = { } this.lastPinged[conid] = new Date().getTime(); const opened = await this.ensureOpened(conid); - opened.subprocess.send({ msgtype: 'ping' }); + try { + opened.subprocess.send({ msgtype: 'ping' }); + } catch (err) { + logger.error({ err }, 'Error calling ping'); + this.close(conid); + } }) ); return { status: 'ok' }; @@ -189,7 +203,12 @@ module.exports = { const msgid = uuidv1(); const promise = new Promise((resolve, reject) => { this.requests[msgid] = [resolve, reject]; - conn.subprocess.send({ msgid, ...message }); + try { + conn.subprocess.send({ msgid, ...message }); + } catch (err) { + logger.error({ err }, 'Error sending request'); + this.close(conn.conid); + } }); return promise; }, diff --git a/packages/api/src/utility/DatastoreProxy.js b/packages/api/src/utility/DatastoreProxy.js index 7bd8889d1..ca8597d93 100644 --- a/packages/api/src/utility/DatastoreProxy.js +++ b/packages/api/src/utility/DatastoreProxy.js @@ -3,6 +3,8 @@ const uuidv1 = require('uuid/v1'); const { handleProcessCommunication } = require('./processComm'); const processArgs = require('../utility/processArgs'); const pipeForkLogs = require('./pipeForkLogs'); +const { getLogger } = require('dbgate-tools'); +const logger = getLogger('DatastoreProxy'); class DatastoreProxy { constructor(file) { @@ -68,7 +70,12 @@ class DatastoreProxy { const msgid = uuidv1(); const promise = new Promise((resolve, reject) => { this.requests[msgid] = [resolve, reject]; - this.subprocess.send({ msgtype: 'read', msgid, offset, limit }); + try { + this.subprocess.send({ msgtype: 'read', msgid, offset, limit }); + } catch (err) { + logger.error({ err }, 'Error getting rows'); + this.subprocess = null; + } }); return promise; } @@ -77,7 +84,12 @@ class DatastoreProxy { const msgid = uuidv1(); const promise = new Promise((resolve, reject) => { this.requests[msgid] = [resolve, reject]; - this.subprocess.send({ msgtype: 'notify', msgid }); + try { + this.subprocess.send({ msgtype: 'notify', msgid }); + } catch (err) { + logger.error({ err }, 'Error notifying subprocess'); + this.subprocess = null; + } }); return promise; } diff --git a/packages/api/src/utility/sshTunnel.js b/packages/api/src/utility/sshTunnel.js index 45aafea73..254f20fc1 100644 --- a/packages/api/src/utility/sshTunnel.js +++ b/packages/api/src/utility/sshTunnel.js @@ -33,11 +33,15 @@ function callForwardProcess(connection, tunnelConfig, tunnelCacheKey) { ); pipeForkLogs(subprocess); - subprocess.send({ - msgtype: 'connect', - connection, - tunnelConfig, - }); + try { + subprocess.send({ + msgtype: 'connect', + connection, + tunnelConfig, + }); + } catch (err) { + logger.error({ err }, 'Error connecting SSH'); + } return new Promise((resolve, reject) => { subprocess.on('message', resp => { // @ts-ignore diff --git a/packages/api/src/utility/sshTunnelProxy.js b/packages/api/src/utility/sshTunnelProxy.js index afca7cc6e..90b930f4b 100644 --- a/packages/api/src/utility/sshTunnelProxy.js +++ b/packages/api/src/utility/sshTunnelProxy.js @@ -1,11 +1,17 @@ +const { getLogger } = require('dbgate-tools'); const uuidv1 = require('uuid/v1'); const { getSshTunnel } = require('./sshTunnel'); +const logger = getLogger('sshTunnelProxy'); const dispatchedMessages = {}; async function handleGetSshTunnelRequest({ msgid, connection }, subprocess) { const response = await getSshTunnel(connection); - subprocess.send({ msgtype: 'getsshtunnel-response', msgid, response }); + try { + subprocess.send({ msgtype: 'getsshtunnel-response', msgid, response }); + } catch (err) { + logger.error({ err }, 'Error sending to SSH tunnel'); + } } function handleGetSshTunnelResponse({ msgid, response }, subprocess) {