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"));