From 1135dc3e3076b604ba22cd6b02400dddb8d3edcf Mon Sep 17 00:00:00 2001 From: marcelspryszynski Date: Wed, 26 Mar 2025 20:16:27 +0100 Subject: [PATCH] Added hashcat and speedtest workflow --- examples/Hashcat/README.md | 6 + examples/Hashcat/filter.js | 28 ++ examples/Hashcat/functions.js | 83 +++++ examples/Hashcat/generate.js | 35 ++ examples/Hashcat/handler.js | 76 +++++ examples/Hashcat/hashcat.js | 44 +++ examples/Hashcat/hashcat.png | Bin 0 -> 20716 bytes examples/Hashcat/package-lock.json | 322 +++++++++++++++++++ examples/Hashcat/package.json | 14 + examples/Hashcat/summarize.js | 17 + examples/Hashcat/workflow.json | 140 ++++++++ examples/HashcatKubernetes/Dockerfile | 50 +++ examples/HashcatKubernetes/DockerfileData | 4 + examples/HashcatKubernetes/filter.js | 27 ++ examples/HashcatKubernetes/generate.js | 35 ++ examples/HashcatKubernetes/handler.js | 76 +++++ examples/HashcatKubernetes/hashcat.js | 44 +++ examples/HashcatKubernetes/package-lock.json | 322 +++++++++++++++++++ examples/HashcatKubernetes/package.json | 14 + examples/HashcatKubernetes/summarize.js | 17 + examples/HashcatKubernetes/workflow.json | 177 ++++++++++ examples/SpeedTest/Dockerfile | 34 ++ examples/SpeedTest/DockerfileData | 4 + examples/SpeedTest/handler.js | 76 +++++ examples/SpeedTest/package.json | 14 + examples/SpeedTest/speedtest.js | 34 ++ examples/SpeedTest/workflow.json | 28 ++ 27 files changed, 1721 insertions(+) create mode 100644 examples/Hashcat/README.md create mode 100644 examples/Hashcat/filter.js create mode 100644 examples/Hashcat/functions.js create mode 100644 examples/Hashcat/generate.js create mode 100644 examples/Hashcat/handler.js create mode 100644 examples/Hashcat/hashcat.js create mode 100644 examples/Hashcat/hashcat.png create mode 100644 examples/Hashcat/package-lock.json create mode 100644 examples/Hashcat/package.json create mode 100644 examples/Hashcat/summarize.js create mode 100644 examples/Hashcat/workflow.json create mode 100644 examples/HashcatKubernetes/Dockerfile create mode 100644 examples/HashcatKubernetes/DockerfileData create mode 100755 examples/HashcatKubernetes/filter.js create mode 100755 examples/HashcatKubernetes/generate.js create mode 100644 examples/HashcatKubernetes/handler.js create mode 100755 examples/HashcatKubernetes/hashcat.js create mode 100644 examples/HashcatKubernetes/package-lock.json create mode 100644 examples/HashcatKubernetes/package.json create mode 100755 examples/HashcatKubernetes/summarize.js create mode 100644 examples/HashcatKubernetes/workflow.json create mode 100644 examples/SpeedTest/Dockerfile create mode 100644 examples/SpeedTest/DockerfileData create mode 100644 examples/SpeedTest/handler.js create mode 100644 examples/SpeedTest/package.json create mode 100644 examples/SpeedTest/speedtest.js create mode 100644 examples/SpeedTest/workflow.json diff --git a/examples/Hashcat/README.md b/examples/Hashcat/README.md new file mode 100644 index 0000000..59ee9c8 --- /dev/null +++ b/examples/Hashcat/README.md @@ -0,0 +1,6 @@ +Hashcat dictionary: +npm install +hflow run . + +Workflow diagram: +![img.png](hashcat.png) \ No newline at end of file diff --git a/examples/Hashcat/filter.js b/examples/Hashcat/filter.js new file mode 100644 index 0000000..3be577a --- /dev/null +++ b/examples/Hashcat/filter.js @@ -0,0 +1,28 @@ +const fs = require('fs'); + +function filterHashes() { + const hashes = fs.readFileSync("hashes.txt", 'utf8').trim().split('\n'); + + const groupedHashes = { + md5: [], + sha1: [], + sha256: [], + sha512: [], + 'sha3-256': [] + }; + + hashes.forEach(line => { + const [hash, algorithm] = line.split(' '); + if (groupedHashes[algorithm]) { + groupedHashes[algorithm].push(hash); + } + }); + + // Write hashes to separate files by algorithm + Object.keys(groupedHashes).forEach(algorithm => { + const filename = `${algorithm}_hashes.txt`; + fs.writeFileSync(filename, groupedHashes[algorithm].join('\n'), 'utf8'); + }); +} + +filterHashes() \ No newline at end of file diff --git a/examples/Hashcat/functions.js b/examples/Hashcat/functions.js new file mode 100644 index 0000000..fc249b4 --- /dev/null +++ b/examples/Hashcat/functions.js @@ -0,0 +1,83 @@ +var spawn = require('child_process').spawn; +var log4js = require('log4js'); +var createJobMessage = require('../../common/jobMessage.js').createJobMessage; + + +// Spawns a job "node handler.js" and waits for the notification of its +// completion using the Redis job status notification mechanism +async function submitRemoteJob(ins, outs, context, cb) { + let fname='wftrace-' + context.hfId + '-' + context.appId + '.log'; + log4js.configure({ + appenders: { hftrace: { type: 'file', filename: fname } }, + categories: { default: { appenders: ['hftrace'], level: 'error' } } + }); + + var logger = log4js.getLogger(); + + logger.level = 'debug'; + console.log("Spawning process..."); + + //console.log(ins.map(i => i)); + + var input_dir = context.executor.input_dir, + work_dir = context.executor.work_dir, + output_dir = context.executor.output_dir; + + let jobMessage = JSON.stringify(createJobMessage(ins, outs, context)); + + var cmd; + + // if 'container' is present, run through Docker, mounting all directories if necessary + if (context.container) { + cmd = 'docker run '; + if (input_dir) cmd += ' -v ' + input_dir + ':/input_dir '; + if (work_dir) cmd += ' -v ' + work_dir + ':/work_dir '; + if (output_dir) cmd += ' -v ' + output_dir + ':/output_dir '; + cmd += container + ' node'; + } else cmd = 'node' + + try { + if (work_dir) { process.chdir(work_dir); } + } catch (error) { + throw error; + } + + // "submit" job (start the handler process) + var proc = spawn(cmd, ['../../../hyperflow-job-executor/jobexec.js', context.taskId, context.redis_url], {shell: true}); + + proc.stderr.on('data', function(data) { + logger.debug(data.toString()); + console.log(data.toString()); + }); + + proc.stdout.on('data', function(data) { + logger.debug(data.toString()); + console.log(data.toString()); + }); + + proc.on('exit', function(code) { + logger.debug('Process exited with code', code); + }); + + // send message to the job (command to be executed) + try { + await context.sendMsgToJob(jobMessage, context.taskId); + logger.info('[' + context.taskId + '] job message sent'); + } catch(err) { + console.error(err); + throw err; + } + + // wait for the job to finish (timeout=0 means indefinite) + try { + var jobResult = await context.jobResult(0, context.taskId); + logger.info('[' + context.taskId + '] job result received:', jobResult); + console.log('Received job result:', jobResult); + cb(null, outs); + } catch(err) { + console.error(err); + throw err; + } +} + +exports.submitRemoteJob = submitRemoteJob; diff --git a/examples/Hashcat/generate.js b/examples/Hashcat/generate.js new file mode 100644 index 0000000..0d424ea --- /dev/null +++ b/examples/Hashcat/generate.js @@ -0,0 +1,35 @@ +const fs = require('fs'); +const crypto = require('crypto'); + +function randomString(maxLength) { + const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + let result = ''; + for (let i = 0; i < maxLength; i++) { + result += chars[Math.floor(Math.random() * chars.length)]; + } + return result; +} + +function generateHashes() { + const algorithms = ['md5', 'sha1', 'sha256', 'sha512', 'sha3-256']; + const proportions = [35, 25, 15, 15, 10]; // Percentages for each algorithm + + const totalHashes = 100; + const hashCounts = proportions.map(p => Math.floor((p / 100) * totalHashes)); + + const hashes = []; + + for (let i = 0; i < algorithms.length; i++) { + for (let j = 0; j < hashCounts[i]; j++) { + const randomStr = randomString(5); + const hash = crypto.createHash(algorithms[i]).update(randomStr).digest('hex'); + hashes.push({ hash, algorithm: algorithms[i] }); + } + } + + // Write all hashes to a single file + const allHashes = hashes.map(h => `${h.hash} ${h.algorithm}`).join('\n'); + fs.writeFileSync('hashes.txt', allHashes, 'utf8'); +} + +generateHashes() \ No newline at end of file diff --git a/examples/Hashcat/handler.js b/examples/Hashcat/handler.js new file mode 100644 index 0000000..e7bbb48 --- /dev/null +++ b/examples/Hashcat/handler.js @@ -0,0 +1,76 @@ +// Executor of 'jobs' using the Redis task status notification mechanism +const redis = require('redis'); +const { spawn } = require('child_process'); + +if (process.argv.length < 4) { + console.error("Usage: node handler.js "); + process.exit(1); +} + +// 'taskId' is the name of the Redis list to use for the notification +var taskId = process.argv[2], +redis_url = process.argv[3]; + +//console.log("taskId", taskId); +//console.log("redis_url", redis_url); + +var rcl = redis.createClient(redis_url); + +// get job message from Redis +var getJobMessage = async function (timeout) { + return new Promise(function (resolve, reject) { + const jobMsgKey = taskId + "_msg"; + rcl.brpop(jobMsgKey, timeout, function (err, reply) { + err ? reject(err): resolve(reply) + }); + }); +} + +// send notification about job completion to Redis +var notifyJobCompletion = async function () { + return new Promise(function (resolve, reject) { + rcl.rpush(taskId, "OK", function (err, reply) { + err ? reject(err): resolve(reply) + }); + }); +} + + +async function executeJob() { + + // 1. get job message + try { + var jobMessage = await getJobMessage(10); + } catch (err) { + console.error(err); + throw err; + } + //console.log("Received job message:", jobMessage); + + // 2. Execute job + var jm = JSON.parse(jobMessage[1]); + + const cmd = spawn(jm["executable"], jm["args"]); + + cmd.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + + cmd.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + + cmd.on('close', async(code) => { + console.log(`child process exited with code ${code}`); + // 3. Notify job completion + try { + await notifyJobCompletion(); + } catch (err) { + console.error("Redis notification failed", err); + throw err; + } + process.exit(0); + }); + } + +executeJob() diff --git a/examples/Hashcat/hashcat.js b/examples/Hashcat/hashcat.js new file mode 100644 index 0000000..33d9af2 --- /dev/null +++ b/examples/Hashcat/hashcat.js @@ -0,0 +1,44 @@ +const { exec } = require('child_process'); + +function runHashcat(algorithm) { + const hashesFile = algorithm + '_hashes.txt'; // Hashes file // Algorithm name (e.g., 'md5', 'sha1') + const crackedFile = 'cracked.txt'; // Output file for cracked hashes + + // Map algorithms to Hashcat mode IDs + const algorithmModeMap = { + md5: 0, + sha1: 100, + sha256: 1400, + sha512: 1700, + 'sha3-256': 17400 + }; + + const hashcatMode = algorithmModeMap[algorithm]; + if (hashcatMode === undefined) { + const error = new Error(`Unsupported algorithm: ${algorithm}`); + console.error(error.message); + return; + } + + const mask = '?a?a?a?a?a'; + console.log(`Running Hashcat for ${algorithm}...`); + + // Construct the Hashcat command + const command = `hashcat --potfile-disable -m ${hashcatMode} -a 3 -o ${crackedFile} ${hashesFile} ${mask}`; + + // Execute the Hashcat command + exec(command, (error, stdout, stderr) => { + if (error) { + console.error(`Hashcat Error: ${error.message}`); + return; + } + if (stderr) { + console.error(`Hashcat Stderr: ${stderr}`); + } + + console.log(`Hashcat Output:\n${stdout}`); + }); +} + +const args = process.argv.slice(2); +runHashcat(args[0]); \ No newline at end of file diff --git a/examples/Hashcat/hashcat.png b/examples/Hashcat/hashcat.png new file mode 100644 index 0000000000000000000000000000000000000000..056bce3c2f6f9e13f5ef19265e74d572901a4795 GIT binary patch literal 20716 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 R;S|GNTI#yEVpZ$l{|^pgtn2^) literal 0 HcmV?d00001 diff --git a/examples/Hashcat/package-lock.json b/examples/Hashcat/package-lock.json new file mode 100644 index 0000000..91bc622 --- /dev/null +++ b/examples/Hashcat/package-lock.json @@ -0,0 +1,322 @@ +{ + "name": "aws-posixfs-executor-test", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "aws-posixfs-executor-test", + "version": "1.0.0", + "dependencies": { + "@stroncium/procfs": "^1.0.0", + "async": "^2.6.4", + "log4js": "^6.4.0", + "redis": "^3.1.1" + } + }, + "node_modules/@stroncium/procfs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@stroncium/procfs/-/procfs-1.2.1.tgz", + "integrity": "sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/redis": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", + "dependencies": { + "denque": "^1.5.0", + "redis-commands": "^1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-redis" + } + }, + "node_modules/redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + } + }, + "dependencies": { + "@stroncium/procfs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@stroncium/procfs/-/procfs-1.2.1.tgz", + "integrity": "sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA==" + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==" + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "requires": { + "ms": "^2.1.3" + } + }, + "denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" + }, + "flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "redis": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", + "requires": { + "denque": "^1.5.0", + "redis-commands": "^1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + } + }, + "redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "requires": { + "redis-errors": "^1.0.0" + } + }, + "rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } +} diff --git a/examples/Hashcat/package.json b/examples/Hashcat/package.json new file mode 100644 index 0000000..bef6116 --- /dev/null +++ b/examples/Hashcat/package.json @@ -0,0 +1,14 @@ +{ + "name": "aws-posixfs-executor-test", + "version": "1.0.0", + "main": "handler.js", + "scripts": { + "start": "node handler.js" + }, + "dependencies": { + "@stroncium/procfs": "^1.0.0", + "async": "^2.6.4", + "log4js": "^6.4.0", + "redis": "^3.1.1" + } +} \ No newline at end of file diff --git a/examples/Hashcat/summarize.js b/examples/Hashcat/summarize.js new file mode 100644 index 0000000..2e2cacc --- /dev/null +++ b/examples/Hashcat/summarize.js @@ -0,0 +1,17 @@ +const fs = require('fs'); + +function summarizeResults() { + const crackedHashes = fs.readFileSync("cracked.txt", 'utf8').trim().split('\n'); + + console.log('Cracked hashes:', crackedHashes); + + const summary = { + cracked: crackedHashes.length, + total: crackedHashes.length, // For simplicity, assume all hashes are cracked + details: crackedHashes + }; + + console.log('Summary:', summary); +} + +summarizeResults() \ No newline at end of file diff --git a/examples/Hashcat/workflow.json b/examples/Hashcat/workflow.json new file mode 100644 index 0000000..7a177eb --- /dev/null +++ b/examples/Hashcat/workflow.json @@ -0,0 +1,140 @@ +{ + "name": "PasswordAudit", + "processes": [ + { + "name": "GenerateHashes", + "type": "dataflow", + "function": "submitRemoteJob", + "firingLimit": 1, + "config": { + "executor": { + "executable": "node", + "args": ["./generate.js"] + } + }, + "ins": [], + "outs": [0] + }, + { + "name": "FilterHashes", + "type": "dataflow", + "function": "submitRemoteJob", + "config": { + "executor": { + "executable": "node", + "args": ["./filter.js"] + } + }, + "ins": [0], + "outs": [1] + }, + { + "name": "RunHashcatMD5", + "type": "dataflow", + "function": "submitRemoteJob", + "config": { + "executor": { + "executable": "node", + "args": ["./hashcat.js", "md5"] + } + }, + "ins": [1], + "outs": [2] + }, + { + "name": "RunHashcatSHA1", + "type": "dataflow", + "function": "submitRemoteJob", + "config": { + "executor": { + "executable": "node", + "args": ["./hashcat.js", "sha1"] + } + }, + "ins": [1], + "outs": [3] + }, + { + "name": "RunHashcatSHA256", + "type": "dataflow", + "function": "submitRemoteJob", + "config": { + "executor": { + "executable": "node", + "args": ["./hashcat.js", "sha256"] + } + }, + "ins": [1], + "outs": [4] + }, + { + "name": "RunHashcatSHA512", + "type": "dataflow", + "function": "submitRemoteJob", + "config": { + "executor": { + "executable": "node", + "args": ["./hashcat.js", "sha512"] + } + }, + "ins": [1], + "outs": [5] + }, + { + "name": "RunHashcatSHA3-256", + "type": "dataflow", + "function": "submitRemoteJob", + "config": { + "executor": { + "executable": "node", + "args": ["./hashcat.js", "sha3-256"] + } + }, + "ins": [1], + "outs": [6] + }, + { + "name": "SummarizeResults", + "type": "dataflow", + "function": "submitRemoteJob", + "config": { + "executor": { + "executable": "node", + "args": ["./summarize.js"] + } + }, + "ins": [2, 3, 4, 5, 6], + "outs": [7] + } + ], + "signals": [ + + { + "name": 0 + }, + { + "name": 1 + }, + { + "name": 2 + }, + { + "name": 3 + }, + { + "name": 4 + }, + { + "name": 5 + }, + { + "name": 6 + }, + { + "name": 7 + } + ], + "ins": [], + "outs": [7] + } + \ No newline at end of file diff --git a/examples/HashcatKubernetes/Dockerfile b/examples/HashcatKubernetes/Dockerfile new file mode 100644 index 0000000..555213c --- /dev/null +++ b/examples/HashcatKubernetes/Dockerfile @@ -0,0 +1,50 @@ +FROM node:22-bullseye + +# Set npm registry +RUN npm config set registry https://registry.npmjs.org/ + +# Install job-executor globally +RUN npm install -g --loglevel verbose @marsel888/job-executor@1.4.8 + +# Update package lists and install required dependencies +RUN apt-get update && apt-get install -y \ + bash \ + coreutils \ + pciutils \ + build-essential \ + git \ + openssl \ + libssl-dev \ + libpcre3 \ + libpcre3-dev \ + zlib1g \ + zlib1g-dev \ + curl \ + p7zip-full \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Download and install pre-built Hashcat binaries +RUN curl -LO https://hashcat.net/files/hashcat-2.00.7z \ + && 7z x hashcat-2.00.7z -o/opt/ \ + && mv /opt/hashcat-2.00 /opt/hashcat \ + && chmod +x /opt/hashcat/hashcat-cli64.bin \ + && ln -s /opt/hashcat/hashcat-cli64.bin /usr/bin/hashcat \ + && chmod 755 /usr/bin/hashcat \ + && rm hashcat-2.00.7z + +# Verify installation +RUN echo $PATH +RUN which hashcat || echo "hashcat not in PATH" + +# Create a wrapper script for hashcat +RUN echo '#!/bin/bash' > /usr/local/bin/hashcat \ + && echo 'exec /opt/hashcat/hashcat-cli64.bin "$@"' >> /usr/local/bin/hashcat \ + && chmod +x /usr/local/bin/hashcat + +# Set up environment +ENV PATH="/opt/hashcat:${PATH}" + +RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.5/dumb-init_1.2.5_x86_64 +RUN chmod +x /usr/local/bin/dumb-init +ENTRYPOINT ["/usr/local/bin/dumb-init", "--"] \ No newline at end of file diff --git a/examples/HashcatKubernetes/DockerfileData b/examples/HashcatKubernetes/DockerfileData new file mode 100644 index 0000000..7775888 --- /dev/null +++ b/examples/HashcatKubernetes/DockerfileData @@ -0,0 +1,4 @@ +FROM busybox + +RUN mkdir /data +COPY * /data/ \ No newline at end of file diff --git a/examples/HashcatKubernetes/filter.js b/examples/HashcatKubernetes/filter.js new file mode 100755 index 0000000..24c2bfe --- /dev/null +++ b/examples/HashcatKubernetes/filter.js @@ -0,0 +1,27 @@ +const fs = require('fs'); + +function filterHashes() { + const hashes = fs.readFileSync("hashes.txt", 'utf8').trim().split('\n'); + + const groupedHashes = { + md5: [], + sha1: [], + sha256: [], + sha512: [], + }; + + hashes.forEach(line => { + const [hash, algorithm] = line.split(' '); + if (groupedHashes[algorithm]) { + groupedHashes[algorithm].push(hash); + } + }); + + // Write hashes to separate files by algorithm + Object.keys(groupedHashes).forEach(algorithm => { + const filename = `${algorithm}_hashes.txt`; + fs.writeFileSync(filename, groupedHashes[algorithm].join('\n'), 'utf8'); + }); +} + +filterHashes() \ No newline at end of file diff --git a/examples/HashcatKubernetes/generate.js b/examples/HashcatKubernetes/generate.js new file mode 100755 index 0000000..0d424ea --- /dev/null +++ b/examples/HashcatKubernetes/generate.js @@ -0,0 +1,35 @@ +const fs = require('fs'); +const crypto = require('crypto'); + +function randomString(maxLength) { + const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + let result = ''; + for (let i = 0; i < maxLength; i++) { + result += chars[Math.floor(Math.random() * chars.length)]; + } + return result; +} + +function generateHashes() { + const algorithms = ['md5', 'sha1', 'sha256', 'sha512', 'sha3-256']; + const proportions = [35, 25, 15, 15, 10]; // Percentages for each algorithm + + const totalHashes = 100; + const hashCounts = proportions.map(p => Math.floor((p / 100) * totalHashes)); + + const hashes = []; + + for (let i = 0; i < algorithms.length; i++) { + for (let j = 0; j < hashCounts[i]; j++) { + const randomStr = randomString(5); + const hash = crypto.createHash(algorithms[i]).update(randomStr).digest('hex'); + hashes.push({ hash, algorithm: algorithms[i] }); + } + } + + // Write all hashes to a single file + const allHashes = hashes.map(h => `${h.hash} ${h.algorithm}`).join('\n'); + fs.writeFileSync('hashes.txt', allHashes, 'utf8'); +} + +generateHashes() \ No newline at end of file diff --git a/examples/HashcatKubernetes/handler.js b/examples/HashcatKubernetes/handler.js new file mode 100644 index 0000000..e7bbb48 --- /dev/null +++ b/examples/HashcatKubernetes/handler.js @@ -0,0 +1,76 @@ +// Executor of 'jobs' using the Redis task status notification mechanism +const redis = require('redis'); +const { spawn } = require('child_process'); + +if (process.argv.length < 4) { + console.error("Usage: node handler.js "); + process.exit(1); +} + +// 'taskId' is the name of the Redis list to use for the notification +var taskId = process.argv[2], +redis_url = process.argv[3]; + +//console.log("taskId", taskId); +//console.log("redis_url", redis_url); + +var rcl = redis.createClient(redis_url); + +// get job message from Redis +var getJobMessage = async function (timeout) { + return new Promise(function (resolve, reject) { + const jobMsgKey = taskId + "_msg"; + rcl.brpop(jobMsgKey, timeout, function (err, reply) { + err ? reject(err): resolve(reply) + }); + }); +} + +// send notification about job completion to Redis +var notifyJobCompletion = async function () { + return new Promise(function (resolve, reject) { + rcl.rpush(taskId, "OK", function (err, reply) { + err ? reject(err): resolve(reply) + }); + }); +} + + +async function executeJob() { + + // 1. get job message + try { + var jobMessage = await getJobMessage(10); + } catch (err) { + console.error(err); + throw err; + } + //console.log("Received job message:", jobMessage); + + // 2. Execute job + var jm = JSON.parse(jobMessage[1]); + + const cmd = spawn(jm["executable"], jm["args"]); + + cmd.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + + cmd.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + + cmd.on('close', async(code) => { + console.log(`child process exited with code ${code}`); + // 3. Notify job completion + try { + await notifyJobCompletion(); + } catch (err) { + console.error("Redis notification failed", err); + throw err; + } + process.exit(0); + }); + } + +executeJob() diff --git a/examples/HashcatKubernetes/hashcat.js b/examples/HashcatKubernetes/hashcat.js new file mode 100755 index 0000000..ab4cdfd --- /dev/null +++ b/examples/HashcatKubernetes/hashcat.js @@ -0,0 +1,44 @@ +const { execSync } = require('child_process'); + +function runHashcat(algorithm) { + const hashesFile = algorithm + '_hashes.txt'; // Hashes file // Algorithm name (e.g., 'md5', 'sha1') + const crackedFile = 'cracked.txt'; // Output file for cracked hashes + + // Map algorithms to Hashcat mode IDs + const algorithmModeMap = { + md5: 0, + sha1: 100, + sha256: 1400, + sha512: 1700 + }; + + const hashcatMode = algorithmModeMap[algorithm]; + if (hashcatMode === undefined) { + const error = new Error(`Unsupported algorithm: ${algorithm}`); + console.error(error.message); + return; + } + + const mask = '?a?a?a?a?a'; + console.log(`Running Hashcat for ${algorithm}...`); + + // Construct the Hashcat command + const command = `hashcat --potfile-disable -m ${hashcatMode} -a 3 -o ${crackedFile} ${hashesFile} ${mask}`; + + // Execute the Hashcat command + execSync(command, (error, stdout, stderr) => { + + if (error) { + console.error(`Hashcat Error: ${error.message}`); + return; + } + if (stderr) { + console.error(`Hashcat Stderr: ${stderr}`); + } + + console.log(`Hashcat Output:\n${stdout}`); + }); +} + +const args = process.argv.slice(2); +runHashcat(args[0]); \ No newline at end of file diff --git a/examples/HashcatKubernetes/package-lock.json b/examples/HashcatKubernetes/package-lock.json new file mode 100644 index 0000000..91bc622 --- /dev/null +++ b/examples/HashcatKubernetes/package-lock.json @@ -0,0 +1,322 @@ +{ + "name": "aws-posixfs-executor-test", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "aws-posixfs-executor-test", + "version": "1.0.0", + "dependencies": { + "@stroncium/procfs": "^1.0.0", + "async": "^2.6.4", + "log4js": "^6.4.0", + "redis": "^3.1.1" + } + }, + "node_modules/@stroncium/procfs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@stroncium/procfs/-/procfs-1.2.1.tgz", + "integrity": "sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/redis": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", + "dependencies": { + "denque": "^1.5.0", + "redis-commands": "^1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-redis" + } + }, + "node_modules/redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + } + }, + "dependencies": { + "@stroncium/procfs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@stroncium/procfs/-/procfs-1.2.1.tgz", + "integrity": "sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA==" + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==" + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "requires": { + "ms": "^2.1.3" + } + }, + "denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" + }, + "flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "redis": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", + "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", + "requires": { + "denque": "^1.5.0", + "redis-commands": "^1.7.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + } + }, + "redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "requires": { + "redis-errors": "^1.0.0" + } + }, + "rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } +} diff --git a/examples/HashcatKubernetes/package.json b/examples/HashcatKubernetes/package.json new file mode 100644 index 0000000..bef6116 --- /dev/null +++ b/examples/HashcatKubernetes/package.json @@ -0,0 +1,14 @@ +{ + "name": "aws-posixfs-executor-test", + "version": "1.0.0", + "main": "handler.js", + "scripts": { + "start": "node handler.js" + }, + "dependencies": { + "@stroncium/procfs": "^1.0.0", + "async": "^2.6.4", + "log4js": "^6.4.0", + "redis": "^3.1.1" + } +} \ No newline at end of file diff --git a/examples/HashcatKubernetes/summarize.js b/examples/HashcatKubernetes/summarize.js new file mode 100755 index 0000000..2e2cacc --- /dev/null +++ b/examples/HashcatKubernetes/summarize.js @@ -0,0 +1,17 @@ +const fs = require('fs'); + +function summarizeResults() { + const crackedHashes = fs.readFileSync("cracked.txt", 'utf8').trim().split('\n'); + + console.log('Cracked hashes:', crackedHashes); + + const summary = { + cracked: crackedHashes.length, + total: crackedHashes.length, // For simplicity, assume all hashes are cracked + details: crackedHashes + }; + + console.log('Summary:', summary); +} + +summarizeResults() \ No newline at end of file diff --git a/examples/HashcatKubernetes/workflow.json b/examples/HashcatKubernetes/workflow.json new file mode 100644 index 0000000..21344a6 --- /dev/null +++ b/examples/HashcatKubernetes/workflow.json @@ -0,0 +1,177 @@ +{ + "name": "PasswordAudit", + "processes": [ + { + "name": "GenerateHashes", + "type": "dataflow", + "function": "{{function}}", + "firingLimit": 1, + "config": { + "executor": { + "executable": "node", + "args": [ + "./generate.js" + ] + } + }, + "ins": [], + "outs": [ + "hashes" + ] + }, + { + "name": "FilterHashes", + "type": "dataflow", + "firingLimit": 1, + "function": "{{function}}", + "config": { + "executor": { + "executable": "node", + "args": [ + "./filter.js" + ] + } + }, + "ins": [ + "hashes" + ], + "outs": [ + "filteredHashes" + ] + }, + { + "name": "RunHashcatMD5", + "type": "dataflow", + "firingLimit": 1, + "function": "{{function}}", + "config": { + "executor": { + "executable": "node", + "args": [ + "./hashcat.js", + "md5" + ] + } + }, + "ins": [ + "filteredHashes" + ], + "outs": [ + "crackedMD5" + ] + }, + { + "name": "RunHashcatSHA1", + "type": "dataflow", + "firingLimit": 1, + "function": "{{function}}", + "config": { + "executor": { + "executable": "node", + "args": [ + "./hashcat.js", + "sha1" + ] + } + }, + "ins": [ + "filteredHashes" + ], + "outs": [ + "crackedSHA1" + ] + }, + { + "name": "RunHashcatSHA256", + "type": "dataflow", + "firingLimit": 1, + "function": "{{function}}", + "config": { + "executor": { + "executable": "node", + "args": [ + "./hashcat.js", + "sha256" + ] + } + }, + "ins": [ + "filteredHashes" + ], + "outs": [ + "crackedSHA256" + ] + }, + { + "name": "RunHashcatSHA512", + "type": "dataflow", + "firingLimit": 1, + "function": "{{function}}", + "config": { + "executor": { + "executable": "node", + "args": [ + "./hashcat.js", + "sha512" + ] + } + }, + "ins": [ + "filteredHashes" + ], + "outs": [ + "crackedSHA512" + ] + }, + { + "name": "SummarizeResults", + "type": "dataflow", + "firingLimit": 1, + "function": "{{function}}", + "config": { + "executor": { + "executable": "node", + "args": [ + "./summarize.js" + ] + } + }, + "ins": [ + "crackedMD5", + "crackedSHA1", + "crackedSHA256", + "crackedSHA512" + ], + "outs": [ + "summary" + ] + } + ], + "signals": [ + { + "name": "hashes" + }, + { + "name": "filteredHashes" + }, + { + "name": "crackedMD5" + }, + { + "name": "crackedSHA1" + }, + { + "name": "crackedSHA256" + }, + { + "name": "crackedSHA512" + }, + { + "name": "summary" + } + ], + "ins": [], + "outs": [ + "summary" + ] +} diff --git a/examples/SpeedTest/Dockerfile b/examples/SpeedTest/Dockerfile new file mode 100644 index 0000000..189517b --- /dev/null +++ b/examples/SpeedTest/Dockerfile @@ -0,0 +1,34 @@ +FROM node:22-bullseye + +# Set npm registry +RUN npm config set registry https://registry.npmjs.org/ + +# Install job-executor globally +RUN npm install -g --loglevel verbose @marsel888/job-executor@1.4.8 + +# Update package lists and install required dependencies +RUN apt-get update && apt-get install -y \ + python3 \ + python3-pip \ + curl \ + dumb-init \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install speedtest-cli via pip +RUN pip3 install speedtest-cli + +# Verify installation +RUN which speedtest-cli || echo "speedtest-cli not in PATH" + +# Create a wrapper script for speedtest +RUN echo '#!/bin/bash' > /usr/local/bin/speedtest \ + && echo 'exec speedtest-cli "$@"' >> /usr/local/bin/speedtest \ + && chmod +x /usr/local/bin/speedtest + +# Download and configure dumb-init manually +RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.5/dumb-init_1.2.5_x86_64 +RUN chmod +x /usr/local/bin/dumb-init + +# Set entrypoint +ENTRYPOINT ["/usr/local/bin/dumb-init", "--"] diff --git a/examples/SpeedTest/DockerfileData b/examples/SpeedTest/DockerfileData new file mode 100644 index 0000000..7775888 --- /dev/null +++ b/examples/SpeedTest/DockerfileData @@ -0,0 +1,4 @@ +FROM busybox + +RUN mkdir /data +COPY * /data/ \ No newline at end of file diff --git a/examples/SpeedTest/handler.js b/examples/SpeedTest/handler.js new file mode 100644 index 0000000..e7bbb48 --- /dev/null +++ b/examples/SpeedTest/handler.js @@ -0,0 +1,76 @@ +// Executor of 'jobs' using the Redis task status notification mechanism +const redis = require('redis'); +const { spawn } = require('child_process'); + +if (process.argv.length < 4) { + console.error("Usage: node handler.js "); + process.exit(1); +} + +// 'taskId' is the name of the Redis list to use for the notification +var taskId = process.argv[2], +redis_url = process.argv[3]; + +//console.log("taskId", taskId); +//console.log("redis_url", redis_url); + +var rcl = redis.createClient(redis_url); + +// get job message from Redis +var getJobMessage = async function (timeout) { + return new Promise(function (resolve, reject) { + const jobMsgKey = taskId + "_msg"; + rcl.brpop(jobMsgKey, timeout, function (err, reply) { + err ? reject(err): resolve(reply) + }); + }); +} + +// send notification about job completion to Redis +var notifyJobCompletion = async function () { + return new Promise(function (resolve, reject) { + rcl.rpush(taskId, "OK", function (err, reply) { + err ? reject(err): resolve(reply) + }); + }); +} + + +async function executeJob() { + + // 1. get job message + try { + var jobMessage = await getJobMessage(10); + } catch (err) { + console.error(err); + throw err; + } + //console.log("Received job message:", jobMessage); + + // 2. Execute job + var jm = JSON.parse(jobMessage[1]); + + const cmd = spawn(jm["executable"], jm["args"]); + + cmd.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + + cmd.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); + }); + + cmd.on('close', async(code) => { + console.log(`child process exited with code ${code}`); + // 3. Notify job completion + try { + await notifyJobCompletion(); + } catch (err) { + console.error("Redis notification failed", err); + throw err; + } + process.exit(0); + }); + } + +executeJob() diff --git a/examples/SpeedTest/package.json b/examples/SpeedTest/package.json new file mode 100644 index 0000000..bef6116 --- /dev/null +++ b/examples/SpeedTest/package.json @@ -0,0 +1,14 @@ +{ + "name": "aws-posixfs-executor-test", + "version": "1.0.0", + "main": "handler.js", + "scripts": { + "start": "node handler.js" + }, + "dependencies": { + "@stroncium/procfs": "^1.0.0", + "async": "^2.6.4", + "log4js": "^6.4.0", + "redis": "^3.1.1" + } +} \ No newline at end of file diff --git a/examples/SpeedTest/speedtest.js b/examples/SpeedTest/speedtest.js new file mode 100644 index 0000000..b81c3b4 --- /dev/null +++ b/examples/SpeedTest/speedtest.js @@ -0,0 +1,34 @@ +const { exec } = require('child_process'); + +function runSpeedTestForDuration(durationSeconds = 10) { + console.log(`Running speed tests for ${durationSeconds} seconds...`); + + const endTime = Date.now() + durationSeconds * 1000; + + function runOnce() { + if (Date.now() >= endTime) { + console.log('Finished speed tests.'); + return; + } + + console.log(`Running speedtest-cli...`); + exec('speedtest-cli --bytes', (error, stdout, stderr) => { + if (error) { + console.error(`Speedtest error: ${error.message}`); + return; + } + if (stderr) { + console.error(`Speedtest stderr: ${stderr}`); + } + + console.log(`Speedtest output:\n${stdout}`); + + // Chain the next test + runOnce(); + }); + } + + runOnce(); +} + +runSpeedTestForDuration(60); \ No newline at end of file diff --git a/examples/SpeedTest/workflow.json b/examples/SpeedTest/workflow.json new file mode 100644 index 0000000..41285cd --- /dev/null +++ b/examples/SpeedTest/workflow.json @@ -0,0 +1,28 @@ +{ + "name": "SpeedTest", + "processes": [ + { + "name": "SpeedTest", + "type": "dataflow", + "function": "{{function}}", + "firingLimit": 1, + "config": { + "executor": { + "executable": "node", + "args": ["./speedtest.js"] + } + }, + "ins": [], + "outs": [0] + } + ], + "signals": [ + + { + "name": 0 + } + ], + "ins": [], + "outs": [0] + } + \ No newline at end of file