SymphonyElectron/src/app/reports-handler.ts

141 lines
5.2 KiB
TypeScript
Raw Normal View History

2019-01-16 12:00:59 -06:00
import * as archiver from 'archiver';
2018-12-03 11:46:47 -06:00
import { app, BrowserWindow, dialog, shell } from 'electron';
2019-01-16 12:00:59 -06:00
import * as electron from 'electron';
2018-12-03 11:46:47 -06:00
import * as fs from 'fs';
2019-01-16 12:00:59 -06:00
import * as path from 'path';
2018-12-03 11:46:47 -06:00
import { isMac } from '../common/env';
import { i18n } from '../common/i18n';
import { logger } from '../common/logger';
2018-12-03 11:46:47 -06:00
2019-01-16 12:00:59 -06:00
/**
* Archives files in the source directory
* that matches the given file extension
*
* @param source {String} source path
* @param destination {String} destination path
* @param fileExtensions {Array} array of file ext
* @return {Promise<void>}
*/
const generateArchiveForDirectory = (source: string, destination: string, fileExtensions: string[]): Promise<void> => {
return new Promise((resolve, reject) => {
logger.info(`reports-handler: generating archive for directory ${source}`);
2019-01-16 12:00:59 -06:00
const output = fs.createWriteStream(destination);
const archive = archiver('zip', { zlib: { level: 9 } });
output.on('close', () => {
logger.info(`reports-handler: generated archive for directory ${source}`);
2019-01-16 12:00:59 -06:00
return resolve();
});
archive.on('error', (err: Error) => {
logger.error(`reports-handler: error archiving directory for ${source} with error ${err}`);
2019-01-16 12:00:59 -06:00
return reject(err);
});
archive.pipe(output);
const files = fs.readdirSync(source);
files
.filter((file) => fileExtensions.indexOf(path.extname(file)) !== -1)
.forEach((file) => {
switch (path.extname(file)) {
case '.log':
archive.file(source + '/' + file, { name: 'logs/' + file });
break;
case '.dmp':
case '.txt': // on Windows .txt files will be created as part of crash dump
archive.file(source + '/' + file, { name: 'crashes/' + file });
break;
default:
break;
}
});
archive.finalize();
});
};
/**
* Compress and export logs stored under system log directory
*
* MacOS - /Library/Logs/Symphony/
* Windows - AppData\Roaming\Symphony\logs
*/
2018-12-03 11:46:47 -06:00
export const exportLogs = (): void => {
const FILE_EXTENSIONS = [ '.log' ];
const MAC_LOGS_PATH = '/Library/Logs/Symphony/';
const WINDOWS_LOGS_PATH = '\\AppData\\Roaming\\Symphony\\logs';
const logsPath = isMac ? MAC_LOGS_PATH : WINDOWS_LOGS_PATH;
const source = app.getPath('home') + logsPath;
const focusedWindow = BrowserWindow.getFocusedWindow();
if (!fs.existsSync(source) && focusedWindow && !focusedWindow.isDestroyed()) {
logger.error(`reports-handler: Can't find any logs to share!`);
2018-12-03 11:46:47 -06:00
dialog.showMessageBox(focusedWindow, {
message: i18n.t(`Can't find any logs to share!`)(),
title: i18n.t('Failed!')(),
2018-12-03 11:46:47 -06:00
type: 'error',
});
return;
}
const destPath = isMac ? '/logs_symphony_' : '\\logs_symphony_';
const timestamp = new Date().getTime();
const destination = app.getPath('downloads') + destPath + timestamp + '.zip';
generateArchiveForDirectory(source, destination, FILE_EXTENSIONS)
.then(() => {
shell.showItemInFolder(destination);
})
.catch((err) => {
if (focusedWindow && !focusedWindow.isDestroyed()) {
logger.error(`reports-handler: Can't share logs due to error ${err}`);
2018-12-03 11:46:47 -06:00
dialog.showMessageBox(focusedWindow, {
message: `${i18n.t('Unable to generate logs due to ')()} ${err}`,
title: i18n.t('Failed!')(),
2018-12-03 11:46:47 -06:00
type: 'error',
});
}
});
};
2019-01-16 12:00:59 -06:00
/**
* Compress and export crash dump stored under system crashes directory
*/
2018-12-03 11:46:47 -06:00
export const exportCrashDumps = (): void => {
const FILE_EXTENSIONS = isMac ? [ '.dmp' ] : [ '.dmp', '.txt' ];
const crashesDirectory = (electron.crashReporter as any).getCrashesDirectory();
const source = isMac ? crashesDirectory + '/completed' : crashesDirectory;
const focusedWindow = BrowserWindow.getFocusedWindow();
if (!fs.existsSync(source) || fs.readdirSync(source).length === 0 && focusedWindow && !focusedWindow.isDestroyed()) {
electron.dialog.showMessageBox(focusedWindow as BrowserWindow, {
message: i18n.t('No crashes available to share')(),
title: i18n.t('Failed!')(),
2018-12-03 11:46:47 -06:00
type: 'error',
});
return;
}
const destPath = isMac ? '/crashes_symphony_' : '\\crashes_symphony_';
const timestamp = new Date().getTime();
const destination = electron.app.getPath('downloads') + destPath + timestamp + '.zip';
generateArchiveForDirectory(source, destination, FILE_EXTENSIONS)
.then(() => {
electron.shell.showItemInFolder(destination);
})
.catch((err) => {
if (focusedWindow && !focusedWindow.isDestroyed()) {
electron.dialog.showMessageBox(focusedWindow, {
message: `${i18n.t('Unable to generate crash reports due to ')()} ${err}`,
title: i18n.t('Failed!')(),
2018-12-03 11:46:47 -06:00
type: 'error',
});
}
});
Merge TS context isolation branch onto Typescript master branch (#598) * Typescript 🎉 * Typescript 🎉 (logger, get-guid, string-format and throttle) * Refactor typescript code * consolidate all the utility functions to one file * refactor protocol handler feature * Typescript: Add code documentation Add pre-commit hooks * Typescript: Fix logger formatting * Typescript: Add support for react * Typescript: Completed about app * Typescript: Completed about app * Typescript: Completed about app * Typescript - Fix issues with about-app and add login to convert less to css * Typescript - Fix loading screen * Typescript - Add custom title bar * Typescript - Add method to get locale * Typescript - Add logic to clean up old logs * Typescript - Add set badge count api * Typescript - Complete application menu * Typescript - Add logic to translate menu items * Typescript - freeze window.ssf api * Typescript - Handle popup menu on alt key press * Typescript - Completed activity detection * Typescript - Completed screen snippet * Typescript - Add login to close screen snippet * Typescript - Completed window actions & snackbar, Updated i18n module * Typescript - Completed native crypto implementation & fixed bugs * Typescript - Completed Desktop capturer & screen picker implementation * Typescript - Optimize window actions * Typescript - Add support for child window * Typescript - fix pop url validation issue & browserify preload * Typescript - Completed context menu implementation and fixed screen snippet * Typescript - Completed screen sharing indicator and fixed i18n usage issue * Typescript - Fix i18n locale setting issue * Typescript - Completed download manager * Typescript - Completed Basic auth * Typescript - Network connectivity dialog * Typescript - Handle certificate error * Typescript - Add translation for certificate error dialog buttons * Typescript - Add gulp tasks to compile less, typescript and copy files * Typescript - Fix some issues with custom title bar, loading screen & screen snippet * Typescript - Remove ES2015 lib * :typescript: - Do not inject custom title bar for mac * :typescript: - Fix screen sharing indicator text and format string * Typescript - Fix esc to full screen * Typescript - handle multiple/single instance of the client and add safety checks * Typescript - Refactor code base * Typescript - Optimize window validation and fix screen picker issue * Typescript - Optimize protocol handler * typescript: logger unit test * typescript: activityDetection unit test (#560) * ELECTRON-1022 - Create app bridge that communicates between renderer and preload via postMessage * ELECTRON-1024 - Add support for screen share and screen sharing indicator * config unit test (#566) * ELECTRON-1024 - Fix screen sharing indicator close issue * ELECTRON-1022 - Bump Symphony version to 5.0.0 (1.55) * fixing jest coverage output report (#575) * protocol handle unit test (#576) * Typescript - Remove unwanted checks in protocol handler and add test cases * added more tests to increase coverage to 100 for protocol handler * Typescript download manager unit test (#579) * adding enzyme * download manager unit test * Typescript - Completed notification workflow * about app unit test * Typescript - Fix notification styles * fixing Compiler error: Generic type ReactElement<P, T> (#583) * fix app path on windows (#580) * basic auth unit test (#582) * screen picker unit test (#587) * screen picker unit test * screen sharing indicator unit test * loading screen unit test (#588) * improving snapshot using snapshotSerializers to remove unnecessary things (#596) * Typescript - Enforce braces for if/for/do/while statements. * Typescript - Fix Lint issues and Unit test * Typescript - Enable eofline (Ensure the file ends with a newline.) * Typescript - Update logger logic and format * Typescript - Provide option for user to set custom log path * Typescript - Fix eofline in css files * Typescript - ignore spec from compiling and remove unwanted rebuild command
2019-03-19 05:52:39 -05:00
};