diff --git a/index.html b/index.html index 2cdd2f4..202acfe 100644 --- a/index.html +++ b/index.html @@ -20,12 +20,13 @@ font-feature-settings: "cv03", "cv04", "cv11"; } .terminal-container { - height: 100%; + height: 70vh; + max-height: 70vh !important; width: 100%; background: #000; - padding: 10px; + padding: 0 !important; border-radius: 4px; - flex-grow: 1; + overflow: hidden; } /* Theme toggle fix */ @@ -144,8 +145,23 @@
-
- +
+ + + + + + + + + + + + +
StatusNameIP AddressMAC AddressActions
+
+
+
@@ -248,7 +264,7 @@
- @@ -373,73 +389,54 @@ } function fetchServers() { - fetch("/servers").then(r => r.json()).then(data => { - const container = document.getElementById("server-list-container"); - const empty = document.getElementById("no-servers-message"); + fetch("/servers") + .then(r => r.json()) + .then(data => { + const spinner = document.getElementById("loading-spinner"); + const container = document.getElementById("server-list"); + const empty = document.getElementById("no-servers-message"); // Re-targeting correct empty div if name changed in previous step, assuming "no-servers-message" + + if(spinner) spinner.classList.add("d-none"); container.innerHTML = ""; if(data && data.length > 0) { - container.classList.remove("d-none"); + container.closest(".card").classList.remove("d-none"); // Show card empty.classList.add("d-none"); data.sort((a,b) => a.name.localeCompare(b.name)); data.forEach(s => { - const div = document.createElement("div"); - div.className = "col-12 col-md-6 col-lg-4"; - div.innerHTML = ` -
-
-
-
-
- - - -
-
-

${s.name}

-
${s.ip}
-
-
- -
-
-
-
Status: Checking
+ const tr = document.createElement("tr"); + tr.innerHTML = ` + Checking +
${s.name}
+ ${s.ip} + ${s.mac} + +
+ + + + + + +
- -
+ `; - container.appendChild(div); + container.appendChild(tr); checkStatus(s.name); }); } else { - container.classList.add("d-none"); + container.closest(".card").classList.add("d-none"); // Hide card empty.classList.remove("d-none"); } }); @@ -448,8 +445,6 @@ function checkStatus(name) { fetch(`/status?name=${name}`).then(r => r.text()).then(status => { const badge = document.getElementById(`status-text-${name}`); - const bar = document.getElementById(`status-bar-${name}`); - const avatar = document.getElementById(`status-avatar-${name}`); if(!badge) return; badge.textContent = status; @@ -457,12 +452,8 @@ if(status === "Online") { badge.classList.add("bg-success-lt"); - bar.className = "card-status-top bg-success"; - avatar.className = "avatar rounded bg-success-lt text-success"; } else { badge.classList.add("bg-danger-lt"); - bar.className = "card-status-top bg-danger"; - avatar.className = "avatar rounded bg-danger-lt text-danger"; } }); } diff --git a/webserver/terminal.go b/webserver/terminal.go index 8a77be0..e3eb4ac 100644 --- a/webserver/terminal.go +++ b/webserver/terminal.go @@ -86,6 +86,14 @@ func (ws *WebServer) handleSSH(w http.ResponseWriter, r *http.Request) { fmt.Sscanf(r.URL.Query().Get("cols"), "%d", &cols) } + // Sanity check for dimensions + if rows <= 0 { + rows = 24 + } + if cols <= 0 { + cols = 80 + } + if err := session.RequestPty("xterm-256color", rows, cols, modes); err != nil { conn.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf("\r\n[Error] Request for PTY failed: %v\r\n", err))) return