UNPKG

hyper-manager

Version:

The ultimate and most complete extension to manage all your connections in one place for Hyper.js

324 lines (297 loc) 9.16 kB
const os = require('os') const path = require('path') const fs = require('fs') const pkg = require('./package') const defaultLocale = 'en-US' const defaultSettingsFileName = '.hyper-manager.json' class HyperManager { constructor() { this.settings = {} } getSettings() { return this.settings } setSettings(settings) { this.settings = settings } getDefaultSettings() { const exampleFileName = this.getExampleFileName() const settings = this.getJSONFileData(exampleFileName) const locale = settings.locale || defaultLocale settings.labels = this.getLocaleLabels(locale) return settings } getLocaleLabels(locale) { const localeFileName = this.getLocaleFileName(locale) return this.getJSONFileData(localeFileName) } getJSONFileData(filename) { try { const data = fs.readFileSync(filename) return JSON.parse(data) } catch (err) { console.error(err) return null } } getLocaleFileName(locale) { return `${__dirname}/locales/${locale}.json` } getExampleFileName() { return `${__dirname}/example.json` } getSettingsFileName() { const userHome = os.homedir() return path.resolve(`${userHome}/${defaultSettingsFileName}`) } isSettingsExists() { const settingsFileName = this.getSettingsFileName() try { if (fs.existsSync(settingsFileName)) { return true } } catch (err) { return false } } loadSettings() { const defaultSettings = this.getDefaultSettings() if (!this.isSettingsExists()) { this.settings = defaultSettings return } try { const settingsFileName = this.getSettingsFileName() this.settings = this.getJSONFileData(settingsFileName) this.settings.version = pkg.version const locale = this.settings.locale || defaultLocale this.settings.locale = locale this.settings.labels = this.getLocaleLabels(locale) } catch (err) { console.log(err) this.settings = defaultSettings } } saveSettings() { try { const data = JSON.stringify({ version: pkg.version, locale: this.settings.locale, groups: this.settings.groups, servers: this.settings.servers }) const settingsFileName = this.getSettingsFileName() fs.writeFileSync(settingsFileName, data) } catch (err) { console.log(err) } } getLabel(name) { const labels = this.settings.labels || {} return labels[name] || 'not-found' } getServerCommand(server) { if (!server.type) { return null } var command = '' switch (server.type) { case 'ssh': command = `ssh ` if (server.user) { command += `${server.user}@` } if (server.host) { command += `${server.host}` } if (server.port && server.port != 22) { command += ` -p ${server.port}` } if (server.key) { command += ` -i ${server.key}` } break case 'ftp': command = `ftp ` if (server.user) { command += `${server.user}@` } if (server.host) { command += `${server.host}` } if (server.port && server.port != 21) { command += ` ${server.port}` } break case 'telnet': command = `telnet ` if (server.user) { command += `${server.user}@` } if (server.host) { command += `${server.host}` } if (server.port) { command += ` ${server.port}` } break case 'cli': break } if (server.custom) { command += `${server.custom}` } return command } openParameterDialog(window) { window.rpc.emit('manager-open', this.getSettings()) } sendCliCommand(window, command) { window.rpc.emit('session data send', { data: command + '\r' }) } openServer(window, server, time) { return new Promise((resolve, reject) => { const command = this.getServerCommand(server) switch (server.launch) { case 'new-tab': window.rpc.emit('termgroup add req') break case 'split-horizontally': window.rpc.emit('split request horizontal') break case 'split-vertically': window.rpc.emit('split request vertical') break } // Launch server command setTimeout(() => { if (command) { // Change working diretory if (server.workingDir) { this.sendCliCommand( window, `cd ${server.workingDir}` ) } // Setting command delay if (server.delay > 0) { setTimeout(() => { this.sendCliCommand( window, command ) // Sleep to the next command setTimeout(resolve, time) }, server.delay * 1000 ) return } else { this.sendCliCommand( window, command ) } } // Sleep to the next command setTimeout(resolve, time) }, 500) }) } createServerMenuItem(server) { return { label: server.name, sublabel: server.legend, accelerator: server.accelerator, click: (item, window, event) => { if (window) { this.openServer(window, server, 500).then() } } } } createGroupOpenAllItem(group) { return { label: this.getLabel('openAll'), click: (item, window, event) => { if (window) { const servers = this.getGroupServers(group.id) servers.reduce((p, server) => { return p.then(() => this.openServer(window, server, 1000)) }, Promise.resolve() ) } } } } createParameterMenuItem() { return { label: this.getLabel('parameters'), click: (item, window, event) => { if (window) { this.openParameterDialog(window) } } } } getGroups() { return this.settings.groups || [] } getServers() { return this.settings.servers || [] } getGroupServers(id) { const servers = this.getServers() return servers.filter((server) => { return server.groupId == id }) } bindMenu(menu) { var groupMenus = [] menu.push({ type: 'separator' }) const groups = this.getGroups() groups.forEach((group) => { const servers = this.getGroupServers(group.id) var serverMenu = [] servers.forEach((server) => { serverMenu.push(this.createServerMenuItem(server)) }) if (servers.length > 1) { serverMenu.push({ type: 'separator' }) serverMenu.push(this.createGroupOpenAllItem(group)) } var menu = { label: group.name, submenu: serverMenu } if (group.legend) { menu.sublabel = group.legend } groupMenus.push(menu) }) if (groups.length > 0) { groupMenus.push({ type: 'separator' }) } groupMenus.push(this.createParameterMenuItem()) menu.push({ label: 'HyperManager', submenu: groupMenus }) return menu } } module.exports = HyperManager