Document importing Windows hosts from Active Directory
Adds Active Directory Import, and updates the pages that the feature changes.
The new page leads with the part that is not obvious from the requirement: the
preview is persisted server-side and apply may only subtract from it, because a
WindowsTarget row makes DAD connect out to a named host carrying a domain
credential. It also records the three query behaviours that are load-bearing
(paging against AD's silent 1000-object cap, unclassifiable operating systems,
domain controllers), the two-credential model, and what is and is not covered by
CI.
Home: the feature is the most recent pass, and the chronology now reads in order
-- the Windows-source paragraph no longer claims to be "the most recent".
Access Control: new section on why two controllers are Admin-only at the
controller level, where reads are gated, unlike windows_targets. Corrects
hidden? to a class method.
Development: the two remote integrations and the seams they sit behind; suite
counts corrected to 581 + 40 runs / 1969 assertions.
Interface: the connection screens and the two-page import, including which rows
arrive pre-checked and which do not.
Installation: DAD_AR_ENCRYPTION_* and WINDOWS_SSL_VERIFY now name the second
model that reads them; one variable covers the LDAPS and WinRM trust decision
rather than two.
Windows Events: cross-links, and the LDAP gap added to "limits worth knowing".
What Changed Since 2016: new dated section, and the system-suite assertion count
corrected to 247.
Every claim here was checked against the code. Two were wrong as first written
and corrected: the LDAPS/StartTLS note is on the show page, not the index, and
the import result lands on the Windows targets screen.
Co-authored-by: openhands <openhands@all-hands.dev>
Update the wiki for direct WinRM polling of Windows hosts
DAD now polls Windows hosts itself with wevtutil over WinRM instead of
requiring OpenWEC on the Windows side plus a fourth daemon to forward
what it wrote. The OpenWEC path stays documented as the alternative,
because a subscription receives events pushed to it and a pull model
cannot recover records for a host DAD cannot reach.
Windows-Events.md is restructured around the two paths sharing one
pipeline rather than around OpenWEC specifically. New material: the
priority bands and the adaptive interval (clamp(500/eps, band_min,
band_max), EMA-smoothed rate, 25% deadband), per-host disable, the
credential model and why the encryption keys must not be rotated, the
60s delta overlap and the duplicate trade, and the failure behaviour
that keeps one bad host or channel from costing the others.
Also corrected along the way, independent of this feature:
- Access-Control.md never documented ACTION_RIGHTS at all, only
CONTROLLER_RIGHTS. That is the mechanism that makes reading a target a
Viewer action while writing or polling one is Admin, so it is now
spelled out with the reason for each override.
- Interface.md had no Windows targets section, and its paginated-list
count was twelve.
- Jobs.md listed seven handlers; there are eight. Added a note that the
Job frequency is not the polling interval, since the two numbers being
different is easy to misread as a bug.
- Development.md test counts were 488/40 runs, 1679 assertions.
- Installation.md was missing DAD_AR_ENCRYPTION_KEY,
DAD_AR_ENCRYPTION_SALT and WINDOWS_SSL_VERIFY, and had no warning that
rotating the credential keys makes stored credentials unreadable --
unlike SECRET_KEY_BASE, which is safe to rotate.
- Architecture.md and Home.md described Windows collection as OpenWEC
only.
- What-Changed-Since-2016.md gets an entry, since the older pages
describe a design that no longer holds.
Stated as limits rather than glossed over: the WinRM transport is not
exercised in CI (no Windows host; the transport sits behind a seam and
the parsing/delta/queueing logic is tested against recorded wevtutil
XML), and the pull path reads rather than subscribes, so records written
while a host is unreachable are only recovered if they are still in the
channel next poll.
This wiki update was prepared by an AI agent (OpenHands) on behalf of the
repository owner.
Co-authored-by: openhands <openhands@all-hands.dev>
Document the browser-facing pass: system suite, assets, and two fixed defects
The wiki was current through the Rust collector but stopped before the six
frontend/UI changes (PRs #34-#39). This brings it up to date.
What Changed Since 2016: new section covering the test/system suite (and why
rake test excludes test/system by default), the scaffold stylesheet merge, the
viewport and the two over-wide layouts, the error-summary partial, the 209
duplicate ids, and the complete: $.ajax() stray-request bug.
Development: test counts corrected (438 unit/controller + 40 system runs); new
"Three suites, not one" explaining the DEFAULT_TEST_EXCLUDE trap and why the
system tests use rack-test rather than a browser; new "Frontend conventions
worth knowing" covering the single stylesheet, the digest/compile coupling, the
draw_* chart API, why coffee-rails cannot be removed despite there being no
.coffee files, the jQuery options-object trap, .js.erb comments being shipped to
the browser, unique ids, and the shared form partial.
Interface: the dashboard renders seven charts, not six, and draw_graph draws a
pie, not a bar -- both were wrong. Added how the dashboard stays live (the
60-second poll) and a short responsive note.
Home: status paragraph for the browser-facing pass.
Co-authored-by: openhands <openhands@all-hands.dev>
Document the 2026-11 integrity/scheduler/pagination pass, with screenshots
Brings the wiki in line with the code as of the four fixes that followed the
2026 review pass.
Jobs: the handler registry is seven operations, not six - prune_sessions is new
and seeded hourly. Failure behaviour rewritten: the loop body now lives in
JobScheduler, and a Job with no usable frequency is disarmed (next_run NULL)
rather than crashing the process. Documented why: the next_run line sat outside
the begin/rescue, so a blank Frequency field crash-looped the scheduler under
Restart=always with the row re-selected on every start, and no Job ran at all.
Access Control: session_hash unique index (the per-request cookie lookup was a
full scan), Session.purge_expired on logon plus the seeded prune_sessions job,
and username uniqueness - do_logon uses find_by, so a second account sharing a
name could never sign in, silently.
Interface: new "Paginated lists" section, 25 rows/page across all twelve
management indexes, ?page clamped at both ends, hand-rolled rather than a gem.
Two new screenshots (sessions, statistics) at the same 1440x1008 as the rest.
What Changed Since 2016: new section on the integrity constraints the
application never had, and how the migration repairs existing bad rows without
deleting any account.
Development: SQLite can create a CHECK but cannot ALTER TABLE ADD CONSTRAINT, so
the Postgres job is the only thing that exercises that branch.
Home: status note for the follow-up pass. Rails version in Interface corrected
to 8.1.4.1.
Co-authored-by: openhands <openhands@all-hands.dev>
Update wiki for the search-form fix and the 8.1.4.1 lock
Co-authored-by: openhands <openhands@all-hands.dev>
Say where job handler output actually appears
scheduler.rb logs the handler return value
Rails.logger.info "job #{job.name} -> #{JobHandler.perform(job.script)}"
so the disk_utilization reading lands in the journal, not on the Jobs screens.
The Jobs show page lists name, operation, owner, last/next run and frequency
only. Stated on Jobs, Interface, and DAD Disk Space Warnings, since all three
now tell the reader to check the job output.
Co-authored-by: openhands <openhands@all-hands.dev>
Correct the dashboard chart list and the disk-space recipe
Interface: the dashboard renders six charts, not "four gauges and two
longitudinal charts" -- three gauges (7 day / 24 hour / 1 hour), two 24-hour
bar charts (by system, by service), and the two longitudinal rate charts.
Tabulated against the canvas ids in app/views/events/index.html.erb.
DAD Disk Space Warnings: the 2015 snippet now misleads in two ways.
Event.diskUtilization measures the archive partition rather than /, and
returns nil rather than 0 when df cannot measure it, so `used > 98` raises
NoMethodError on nil instead of reporting an empty disk. Adds the nil-safe
form, notes that the disk_utilization handler already ships this alert, and
points at archiveFreeSpacePercent as the thing that actually prevents
running out of space.
What Changed Since 2016: records the diskUtilization semantics change under
"Still true", since the method name survives but the contract does not.
Co-authored-by: openhands <openhands@all-hands.dev>
Add interface screenshots and correct disk/search documentation
Adds an Interface page with screenshots of the running UI (login, dashboard,
search results, jobs, users/roles/rights, preferences, alerts, displays,
exclusions, stored searches, systems) taken against a seeded demonstration
dataset, and threads the relevant ones into the pages they describe.
Corrects the record on disk utilization: there is no dashboard disk gauge. The
author commented it out in bec738c ("Hiding disk gauge", 2015-02-28); the live
surfaces are the disk_utilization job and preferences.archiveFreeSpacePercent.
Documents the open search-form bug (RECOMMENDATIONS 2.3): the Rails check_box
always submits timesearch_enabled[enabled]=0, and EventsController#search
branches on the presence of that key, so every form search takes the absolute
date branch with a now->now window and reports 0 events.
Co-authored-by: openhands <openhands@all-hands.dev>