This commit is contained in:
2026-05-29 18:43:53 +02:00
parent a26914f244
commit b157142e97
7 changed files with 958 additions and 855 deletions

View File

@@ -190,6 +190,18 @@ const server = http.createServer(async (req, res) => {
// ---- API Routes ----
if (pathname.startsWith('/api/')) {
try {
// GET /api/health
if (pathname === '/api/health' && method === 'GET') {
return sendJson(res, {
status: 'ok',
mode: MODE,
uptime: process.uptime(),
collector: collector ? 'active' : 'off',
monitor: monitor ? 'active' : 'off',
sources: logSourceManager.getSources().length,
s3Sources: s3Sources.size,
});
}
// GET /api/mode
if (pathname === '/api/mode' && method === 'GET') {
return sendJson(res, { mode: MODE, hasCollector: !!collector, hasRemoteCollector: !!REMOTE_COLLECTOR_URL, s3Sources: Array.from(s3Sources.keys()) });
@@ -216,17 +228,29 @@ const server = http.createServer(async (req, res) => {
logSourceManager.removeSource(sourcePath);
return sendJson(res, logSourceManager.getSources());
}
// GET /api/logs?source=...
// GET /api/logs?source=...&level=...&offset=...
if (pathname === '/api/logs' && method === 'GET') {
const source = parsedUrl.query.source;
const levelFilter = parsedUrl.query.level;
const offsetParam = parsedUrl.query.offset;
const offset = offsetParam ? parseInt(offsetParam, 10) : 0;
let entries;
if (source && source !== 'ALL') {
const entries = await logSourceManager.readLog(source);
return sendJson(res, entries);
entries = await logSourceManager.readLog(source);
}
else {
const entries = await logSourceManager.readAllLogs();
return sendJson(res, entries);
entries = await logSourceManager.readAllLogs();
}
// Apply level filter
if (levelFilter && levelFilter !== 'ALL') {
const filterUpper = levelFilter.toUpperCase();
entries = entries.filter((e) => e.level && e.level.toUpperCase() === filterUpper);
}
// Apply offset
if (offset > 0 && offset < entries.length) {
entries = entries.slice(offset);
}
return sendJson(res, entries);
}
// ---- S3 endpoints ----
// POST /api/s3/add { name, bucket, prefix, accessKeyId, secretAccessKey, region, endpoint? }
@@ -251,8 +275,14 @@ const server = http.createServer(async (req, res) => {
const s3 = s3Sources.get(name);
if (!s3)
return sendError(res, `S3 source not found: ${name}`, 404);
const objects = await s3.listObjects(prefix);
return sendJson(res, objects);
try {
const objects = await s3.listObjects(prefix);
return sendJson(res, objects);
}
catch (err) {
console.warn(`[S3] Connection error for source "${name}":`, err.message);
return sendError(res, `S3 connection failed for "${name}": ${err.message}`, 502);
}
}
// GET /api/s3/read?name=...&key=...
if (pathname === '/api/s3/read' && method === 'GET') {
@@ -263,16 +293,22 @@ const server = http.createServer(async (req, res) => {
return sendError(res, `S3 source not found: ${name}`, 404);
if (!key)
return sendError(res, 'Missing key parameter', 400);
const content = await s3.getObject(key);
const lines = content.split('\n').filter(l => l.trim() !== '');
const entries = lines.map((line, i) => ({
line,
lineNumber: i + 1,
source: `s3://${name}/${key}`,
timestamp: extractTimestamp(line),
level: extractLevel(line),
}));
return sendJson(res, entries);
try {
const content = await s3.getObject(key);
const lines = content.split('\n').filter(l => l.trim() !== '');
const entries = lines.map((line, i) => ({
line,
lineNumber: i + 1,
source: `s3://${name}/${key}`,
timestamp: extractTimestamp(line),
level: extractLevel(line),
}));
return sendJson(res, entries);
}
catch (err) {
console.warn(`[S3] Read error for "${name}/${key}":`, err.message);
return sendError(res, `S3 read failed: ${err.message}`, 502);
}
}
// DELETE /api/s3/remove?name=...
if (pathname === '/api/s3/remove' && method === 'DELETE') {