| document.addEventListener("DOMContentLoaded", () => { |
| const username = localStorage.getItem("username"); |
| if (!username) { |
| alert("You need to log in first."); |
| window.location.href = "/"; |
| return; |
| } |
|
|
| const terminal = document.getElementById("terminal"); |
| const commandInput = document.getElementById("command"); |
|
|
| const appendToTerminal = (text, type = "info") => { |
| const line = document.createElement("div"); |
| line.textContent = text; |
|
|
| |
| if (type === "error") { |
| line.style.color = "red"; |
| } else if (type === "warn") { |
| line.style.color = "orange"; |
| } else { |
| line.style.color = "white"; |
| } |
|
|
| terminal.appendChild(line); |
| terminal.scrollTop = terminal.scrollHeight; |
| }; |
|
|
| const fetchLogs = async () => { |
| try { |
| const response = await fetch(`/logs?username=${username}`); |
| if (response.ok) { |
| const logs = await response.text(); |
| terminal.innerHTML = ""; |
| logs.split("\n").forEach((line) => { |
| if (line.includes("WARN")) { |
| appendToTerminal(line, "warn"); |
| } else if (line.includes("ERROR") || line.includes("error")) { |
| appendToTerminal(line, "error"); |
| } else if (line.trim()) { |
| appendToTerminal(line); |
| } |
| }); |
| } else { |
| appendToTerminal("Failed to fetch logs.", "error"); |
| } |
| } catch (error) { |
| appendToTerminal("Error fetching logs.", "error"); |
| } |
| }; |
|
|
| const sendCommand = async (command) => { |
| appendToTerminal(`$ ${command}`); |
| try { |
| const response = await fetch("/execute", { |
| method: "POST", |
| headers: { "Content-Type": "application/json" }, |
| body: JSON.stringify({ username, command }), |
| }); |
| if (response.ok) { |
| fetchLogs(); |
| } else { |
| appendToTerminal("Error executing command.", "error"); |
| } |
| } catch (error) { |
| appendToTerminal("Command execution failed.", "error"); |
| } |
| }; |
|
|
| document.getElementById("send").addEventListener("click", () => { |
| const command = commandInput.value.trim(); |
| if (command) { |
| sendCommand(command); |
| commandInput.value = ""; |
| } |
| }); |
|
|
| document.getElementById("start").addEventListener("click", () => { |
| sendCommand("yarn install && yarn start"); |
| }); |
|
|
| document.getElementById("stop").addEventListener("click", () => { |
| sendCommand("pkill -f node"); |
| }); |
|
|
| document.getElementById("restart").addEventListener("click", () => { |
| sendCommand("pkill -f node && yarn start"); |
| }); |
|
|
| document.getElementById("deploy").addEventListener("click", async () => { |
| const repoUrl = prompt("Enter the GitHub repository URL to deploy:"); |
| if (repoUrl) { |
| try { |
| const response = await fetch("/deploy", { |
| method: "POST", |
| headers: { "Content-Type": "application/json" }, |
| body: JSON.stringify({ username, repoUrl }), |
| }); |
| if (response.ok) { |
| appendToTerminal("Deployment started..."); |
| fetchLogs(); |
| } else { |
| appendToTerminal("Error starting deployment.", "error"); |
| } |
| } catch (error) { |
| appendToTerminal("Deployment failed.", "error"); |
| } |
| } |
| }); |
|
|
| |
| fetchLogs(); |
| }); |