alex
3ca935e551
Tests: add real-world config coverage and prune brittle cases
...
Reduce presentation-focused test churn while adding corpus-based parser, validator, capability-guard, and round-trip save coverage to better protect future refactors.
2026-03-11 11:44:01 +10:00
alex
a03e93bcd3
Effective config: do-0x20-encode revert fix, validation UI, custom displays, option help
...
- Fix do-0x20-encode: clearing pending when toggling back to original (Disabled/Default)
- Do0x20EncodeDisplay: uncheck uses pending.OldValue when present
- EffectiveConfigFieldDisplay: use pending.OldValue as _valueAtActivation when re-entering with pending
- Effective config: validation errors/warnings in toolbar and save modal, revert from modal
- Custom displays: Do0x20EncodeDisplay (tri-state), KeyOnlyOrValueDisplay
- ExplicitToggleState, config/apply support for do-0x20-encode, option help and tests
2026-03-08 12:52:46 +10:00
alex
a776f445b6
Assembly-scanned services, options validator marker, UI tweaks, and config fixes
...
- Register ISettingsModalService, INotificationService, IUpdateCheckService via assembly scanning (marker interfaces)
- Add IApplicationOptionsValidator<TOptions> marker; scan only those for IValidateOptions registration
- Fix ApplicationLifecycleLoggingHostedService: log RestartCommand/ReloadCommand/StatusCommand (no ApplyCommand)
- NavMenu: spin animation for update-check button icon when checking; single icon with conditional nav-footer-spin class
- Add NotificationHost/NotificationToast components and NotificationService for toasts
- Effective config save flow, restore result, save service; various EffectiveConfig and DnsmasqOptions/validator updates
- Test and script updates; docker-compose.test.yml, appsettings, DnsmasqConfKeys/tooltips/sections
2026-03-01 19:21:09 +10:00
alex
439192058e
Add 16 dnsmasq options, fix srv→srv-host, expand tests
...
- DnsmasqConfKeys: add ReadEthers, DhcpOptionForce, DhcpMac, DhcpNameMatch,
DhcpIgnoreNames, Ipset, Nftset, MxTarget, TftpNoFail, TftpNoBlocksize,
DhcpRapidCommit, Localmx, Selfmx, EnableRa, LogDhcp, DhcpScript.
Fix SRV option key: srv → srv-host (dnsmasq uses srv-host).
- Effective config: new multi-value, flags, single-value fields and sources;
ConfigSetCache, EffectiveConfigFieldBuilder, Registry, Tooltips updated.
- Tests: split DnsmasqConfIncludeParserTests into focused classes
(CoreBehaviour, Include, HostsAndLease, SingleValue, Records, Interfaces,
ServerAndResolv, DhcpTftpDnssec, Flags, OfficialExample, NewOptions).
Rename *_ParsesRealExample to *_WhenSet_ReturnsValue(s).
Add DnsmasqConfIncludeParserOfficialExampleTests (dnsmasq.official.conf.example).
Add DnsmasqConfIncludeParserNewOptionsTests (positive tests for 16 options).
EffectiveDnsmasqConfigTests: extend CreateConfig for new constructor params.
- Testdata: add dnsmasq.official.conf.example; update README.
2026-02-12 02:14:33 +10:00
alex
b70aa02017
Refactor settings modal to use ISettingsModalService and SettingsModalSections
...
- Replace SettingsModalContext with SettingsModalSections
- Add SettingsModalService for modal state management
- Add StatusSection.razor.css for status-dot styles
- Update layout, NavMenu, and modal components
- Update tests for config/settings changes
2026-02-09 14:59:01 +10:00
alex
b44dde2c77
Refactor: reorganise namespaces and move service DTOs to Models/Contracts
...
- Move Client/Http, Services, Parsers under Infrastructure/ (Client, Services, Parsers)
- Move config helpers (DnsmasqConfKeys, DnsmasqOptionTooltips, DnsmasqFileEncoding, EffectiveConfigFieldBuilder) to Infrastructure/Helpers/Config; ApiJsonOptions to Helpers/Http
- Move Configuration types (ApplicationOptions, DnsmasqOptions, DnsmasqOptionsValidator) to Models/Config
- Merge Models/Status and Models/EffectiveConfig into Models/Dnsmasq and Models/Dnsmasq/EffectiveConfig
- Move Client/Models and Client/Services to Models/Client and Infrastructure/Services
- Move ConfigSetSnapshot, HostsSnapshot, ProcessRunResult, ManagedConfigContent from Infrastructure/Services/Abstractions to Models/Contracts
- Update all namespaces and usings; tests pass
2026-02-05 23:08:40 +10:00
alex
2f049feed2
Install script, static assets, UI and release workflow updates
...
- install.sh: default dirs, --update/--service/--uninstall/--purge, in-dir dnsmasq-webui symlink, ContentRootPath note
- UseStaticFiles instead of MapStaticAssets (fix 0-byte assets)
- Program: ContentRootPath when not Development for symlink/CWD
- App.razor: direct asset paths
- Dnsmasq page: remove redundant status pre, margin above Reload button
- Sidebar: logo 64px via app.css, hamburger vertically centered, toggler inside top-row
- ApplicationTitle documented in README
- publish/release: RIDs, Docker build for glibc
2026-02-05 02:00:36 +10:00
alex
a8ddcdec4e
Dnsmasq/Hosts UI tweaks, test harness: down before redeploy, exclude leases from mount
...
- Dnsmasq page: Config (Main config, Managed file, Config set) under Service configuration; remove Paths/Leases (in Effective config DHCP); EffectiveConfigSection collapsible groups; StatusSection flex-wrap
- Hosts: HostsFileSection always shows table; 'No host entries' in tbody when empty
- Models: reorganize into sub-namespaces (Config, EffectiveConfig, Hosts, Dhcp, Status); move EffectiveConfig/Status/Logs components under Dnsmasq
- Test harness: prepare-test-mount.sh runs 'docker compose down' before mount+up so all containers (including DHCP clients) restart; exclude testdata/leases from sync (unit tests only); testdata/README
2026-02-03 01:35:26 +10:00
alex
888bc980cf
Effective config with source tracking, Dnsmasq page, and test harness
...
- Effective config: track value sources (ConfigValueSource, EffectiveConfigSources)
and show readonly badges/tooltips for non-managed files. Multi-value options
use ValueWithSource/PathWithSource for JSON. StatusClient uses camelCase
serialization for reliable deserialization.
- Parsing: align with dnsmasq (conf-file/conf-dir order, suffix filter, case-
sensitive keys). DnsmasqConfIncludeParser and DnsmasqConfigSetService build
effective config and sources. New DnsmasqConfigSetServiceTests.
- UI: rename Overview/Home to Dnsmasq (page, nav, doc comments). Add
EffectiveConfigOptionItem and EffectiveConfigMultiValueRow components.
Dnsmasq.razor uses them; Hosts.razor shows addn-hosts with source. Encode
server-derived strings in markup to avoid XSS.
- Home section namespace: Components.Home -> Components.Dnsmasq (LogsSection,
StatusSection, _Imports).
- Test data: expand testdata (README, resolv.dnsmasq, hosts.extra, dnsmasq.d
configs). dhcp.conf static IP aligned with testnet.
- agents.md: add agent instructions for test harness and conventions.
2026-02-02 12:12:01 +10:00
alex
e50cfc986c
WIP: layout, status, hosts, dhcp, error pages and tests
2026-02-01 17:05:37 +10:00
alex
d0391ef058
Effective config, hosts/addn-hosts logic, test harness status & logs
...
- EffectiveDnsmasqConfig: overridable single-value options (no-hosts, addn-hosts,
flags, dhcp-leasefile, cache-size, port, etc.) from dnsmasq source/docs.
- Hosts UI: allow editing when no-hosts but SystemHostsPath is in addn-hosts;
HostsController and Hosts.razor check pathInAddnHosts.
- Config comments: managed file ensures one addn-hosts line in our file only;
DnsmasqOptions/validator docs for SystemHostsPath and addn-hosts.
- Test harness: dnsmasq logs to /data/dnsmasq.log (log-facility + log-queries in
dnsmasq-test.conf); entrypoint touches log file for write access.
- dnsmasq-status.sh: simulates systemctl status output in container (ps/pgrep);
Dockerfile copies and chmod +x; StatusShowCommand/LogsCommand use script and
tail /data/dnsmasq.log.
- Project: Models/Config namespace, typed HTTP clients, combined DHCP+Leases
page, ProcessRunner, shared models (PascalCase).
2026-02-01 01:17:32 +10:00
alex
40fbf14327
Refactor parsers to Superpower; config set; EnsureManagedConfig; options doc
...
- Parsers: Superpower for all (Directive, FileLine, Include, DhcpHost, Leases, Hosts)
- Shared ConfParserHelpers (Token, OptionalCommentPrefix)
- DnsmasqConfOptionRegistry + DnsmasqOptionKind: typed options (ConfFile, ConfDir,
Domain, DhcpRange, Server, Local, Address, DhcpOption, DhcpHost, Path, Flag, etc.)
- EnsureManagedConfigHostedService: append conf-dir= to main config if missing,
then create managed file; DnsmasqOptions + Dockerfile comments for permissions
- Renames: ConfigLine->DnsmasqConfLine, ConfigSet->DnsmasqConfigSet, etc.
- Test harness: entrypoint in scripts/, prepare-test-mount improvements
- Status/Reload API and UI: stdout+stderr, exit code
2026-01-31 19:28:10 +10:00
alex
f5bbe7d608
Refactor: ServiceCollectionExtensions data-driven registration; LeasesCache + FSW; test harness scripts
2026-01-31 09:49:10 +10:00
alex
e99b2d0453
Initial commit: dnsmasq web UI
...
- ASP.NET Core 9 Blazor Web App + Web API
- Hosts file management (read/write, hosts(5) format)
- DHCP static hosts (dhcp-host=, dnsmasq config)
- DHCP leases (read-only, dnsmasq lease file format)
- Reload and status commands (configurable)
- Docker: standalone app image + Dockerfile.dnsmasq (app + dnsmasq)
- docker-compose.test.yml: app + dhcp-client, testdata mount
- Unit tests (Hosts, DhcpHost, Leases, DnsmasqConfig parsers) using testdata
2026-01-31 03:06:46 +10:00