Skip to content

Releases: spiderr/xymon

Xymon 5.0.1

05 Jun 15:41

Choose a tag to compare

Xymon 5.0.1 Pre-release
Pre-release

Xymon 5.0.1 — HTML5/Bootstrap 5 Web UI

This release continues the HTML5/Bootstrap 5 modernization of the Xymon web UI started in 5.0.0. All changes are to the web layer only — monitoring logic, protocols, and CGI query string APIs are unchanged.


New: Pure-CSS Color Filter on Overview Pages

Screenshot 2026-06-05 at 12 03 34 PM

The main status grid (xymon.html), non-green page (nongreen.html), and critical page (critical.html) now have a row filter in the page header. Clicking a color toggles that color on/off; multiple colors can be active simultaneously (OR logic — a row is shown if it contains any checked color).

This is implemented entirely in CSS using :has() selectors — no JavaScript, no page reload, no server round-trip. Each host row carries a xymon-host-row class; per-color icon cells carry xymon-{color} classes (already present from the 5.0.0 FontAwesome conversion). The CSS then does:

body:has(.xymon-filter-btn:checked) .xymon-host-row { display: none; }
body:has(#filter-red:checked) .xymon-host-row:has(.xymon-red) { display: table-row; }
/* … one rule per color */

Filter state resets on page reload — intentional for a monitoring tool where you want a fresh view each time. Degrades gracefully in browsers without :has() support (Chrome <105, Firefox <121) — the buttons appear but all rows remain visible.

The nongreen page omits the green button (there are no green rows on that page by definition). The critical page includes the filter alongside the existing Edit button.


New: Inline Acknowledge and Disable on the Service Status Page

Screenshot 2026-06-05 at 12 14 36 PM

Previously, acknowledging an alert or disabling a check required navigating away from the service status page to a separate form. Both actions can now happen via Bootstrap modal dialogs launched directly from the status page header. Bulk acknowledge.sh form still exists as before via tidy link in acknowledgements.sh page header.
Screenshot 2026-06-05 at 12 18 19 PM

  • Ack modal: pre-populated with the alert cookie; submit sends the xymondack message without leaving the page.
  • Disable modal: duration selector, reason field, and an optional host-list checkbox tree for disabling multiple services at once — all without a page navigation.
  • Smart suppression: the Ack button is hidden when the test is already acknowledged; the Disable button is hidden when the test is already disabled. The buttons are re-queried from xymondboard on each page load so the state is always current.
  • The maintenance page (enadis.cgi) now pre-selects the correct host and service when launched from a status page link, and includes a Disable button for convenience.

New: Status Page Acknowledgement and Disable Banners — Structured Layout

The status log page previously showed ack and disable information as a single pre-formatted text blob. Both banners are now parsed and rendered as structured Bootstrap alert cards with discrete By / At / Until / Reason fields. Banner background color reflects the current test status color (red alert has a red tint, yellow has a yellow tint, etc.).

The Acknowledged banner now appears above the status message body text, alongside the Disabled banner when both apply, so the full context is visible without scrolling past the log.


Fix: Acknowledgement Preserved When a Test Is Disabled (core 5.0.1 fix)

Problem: Xymon's default OKCOLORS includes blue (disabled state). When a test is disabled it transitions to blue, which xymond treats as "OK", causing it to immediately clear the test's acknowledgement record (ackmsg and acktime are zeroed). On the status page, the ack was gone the moment the disable took effect — there was no way to know the test had been acknowledged before being disabled.

Fix: enadis.cgi now queries xymondboard for the active ack before sending the disable command. If a live ack is found, its reason, author, timestamp, and expiry are embedded as structured Ack-preserved-* fields inside the disable message itself. Since xymond preserves the disable message (dismsg) even after clearing ackmsg, those fields survive. The status page then renders a Previously Acknowledged banner beneath the Disabled banner.

This fix only applies to disables performed after upgrading. Tests disabled prior to this release will not show the preserved ack banner.


Fix: Timestamps Embedded in Ack and Disable Records

  • acknowledge.cgi now appends Acked at: <timestamp> to the ack message, so the exact acknowledgement time is stored in xymond and displayed in the Acknowledged banner without consulting history logs.
  • enadis.cgi now appends Disabled at: <timestamp> to the disable message for the same reason.

Previously, only the acknowledgement duration was stored — the absolute time had to be inferred.


Fix: Non-Green Page Shows Active Acknowledgements

The non-green overview (nongreen.html) now shows a table of currently acknowledged services above the event log. Previously, an acknowledged-but-still-non-green test could be hard to distinguish from an unattended alert when looking at the overview.


Fix: Event Log — 24-Hour Default Window and Server-Side Pagination

  • Default time window changed from 4 hours to 24 hours, matching the filter form's own default and giving a more useful out-of-the-box view.
  • Server-side pagination: the event log now renders a page of events (default 100) with Newer / Older Bootstrap navigation controls above and below the table. All active filter parameters (host regex, color match, time range, etc.) are preserved in the pagination links. The OFFSET query parameter drives the page position. Previously the event log rendered as a single unbounded list which could be extremely slow on busy installations.

Fix: Service Name Links to Status Page in Event Log and Acknowledgements

In the event log and the acknowledgements list, the service name column is now a hyperlink to svcstatus.cgi for that host/service. Previously it was plain text — navigating from a log entry to the live status page required manually constructing the URL.


Fix: Compact Timestamps in Event and Acknowledgements Tables

Event log and acknowledgements list timestamps changed from ctime() format (Thu Jun 5 12:34:56 2026\n) to strftime("%b %d %H:%M") (Jun 05 12:34). The old format wasted column space and included a redundant year and trailing newline.


HTML5 Cleanup — Tables, Notifications, Configuration Reports

The following pages were still using HTML4 table markup, inline styles, or legacy Bootstrap 3 patterns and have been updated to proper Bootstrap 5 responsive tables:

  • Notifications list (notifications.cgi) — alert pending queue
  • Acknowledgements list (acknowledgements.cgi) — active ack table
  • Event log (eventlog.cgi) — dark-themed responsive table with sortable header
  • Configuration report (confreport.cgi) — host/test/alert configuration dump
  • Critical view (criticalview.cgi) — priority systems dashboard
  • Find host (findhost.cgi) — search results table
  • Ghost list (ghostlist.cgi) — hosts sending data but absent from hosts.cfg
  • Status report (statusreport.cgi) — single-test status across all hosts; also fixed a realloc crash triggered by the --filter and --column command-line arguments

The overview pages now render info, trends, and client column icons inline within the hostname cell rather than as separate service columns, reducing horizontal sprawl on wide host tables.


RRD Graph Improvements (carried from 5.0.0 development)

  • Zoom overlay button on graph cells links to the graph zoom view.
  • RRDGRAPHZOOM environment variable support for HiDPI/Retina display rendering (passes --zoom N to rrd_graph).
  • zoom.js externalized as a static file rather than inlined into each page response.
  • RRDtool argv API abstracted via lib/rrd_api_compat.h — autodetects whether the installed RRDtool expects const char ** or char ** argv, fixing build failures on newer RRDtool versions (merged from upstream).

Upstream Merges

Merged from upstream main:

  • RRDtool argv API compatibility layer (rrd_api_compat.h) — drop RRDtool <1.2 support
  • FreeBSD XymonClient: pkg info collection
  • xymon-snmpcollect: handle Net-SNMP builds without MD5 support
  • Build system: macOS package-manager dependency path detection
  • clock-gettime library detection fix
  • Syslog path fix in analysis.cfg(5) man page

Installation Notes

A ./configure re-run is required after upgrading from 5.0.0 due to the new lib/rrd_api_compat.h header introduced by the upstream RRDtool API abstraction. The RPM %build section handles this automatically.

RPM: xymon-5.0.1-0.el9.tera.x86_64.rpm

Xymon 5.0.0 Facelift HTML5+Bootstrap+FontAwesome

27 May 04:44

Choose a tag to compare

xymon-HTML-5 0 0

I love Xymon. I've been staring a these damn smiley's for 25 years, but the Web 1.0 UI has got to go and I have been hoping someone would get 'er done.

So.. I guess I'll do it. But I haven't wrtten .c since the 90's so I'm gonna cheat with claude's help. So here's a full HTML5/Bootstrap 5 web UI replacement for Xymon 4.3.30. Same look, same behavior.

💽 Code is at https://github.com/spiderr/xymon/tree/html5-bootstrap

./configure; make; make install; 🍹

This is not a Bootstrap-generic makeover; it's the same interface with standards-compliant HTML5. Or the more technical explanation: I gave the page generation files an HTML5 enema.

Does it work?

I am running it in production with ~50 clients. I'm in CentOS/RedHat/Rocky land, so I've built this fork from the distro's .spec and JCleaver's awesome terabithia .spec, and simply executed:

dnf update ls ~/rpmbuild/RPMS/x86_64/xymon-5.0.0-1.x86_64.rpm

The only thing I've only noticed how glorious it is to look at the sharp, crisp icons and graphs. 🕶️

What it looks like

It looks just like it always has, (.woff) smiley's and all. Why mess with perfection?

🟢 The goal was fidelity to the Xymon 4.x user experience, not a redesign. The status grid, color semantics, page flow, and navigation structure are all preserved. The "classic" Xymon aesthetic — dark navigation bar, status-colored page backgrounds, dense information layout — is intentional and carried forward.

🧭 I did fix that navbar. That thing has always been unwieldy. Nothing was added, nothing removed. I just rearranged the deck chairs. If you want to go old school, you can always rock out in /etc/xymon/xymonmenu.cfg
xymon-5-home

🧳 Everything is self-contained. No CDN blah blah crap. It's all self-hosted and on-prem. What effin' good is your monitoring tool if the interface is broken because net access is down.

🧐 HI-REZ graphs are now available.

# HiDPI/Retina graph rendering. When set, passes --zoom to rrdtool, which scales
# the entire graph (data area, fonts, line widths) proportionally. The browser
# scales the image back to fit the page, giving crisp rendering on high-DPI screens.
# Requires rrdtool 1.2+. Leave unset for standard 1x rendering (default).
RRDGRAPHZOOM="2"
xymon-5-xymongen

☝️ And one more thing...

It works on mobile. Dives into the rage metal mosh pit 🤘🎸


100% UI changes, 0% everything else.

My hard rule was every daemon, protocol, data format, CGI API, URL, and query string is identical to 4.3.30. Scripts, bookmarks, and integrations will not notice the difference. The only thing that changed is the HTML that comes out of the CGIs and page generator.

This is a large refactor so I presumptuously dubbed it 5.0.0, because... HTML5 + Bootstrap 5 = Xymon 5... see what I did there? And, let's be honest, this project needs shot of activity. A major rev like this is warrants a major rev bump, and for all the whiney 8-bit GIF'ers out there... 4.3.X can live on in eternal pyscho-smiley glory (or... make yerself a 5.0.0 theme that uses the old smiley .gifs er, spoiler alert. more on that in a bit..)


Template architecture

I reorganized the messy xymond/webfiles/ into per-page subdirectories. All pages use a xymond/webfiles/shared/ master template — consistent <head>, navbar, and footer everywhere

Each template gets three fragment files injected by the master at render time:

xymond/webfiles/
├── shared/
│   ├── header          ← DOCTYPE, <head>, navbar, container open — used by all pages
│   └── footer          ← container close, JS includes
├── hostsvc/            ← status log (svcstatus.cgi)
│   ├── head_inc        ← <meta http-equiv="refresh"> if needed; empty otherwise
│   ├── body_header_inc ← page <h1> + action buttons (e.g. Ack, Disable)
│   └── footer_inc      ← page-specific JS
├── hist/               ← history timeline (history.cgi)
│   ├── head_inc
│   └── body_header_inc
├── event/              ← event log (eventlog.cgi)
│   ├── head_inc
│   ├── body_header_inc
│   └── form            ← filter form HTML
└── ...                 ← one subdir per template; 30+ pages covered

Token resolution in headfoot.c:

Token Loads Content
&PAGEHEAD <template>/head_inc meta refresh; empty for most pages
&XYMONPAGEHEADER <template>/body_header_inc <h1> + action buttons
&PAGEFOOTER <template>/footer_inc page-specific JS

Page titles are centralized in a lookup table in headfoot.c — no template file sets the <title>, and the XYMONPAGEACTIONS env var is gone. To change a page's heading or action buttons, edit body_header_inc; no recompile needed.

File resolution is 4-tier and backward-compatible: per-URL-path → per-template subdir → legacy flat path → shared fallback. Existing local overrides at flat paths still resolve (I think... I don't override that stuff so if you have tricked out overrides, that definitely should be tested).


Theming

☝️☝️And one more one more thing ... I implemented themes.

One variable in /etc/xymon/xymonserver.cfg:

XYMONTHEME="classic"

That's the entire activation mechanism. No recompile. No restart. systemctl reload xymon picks it up. Three themes ship out of the box:

xymond/wwwfiles/themes/
├── default/       ← clean dark base; all other themes @import this
│   └── xymon.css
│   └── preview.html
├── classic/       ← ships as the default for new installs
│   └── xymon.css
│   └── preview.html
└── monsters/      ← Halloween theme (because why not)
    ├── xymon.css
    └── preview.html
xymon-theme-default xymon-theme-classic xymon-theme-monsters

How it works under the hood:

lib/headfoot.c resolves &XYMONSTYLESSHEET to {XYMONSERVERWWWURL}/themes/{XYMONTHEME}/xymon.css. That CSS is the last <link> in shared/header, so it wins the cascade over Bootstrap and the base layout. A theme file is one CSS file that starts with @import url("../default/xymon.css") and overrides whatever it wants.

Template HTML contains only semantic class names — no Bootstrap spacing or layout utilities (mb-3, gap-2, p-2, etc.) appear in any template or C-emitted HTML. Everything dimensional is in xymon.css. This is what makes themes work cleanly: the HTML is neutral, the CSS owns all the visuals.

The classic theme ships as the configured default for new installs. It emulates the expressive personality of the original Xymon GIFs: stable green is a diamond, stable yellow is a pulsing exclamation triangle, stable red is a jolting circle-X, and recently-changed states get face expressions (smile, meh, angry, dizzy, rolling-eyes). The classic theme is the spirit of the 5.0.0 release — same Xymon personality, standards-compliant HTML.

EXISTING INSTALLS should add the following to their xymonserver.cfg else you'll get the boring default... unless boring is the way you roll.

XYMONTHEME="classic"

The monsters theme is a Halloween icon set I threw in: black cat = OK, spider = warning, skull = critical, moon = maintenance, eye = no data, wizard hat = untested. Stable states are silent. Recently-changed states are animated — the spider scurries, the skull rattles, the eye triple-blinks. There's a tiled SVG spider web baked into the CSS background via a data URI (no image file). Set XYMONTHEME="monsters" and reload.

Rolling your own theme:

/* mytheme/xymon.css */
@import url("../default/xymon.css");

/* override icon contract — lib/color.c emits:               */
/* <i class="xymon-icon xymon-{color} xymon-{state}"></i>   */
.xymon-green.xymon-stable::before { content: "\f005"; }  /* fa-star */
/* ... */

One file. The CSS icon contract is stable — xymon-{color} + xymon-{state} class combinations, override ::before content and add animation rules. Each shipped theme includes a preview.html — a standalone icon test page that loads ./xymon.css relative to itself, no CGI needed:

/xymon/themes/default/preview.html   ← base icon set; shows shape-encodes-state logic
/xymon/themes/classic/preview.html   ← highlights which cells override default vs inherit
/xymon/themes/monsters/preview.html  ← shows all animations live

When building a custom theme, drop a preview.html alongside your xymon.css using the same pattern.


Upgrading from 4.3.30

  • xymond/webfiles/ is reorganized. Local template overrides at flat paths still resolve (tier 3 of the 4-tier lookup), but migrating them to the new subdir layout is recommended.
  • GIF assets in xymond/wwwfiles/gifs/ are still installed; they're just not referenced. Leave them in place.
  • Bootstrap 5.3 + FontAwesome 6 are self-hosted under xymond/wwwfiles/externals/. No CDN calls, no external dependencies at runtime. Your monitoring UI works when the internet doesn't.
  • RRDWIDTH / RRDHEIGHT in xymonserver.cfg work as always (defaults: 576×120).
  • Everything else — xymond, xymonnet, xymongen, client agents, hosts.cfg, `ale...
Read more