const { pathExists, copy, readJSON, writeFile, ensureDir } = require('fs-extra'); const { join } = require('path'); const { Client } = require('ssh2'); var outputDir = join(__filename, '..', 'output'); var configPath = join(__filename, '..', 'config.json'); var defaultConfigPath = join(__filename, '..', 'defaultConfig.json'); var config: Config = null; console.log('S T A R T I N G M U L T I S S H D E P L O Y E R'); var prepareDeploy = async () => { await ensureDir(outputDir); var exists = await pathExists(configPath); if (exists) { config = await readJSON(configPath); startPrepare(); } else { copy(defaultConfigPath, configPath, (err) => { if (err) throw err; console.log(`----- Default config has been copied -----`); }); } }; function startPrepare() { console.log(`----- STARTING PREPARE ON ${config.addresses.length} DEVICES -----`); (function handle(i = 0) { if (config.addresses[i]) { var address = config.addresses[i]; console.log(`Starting on device ${address}`); var ip = address.split(':')[0]; var port = address.split(':')[1] != undefined ? address.split(':')[1] : 22; const conn = new Client(); conn .on('ready', () => { console.log(' Client :: ready'); var output = `Device=${address}\n--- Starting ${new Date().toLocaleTimeString('NL-nl')} ---\n`; conn.shell((err, stream) => { if (err) { console.error(' Error starting shell:', err); return; } stream .on('close', (code, signal) => { console.log(' Stream :: close :: code: ' + code + ', signal: ' + signal); conn.end(); output = `${output}\n--- Finished ${new Date().toLocaleTimeString('NL-nl')} ---`; writeFile(join(outputDir, `${address}.log`), output, (err) => { if (err) throw err; console.log(`Finished device ${address}`); handle(i + 1); }); }) .on('data', (data) => { output = `${output}${data}`; console.log(data.toString()); }); stream.write(`${config.payload.join('\n')}\nexit\n`); }); }) .connect({ host: ip, port: port, username: config.username, password: config.password }) .on('error', (error) => { console.log(`Error whilst connecting to address ${address}`, error); handle(i + 1); }); } else console.log('----- FINISHED ALL DEVICES -----'); })(); } prepareDeploy(); interface Config { addresses: string[]; username: string; password: string; payload: string[]; }