Final
This commit is contained in:
@@ -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') {
|
||||
|
||||
Reference in New Issue
Block a user