Commit Graph
526 Commits
Author SHA1 Message Date
mrcharles 069273531d docs(agents): no-wiki-in-Redmine ruling + fix tooling-cli paths [#441]
Discourse is the sole documentation space; Redmine wikis stay disabled
(verified 0/62 projects). Also repointed the stale redmine/discourse CLI
AGENTS.md references to ukrrs/connectors/KNEL-AIMiddleware.

Detail: https://projects.knownelement.com/issues/441 (latest note)

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 17:03:54 -05:00
mrcharles ebefbe47a7 feat(netinfra): NTP + Technitium zones into git SoR; drift-check full stack [#630]
ntp.conf captured (nodes byte-identical); 171 Technitium DZ zone files
captured from the primary; drift-check now covers dhcpd/pihole/ntp on
both nodes plus a zones md5-manifest check. Live run caught real drift:
node-02 dhcpd.conf was a stale primary copy missing the #614 minisplit
reservation — reconciled git->02 with dhcpd -t gate, serial restart,
failover "Both servers normal", all 7 checks in sync. Red-green unit
tests extended (gen_manifest, tracked-file invariants).

Results: https://projects.knownelement.com/issues/630#note-2
2026-09-02 16:33:33 -05:00
mrcharles bdf61ebe49 fix(kuma): Cloudron monitors under dedicated group; zero IP literals [#435]
New "Cloudron" group (id 277); all 55 app monitors moved there
(canary-verified). Deleted IP-literal monitor id=8 (dup of DNS-named
id=210) and repointed appletv monitor to new DNS name
stl-appletv-livingroom.knel.net. Fleet-wide IP literals in Kuma: 0.
Sync tool default group updated to 277.

Results: https://projects.knownelement.com/issues/435#note-5
2026-09-02 16:26:46 -05:00
mrcharles 14e7e4dabb docs: session close-out — HA software queue worked, masters #682/#683 cut [#344]
💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 15:21:33 -05:00
mrcharles f393a5ba5f feat(idrac): drac-extend — IPMI temps via snmpd extend (tsys6/7) [#625]
💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 14:56:21 -05:00
mrcharles 8bc1dc6612 feat(kuma): Cloudron HTTP-200 coverage + group discipline [#435]
55 http monitors added under "Cloud Systems" (blue/green: canary first,
verified green); 9 root-level strays re-homed into founder's groups
(root now zero). New tools: inventory (read-only dump), cloudron-sync
(idempotent diff/add from committed app list), regroup (lib-based moves;
raw editMonitor times out on this build). fleet-sync now requires
--group-id so it can never place monitors at root again.

Results: https://projects.knownelement.com/issues/435#note-4
2026-09-02 13:23:27 -05:00
mrcharles 53b847985e feat(ha): websocket driver tool; Govee integration live end-to-end [#620]
💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 12:59:36 -05:00
mrcharles a2ff60908e feat(mdns): one-shot browse tool; iDRAC SNMP live both DRACs; Govee creds [#619][#625]
💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 12:44:44 -05:00
mrcharles 2c12d7b39e docs(ha): session close-out — iDRAC creds ask, lock verdict, hygiene log [#619][#625]
💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 12:21:35 -05:00
mrcharles 4bf0c31609 chore: session close-out — k8s cluster rebuilt, 8/8 nodes Ready [#367][#368]
Details: https://projects.knownelement.com/issues/367
2026-09-02 12:10:07 -05:00
mrcharles 57946b7140 docs(ha): DHCP-table lock verdict — no lock OUIs, BLE-only likely [#619]
💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 12:08:40 -05:00
mrcharles 1f44a193a2 feat(k8s): cnode disks on TS5-SSD; worker roster — ultix-streaming replaces tsys5
- cnodes 102/705/603 moved to TS5-SSD storage by founder (etcd apply 4-5s -> <1s)
- wnode-tsys5 slot retired; ultix-streaming joins in its place (5 workers)
- ultix-offstage unreachable; stays excluded until back on tailnet

[#367][#368] https://projects.knownelement.com/issues/368
2026-09-02 12:03:26 -05:00
mrcharles babd6d2e25 fix(mdns): accumulate probe records across responses; unit tests [#619]
Live proof: ecobee answers unicast mDNS with PTR only
(_hap._tcp.local -> "Main Floor._hap._tcp.local"), so the old
replace-on-probe wiped learned records every cycle. Merge by
(name, type) instead. CONFIG_PATH now env-overridable for tests.
Details: https://projects.knownelement.com/issues/619#note-5

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 12:02:00 -05:00
mrcharles d3c5ae8beb fix(k8s): time-box remote cmds; k3s kubectl in post-setup; codify VM tuning
- join-workers.sh: timeout wrappers (30s token / 60s pre-clean / 300s install)
- post-setup.sh: bare kubectl/etcdctl do not exist on cnodes; use k3s kubectl
  and etcd-snapshot for health checks (taints silently failed before)
- k8s/proxmox-tuning.sh: codifies 2026-09-01 VM tuning (ssd=1,discard=on,
  queues=2, cpuunits, startup order) — dry-run default, RUN=1 applies

[#367][#368] https://projects.knownelement.com/issues/367
2026-09-01 19:32:51 -05:00
mrcharles c45be04bf5 feat(mdns): hap-bridge daemon — unicast probe to multicast replay [#619] 2026-09-01 18:43:04 -05:00
mrcharles aa510aac30 docs: ask for UniFi Integration API key [#619] 2026-09-01 18:38:40 -05:00
mrcharles 133b68ab40 fix(sensors): numeric parser anchors on degree symbol (label-digit bug) [#618] 2026-09-01 18:22:52 -05:00
mrcharles 6c8f839eaa fix(sensors): allowlist netinfra pair (TS subnet-route hairpin sources) [#618] 2026-09-01 18:16:19 -05:00
mrcharles 375a9fb3b2 fix(sensors): rocommunity6 for IPv6 ACL sources (snmpd config error) [#618] 2026-09-01 18:07:01 -05:00
mrcharles 7b922c507c feat(sensors): numeric -n mode + lmsensors_n extend for HA SNMP migration [#618] 2026-09-01 18:02:09 -05:00
mrcharles 196d0f597e docs: unattended night-grind plan for approval [#344] 2026-09-01 17:37:47 -05:00
mrcharles 3b1bf0adcb chore: HomeAssistant ops dir (config-repo pointer, needfromcharles asks); tidy test junk [#344] 2026-09-01 17:35:13 -05:00
mrcharles adfdcafeab feat(dns): git SoR + drift-check for pihole/dhcpd; serial-restart rule [#469][#420] 2026-09-01 17:07:23 -05:00
mrcharles e2d6e5c52f docs: session close-out — HA plant monitoring live, VM pipeline flowing [#344] 2026-09-01 16:12:39 -05:00
mrcharles 47323976e0 feat(dhcp): reserve pfv-minisplit-dongle 192.168.1.149 [#614][#629][#420] 2026-09-01 15:36:37 -05:00
mrcharles ab75a1713c fix(dns): reload Technitium when zone sync changes files (TDD) [#469][#344] 2026-09-01 13:41:27 -05:00
mrcharles a9a37266c7 docs(framework): field lessons + session close-out for pfv-bms stabilization [#344] 2026-09-01 13:08:30 -05:00
mrcharles 070172f93a feat(framework): VM_PORT support in remote.sh for HAOS debug SSH [#344] 2026-09-01 12:22:38 -05:00
mrcharles 39bb855a98 chore(archive): preserve KNELServerBuild remainder + layout notes [#474]
Archive the non-ported remainder of the legacy KNELServerBuild repo
under archive/KNELServerBuild/ with its original structure intact,
completing the legacy repo merge for everything except the live
LibreNMS patterns (ported in the previous commit).

Exclusions:
- .git history (superseded; legacy repo remains at its original path)
- ported files (Agents/librenms, Modules/OAM/oam-librenms.sh,
  ConfigFiles/SNMP/snmp-sudo.conf)
- vendored KNELShellFramework tree (byte-identical duplicate of the
  copy already vendored at vendor/ in this repo)
- SSH authorized-keys files (live access-control material; carrying
  them in an archive invites drift — key policy lives elsewhere)

The whole tree is skip-listed in tests/shellcheck.sh (archived legacy
code, not maintained — same standing as vendor/); check-rules.sh
already prunes archive/. Rule 9 (conflict markers) now also excludes
archive/ staged files: preserved-verbatim legacy scripts contain
decorative "====" banners that false-positive as conflict markers
(same archive exclusion precedent as rule 11).

AGENTS.md: note archive/KNELServerBuild and oam/librenms-agent in the
Repository Layout, and fix the stale KNELIAC path to
/home/reachableceo/projects/KNEL/KNELIAC.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-28 06:12:05 -05:00
mrcharles 75de9d7104 feat(oam): port LibreNMS agent tooling from KNELServerBuild [#474]
Port the live LibreNMS monitoring patterns from the legacy
KNELServerBuild repo into oam/librenms-agent/, joining the existing
OAM tooling (oxidized, unpoller, smokeping, netdisco):

- agent/ — upstream check_mk agent + snmp-extend scripts (dmi, dpkg,
  mysql, ntp-client, ntp-server, os-updates, postfix, raspberry, smart,
  ss, ups-nut), copied verbatim (md5-verified), never to be edited here
- setup.sh — deploy module ported from ProjectCode/Modules/OAM/
  oam-librenms.sh; only the legacy framework bootstrap was replaced
  with plain bash (path constants + print_info -> echo)
- snmp-sudo.conf — Debian snmpd sudo rule the extends require
  (Debian-snmp NOPASSWD /bin/cat); carried as a file only, sudoers
  install is a policy decision per AGENTS.md

Lint gates: extend the existing upstream-skip mechanism for the
verbatim agent scripts (tests/shellcheck.sh + check-rules.sh prune,
same precedent as archive/provisioning/Agents/librenms), and fix the
stale skip path there (provisioning/ moved to archive/provisioning in
6244c1c; the bash extends have been failing the whole-repo shellcheck
gate since).

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-28 06:11:08 -05:00
mrcharles f16397f95e feat(netinfra): DHCP hot-standby + dual-stack NTP/SNMP on netinfra pair [#420]
DNS/DHCP/NTP redundancy per founder ruling 2026-08-27:
- DHCP failover converted load-balance -> hot standby (split 255 on
  primary; secondary answers only if primary unreachable >3s). DHCP
  options now hand out BOTH nodes for DNS and NTP (active/active) —
  Tailscale hosts stay on MagicDNS 100.100.100.100.
- netinfra-02 ntpsec deployed (pool.ntp.org, all interfaces); 01
  repointed from debian pool zones to pool.ntp.org. NTP now redundant;
  GPS stratum-1 on pfvsvrpi tracked as follow-up ticket.
- snmpd on both nodes with scoped ACLs (LibreNMS LAN+TS sources only)
  and ntpq/dhcpd-lease extends — prep for DNS/DHCP/NTP graphing.
- Deployed sync-zones.sh (git version, DNS name instead of IP literal)
  to netinfra-02; zone sync verified 171/171 zones both nodes.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 13:02:26 -05:00
mrcharles ae8af3472b fix(framework): per-session ticket files unblock parallel sessions [#439]
The ticket gate required the single .crush/active-ticket file, so two
concurrent sessions overwrote each other's ticket mid-work. The gate now
accepts any non-empty .crush/active-ticket* file; each session keeps its
own (e.g. active-ticket-plant, active-ticket-core). Also prune .crush/
session scratch from both shellcheck scanners so one session's throwaway
probe scripts cannot block the other session's commits. Documented in
AGENTS.md Task Tracking.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 13:01:25 -05:00
mrcharles 5977eba503 feat(sensors): sysfs thermal fallback + SBC fleet coverage [#341][#457][#458]
lm-sensors is silent on SBCs (Pis, Jetson-class), so the wrapper now falls
back to /sys/class/thermal zones rendered in lm-sensors format when native
sensors output is empty; suppressed when native output exists to avoid
duplicates. TDD: 3 new unit tests (12 green). Sensor stack deployed to
jetson + pfvsvrpi + 3 subopis (verified from poller), HA pack extended to
16 sensors across 14 hosts, high-temp automation covers the SBC fleet.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 12:00:43 -05:00
mrcharles 2b6fc2b388 feat(ha): pfv-bms plant monitoring YAML pack [#439]
SNMP sensors for all 9 instrumented hosts (temps in °F per founder
ruling, °C converted at display layer), ACPI node-wattage feeds for
tsys6/7, UPS alert automations (on-battery, battery-low, comm-lost,
power-restored, high-temp) targeting Pushover, and Riemann-sum kWh
helpers for the Energy dashboard. PDU and iDRAC blocks left as pinned
placeholders pending PDU community and #462 OMSA work.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 11:35:58 -05:00
mrcharles d2f4214b8c fix(dhcp): correct pfv-tsys6-oob reservation MAC to live iDRAC6 [#460]
The reservation carried a4:ba:db:0b:df:a0 (core-switch OUI, mis-migrated
from pfv-netboot) so tsys6's iDRAC could never lease its reserved address.
Replaced with the in-band-verified BMC MAC; deployed to both failover
nodes, validated, restarted.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 11:23:09 -05:00
mrcharles df2a60e8b2 docs(framework): field-lessons section + parallel-session scratch protocol [#439]
Persist physical-plant session gotchas (venv trap, temperusb API, CLI body
scanner workaround, app-connector source IPs, NUT/udev restart quirks) so
future sessions inherit them. Document .crush/WORKING-PLANT.md split for
concurrent sessions sharing the repo.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 11:02:32 -05:00
mrcharles 333f2ae51b feat(sensors): lm-sensors+TEMPer SNMP extend on 6 hosts with scoped ACLs [#341][#439][#458][#459]
Native lm-sensors output plus optional TEMPer USB probe, unified in
lm-sensors format behind one snmpd extend (lmsensors). Idempotent
deploy binds snmpd to explicit LAN+Tailscale addresses only and
source-scopes the community to the pollers (LibreNMS, Home Assistant
app-connector LAN IP, admin workstation, Cloudron) per the founder's
security ruling. TDD unit suite included; fleet verified live (6 hosts)
and negative-tested (refused source).

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 10:46:57 -05:00
mrcharles 350d984e34 sync(dhcp): back-port live netinfra-01/02 dhcpd.conf to repo [#420]
The live configs were edited in place (canonical renames, stale block
removal, 7 new reservations, 69 total) but the repo copies were never
updated — the exact drift class that bit pi-hole. Repo and live state
now match on both failover nodes.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
EOF
2026-08-27 09:32:16 -05:00
mrcharles 721968bc3b docs(framework): complete TSYSGroupAIOS adoption + tracker/IaC rules [#454]
Bring the framework's global baseline (BASELINE-PROMPT.md, PATTERNS.md,
ADOPTING.md) into the repo — AGENTS.md referenced them but the files were
missing. AGENTS.md gains three rules adopted this session: TDD & Linting
(mandatory at the Ansible/IaC transition), IaC codification shadow-tracking
(every manual fleet change same-day ticketed to #454), and Redmine tracker
discipline (Support not Bug — the CLI default created nine misfiled
tickets, now corrected). Q10 records the direct-push vs PR conflict for
the founder to rule on.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-27 09:26:26 -05:00
mrcharles 28b28026bf docs: session close-out — WORKING.md cleared, handoff via #439/#454 [#446] 2026-08-27 09:20:54 -05:00
mrcharles cb327bcfed feat(netinfra): 192.168/16 reverse forwarding to Technitium on both nodes [#449]
pi-hole on netinfra-01/02 now conditionally forwards 192.168.0.0/16
reverse lookups to this node's Technitium over dnsnet, alongside the
existing knel.net + 100.64/10 pair. Technitium stays the single source
of truth; pollers (NetDisco, phpIPAM, UNPoller, Wazuh soon) resolving
via either node's :53 now get LAN PTRs. Both live revServer arrays and
this compose file are in sync; validated with forward, PTR (192.168 +
100.x), and external lookups against both nodes.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 21:21:15 -05:00
mrcharles a4920893b1 fix(test): scope local gate to unit suite [#420]
The full legacy suite mixes repo tests with deployment-target tests
(PAM packages, target resolv.conf, Proxmox repo reachability) that can
only pass on a provisioned server. The workstation gate now runs the
unit suite; validation/security stay invocable for sectestbed runs.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 20:56:28 -05:00
mrcharles 52e0e4cf4e chore(framework): complete TSYSGroupAIOS adoption + extend Kuma device coverage [#420][#435]
Fill the framework gaps the Makefile already referenced: scripts/test.sh
(wrapper over tests/run-tests.sh, now exercised by the pre-push full
audit) and up.sh/down.sh stubs for this non-compose repo. Extend
kuma-fleet-sync STATIC_GEAR with the fixed network/office devices
(printer, consrv, tsys6/7 OOB, scanners, label printer, r1-tor-top,
DOME) so future runs keep their ICMP monitors in sync; DOME added
paused like the other known-down systems.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 20:49:44 -05:00
mrcharles 28c2b16fd0 feat(kuma): fleet ICMP coverage sync script [#435]
Gap-analyzes the tailnet Linux fleet + static network gear (switches,
router, APs, PDU, stor1, Reston VPSes) against Uptime Kuma ping
monitors over the socket.io API, and can create missing monitors with
--add. Websocket transport is forced because the Cloudron proxy drops
engine.io polling pushes. First run closed the last 4 gaps: 84/84.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 19:12:28 -05:00
mrcharles a01c91661f fix(audit): use MagicDNS names; Tailscale appliance renames landed [#446]
pfv-bms and tsys-umbrel were renamed in the Tailscale admin console,
so MagicDNS now serves the canonical names. The audit key switches
from the OS-reported hostname to the admin-assigned DNS name, which
retires the alias table. Reston VPS exclusion keyed to its MagicDNS
name (tsys-cloudron). Every in-scope system now passes: VM name,
DNS name, and Tailscale name all agree.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 18:28:12 -05:00
mrcharles 0488042c99 fix(audit): scope out netbird (Reston VPS, NetBird controller) [#446]
Names verified matching (netbird TS/DNS) — no fleet access audit
needed, same treatment as the other Reston systems.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 18:21:09 -05:00
mrcharles faf8ae2d28 fix(audit): ultix-field renamed + access is ultixfield user with sudo [#446]
Device-side hostname, /etc/hosts, and Tailscale node renamed from
ultixfield to ultix-field to match the DNS canonical name (convention
match with ultix-streaming/ultix-offstage). Verified unprivileged path
is the ultixfield account with passwordless sudo.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 18:18:17 -05:00
mrcharles 01893f813d fix(audit): pfv-jetson-nano-1 expected user is localuser with sudo [#446]
With UCS and Jetson keys in place every auditable system now passes:
68 OK / 2 by-design (Home Assistant, Umbrel). Zero failures.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 18:11:05 -05:00
mrcharles d7dba1a6ac fix(audit): drop stlp-3dscanner and sectestbed-sandbox from scope [#446]
3dscanner has been offline ~7 months; sandbox is a disposable
break-fix VM rolled back via Proxmox snapshots, so a failed SSH
probe there is expected noise, not a finding.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 18:07:08 -05:00
mrcharles 5254633710 fix(audit): tsys-ucs-01/02 expected user is root (key deploy pending) [#446]
💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-26 18:04:20 -05:00