Merge branch 'master' into patch-5
This commit is contained in:
@@ -20,6 +20,7 @@ Commands:
|
|||||||
config Configuration management
|
config Configuration management
|
||||||
fb File base management
|
fb File base management
|
||||||
mb Message base management
|
mb Message base management
|
||||||
|
ssh SSH key management
|
||||||
`,
|
`,
|
||||||
User: `usage: oputil.js user <action> [<arguments>]
|
User: `usage: oputil.js user <action> [<arguments>]
|
||||||
|
|
||||||
@@ -219,6 +220,11 @@ qwk-export arguments:
|
|||||||
TIMESTAMP.
|
TIMESTAMP.
|
||||||
--no-qwke Disable QWKE extensions.
|
--no-qwke Disable QWKE extensions.
|
||||||
--no-synchronet Disable Synchronet style extensions.
|
--no-synchronet Disable Synchronet style extensions.
|
||||||
|
`,
|
||||||
|
SSH: `usage: oputil.js ssh <action>
|
||||||
|
|
||||||
|
Actions:
|
||||||
|
create Create new SSH Keys
|
||||||
`,
|
`,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ const handleFileBaseCommand = require('./oputil_file_base.js').handleFileBaseCom
|
|||||||
const handleMessageBaseCommand =
|
const handleMessageBaseCommand =
|
||||||
require('./oputil_message_base.js').handleMessageBaseCommand;
|
require('./oputil_message_base.js').handleMessageBaseCommand;
|
||||||
const handleConfigCommand = require('./oputil_config.js').handleConfigCommand;
|
const handleConfigCommand = require('./oputil_config.js').handleConfigCommand;
|
||||||
|
const handleSSHKeyCommand = require('./oputil_ssh_key.js').handleSSHKeyCommand;
|
||||||
const getHelpFor = require('./oputil_help.js').getHelpFor;
|
const getHelpFor = require('./oputil_help.js').getHelpFor;
|
||||||
|
|
||||||
module.exports = function () {
|
module.exports = function () {
|
||||||
@@ -32,6 +33,8 @@ module.exports = function () {
|
|||||||
return handleFileBaseCommand();
|
return handleFileBaseCommand();
|
||||||
case 'mb':
|
case 'mb':
|
||||||
return handleMessageBaseCommand();
|
return handleMessageBaseCommand();
|
||||||
|
case 'ssh':
|
||||||
|
return handleSSHKeyCommand();
|
||||||
default:
|
default:
|
||||||
return printUsageAndSetExitCode(getHelpFor('General'), ExitCodes.BAD_COMMAND);
|
return printUsageAndSetExitCode(getHelpFor('General'), ExitCodes.BAD_COMMAND);
|
||||||
}
|
}
|
||||||
|
|||||||
137
core/oputil/oputil_ssh_key.js
Normal file
137
core/oputil/oputil_ssh_key.js
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
/* jslint node: true */
|
||||||
|
/* eslint-disable no-console */
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// ENiGMA½
|
||||||
|
const initConfigAndDatabases = require('./oputil_common.js').initConfigAndDatabases;
|
||||||
|
|
||||||
|
const {
|
||||||
|
printUsageAndSetExitCode,
|
||||||
|
argv,
|
||||||
|
ExitCodes,
|
||||||
|
getAnswers,
|
||||||
|
} = require('./oputil_common.js');
|
||||||
|
const getHelpFor = require('./oputil_help.js').getHelpFor;
|
||||||
|
|
||||||
|
// deps
|
||||||
|
const async = require('async');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const exec = require('child_process').exec;
|
||||||
|
const inq = require('inquirer');
|
||||||
|
const _ = require('lodash');
|
||||||
|
|
||||||
|
|
||||||
|
exports.handleSSHKeyCommand = handleSSHKeyCommand;
|
||||||
|
|
||||||
|
const ConfigIncludeKeys = [
|
||||||
|
'loginServers.ssh',
|
||||||
|
'loginServers.ssh.privateKeyPem',
|
||||||
|
];
|
||||||
|
|
||||||
|
const MINIMUM_PASSWORD_LENGTH = 8;
|
||||||
|
const QUESTIONS = {
|
||||||
|
Create: [
|
||||||
|
{
|
||||||
|
name: 'createNew',
|
||||||
|
message: 'Generate New SSH Keys?',
|
||||||
|
type: 'confirm',
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'password',
|
||||||
|
message: 'SSL Password:',
|
||||||
|
default: "",
|
||||||
|
when: answers => answers.createNew,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
function execute(ui, command) {
|
||||||
|
exec(
|
||||||
|
command,
|
||||||
|
function (error, stdout, stderr) {
|
||||||
|
ui.log.write(error);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
const reason = error ? error.message : 'OpenSSL Error';
|
||||||
|
logDebug(
|
||||||
|
{
|
||||||
|
reason: reason,
|
||||||
|
cmd: util.cmd,
|
||||||
|
args: args
|
||||||
|
},
|
||||||
|
`openssl command failed`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ui.log.write("SSH Keys Generated")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createNew(cb) {
|
||||||
|
const ui = new inq.ui.BottomBar();
|
||||||
|
|
||||||
|
async.waterfall(
|
||||||
|
[
|
||||||
|
function init(callback) {
|
||||||
|
return initConfigAndDatabases(callback);
|
||||||
|
},
|
||||||
|
function create(configuration, callback) {
|
||||||
|
getAnswers(QUESTIONS.Create, answers => {
|
||||||
|
if (!answers.createNew) {
|
||||||
|
return callback('exit');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Answer Value
|
||||||
|
const sslPassword = answers.password.trim();
|
||||||
|
if (!sslPassword || sslPassword == "") {
|
||||||
|
ui.log.write('Password must be set.');
|
||||||
|
|
||||||
|
return callback('exit');
|
||||||
|
}
|
||||||
|
if (sslPassword.length < MINIMUM_PASSWORD_LENGTH) {
|
||||||
|
ui.log.write(`Password must be at least ${MINIMUM_PASSWORD_LENGTH} characters.`);
|
||||||
|
|
||||||
|
return callback('exit');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if Keyfiles Exist
|
||||||
|
const sshKeyPath = "config/security/";
|
||||||
|
const sshKeyFilename = "ssh_private_key.pem";
|
||||||
|
const targetKeyFile = sshKeyPath + sshKeyFilename;
|
||||||
|
|
||||||
|
ui.log.write(`Creating SSH Key: ${targetKeyFile}`);
|
||||||
|
|
||||||
|
// Create Dir
|
||||||
|
ui.log.write(`Creating Directory: ${sshKeyPath}`);
|
||||||
|
fs.ensureDirSync(sshKeyPath);
|
||||||
|
|
||||||
|
// Create SSH Keys
|
||||||
|
const command = `openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 | openssl rsa -out ./${targetKeyFile} -aes128 -traditional -passout pass:`;
|
||||||
|
execute(ui, `${command}${sslPassword}`);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
],
|
||||||
|
err => {
|
||||||
|
return cb(err, configPath, config);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSSHKeyCommand() {
|
||||||
|
if (true === argv.help) {
|
||||||
|
return printUsageAndSetExitCode(getHelpFor('SSH'), ExitCodes.ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
const action = argv._[1];
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case 'create':
|
||||||
|
return createNew();
|
||||||
|
|
||||||
|
default:
|
||||||
|
return printUsageAndSetExitCode(getHelpFor('SSH'), ExitCodes.ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
"temptmp": "^1.1.0",
|
"temptmp": "^1.1.0",
|
||||||
"uuid": "8.3.2",
|
"uuid": "8.3.2",
|
||||||
"uuid-parse": "1.1.0",
|
"uuid-parse": "1.1.0",
|
||||||
"ws": "7.4.3",
|
"ws": "8.18.0",
|
||||||
"yazl": "^2.5.1"
|
"yazl": "^2.5.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
Reference in New Issue
Block a user