원격 syslog 기능 제거

This commit is contained in:
seo committed 2026-08-01 11:32:15 +09:00
1 parent 95a4750137
commit c0dadcc8a9
5 files changed
+4 -482

No files matched your search

-220
View File
@@ -60,10 +60,6 @@
dmesgToggle: $('#dmesgToggle'),
dmesgOutput: $('#dmesgOutput'),
dmesgMeta: $('#dmesgMeta'),
synologyLogToggle: $('#synologyLogToggle'),
synologyLogFilters: $('#synologyLogFilters'),
synologyLogOutput: $('#synologyLogOutput'),
synologyLogMeta: $('#synologyLogMeta'),
processDetails: $('#processDetails'),
diagnosticDetails: $('#diagnosticDetails'),
};
@@ -83,12 +79,6 @@
dmesgOpen: false,
dmesgTimer: null,
dmesgLatestKey: null,
synologyLogOpen: false,
synologyLogTimer: null,
synologyLogLatestKey: null,
synologyLogScrollHoldUntil: 0,
synologyLogFilter: 'all',
synologyLogData: null,
ws: null,
wsConnected: false,
wsFallbackTimer: null,
@@ -331,9 +321,6 @@
fanUpdateFailed: 'fan update failed',
dmesgUnavailable: 'dmesg log is not available yet.',
dmesgRefreshFailed: 'dmesg refresh failed',
synologyLog: 'Synology Log',
synologyLogUnavailable: 'Synology log is not available yet.',
synologyLogRefreshFailed: 'Synology log refresh failed',
rebootPrompt: 'Type reboot below to continue.',
rebootPhrase: 'reboot',
rebootTitle: 'System Reboot',
@@ -566,9 +553,6 @@
fanUpdateFailed: '팬 갱신 실패',
dmesgUnavailable: 'dmesg 로그를 아직 사용할 수 없습니다.',
dmesgRefreshFailed: 'dmesg 갱신 실패',
synologyLog: '시놀로지 로그',
synologyLogUnavailable: '시놀로지 로그를 아직 사용할 수 없습니다.',
synologyLogRefreshFailed: '시놀로지 로그 갱신 실패',
rebootPrompt: '재부팅을 계속하려면 아래에 재부팅을 입력하세요.',
rebootPhrase: '재부팅',
rebootTitle: '시스템 재부팅',
@@ -623,10 +607,6 @@
if (els.dmesgToggle) {
els.dmesgToggle.textContent = state.dmesgOpen ? t('hide') : t('show');
}
if (els.synologyLogToggle) {
els.synologyLogToggle.textContent = state.synologyLogOpen ? t('hide') : t('show');
}
updateSynologyLogFilters();
}
function initPreferences() {
@@ -1263,10 +1243,6 @@
stopDmesgFallback();
sendWs({ type: 'dmesg', open: true });
}
if (state.synologyLogOpen) {
stopSynologyLogFallback();
sendWs({ type: 'synology_log', open: true });
}
});
state.ws.addEventListener('message', event => {
@@ -1288,11 +1264,6 @@
return;
}
if (message?.type === 'synology_log') {
renderSynologyLog(message.data || {});
return;
}
if (message?.type === 'error') {
console.error(message.message || 'websocket error');
}
@@ -1304,9 +1275,6 @@
if (state.dmesgOpen) {
startDmesgFallback();
}
if (state.synologyLogOpen) {
startSynologyLogFallback();
}
const delay = state.wsReconnectDelay;
state.wsReconnectDelay = Math.min(15000, state.wsReconnectDelay * 1.7);
state.wsReconnectTimer = setTimeout(connectControlSocket, delay);
@@ -2139,49 +2107,12 @@
.join(' · ') || '-';
}
function remoteAge(row) {
if (!row || row.age_seconds === null || row.age_seconds === undefined) {
return '-';
}
const formatted = formatDhms(Number(row.age_seconds));
return formatted ? `${formatted} ${t('ago')}` : '-';
}
function renderRemoteLogs(data = {}) {
if (!els.remoteLogList) return;
const piToSynology = data.raspberry_to_synology || {};
const synologyToPi = data.synology_to_raspberry || {};
const journal = data.journal || {};
const pstore = data.pstore || {};
const newest = synologyToPi.logs?.newest || null;
const queue = piToSynology.queue || {};
const rows = [
{
title: t('remotePiToSynology'),
desc: remoteMeta([
{ label: t('remoteTarget'), value: piToSynology.target || '-' },
{ label: t('remoteTransport'), value: piToSynology.transport || '-' },
]),
meta: remoteMeta([
{ label: 'rsyslog', value: `${piToSynology.rsyslog_active || '-'} / ${piToSynology.rsyslog_enabled || '-'}` },
{ label: t('remoteQueue'), value: queue.available === false ? '-' : `${Number(queue.file_count || 0).toLocaleString()} / ${queue.total_size || '-'}` },
]),
state: remoteState(Boolean(piToSynology.ok), true),
},
{
title: t('remoteSynologyToPi'),
desc: remoteMeta([
{ label: t('remoteListener'), value: synologyToPi.listener ? `:${synologyToPi.listen_port || 6514}` : '-' },
{ label: t('remoteTransport'), value: synologyToPi.transport || '-' },
]),
meta: remoteMeta([
{ label: t('remoteLatest'), value: newest ? `${newest.name || '-'} / ${remoteAge(newest)}` : '-' },
{ label: t('remoteFiles'), value: `${Number(synologyToPi.logs?.file_count || 0).toLocaleString()} / ${synologyToPi.logs?.total_size || '-'}` },
]),
state: remoteState(Boolean(synologyToPi.ok), true),
},
{
title: t('remotePersistentJournal'),
desc: journal.path || '-',
@@ -2961,134 +2892,6 @@
}
}
function scrollSynologyLogToTop() {
if (!els.synologyLogOutput) return;
if (els.synologyLogOutput.hidden) return;
if (Date.now() < state.synologyLogScrollHoldUntil) return;
els.synologyLogOutput.scrollTop = 0;
}
function synologyLogFilterLabel(filter = state.synologyLogFilter) {
const keys = {
all: 'logFilterAll',
important: 'logFilterImportant',
error: 'logFilterError',
failed: 'logFilterFailed',
blocked: 'logFilterBlocked',
connection: 'logFilterConnection',
system: 'logFilterSystem',
};
return t(keys[filter] || keys.important);
}
function updateSynologyLogFilters() {
if (!els.synologyLogFilters) return;
els.synologyLogFilters.querySelectorAll('[data-log-filter]').forEach(button => {
const key = button.dataset.logFilter || 'all';
button.textContent = synologyLogFilterLabel(key);
button.dataset.active = key === state.synologyLogFilter ? '1' : '0';
});
}
function synologyLogLineMatches(line, filter) {
if (filter === 'all') return true;
const value = String(line || '').toLowerCase();
const patterns = {
important: /(error|err|fail|failed|failure|denied|blocked|drop|reject|disconnect|timeout|oom|panic|critical|warn|warning|throttl|undervoltage)/i,
error: /(error|err|exception|critical|panic|oom)/i,
failed: /(fail|failed|failure|timeout|unreachable|cannot|could not)/i,
blocked: /(blocked|denied|reject|drop|ban|iptables|nft|firewall)/i,
connection: /(connect|disconnect|connection|ssh|tls|handshake|listen|socket)/i,
system: /(systemd|kernel|docker|nginx|mariadb|rsyslog|syslog|journal)/i,
};
return (patterns[filter] || patterns.important).test(value);
}
function filteredSynologyLogLines(lines) {
return (lines || []).filter(line => synologyLogLineMatches(line, state.synologyLogFilter));
}
function renderSynologyLog(data) {
if (!els.synologyLogOutput || !els.synologyLogMeta) return;
if (Date.now() < state.synologyLogScrollHoldUntil) return;
const scrollTop = els.synologyLogOutput.scrollTop;
state.synologyLogData = data || null;
if (!data?.available) {
els.synologyLogOutput.textContent = data?.message || t('synologyLogUnavailable');
els.synologyLogMeta.textContent = '/var/log/remote/synology/chaegeon.log unavailable';
return;
}
const rawLines = data.lines || [];
const lines = filteredSynologyLogLines(rawLines);
const latestKey = `${data.line_count || 0}\n${lines[0] || ''}`;
const hasNewLine = state.synologyLogLatestKey !== null && latestKey !== state.synologyLogLatestKey;
els.synologyLogOutput.textContent = lines.length ? lines.join('\n') : t('logFilterNoLines');
els.synologyLogMeta.textContent = `${data.path || '/var/log/remote/synology/chaegeon.log'} · ${lines.length} / ${data.line_count || 0} lines · ${synologyLogFilterLabel()} · updated ${data.updated_at || '-'}`;
state.synologyLogLatestKey = latestKey;
els.synologyLogOutput.scrollTop = Date.now() < state.synologyLogScrollHoldUntil ? scrollTop : 0;
if (hasNewLine) {
requestAnimationFrame(scrollSynologyLogToTop);
}
}
async function refreshSynologyLog() {
if (!state.synologyLogOpen) return;
try {
renderSynologyLog(await api('synology_log'));
} catch (e) {
console.error(e);
if (els.synologyLogOutput) {
els.synologyLogOutput.textContent = e.message || t('synologyLogRefreshFailed');
}
}
}
function stopSynologyLogFallback() {
clearInterval(state.synologyLogTimer);
state.synologyLogTimer = null;
}
function startSynologyLogFallback() {
if (state.synologyLogTimer) return;
refreshSynologyLog();
state.synologyLogTimer = setInterval(refreshSynologyLog, 1000);
}
function setSynologyLogOpen(open) {
state.synologyLogOpen = open;
if (els.synologyLogOutput) {
els.synologyLogOutput.hidden = !open;
}
if (els.synologyLogFilters) {
els.synologyLogFilters.hidden = !open;
}
if (els.synologyLogToggle) {
els.synologyLogToggle.textContent = open ? t('hide') : t('show');
}
updateSynologyLogFilters();
stopSynologyLogFallback();
if (open) {
if (!sendWs({ type: 'synology_log', open: true })) {
startSynologyLogFallback();
}
} else {
sendWs({ type: 'synology_log', open: false });
}
}
async function refreshStatus() {
if (state.loading) return;
state.loading = true;
@@ -3232,26 +3035,6 @@
els.dmesgToggle?.addEventListener('click', () => {
setDmesgOpen(!state.dmesgOpen);
});
els.synologyLogToggle?.addEventListener('click', () => {
setSynologyLogOpen(!state.synologyLogOpen);
});
els.synologyLogFilters?.addEventListener('click', event => {
const button = event.target?.closest?.('[data-log-filter]');
if (!button) return;
state.synologyLogFilter = button.dataset.logFilter || 'all';
state.synologyLogScrollHoldUntil = 0;
updateSynologyLogFilters();
if (state.synologyLogData) {
renderSynologyLog(state.synologyLogData);
}
});
const holdSynologyLogScroll = () => {
state.synologyLogScrollHoldUntil = Date.now() + 4000;
};
['scroll', 'wheel', 'touchstart', 'touchmove', 'pointerdown'].forEach(eventName => {
els.synologyLogOutput?.addEventListener(eventName, holdSynologyLogScroll, { passive: true });
});
const holdCustomServiceScroll = () => {
state.customServiceScrollHoldUntil = Date.now() + 4000;
};
@@ -3331,9 +3114,6 @@
if (state.dmesgOpen && !sendWs({ type: 'dmesg', open: true })) {
refreshDmesg();
}
if (state.synologyLogOpen && !sendWs({ type: 'synology_log', open: true })) {
refreshSynologyLog();
}
}
});
document.addEventListener('keydown', event => {