diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2018-06-11 13:18:32 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2018-06-12 15:33:31 +0200 |
| commit | b9c06082c17b7e289a79c349c6cfb4ab053d9f78 (patch) | |
| tree | 355d6b83bb12734b8878f46ef4b01ade9f251d87 | |
| parent | b31272a1895d3b8df05ea899fa454ee2fb208c39 (diff) | |
| download | mullvadvpn-b9c06082c17b7e289a79c349c6cfb4ab053d9f78.tar.xz mullvadvpn-b9c06082c17b7e289a79c349c6cfb4ab053d9f78.zip | |
Move problem report handling from renderer to main
| -rw-r--r-- | app/lib/problem-report.js | 71 | ||||
| -rw-r--r-- | app/main.js | 63 |
2 files changed, 72 insertions, 62 deletions
diff --git a/app/lib/problem-report.js b/app/lib/problem-report.js index 32acb32b93..df302bd908 100644 --- a/app/lib/problem-report.js +++ b/app/lib/problem-report.js @@ -1,71 +1,42 @@ // @flow -import { resolveBin } from './proc'; -import { execFile } from 'child_process'; import { ipcRenderer } from 'electron'; -import { log } from './platform'; import uuid from 'uuid'; const collectProblemReport = (toRedact: Array<string>): Promise<string> => { return new Promise((resolve, reject) => { const requestId = uuid.v4(); - let responseListener: Function; - - const removeResponseListener = () => { - ipcRenderer.removeListener('collect-logs-reply', responseListener); - }; - - // timeout after 10 seconds if no ipc response received - const requestTimeout = setTimeout(() => { - removeResponseListener(); - log.error('Timed out when collecting a problem report'); - reject(new Error('Timed out')); - }, 10000); - - responseListener = (_event, id, error, reportPath) => { - if (id !== requestId) { - return; - } - - clearTimeout(requestTimeout); - removeResponseListener(); - - if (error) { - log.error(`Cannot collect a problem report: ${error.err}`); - log.error(`Stdout: ${error.stdout}`); - reject(error); - } else { - resolve(reportPath); + const responseListener = (_event, responseId, result) => { + if (responseId === requestId) { + ipcRenderer.removeListener('collect-logs-reply', responseListener); + if (result.success) { + resolve(result.reportPath); + } else { + reject(new Error(result.error)); + } } }; - // add ipc response listener ipcRenderer.on('collect-logs-reply', responseListener); - - // send ipc request ipcRenderer.send('collect-logs', requestId, toRedact); }); }; -const sendProblemReport = (email: string, message: string, savedReport: string) => { - const args = ['send', '--email', email, '--message', message, '--report', savedReport]; - - const binPath = resolveBin('problem-report'); - +const sendProblemReport = (email: string, message: string, savedReport: string): Promise<void> => { return new Promise((resolve, reject) => { - execFile(binPath, args, { windowsHide: true }, (err, stdout, stderr) => { - if (err) { - reject({ err, stdout, stderr }); - } else { - log.debug('Report sent'); - resolve(); + const requestId = uuid.v4(); + const responseListener = (_event, responseId, result) => { + if (requestId === responseId) { + ipcRenderer.removeListener('send-problem-report-reply', responseListener); + if (result.success) { + resolve(); + } else { + reject(new Error(result.error)); + } } - }); - }).catch((e) => { - const { err, stdout } = e; - log.error('Failed sending problem report', err); - log.error(' stdout: ' + stdout); + }; - throw e; + ipcRenderer.on('send-problem-report-reply', responseListener); + ipcRenderer.send('send-problem-report', requestId, email, message, savedReport); }); }; diff --git a/app/main.js b/app/main.js index f9707a3e4c..2ac7f0a8d1 100644 --- a/app/main.js +++ b/app/main.js @@ -171,27 +171,66 @@ const ApplicationMain = { } }); - ipcMain.on('collect-logs', (event, id, toRedact) => { + ipcMain.on('collect-logs', (event, requestId, toRedact) => { const reportPath = path.join(app.getPath('temp'), uuid.v4() + '.log'); - - const binPath = resolveBin('problem-report'); - let args = ['collect', '--output', reportPath]; - + const executable = resolveBin('problem-report'); + const args = ['collect', '--output', reportPath]; if (toRedact.length > 0) { - args = args.concat(['--redact', ...toRedact, '--']); + args.push('--redact', ...toRedact, '--'); } + args.push(this._logFilePath); - args = args.concat([this._logFilePath]); + execFile(executable, args, { windowsHide: true }, (error, stdout, stderr) => { + if (error) { + log.error( + `Failed to collect a problem report: ${error.message} + Stdout: ${stdout.toString()} + Stderr: ${stderr.toString()}`, + ); - execFile(binPath, args, { windowsHide: true }, (err) => { - if (err) { - event.sender.send('collect-logs-reply', id, err); + event.sender.send('collect-logs-reply', requestId, { + success: false, + error: error.message, + }); } else { - log.debug('Report written to', reportPath); - event.sender.send('collect-logs-reply', id, null, reportPath); + log.debug(`Problem report was written to ${reportPath}`); + + event.sender.send('collect-logs-reply', requestId, { + success: true, + reportPath, + }); } }); }); + + ipcMain.on( + 'send-problem-report', + (event, requestId, email: string, message: string, savedReport: string) => { + const executable = resolveBin('problem-report'); + const args = ['send', '--email', email, '--message', message, '--report', savedReport]; + + execFile(executable, args, { windowsHide: true }, (error, stdout, stderr) => { + if (error) { + log.error( + `Failed to send a problem report: ${error.message} + Stdout: ${stdout.toString()} + Stderr: ${stderr.toString()}`, + ); + + event.sender.send('send-problem-report-reply', requestId, { + success: false, + error: error.message, + }); + } else { + log.info('Problem report was sent.'); + + event.sender.send('send-problem-report-reply', requestId, { + success: true, + }); + } + }); + }, + ); }, _getRpcAddressFilePath() { |
