wol-gate: 매직패킷 발송 시 트리거한 요청 출처 로깅

깨우기 원인이 실사용자 접속인지 봇/스캐너 트래픽인지 구분할 수 있도록
IP, User-Agent, 요청 경로를 로그에 남김.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
kim
2026-08-04 10:37:43 +09:00
co-authored by Claude Sonnet 5
parent dd7a1d0ca1
commit bb7c6a2105
+15 -4
View File
@@ -78,10 +78,21 @@ function renderWakingPage() {
</body></html>`;
}
function maybeWake() {
function describeRequester(req) {
const ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress;
const ua = req.headers['user-agent'] || '-';
const host = req.headers['host'] || '-';
return `${ip} "${req.method} ${host}${req.url}" UA="${ua}"`;
}
function maybeWake(req) {
const now = Date.now();
if (now - lastWakeAt <= WAKE_COOLDOWN_MS) return;
if (now - lastWakeAt <= WAKE_COOLDOWN_MS) {
console.log(`[wol-gate] wake suppressed (cooldown) - triggered by ${describeRequester(req)}`);
return;
}
lastWakeAt = now;
console.log(`[wol-gate] waking - triggered by ${describeRequester(req)}`);
try {
sendMagicPacket(TARGET_MAC, BROADCAST_ADDR, WOL_PORT);
} catch (e) {
@@ -109,7 +120,7 @@ const server = http.createServer(async (req, res) => {
proxyRequest(req, res);
return;
}
maybeWake();
maybeWake(req);
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(renderWakingPage());
});
@@ -117,7 +128,7 @@ const server = http.createServer(async (req, res) => {
// Forward WebSocket upgrades too, once awake (homeclaw uses WS heavily).
server.on('upgrade', async (req, socket, head) => {
if (!(await checkTargetAlive())) {
maybeWake();
maybeWake(req);
socket.destroy();
return;
}