change poll mcp again status
This commit is contained in:
@@ -226,6 +226,21 @@ function table(rows, columns, id = '') {
|
|||||||
return `<div class="table-wrap"><table><thead><tr>${head}</tr></thead><tbody>${body}</tbody></table></div>`;
|
return `<div class="table-wrap"><table><thead><tr>${head}</tr></thead><tbody>${body}</tbody></table></div>`;
|
||||||
}
|
}
|
||||||
function capability(label, state, detail) { return `<span class="capability ${state}">${esc(label)}: ${esc(detail)}</span>`; }
|
function capability(label, state, detail) { return `<span class="capability ${state}">${esc(label)}: ${esc(detail)}</span>`; }
|
||||||
|
function mcpCapability(mcp, configuration, pollRunningSeconds=0) {
|
||||||
|
if (configuration.log_source !== 'graylog_mcp') return {state: 'warn', detail: 'not selected'};
|
||||||
|
const status = String(mcp.status || 'checking');
|
||||||
|
if (status === 'connected') return {state: 'on', detail: 'connected'};
|
||||||
|
if (status === 'partial') return {state: 'warn', detail: 'partial'};
|
||||||
|
if (status === 'refreshing') {
|
||||||
|
const previous = String(mcp.previous_status || '');
|
||||||
|
if (['connected', 'partial'].includes(previous) || Number(mcp.previous_events_fetched || mcp.events_fetched || 0) > 0 || Number(mcp.previous_aggregate_events || mcp.aggregate_events || 0) > 0) {
|
||||||
|
const suffix = pollRunningSeconds ? `polling ${pollRunningSeconds}s` : 'polling';
|
||||||
|
return {state: 'on', detail: previous === 'partial' ? `partial, ${suffix}` : `connected, ${suffix}`};
|
||||||
|
}
|
||||||
|
return {state: 'warn', detail: 'starting poll'};
|
||||||
|
}
|
||||||
|
return {state: 'warn', detail: status};
|
||||||
|
}
|
||||||
function actionItem(severity, title, detail, action) {
|
function actionItem(severity, title, detail, action) {
|
||||||
return `<div class="action-item ${esc(severity)}"><strong>${esc(title)}</strong><div>${esc(detail)}</div><div class="muted">Next: ${esc(action)}</div></div>`;
|
return `<div class="action-item ${esc(severity)}"><strong>${esc(title)}</strong><div>${esc(detail)}</div><div class="muted">Next: ${esc(action)}</div></div>`;
|
||||||
}
|
}
|
||||||
@@ -560,11 +575,12 @@ async function refresh() {
|
|||||||
].join('');
|
].join('');
|
||||||
const llm = data.llm_assessment || {};
|
const llm = data.llm_assessment || {};
|
||||||
const llmEnabled = Boolean(llm.enabled || configuration.llm_enabled);
|
const llmEnabled = Boolean(llm.enabled || configuration.llm_enabled);
|
||||||
|
const mcpBadge = mcpCapability(mcp, configuration, pollRunningSeconds);
|
||||||
document.getElementById('capabilities').innerHTML = [
|
document.getElementById('capabilities').innerHTML = [
|
||||||
capability('Baseline', baseline.enabled ? 'on' : 'warn', baseline.enabled ? `${baseline.sources_ready || 0} sources ready` : 'disabled'),
|
capability('Baseline', baseline.enabled ? 'on' : 'warn', baseline.enabled ? `${baseline.sources_ready || 0} sources ready` : 'disabled'),
|
||||||
capability('Ollama', llmEnabled && llm.status !== 'error' ? 'on' : 'warn', llmEnabled ? (llm.status || 'starting') : 'disabled'),
|
capability('Ollama', llmEnabled && llm.status !== 'error' ? 'on' : 'warn', llmEnabled ? (llm.status || 'starting') : 'disabled'),
|
||||||
capability('Threat Intel', threat.enabled && threat.configured ? 'on' : 'warn', threat.enabled ? `${threat.provider || 'unknown'}${threat.configured ? '' : ', key missing'}` : 'disabled'),
|
capability('Threat Intel', threat.enabled && threat.configured ? 'on' : 'warn', threat.enabled ? `${threat.provider || 'unknown'}${threat.configured ? '' : ', key missing'}` : 'disabled'),
|
||||||
capability('Graylog MCP', mcp.status === 'connected' ? 'on' : 'warn', configuration.log_source === 'graylog_mcp' ? (mcp.status || 'checking') : 'not selected')
|
capability('Graylog MCP', mcpBadge.state, mcpBadge.detail)
|
||||||
].join('');
|
].join('');
|
||||||
document.getElementById('liveStatus').innerHTML = [
|
document.getElementById('liveStatus').innerHTML = [
|
||||||
data.stale ? `<span class="sev-high">Showing cached dashboard data because live MCP fetch failed.</span>` : '',
|
data.stale ? `<span class="sev-high">Showing cached dashboard data because live MCP fetch failed.</span>` : '',
|
||||||
|
|||||||
@@ -49,6 +49,10 @@ class DashboardTests(unittest.TestCase):
|
|||||||
self.assertIn("function renderCorrelationExplorer", HTML)
|
self.assertIn("function renderCorrelationExplorer", HTML)
|
||||||
self.assertIn("correlationHitboxes", HTML)
|
self.assertIn("correlationHitboxes", HTML)
|
||||||
|
|
||||||
|
def test_dashboard_shows_refreshing_mcp_as_polling_badge(self):
|
||||||
|
self.assertIn("function mcpCapability", HTML)
|
||||||
|
self.assertIn("connected, ${suffix}", HTML)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user