491 lines
18 KiB
JavaScript
491 lines
18 KiB
JavaScript
|
const { Embed } = require("discord.js");
|
|||
|
const fs = require("fs");
|
|||
|
const dateFormat = require("dateformat");
|
|||
|
require('dotenv').config()
|
|||
|
const cmd = require('cmd-promise')
|
|||
|
var portastic = require('portastic');
|
|||
|
const { stderr } = require("process");
|
|||
|
let jsonfile = require('jsonfile')
|
|||
|
let rand = Math.floor(Math.random() * 99999999999999);
|
|||
|
let code
|
|||
|
let ifApt
|
|||
|
const date = require('date-and-time');
|
|||
|
const now = new Date();
|
|||
|
const { EmbedBuilder } = require('discord.js');
|
|||
|
const Dockerode = require('simple-dockerode');
|
|||
|
var docker = new Dockerode({ socketPath: '/var/run/docker.sock' });
|
|||
|
let finished
|
|||
|
let end = "<=================================END===========================>"
|
|||
|
|
|||
|
module.exports = {
|
|||
|
name: "x",
|
|||
|
description: "Execute a command non-interactively.",
|
|||
|
options: [{
|
|||
|
"name": "cmd",
|
|||
|
"description": "Command to Execute",
|
|||
|
"required": true,
|
|||
|
"type": 3 // 6 is type USER
|
|||
|
}],
|
|||
|
|
|||
|
run: async (client, interaction) => {
|
|||
|
console.log("RUN")
|
|||
|
await cmd('bash /home/opc/check_exist.sh ' + interaction.user.id).then(out => {
|
|||
|
console.log('out =', out)
|
|||
|
if (out.stdout != 1) {
|
|||
|
(async () => {
|
|||
|
finished = 1
|
|||
|
console.log(end)
|
|||
|
|
|||
|
return await interaction.editReply("Sorry, you do not have a container currently, generate one using /generate")
|
|||
|
})();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}).catch(err => {
|
|||
|
console.log('err =', err)
|
|||
|
})
|
|||
|
console.log("Begin Done")
|
|||
|
|
|||
|
if (finished == 1) {
|
|||
|
finished = 0
|
|||
|
return
|
|||
|
} else {
|
|||
|
|
|||
|
// await interaction.deferReply();
|
|||
|
const path = 'cache/' + interaction.user.id
|
|||
|
const isNotDefined = require("is-not-defined");
|
|||
|
if (isNotDefined(interaction.options._hoistedOptions)) {
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("You must supply a command.")
|
|||
|
|
|||
|
})();
|
|||
|
return
|
|||
|
}
|
|||
|
let code = interaction.options._hoistedOptions[0].value
|
|||
|
if (code.startsWith("apt install") || code.startsWith("yum install")) {
|
|||
|
if (!code.includes("-y")) {
|
|||
|
code = code + " -y"
|
|||
|
console.log(code)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (code.startsWith("pacman install")) {
|
|||
|
if (!code.includes("--noconfirm")) {
|
|||
|
code = code + " --noconfirm"
|
|||
|
console.log(code)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (code.startsWith("neofetch")) {
|
|||
|
code = "neofetch --stdout"
|
|||
|
}
|
|||
|
|
|||
|
if (fs.existsSync(path)) {
|
|||
|
console.log("")
|
|||
|
}
|
|||
|
else {
|
|||
|
console.log("No Channel PWD Found! Generating!")
|
|||
|
fs.writeFile('./cache/' + interaction.user.id, "{\"pwd\":\"/\"}", function (err) {
|
|||
|
});
|
|||
|
}
|
|||
|
commandToRun = code
|
|||
|
if (commandToRun == "yes") return console.log("yes Blocked")
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* Start of Print Working Directory
|
|||
|
*
|
|||
|
*/
|
|||
|
if (commandToRun == "pwd") {
|
|||
|
goNoFurther = true
|
|||
|
// check for channel pwd support file
|
|||
|
if (fs.existsSync(path)) {
|
|||
|
console.log("Channel PWD is active")
|
|||
|
jsonfile = require('jsonfile')
|
|||
|
jsonfile.readFile(path, function (err, pwdata) {
|
|||
|
// console.log(pwdata)
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("```" + pwdata.pwd + "```")
|
|||
|
})();
|
|||
|
goNoFurther = false;
|
|||
|
if (err) console.error(err)
|
|||
|
})
|
|||
|
}
|
|||
|
function escapeDoubleQuotes(str) {
|
|||
|
return str.replace(/\\([\s\S])|(")/g, "\\$1$2"); // thanks @slevithan!
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
*
|
|||
|
* Main
|
|||
|
*
|
|||
|
*/
|
|||
|
if (commandToRun == "pwd") return
|
|||
|
// /**
|
|||
|
// *
|
|||
|
// * Start of Write
|
|||
|
// *
|
|||
|
// */
|
|||
|
// console.log("cmd: " + commandToRun)
|
|||
|
// if (commandToRun.startsWith("write")) {
|
|||
|
// const echoFile = require('write');
|
|||
|
// const cmd = require('cmd-promise')
|
|||
|
// re = /\{([\s\S)]+)\}/;
|
|||
|
// re2 = /\^(.*)\^/;
|
|||
|
// if (commandToRun.toString().includes("\n")) console.log("YES! BREAK")
|
|||
|
// let cdcmdtest = commandToRun // First index is removed and array is returned.
|
|||
|
// jsonfile.readFile(path, function (err, pwdata) {
|
|||
|
// if (err) console.error(err)
|
|||
|
// // Regular Expression To find Sections fo command
|
|||
|
// let codeToSend = cdcmdtest.match(re)[1]; // yes, start at 0, not 1. I hate that too.
|
|||
|
// console.log("codeToSend: " + codeToSend)
|
|||
|
// let fileToSend = cdcmdtest.match(re2)[1]; // yes, start at 0, not 1. I hate that too.
|
|||
|
// console.log("file: " + fileToSend)
|
|||
|
// // let usrcmd = cdcmdtest.slice(0).join(" ");
|
|||
|
// jsonfile.readFile(path, function (err, pwdata) {
|
|||
|
// if (err) console.error(err)
|
|||
|
// //await interaction.editReply(pwdata.pwd);
|
|||
|
// const cmd = require('cmd-promise')
|
|||
|
// // let usrcmd = cdcmdtest.slice(0).join(" ");
|
|||
|
// console.log("/tmp/tmpfile/" + rand + "/" + fileToSend)
|
|||
|
// echoFile.sync("/tmp/tmpfile/" + rand + "/" + fileToSend, codeToSend, {
|
|||
|
// newline: true
|
|||
|
// });
|
|||
|
// console.log('docker cp ' + "/tmp/tmpfile/" + rand + "/" + fileToSend + ' ' + interaction.user.id + ':' + pwdata.pwd)
|
|||
|
// cmd('docker cp ' + "/tmp/tmpfile/" + + rand + "/" + fileToSend + ' ' + interaction.user.id + ':' + pwdata.pwd).then(out => {
|
|||
|
// console.log('out =', out)
|
|||
|
// try {
|
|||
|
// fs.unlinkSync("/tmp/tmpfile/" + + rand + "/" + fileToSend)
|
|||
|
// console.log("tmpfileremoved")
|
|||
|
// rand = Math.floor(Math.random() * 99999999999999);
|
|||
|
// } catch (err) {
|
|||
|
// console.error(err)
|
|||
|
// }
|
|||
|
// }).catch(err => {
|
|||
|
// console.log('err =', err)
|
|||
|
// })
|
|||
|
// (async () => {
|
|||
|
// await interaction.editReply("File Saved as " + fileToSend);
|
|||
|
// })();
|
|||
|
// })
|
|||
|
// })
|
|||
|
// }
|
|||
|
/**
|
|||
|
*
|
|||
|
* Start of CDX
|
|||
|
*
|
|||
|
*/
|
|||
|
// if (commandToRun == "gobk") {
|
|||
|
// // check for channel pwd support file
|
|||
|
|
|||
|
// if (fs.existsSync(path)) {
|
|||
|
// console.log("Channel PWD is active")
|
|||
|
// jsonfile.readFile(path, function (err, pwdata) {
|
|||
|
// if (err) console.error(err)
|
|||
|
// console.log(RemoveLastDirectoryPartOf(pwdata.pwd))
|
|||
|
// //console.log(dir)
|
|||
|
// if (RemoveLastDirectoryPartOf(pwdata.pwd).length == 0) {
|
|||
|
// obj = {
|
|||
|
// pwd: "/"
|
|||
|
// }
|
|||
|
// } else {
|
|||
|
// obj = {
|
|||
|
// pwd: RemoveLastDirectoryPartOf(pwdata.pwd)
|
|||
|
// }
|
|||
|
// }
|
|||
|
// jsonfile.writeFile(path, obj, function (err) {
|
|||
|
// (async () => {
|
|||
|
// await interaction.editReply(obj.pwd);
|
|||
|
// })();
|
|||
|
// if (err) console.error(err)
|
|||
|
// })
|
|||
|
// });
|
|||
|
// function RemoveLastDirectoryPartOf(the_url) {
|
|||
|
// var the_arr = the_url.split('/');
|
|||
|
// the_arr.pop();
|
|||
|
// return (the_arr.join('/'));
|
|||
|
// }
|
|||
|
// function startsWith(str, word) {
|
|||
|
// return str.lastIndexOf(word, 0) === 0;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// }
|
|||
|
/**
|
|||
|
*
|
|||
|
* End of CDX
|
|||
|
*
|
|||
|
*/
|
|||
|
/**
|
|||
|
*
|
|||
|
* Start of CD
|
|||
|
*
|
|||
|
*/
|
|||
|
if (commandToRun.startsWith("cd")) {
|
|||
|
console.log("test")
|
|||
|
argscmd = interaction.options._hoistedOptions[0].value
|
|||
|
if (argscmd == "..") {
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("please use the gobk command to go back a directory")
|
|||
|
})();
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// check for channel pwd support file
|
|||
|
|
|||
|
if (fs.existsSync(path)) {
|
|||
|
console.log("Channel PWD is active")
|
|||
|
jsonfile = require('jsonfile')
|
|||
|
jsonfile.readFile(path, function (err, pwdata) {
|
|||
|
let argscmd = commandToRun.replace("cd ", "")
|
|||
|
let dir = argscmd; // yes, start at 0, not 1. I hate that too.
|
|||
|
|
|||
|
|
|||
|
if (startsWith(argscmd, "/") == false) {
|
|||
|
const cmd = require('cmd-promise')
|
|||
|
if (!argscmd) {
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("Give my Syntax Please")
|
|||
|
})();
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
let dir = commandToRun; // yes, start at 0, not 1. I hate that too.
|
|||
|
let data
|
|||
|
jsonfile.readFile(path, function (err, pwdata) {
|
|||
|
if (err) console.error(err)
|
|||
|
console.log(dir)
|
|||
|
data = pwdata.pwd + "/" + argscmd
|
|||
|
if (pwdata.pwd == "/") {
|
|||
|
data = "/" + argscmd
|
|||
|
}
|
|||
|
if (argscmd == "~") {
|
|||
|
data = "/root"
|
|||
|
}
|
|||
|
if (argscmd.includes("~") && argscmd.includes("/")) {
|
|||
|
data = "/root" + "/" + argscmd.replace("~", "")
|
|||
|
}
|
|||
|
|
|||
|
if (argscmd.includes("..") || argscmd.includes("../")) { // check if the user is trying to go back a directory
|
|||
|
|
|||
|
console.log(argscmd.split("../"))
|
|||
|
console.log("user wants to go back " + argscmd.split("../").length + " directories")
|
|||
|
|
|||
|
function RemoveLastDirectoryPartOf(the_url, num) {
|
|||
|
var the_arr = the_url.split('/');
|
|||
|
the_arr.splice(-num, num)
|
|||
|
return (the_arr.join('/'));
|
|||
|
}
|
|||
|
data = RemoveLastDirectoryPartOf(pwdata.pwd, argscmd.split("../").length - 1)
|
|||
|
}
|
|||
|
|
|||
|
let final = data.replace(/([^:]\/)\/+/g, "$1")
|
|||
|
console.log(final)
|
|||
|
|
|||
|
const obj = {
|
|||
|
pwd: final
|
|||
|
}
|
|||
|
jsonfile.writeFile(path, obj, function (err) {
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("Directory Changed to: " + final)
|
|||
|
})();
|
|||
|
if (err) console.error(err)
|
|||
|
})
|
|||
|
|
|||
|
});
|
|||
|
|
|||
|
} else {
|
|||
|
jsonfile.readFile(path, function (err, pwdata) {
|
|||
|
if (err) console.error(err)
|
|||
|
console.log('dir:' + dir)
|
|||
|
//onsole.log(dir)
|
|||
|
|
|||
|
const obj = {
|
|||
|
pwd: dir.replace(/([^:]\/)\/+/g, "$1")
|
|||
|
}
|
|||
|
jsonfile.writeFile(path, obj, function (err) {
|
|||
|
if (err) console.error(err)
|
|||
|
})
|
|||
|
goNoFurther = false;
|
|||
|
});
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("Directory Changed to: " + dir.replace(/([^:]\/)\/+/g, "$1"))
|
|||
|
})();
|
|||
|
}
|
|||
|
function RemoveLastDirectoryPartOf(the_url) {
|
|||
|
var the_arr = the_url.split('/');
|
|||
|
the_arr.pop();
|
|||
|
return (the_arr.join('/'));
|
|||
|
}
|
|||
|
function startsWith(str, word) {
|
|||
|
return str.lastIndexOf(word, 0) === 0;
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
*
|
|||
|
* End of CD
|
|||
|
*
|
|||
|
*/
|
|||
|
if (commandToRun.startsWith("cd")) return console.log("Skipped At Main")
|
|||
|
if (commandToRun.startsWith("write")) return
|
|||
|
if (commandToRun == "gobk") return
|
|||
|
|
|||
|
if (fs.existsSync(path)) {
|
|||
|
function RemoveLastDirectoryPartOf(the_url) {
|
|||
|
var the_arr = the_url.split('/');
|
|||
|
the_arr.pop();
|
|||
|
return (the_arr.join('/'));
|
|||
|
}
|
|||
|
console.log("Channel PWD is active")
|
|||
|
jsonfile.readFile(path, function (err, pwdata) {
|
|||
|
console.log(pwdata)
|
|||
|
if (code == "neofetch") {
|
|||
|
code = "neofetch --stdout --color_blocks off"
|
|||
|
}
|
|||
|
if (code.startsWith("apt")) {
|
|||
|
ifApt = "-y"
|
|||
|
} else if (code.startsWith("yum")) {
|
|||
|
ifApt = "-y"
|
|||
|
}
|
|||
|
else if (code.startsWith("pacman")) {
|
|||
|
ifApt = "--noconfirm"
|
|||
|
} else if (code.startsWith("apt-get")) {
|
|||
|
ifApt = "-y"
|
|||
|
}
|
|||
|
else {
|
|||
|
ifApt = ""
|
|||
|
}
|
|||
|
|
|||
|
if (code.includes("~")) {
|
|||
|
code = code.replace("~", "/root")
|
|||
|
}
|
|||
|
if (code.includes("..")) {
|
|||
|
pwdata.pwd = RemoveLastDirectoryPartOf(pwdata.pwd)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// if (code.includes("../")) { // check if the user is trying to go back a directory
|
|||
|
|
|||
|
// function RemoveLastDirectoryPartOf(the_url, num) {
|
|||
|
// var the_arr = the_url.split('/');
|
|||
|
// the_arr.splice(-num, num)
|
|||
|
// return (the_arr.join('/'));
|
|||
|
// }
|
|||
|
// console.log(argscmd.split("../"))
|
|||
|
// console.log("user wants to go back " + argscmd.split("../").length -1 + " directories in their command")
|
|||
|
|
|||
|
// pwddata.pwd = RemoveLastDirectoryPartOf(pwdata.pwd, argscmd.split("../").length - 1)
|
|||
|
// }
|
|||
|
|
|||
|
|
|||
|
const customerContainer = docker.getContainer(interaction.user.id);
|
|||
|
// Simple to grab the stdout and stderr.
|
|||
|
customerContainer.exec(['/bin/bash', '-c', 'cd ' + pwdata.pwd + ' && ' + commandToRun], { stdout: true, stderr: true }, (err, out) => {
|
|||
|
if (typeof (out) !== 'undefined') {
|
|||
|
console.log(out.stdout)
|
|||
|
|
|||
|
if (out.inspect.ExitCode !== 0) {
|
|||
|
if (out.stderr.includes("syntax error")) {
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("```️️️️" + "There is an error in your syntax, please try again." + "```")
|
|||
|
console.log(end)
|
|||
|
|
|||
|
})();
|
|||
|
} else {
|
|||
|
(async () => {
|
|||
|
return await interaction.editReply("```️️️️" + out.stderr + "```")
|
|||
|
console.log(end)
|
|||
|
|
|||
|
})();
|
|||
|
}
|
|||
|
}
|
|||
|
if (out.inspect.ExitCode == 0) {
|
|||
|
if (!out.stdout) {
|
|||
|
|
|||
|
const mainEmbed = new EmbedBuilder()
|
|||
|
.setColor('#0099ff')
|
|||
|
.setTitle('Command Executed Successfully!')
|
|||
|
.setDescription('```' + commandToRun + ' has completed.```')
|
|||
|
.setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: `${interaction.user.displayAvatarURL()}` });
|
|||
|
(async () => {
|
|||
|
return await interaction.editReply({ embeds: [mainEmbed] })
|
|||
|
console.log(end)
|
|||
|
|
|||
|
})();
|
|||
|
} else {
|
|||
|
if (out.stdout.length > 2020) {
|
|||
|
fs.writeFile('/tmp/paste', "Command: " + code.replace("--stdout --color_blocks off", "") + " | Container Owner: " + interaction.user.username + "\n" + out.stdout, err => {
|
|||
|
if (err) {
|
|||
|
console.error(err)
|
|||
|
return
|
|||
|
}
|
|||
|
})
|
|||
|
cmd("sleep 2; cat /tmp/paste | dpaste").then(pasteout => {
|
|||
|
const mainEmbed = new EmbedBuilder()
|
|||
|
.setColor('#0099ff')
|
|||
|
.addFields(
|
|||
|
{ name: 'Please check the below output log:', value: pasteout.stdout.replace("Pro tip: you can password protect your paste just by typing a username and password after your paste command.", "").replace("Paste Saved: ", "").replace("-------------------------------------------------------", "") },
|
|||
|
).setTitle("Container Owner: " + interaction.user.username)
|
|||
|
.setDescription("The command: " + code.replace("--stdout --color_blocks off", "") + " was too large for discord.")
|
|||
|
.setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: `${interaction.user.displayAvatarURL()}` });
|
|||
|
(async () => {
|
|||
|
console.log(end)
|
|||
|
return await interaction.editReply({ embeds: [mainEmbed] })
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
})
|
|||
|
}
|
|||
|
else {
|
|||
|
// console.log("ahah " + code)
|
|||
|
if (code.includes("dpaste")) {
|
|||
|
|
|||
|
const mainEmbed = new EmbedBuilder()
|
|||
|
.setColor('#0099ff')
|
|||
|
.addFields(
|
|||
|
{ name: 'View your Paste at the link below!', value: out.stdout.replace("Pro tip: you can password protect your paste just by typing a username and password after your paste command.", "").replace("Paste Saved: ", "").replace("-------------------------------------------------------", "") },
|
|||
|
{ name: 'Pro Tip!', value: "You can protect your paste by typing a username and password after dpaste." },
|
|||
|
).setTitle("Paste Saved!")
|
|||
|
.setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: `${interaction.user.displayAvatarURL()}` });
|
|||
|
(async () => {
|
|||
|
return await interaction.editReply({ embeds: [mainEmbed] })
|
|||
|
console.log(end)
|
|||
|
|
|||
|
})();
|
|||
|
return
|
|||
|
}
|
|||
|
if (commandToRun.startsWith("cowsay") || commandToRun.startsWith("figlet")) {
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("```️️️️" + out.stdout + "```")
|
|||
|
})();
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if (code.includes("figlet") || code.includes("figlet")) {
|
|||
|
(async () => {
|
|||
|
return await interaction.editReply("```️️️️" + out.stdout + "```")
|
|||
|
console.log(end)
|
|||
|
})();
|
|||
|
}
|
|||
|
//<@UserID NUMBER>
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("```️️️️" + "Command: " + code.replace("--stdout --color_blocks off", "") + " | Container Owner: " + interaction.user.username + "\n" + out.stdout + "```")
|
|||
|
console.log("<=================================END===========================>")
|
|||
|
})();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
(async () => {
|
|||
|
await interaction.editReply("```️️️️" + "Your container either needs to be generated or is not running." + "```")
|
|||
|
return console.log(end)
|
|||
|
})();
|
|||
|
}
|
|||
|
})
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
};
|