Skip to content

Feature/syslog dashboard - #363

Merged
TheWitness merged 21 commits into
Cacti:developfrom
bmfmancini:feature/syslog-dashboard
Sep 19, 2026
Merged

TheWitness merged 21 commits into
Cacti:developfrom
bmfmancini:feature/syslog-dashboard

Conversation

@bmfmancini

Copy link
Copy Markdown
Member

This feature brings dashboard functionality

image

This is mostly feature complete but still under QA

bmfmancini and others added 21 commits September 18, 2026 11:22
…arallel processing

The master poller aggregated worker statistics through the per process
cached read_config_option() helper. It had already read the same
stats_syslog_child_N keys while waiting out the references phase, where
the moved count is always zero, so the transfer aggregation re-read
those cached numbers and the 'Records processed' figure on the Syslog
Status tab stayed at zero.

Move syslog_aggregate_worker_stats() next to the other worker helpers in
functions.php and read the settings rows with a dedicated fresh SELECT,
ignoring rows outside the configured worker range. Add regression tests
pinning the fresh read, pruning, malformed-row handling, and the source
scan that bans read_config_option() from the aggregation helper.
…ndling

- Serialize panel expressions through syslogBuilderSync() so the DSL
  string (not the builder's structured JSON) reaches the backend,
  fixing 'Invalid logical search' errors on every panel save
- Rebuild the chart select per panel kind (donut for breakdowns) and
  refresh selectmenu widgets after programmatic value changes so
  dropdowns show and submit the right values
- Import saved searches from a server-parsed tree instead of wiping the
  builder model, restoring working saved-search dropdown seeding
- Auto-select the first owned dashboard on tab entry so Add Panel is
  reachable and the correct empty state shows
- Embed panel trees for editing so the dialog rehydrates exactly what
  was saved; guard Save against invalid builder rows
- Backtick the interval column in panel INSERT/UPDATE: it is a MySQL
  reserved word, so unquoted use made every panel save fail silently
  (the reported 'dropdowns do nothing' was saves never persisting)
- Treat empty result arrays as not-found in dashboard/panel loads:
  some Cacti builds return [] instead of false from prepared row
  fetches, which had misreported every panel as an invalid source
- Resolve new dashboard/panel ids by owner/name lookup when the
  connection's insert id is unavailable
- Scope .syslogDashboardEmpty[hidden] to display:none so the theme
  cannot override the empty-state visibility
The dialog's expression builder rendered its field/operator selects as
plain native controls because the builder element lacked the 'cacti'
theme marker, making interaction inconsistent (native OS popups, and
perceived unresponsive clicks) with the themed selects around it
The modal dialog's focus containment blurs menus that live outside its
wrapper, which corrupts the selectmenu open/close state after the first
selection — the next click on the same button toggled internal state
without ever rendering the menu, so the dropdown worked exactly once

Move each selectmenu's menu wrap into the dialog's own stacking context
on open, the same way autocomplete suggestion menus are already handled
…board

All-records timeseries panels emitted a double comma in each UNION branch
(the bucket select already ends with a comma), producing invalid SQL.
Breakdown panels crashed chart init in billboard.js: empty or duplicate
sanitized labels become falsy/colliding legend ids, and
getLegendItemTextBox() returns undefined for falsy ids. Blank labels now
render as 'Unknown' and duplicate labels merge their counts
Panels can now be rearranged by dragging their header: drop targets show
a placement line above or below the hovered card, and the drop posts the
new absolute position, which the server renumbers gaplessly. Horizontal
resizing gets a dedicated full-height edge strip (ew-resize) alongside
the corner handle, so widening a panel does not require grabbing the
tiny diagonal grip
Cacti 1.2 ships Font Awesome 5, which has no fa-pencil rule, so the edit
icon rendered as an empty 14px void and the button appeared missing
- add admin page for dashboards
- add user/group permissions to enable/.disable dashboarding
New syslog_dashboards_perm and syslog_saved_searches_perm tables store
explicit user and group grants, managed from the admin Dashboards and
Saved Search Templates pages with Cacti's jQuery multiselect widget.
Visibility checks honor the grants: granted items appear in a new
"Shared With Me" group of the viewer's selects, granted dashboards are
view-only with "Save as my copy", and share rows are cleared when their
item is deleted.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The dashboard tab already persisted a refresh value in the session and
set_page_refresh() reloaded it, but there was no control to change it.
Add a Refresh select beside Time Range using Cacti's page_refresh_interval
options, wire its change through the same full-page nav as the timespan
select so the interval lands in sess_sl_dashboard_refresh, and style it
to match the existing dashboard bar.

Co-Authored-By: Claude Code <noreply@anthropic.com>
- Alert Logs tab: initialize the value filter buttons, which rendered
  but had no click handlers bound on that tab
- Alert Rules, Removal Rules, and Reports pages: point the Enabled and
  Rows selects at their per-page filter functions instead of the log
  viewer's global applyFilter(), which navigated away to syslog.php
- URL-encode the search term in applyFilterAlerts/Removal/Reports so
  terms containing &, #, +, or % survive the round trip
- Drop silently discarded extra arguments from html_escape() in the
  grouped message detail rows

Co-Authored-By: Claude Code <noreply@anthropic.com>
Fix dead click-to-filter buttons and broken admin page filters
@TheWitness
TheWitness merged commit 3776f9e into Cacti:develop Sep 19, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants