serverless-spy
Version:
CDK-based library for writing elegant integration tests on AWS serverless architecture and an additional web console to monitor events in real time.
210 lines (201 loc) • 8.04 kB
JavaScript
/*
* Copyright 2010-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
//node.js deps
const fs = require('fs');
//npm deps
const minimist = require('minimist');
//app deps
const isUndefined = require('../../common/lib/is-undefined');
//begin module
var clientIdDefault;
if (!isUndefined(process.env.USER)) {
clientIdDefault = process.env.USER.concat(Math.floor((Math.random() * 100000) + 1));
} else {
clientIdDefault = 'nouser' + (Math.floor((Math.random() * 100000) + 1));
}
module.exports = function(description, args, processFunction, argumentHelp) {
var doHelp = function() {
var progName = process.argv[1];
var lastSlash = progName.lastIndexOf('/');
if (lastSlash !== -1) {
progName = progName.substring(lastSlash + 1, progName.length);
}
if (isUndefined(argumentHelp)) {
console.log('Usage: ' + progName + ' [OPTION...]');
} else {
console.log('Usage: ' + progName + ' [OPTION...] ARGUMENTS...');
}
console.log('\n' + progName + ': ' + description + '\n\n' +
' Options\n\n' +
' -i, --client-id=ID use ID as client ID\n' +
' -H, --host-name=HOST connect to HOST (overrides --aws-region)\n' +
' -p, --port=PORT connect to PORT (overrides defaults)\n' +
' -P, --protocol=PROTOCOL connect using PROTOCOL (mqtts|wss)\n' +
' -k, --private-key=FILE use FILE as private key\n' +
' -c, --client-certificate=FILE use FILE as client certificate\n' +
' -a, --ca-certificate=FILE use FILE as CA certificate\n' +
' -f, --certificate-dir=DIR look in DIR for certificates\n' +
' -F, --configuration-file=FILE use FILE (JSON format) for configuration\n' +
' -r, --reconnect-period-ms=VALUE use VALUE as the reconnect period (ms)\n' +
' -K, --keepalive=VALUE use VALUE as the keepalive time (seconds)\n' +
' -t, --test-mode=[1-n] set test mode for multi-process tests\n' +
' -T, --thing-name=THINGNAME access thing shadow named THINGNAME\n' +
' -d, --delay-ms=VALUE delay in milliseconds before publishing\n' +
' -D, --debug print additional debugging information\n\n' +
' Default values\n\n' +
' client-id $USER<random-integer>\n' +
' protocol mqtts\n' +
' private-key private.pem.key\n' +
' client-certificate certificate.pem.crt\n' +
' ca-certificate root-CA.crt\n' +
' reconnect-period-ms 3000ms\n' +
' delay-ms 4000ms\n' +
' test-mode 1\n');
if (!isUndefined(argumentHelp)) {
console.log(argumentHelp);
}
};
args = minimist(args, {
string: ['certificate-dir', 'private-key', 'client-certificate',
'ca-certificate', 'client-id', 'thing-name', 'configuration-file',
'host-name', 'protocol'
],
integer: ['reconnect-period-ms', 'test-mode', 'port', 'delay-ms',
'keepalive'
],
boolean: ['help', 'debug'],
alias: {
clientId: ['i', 'client-id'],
privateKey: ['k', 'private-key'],
clientCert: ['c', 'client-certificate'],
caCert: ['a', 'ca-certificate'],
certDir: ['f', 'certificate-dir'],
configFile: ['F', 'configuration-file'],
baseReconnectTimeMs: ['r', 'reconnect-period-ms'],
keepAlive: ['K', 'keepalive'],
testMode: ['t', 'test-mode'],
thingName: ['T', 'thing-name'],
delay: ['d', 'delay-ms'],
Port: ['p', 'port'],
Protocol: ['P', 'protocol'],
Host: ['H', 'host-name'],
Debug: ['D', 'debug'],
help: 'h'
},
default: {
protocol: 'mqtts',
clientId: clientIdDefault,
privateKey: 'private.pem.key',
clientCert: 'certificate.pem.crt',
caCert: 'root-CA.crt',
testMode: 1,
/* milliseconds */
baseReconnectTimeMs: 4000,
/* seconds */
keepAlive: 300,
/* milliseconds */
delay: 4000,
Debug: false
},
unknown: function() {
console.error('***unrecognized options***');
doHelp();
process.exit(1);
}
});
if (args.help) {
doHelp();
return;
}
//
// If the user has specified a directory where certificates are located,
// prepend it to all of the certificate filenames.
//
if (!isUndefined(args.certDir)) {
args.privateKey = args.certDir + '/' + args.privateKey;
args.clientCert = args.certDir + '/' + args.clientCert;
args.caCert = args.certDir + '/' + args.caCert;
}
//
// If the configuration file is defined, read it in and set the parameters based
// on the values inside; these will override any other arguments specified on
// the command line.
//
if (!isUndefined(args.configFile)) {
if (!fs.existsSync(args.configFile)) {
console.error('\n' + args.configFile + ' doesn\'t exist (--help for usage)\n');
return;
}
var config = JSON.parse(fs.readFileSync(args.configFile, 'utf8'));
if (!isUndefined(config.privateKey)) {
if (!isUndefined(args.certDir)) {
args.privateKey = args.certDir + '/' + config.privateKey;
} else {
args.privateKey = config.privateKey;
}
}
if (!isUndefined(config.clientCert)) {
if (!isUndefined(args.certDir)) {
args.clientCert = args.certDir + '/' + config.clientCert;
} else {
args.clientCert = config.clientCert;
}
}
if (!isUndefined(config.caCert)) {
if (!isUndefined(args.certDir)) {
args.caCert = args.certDir + '/' + config.caCert;
} else {
args.caCert = config.caCert;
}
}
if (!isUndefined(config.host)) {
args.Host = config.host;
}
if (!isUndefined(config.port)) {
args.Port = config.port;
}
//
// When using a JSON configuration document from the AWS Console, allow
// the client ID to be overriden by the command line option for client ID.
// This is required to run the example programs from a JSON configuration
// document, since both instances must use different client IDs.
//
if (!isUndefined(config.clientId) && isUndefined(args.clientId)) {
args.clientId = config.clientId;
}
if (!isUndefined(config.thingName)) {
args.thingName = config.thingName;
}
}
if (args.Protocol === 'mqtts') {
//
// Client certificate, private key, and CA certificate must all exist if
// connecting via mqtts.
//
if (!fs.existsSync(args.privateKey)) {
console.error('\n' + args.privateKey + ' doesn\'t exist (--help for usage)\n');
return;
}
if (!fs.existsSync(args.clientCert)) {
console.error('\n' + args.clientCert + ' doesn\'t exist (--help for usage)\n');
return;
}
if (!fs.existsSync(args.caCert)) {
console.error('\n' + args.caCert + ' doesn\'t exist (--help for usage)\n');
return;
}
}
processFunction(args);
};