logs-test / server.js
ulduldp's picture
Update server.js
9fcb962 verified
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const Convert = require('ansi-to-html');
const { exec } = require('child_process');
const path = require('path');
const app = express();
const server = http.createServer(app);
const io = new Server(server, {
cors: { origin: "*" }
});
const PORT = 7860;
// ANSI → HTML
const convert = new Convert({
fg: '#e2e8f0',
bg: '#0b1020',
newline: true,
escapeXML: true
});
// logs memory
let logs = [];
const MAX_LOGS = 10000;
function formatLog(data) {
return {
html: convert.toHtml(data.message || ''),
level: data.level || 'info',
timestamp: new Date()
};
}
function addLog(log) {
logs.push(log);
if (logs.length > MAX_LOGS) logs.shift();
}
// STATIC
app.use(express.static(path.join(__dirname, 'public')));
// ✅ PAGINATED API
app.get('/api/logs', (req, res) => {
const limit = parseInt(req.query.limit) || 50;
const offset = parseInt(req.query.offset) || 0;
const start = Math.max(logs.length - offset - limit, 0);
const end = logs.length - offset;
const slice = logs.slice(start, end);
res.json({
logs: slice,
hasMore: start > 0
});
});
// SOCKET
io.on('connection', (socket) => {
console.log('Client connected:', socket.id);
socket.on('log', (data) => {
const log = formatLog(data);
addLog(log);
io.emit('log', log);
});
socket.on('command', (data) => {
const cmd = data.command.trim();
if (!cmd) return;
if (cmd === "clear") {
logs = [];
return;
}
const blocked = ['rm', 'shutdown', 'reboot', 'mkfs'];
if (blocked.some(b => cmd.includes(b))) {
const log = formatLog({
message: "\x1b[31mBlocked command!\x1b[0m",
level: "error"
});
addLog(log);
return io.emit('log', log);
}
const cmdLog = formatLog({
message: "\x1b[32m$ " + cmd + "\x1b[0m"
});
addLog(cmdLog);
io.emit('log', cmdLog);
exec(cmd, { timeout: 20000 }, (error, stdout, stderr) => {
if (stdout) {
const outLog = formatLog({ message: stdout });
addLog(outLog);
io.emit('log', outLog);
}
if (stderr) {
const errLog = formatLog({
message: "\x1b[31m" + stderr + "\x1b[0m",
level: "error"
});
addLog(errLog);
io.emit('log', errLog);
}
if (error) {
const errLog = formatLog({
message: "\x1b[31m" + error.message + "\x1b[0m",
level: "error"
});
addLog(errLog);
io.emit('log', errLog);
}
});
});
});
server.listen(PORT, () => {
console.log('🚀 Server running on http://localhost:' + PORT);
});