| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="UTF-8"> |
| <title>VPC - Virtual Private Console π©π</title> |
| <script src="https://cdn.jsdelivr.net/npm/xterm/lib/xterm.js"></script> |
| <script src="https://cdn.socket.io/4.3.2/socket.io.min.js"></script> |
| <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm/css/xterm.css" /> |
| <style> |
| body { background: #111; color: white; margin: 0; display: flex; flex-direction: column; height: 100vh; } |
| #terminal { flex-grow: 1; padding: 10px; } |
| #upload-btn { padding: 10px; background: hotpink; border: none; color: white; cursor: pointer; } |
| </style> |
| </head> |
| <body> |
| <div id="terminal"></div> |
| <input type="file" id="fileInput" style="display:none"> |
| <button id="upload-btn">π Upload File</button> |
|
|
| <script> |
| const term = new Terminal(); |
| const socket = io(); |
| term.open(document.getElementById('terminal')); |
| |
| term.onData(data => socket.emit('input', data)); |
| socket.on('output', data => term.write(data)); |
| |
| const uploadBtn = document.getElementById("upload-btn"); |
| const fileInput = document.getElementById("fileInput"); |
| |
| uploadBtn.onclick = () => fileInput.click(); |
| |
| fileInput.onchange = () => { |
| const file = fileInput.files[0]; |
| const formData = new FormData(); |
| formData.append("file", file); |
| |
| fetch("/upload", { |
| method: "POST", |
| body: formData |
| }) |
| .then(res => res.json()) |
| .then(data => { |
| term.writeln(`\r\n[Uploaded: ${data.path}]\r\n`); |
| }); |
| }; |
| </script> |
| </body> |
| </html> |
|
|