forked from roadtrippers/beeswithfrickinlaserbeams
/
bees.js
107 lines (98 loc) · 3.12 KB
/
bees.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Require dependencies
var AWS = require('aws-sdk');
var lambda = new AWS.Lambda({region: 'us-east-1'});
var Promise = require('bluebird');
var AdmZip = require('adm-zip');
// Set configuration variables
var CONCURRENT_JOB_LIMIT = 50;
var config = process.argv.reduce(function(memo, arg, index) {
switch (arg) {
case '-n':
memo.totalRequests = process.argv[index + 1];
break;
case '-c':
memo.concurrentRequests = process.argv[index + 1];
memo.beamsPerBee = Math.ceil(
1.0 * memo.concurrentRequests / CONCURRENT_JOB_LIMIT);
break;
case '-u':
memo.url = process.argv[index + 1];
break;
}
return memo;
}, {});
if (config.concurrentRequests < CONCURRENT_JOB_LIMIT) {
config.beeCount = config.concurrentRequests;
} else config.beeCount = CONCURRENT_JOB_LIMIT;
config.iterations = Math.ceil(
1.0 * config.totalRequests / config.concurrentRequests);
// Create a zip file from the code for Lambda to consume
var zip = new AdmZip();
zip.addLocalFile('bee.js');
zip.addLocalFile('laser.js');
// Configure beeWithFrickinLaserBeam Lambda function
var createFunctionParams = {
Code: {
ZipFile: zip.toBuffer()
},
FunctionName: 'bee',
Handler: 'bee.handler',
Role: 'arn:aws:iam::816502430665:role/lambda_exec_role',
Runtime: 'nodejs',
MemorySize: 1024,
Timeout: 3
};
var createFunction = Promise.promisify(lambda.createFunction, lambda);
createFunction(createFunctionParams).
then(function(e) {
console.log('Releasing',
config.beeCount,
'bee(s) with',
config.beamsPerBee,
'frickin\' laser beam(s) each for',
config.iterations,
'attack(s).');
var invokeParams = {
FunctionName: 'bee',
Payload: JSON.stringify({
url: config.url,
beamsPerBee: config.beamsPerBee
})
};
// Start sending waves of requests
sendInTheBees(config.iterations - 1, invokeParams);
});
var invoke = Promise.promisify(lambda.invoke, lambda);
function sendInTheBees(iterations, invokeParams, totals) {
// Kick off all the jobs
var invokedBees = [];
for (var i = 0; i < config.beeCount; i++) {
invokedBees.push(invoke(invokeParams));
}
var payload;
Promise.all(invokedBees).then(function(results){
// Run calculations on our results
totals = results.reduce(function(memo, result) {
payload = JSON.parse(result.Payload);
memo.codes = payload.codes.reduce(function(m, v) {
if (memo.codes.indexOf(v) === -1) m.push(v);
return m;
});
memo.time += payload.time * 1.0 / config.beeCount / config.iterations;
memo.hits += config.beamsPerBee;
return memo;
}, totals || { time: 0, hits: 0, codes: [] });
if (iterations > 0) {
console.log('Sending in', iterations, 'more swarms.');
sendInTheBees(iterations - 1, invokeParams, totals);
} else {
console.log('Sent', totals.hits, 'hits');
console.log('Recieved codes:', totals.codes);
console.log('Mean request time:', parseInt(totals.time), 'ms');
lambda.deleteFunction({FunctionName: 'bee'}).send();
}
}).catch(function(e) {
console.log(e);
lambda.deleteFunction({FunctionName: 'bee'}).send();
})
}