File size: 4,386 Bytes
8d4b7d1 96f034c 8d4b7d1 e86d5e6 becc448 e86d5e6 8d4b7d1 becc448 8d4b7d1 726cd57 becc448 726cd57 8d4b7d1 becc448 8d4b7d1 becc448 cf19cd4 becc448 8d4b7d1 becc448 8d4b7d1 50ecd62 becc448 50ecd62 8d4b7d1 50ecd62 8d4b7d1 cf19cd4 50ecd62 8d4b7d1 becc448 726cd57 becc448 8d4b7d1 becc448 50ecd62 becc448 8d4b7d1 becc448 50ecd62 becc448 50ecd62 becc448 cf19cd4 becc448 8d4b7d1 becc448 50ecd62 becc448 50ecd62 8d4b7d1 becc448 50ecd62 becc448 cf19cd4 becc448 cf19cd4 becc448 50ecd62 becc448 50ecd62 8d4b7d1 cf19cd4 8d4b7d1 cf19cd4 becc448 8d4b7d1 becc448 b4d170f |
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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const path = require("path");
const { exec } = require("child_process");
const fs = require("fs-extra");
const { handleTerminal } = require("./terminalManager");
const {
isValidDirectoryName,
createUserDirectory,
deleteUserDirectory,
logMessage
} = require("./utils");
const app = express();
// Middleware
app.use(bodyParser.json());
app.use(cors({
origin: "*", // For production, replace with specific allowed origins
methods: ["GET", "POST"],
}));
app.use(express.static(path.join(__dirname, "../frontend")));
const userDirectories = "./userDirectories";
// Ensure userDirectories exists
if (!fs.existsSync(userDirectories)) {
fs.mkdirSync(userDirectories);
}
const runningProcesses = new Map(); // Tracks running processes
// Root Route
app.get("/", (req, res) => {
res.sendFile(path.join(__dirname, "../frontend/index.html"));
});
// Start Directory and Terminal
app.post("/start", async (req, res) => {
const { directoryName, password, repoURL } = req.body;
try {
// Validate input
if (!directoryName || !password || !repoURL) {
return res.status(400).send("Invalid inputs");
}
if (!isValidDirectoryName(directoryName)) {
return res.status(400).send("Invalid directory name format");
}
if (runningProcesses.has(directoryName)) {
return res.status(400).send("A process is already running for this directory.");
}
const userDir = path.join(userDirectories, directoryName);
// Create user directory
try {
createUserDirectory(userDirectories, directoryName, password);
} catch (err) {
logMessage(`Failed to create directory: ${err.message}`);
return res.status(500).send("Failed to create user directory");
}
// Clone GitHub repository
exec(`git clone ${repoURL} ${userDir}`, (cloneError, stdout, stderr) => {
if (cloneError) {
logMessage(`Error cloning repo: ${cloneError.message}`);
logMessage(`STDERR: ${stderr}`);
return res.status(500).send(`Error cloning repository: ${stderr}`);
}
logMessage(`Repository cloned successfully for ${directoryName}`);
// Install dependencies
exec(`yarn install --cwd ${userDir}`, (installError, installStdout, installStderr) => {
if (installError) {
logMessage(`Error installing dependencies: ${installError.message}`);
logMessage(`STDERR: ${installStderr}`);
return res.status(500).send(`Error installing dependencies: ${installStderr}`);
}
// Start the terminal process
handleTerminal(directoryName, userDir);
// Track the running process
runningProcesses.set(directoryName, true);
logMessage(`Successfully initialized directory: ${directoryName}`);
res.send("Directory and terminal started successfully");
});
});
} catch (error) {
logMessage(`Error: ${error.message}`);
res.status(500).send("Internal Server Error");
}
});
// Delete Directory
app.post("/delete", async (req, res) => {
const { directoryName, password } = req.body;
try {
if (!directoryName || !password) {
return res.status(400).send("Invalid inputs");
}
if (runningProcesses.has(directoryName)) {
handleTerminal(directoryName, null, true); // Stop terminal
runningProcesses.delete(directoryName);
}
deleteUserDirectory(userDirectories, directoryName, password);
logMessage(`Directory ${directoryName} deleted successfully`);
res.send("Directory deleted successfully");
} catch (error) {
logMessage(`Error deleting directory: ${error.message}`);
res.status(500).send(error.message);
}
});
// Stop Terminal
app.post("/stop", (req, res) => {
const { directoryName } = req.body;
if (!directoryName) {
return res.status(400).send("Invalid directory name");
}
if (!runningProcesses.has(directoryName)) {
return res.status(400).send("No process is running for this directory.");
}
handleTerminal(directoryName, null, true); // Stop terminal
runningProcesses.delete(directoryName);
logMessage(`Terminal for ${directoryName} stopped`);
res.send("Terminal stopped successfully");
});
// Server Listener
app.listen(7860, () => console.log("Server is running on port 7860")); |