Skip to content

Commit

Permalink
fix checksums, allow for decrypting kms
Browse files Browse the repository at this point in the history
  • Loading branch information
roaringdev committed Mar 8, 2018
1 parent 5d126f3 commit 3b7c590
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 45 deletions.
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
28 changes: 28 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
module.exports = {
"env": {
"es6": true,
"node": true,
"mocha": true,
"jquery": true
},
"extends": "eslint:recommended",
"parserOptions": {
"sourceType": "module"
},
"rules": {
"eol-last": ["error", "always"],
"no-console": 0,
"indent": [
"error",
"tab"
],
"linebreak-style": [
"error",
"unix"
],
"semi": [
"error",
"always"
]
}
}
6 changes: 4 additions & 2 deletions leo-cli-configure.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ program
.usage('<stack> <region> <dir> [options]')
.action(function(stack, region, dir, options) {
if (typeof dir === "object") {
dir = ".";
options = dir;
dir = ".";
}
if (options.global) {
dir = null;
}

generateProfile(stack, {
region: region
}, dir, (err) => {
Expand Down
5 changes: 3 additions & 2 deletions leo-cli-publish.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ program
.option("--awsprofile [awsprofile]", "AWS Profile to use")
.option("--tag [tag]", "Tag for publish directory. eg. prod")
.usage('<dir> [options]')
.action(function (dir) {
.action(function(dir) {
let env = program.env || "dev";
// console.log(env)
let rootDir = path.resolve(process.cwd(), dir);
Expand All @@ -33,7 +33,7 @@ program
let filter = program.filter;
let force = program.force;
if (configure.type !== "microservice" && configure._meta.microserviceDir) {
filter = rootDir.replace(/^.*?(bots|api)[\\/]/, "")
filter = rootDir.replace(/^.*?(bots|api)[\\/]/, "");
force = filter;
rootDir = configure._meta.microserviceDir;
configure = buildConfig(rootDir);
Expand Down Expand Up @@ -84,6 +84,7 @@ program

if (program.run || !program.build) {
console.log("\n---------------Publish Complete---------------");
console.log(data.filter(d => d.region == program.region)[0].url + "cloudformation.json");
} else {
console.log("\n---------------Build Complete---------------");
}
Expand Down
27 changes: 14 additions & 13 deletions lib/cloud-formation.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ var cmds = require("./build.js")
var buildConfig = require("./build-config").build;

module.exports = {
createCloudFormation: function (dir, opts, callback) {
createCloudFormation: function(dir, opts, callback) {
return new Promise((resolve, reject) => {
opts = Object.assign({
config: undefined,
Expand Down Expand Up @@ -49,7 +49,7 @@ module.exports = {
}
cloudFormation.Resources = Object.assign(cloudFormation.Resources, microservice.config && microservice.config.leo && microservice.config.leo.Resources || {});

let scalable = function (tableName, throughput, type) {
let scalable = function(tableName, throughput, type) {
let targetCapacity = throughput[`Target${type}Capacity`];
if (typeof targetCapacity == "number") {
targetCapacity = {
Expand Down Expand Up @@ -206,14 +206,14 @@ module.exports = {
console.log(path.resolve(dir, "*(bots|api)/{,!(node_modules)/**/}" + `/${opts.filter}/package.json`));
glob(path.resolve(path.resolve(dir, "*(bots|api)/{,!(node_modules)/**/}" + `/${opts.filter}/package.json`)), {
nodir: true
}, function (err, files) {
}, function(err, files) {
var entries = [];

let prevSwagger = merge({}, cloudFormation.Resources.RestApi && cloudFormation.Resources.RestApi.Properties.Body);
files.filter(f => !f.match(/\/node_modules\//)).map((file) => {
var package = JSON.parse(fs.readFileSync(file));
const packageName = package.name.replace(/[^a-zA-Z0-9]/g, '');
const ID = package.logicalResource || package.name.replace(/[^a-zA-Z0-9]+/g, "_").replace(/(^\w|_\w)/g, function (txt) {
const ID = package.logicalResource || package.name.replace(/[^a-zA-Z0-9]+/g, "_").replace(/(^\w|_\w)/g, function(txt) {
return txt.charAt(txt.length == 1 ? 0 : 1).toUpperCase();
});
const existing = cloudFormation.Resources[ID];
Expand All @@ -230,13 +230,14 @@ module.exports = {
package.config.leo.stacks = package.config.leo.stacks.concat(microservice.config.leo.stacks);
}

if (package.config.leo.skip === true) {
return;
}

// TODO: this was for old config merging
let mergedConfig = buildConfig(file);
package.config.leo = mergedConfig;

if (mergedConfig.skip === true) {
return;
}

let version = package.version;
let botDirName = file.replace(/^.*(?:bots|api)[/\\](.*)[\\/]package\.json$/, "$1").replace(/\//g, "\\");
Expand Down Expand Up @@ -553,7 +554,7 @@ module.exports = {
});
});
},
run: function (stack, region, file, opts) {
run: function(stack, region, file, opts) {
return new Promise((resolve, reject) => {
var cloudformation = new aws.CloudFormation({
region: region,
Expand Down Expand Up @@ -589,7 +590,7 @@ module.exports = {
reject(err);
}
} else {
setTimeout(function () {
setTimeout(function() {
cloudformation.api.waiters["stackUpdateComplete"].delay = 10;
cloudformation.waitFor("stackUpdateComplete", {
StackName: stack
Expand All @@ -604,7 +605,7 @@ module.exports = {
});
});
},
get: function (stack, region, opts) {
get: function(stack, region, opts) {
return new Promise((resolve, reject) => {
var cloudformation = new aws.CloudFormation({
region: region,
Expand Down Expand Up @@ -644,7 +645,7 @@ function getBuckets(regions, opts, callback) {
});
cloudformation.describeStackResources({
StackName: opts.name
}, function (err, data) {
}, function(err, data) {
if (err) {
if (err.message == `Stack with id ${opts.name} does not exist`) {
console.log(`We cannot find a CloudFormation stack with the name ${opts.name} in region ${region}`);
Expand Down Expand Up @@ -742,7 +743,7 @@ function createStack(name, template, region, opts, done) {
}
cloudformation.describeStackResources({
StackName: name
}, function (err, data) {
}, function(err, data) {
if (err) {
return done(err);
}
Expand All @@ -769,7 +770,7 @@ function createLambdaEntry(existing, properties, newPath, file) {

if (config.type == "cron-template") {
// No lambda to create
var visit = function (obj) {
var visit = function(obj) {
Object.keys(obj)
.forEach(k => {
var v = obj[k];
Expand Down
41 changes: 20 additions & 21 deletions lib/wrappers/cron.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,14 @@ require('source-map-support').install({
});

var moment = require("moment");
var file = require("____FILE____");
var handler = "____HANDLER____";
let decrypted = false;
let botHandler = function (event, context, callback) {
let botHandler = function(event, context, callback) {
let tasks = [];
Object.keys(process.env).forEach(function (key) {
Object.keys(process.env).forEach(function(key) {
if (!decrypted && key.toLowerCase().indexOf('kms') !== -1) {
tasks.push(function (done) {
kms.decryptString(process.env[key], function (err, value) {
tasks.push(function(done) {
kms.decryptString(process.env[key], function(err, value) {
if (err) {
return done(err);
}
Expand All @@ -32,12 +31,12 @@ let botHandler = function (event, context, callback) {
});
}
});
async.parallelLimit(tasks, 20, function (err, results) {
async.parallelLimit(tasks, 20, function(err, results) {
if (err) {
return callback(err);
}
decrypted = true;
file[handler](event, context, callback);
require("____FILE____")[handler](event, context, callback);
});
};

Expand All @@ -51,18 +50,18 @@ var theCallback;
var theContext;
var __theEvent;
var __startTime = moment.now();
process.on('uncaughtException', function (err) {
process.on('uncaughtException', function(err) {
console.log(err);
console.log(`[LEOCRON]:end:${config.name}:${theContext.awsRequestId}`);
if (__theEvent.__cron) {
cron.reportComplete(__theEvent.__cron, theContext.awsRequestId, "error", {
msg: err.message,
stack: err.stack
}, {}, function () {
}, {}, function() {
console.log("Cron Lock removed");
});
} else {
cron.removeLock(config.name, theContext.awsRequestId, function () {
cron.removeLock(config.name, theContext.awsRequestId, function() {
console.log("Lock removed");
});
}
Expand All @@ -78,7 +77,7 @@ function empty(obj) {
}

module.exports = {
handler: function (event, context, callback) {
handler: function(event, context, callback) {
let debug = process.env.debug === "true";
context.resources = process.resources;
if (event.requestContext) { //new lambda proxy method
Expand Down Expand Up @@ -115,25 +114,25 @@ module.exports = {
console.log("[LEOCRON]:check:" + cronkey);
debug && console.log("Locking on __cron", event.__cron);
var startTime = moment.now();
cron.checkLock(event.__cron, context.awsRequestId, context.getRemainingTimeInMillis(), function (err, data) {
cron.checkLock(event.__cron, context.awsRequestId, context.getRemainingTimeInMillis(), function(err, data) {
if (err) {
console.log("LOCK EXISTS, cannot run");
callback(null, "already running");
} else {
try {
console.log("[LEOCRON]:start:" + cronkey);
fill(event || {}, config, dynamodb.docClient).then(filledEvent => {
botHandler(filledEvent, context, function (err, data) {
botHandler(filledEvent, context, function(err, data) {
console.log("[LEOCRON]:complete:" + cronkey);
cron.reportComplete(event.__cron, context.awsRequestId, err ? "error" : "complete", err ? err : '', {}, function (err2, data2) {
cron.reportComplete(event.__cron, context.awsRequestId, err ? "error" : "complete", err ? err : '', {}, function(err2, data2) {
if (err || err2) {
console.log(err || err2);
}
callback(err, data);
});
});
}).catch(err => {
cron.reportComplete(event.__cron, context.awsRequestId, "error", err, {}, function () {
cron.reportComplete(event.__cron, context.awsRequestId, "error", err, {}, function() {
callback(err);
});
});
Expand All @@ -142,7 +141,7 @@ module.exports = {
cron.reportComplete(event.__cron, context.awsRequestId, "error", {
msg: e.message,
stack: e.stack
}, {}, function () {
}, {}, function() {
callback(e);
});
}
Expand All @@ -153,17 +152,17 @@ module.exports = {
} else {
debug && console.log("Locking Settings");

cron.createLock(config.name, context.awsRequestId, context.getRemainingTimeInMillis() + 100, function (err, data) {
cron.createLock(config.name, context.awsRequestId, context.getRemainingTimeInMillis() + 100, function(err, data) {
if (err) {
console.log("LOCK EXISTS, cannot run");
callback(null, "already running");
} else {
try {
debug && console.log("running");
fill(event || {}, config, dynamodb.docClient).then(filledEvent => {
botHandler(filledEvent, context, function (err, data) {
botHandler(filledEvent, context, function(err, data) {
debug && console.log("removing lock", config.name, context.awsRequestId);
cron.removeLock(config.name, context.awsRequestId, function (err2, data2) {
cron.removeLock(config.name, context.awsRequestId, function(err2, data2) {
if (err || err2) {
console.log(err || err2);
}
Expand All @@ -172,13 +171,13 @@ module.exports = {
});
}).catch(err => {
debug && console.log("error");
cron.removeLock(config.name, context.awsRequestId, function () {
cron.removeLock(config.name, context.awsRequestId, function() {
callback(err);
}, "error");
});
} catch (e) {
debug && console.log("error");
cron.removeLock(config.name, context.awsRequestId, function () {
cron.removeLock(config.name, context.awsRequestId, function() {
callback(e);
});
}
Expand Down
34 changes: 31 additions & 3 deletions lib/wrappers/raw.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,40 @@
"use strict";

process.resources = process.env.Resources && JSON.parse(process.env.Resources) || {};
var file = require("____FILE____");
var handler = "____HANDLER____";
var async = require("async");
var leosdk = require("leo-sdk");
var kms = require("leo-sdk/lib/kms")(leosdk.configuration);

let decrypted = false;
let botHandler = function(event, context, callback) {
let tasks = [];
Object.keys(process.env).filter(e => !e.match(/^npm/)).forEach(function(key) {
if (!decrypted && key.toLowerCase().indexOf('kms') !== -1) {
tasks.push(function(done) {
kms.decryptString(process.env[key], function(err, value) {
if (err) {
return done(err);
}
console.log(key, value);
process.env[key] = value;
done();
});
});
}
});
async.parallelLimit(tasks, 20, function(err, results) {
if (err) {
return callback(err);
}
decrypted = true;
require("____FILE____")[handler](event, context, callback);
});
};

module.exports = {
handler: function (event, context, callback) {
handler: function(event, context, callback) {
context.resources = process.resources;
return file[handler](event, context, callback);
return botHandler(event, context, callback);
}
};
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "leo-cli",
"version": "1.0.19",
"version": "1.0.21",
"description": "",
"main": "index.js",
"directories": {
Expand Down Expand Up @@ -120,4 +120,4 @@
},
"author": "",
"license": "MIT"
}
}

0 comments on commit 3b7c590

Please sign in to comment.