# Installer Fix1 Implementation **Date:** 2026-03-29 **Branch:** culurien --- ## Summary Fixed 6 bugs and performed ETHOS cleanup on the existing installer templates and dashboard code. No new features. ## Files Changed ### 1. `aggregator-server/internal/services/templates/install/scripts/windows.ps1.tmpl` **F-1 (HIGH): `$AgentBinary` undefined** - Line 204 referenced `$AgentPath` and `$AgentDir` which were never defined - Added `$AgentBinary = Join-Path $InstallDir "redflag-agent.exe"` before the registration block - `$InstallDir` is defined at line 15 as `C:\Program Files\RedFlag` - Registration now correctly resolves to `C:\Program Files\RedFlag\redflag-agent.exe` **F-2 (HIGH): No admin/UAC check** - Added `#Requires -RunAsAdministrator` directive at top of script - Added runtime `IsInRole` check with clear error messages (no emoji) - Script now fails immediately with actionable instructions if not elevated ### 2. `aggregator-web/src/pages/settings/AgentManagement.tsx` **F-5 (MEDIUM): Dashboard saves `.bat` instead of `.ps1`** - Changed `-OutFile install.bat; .\install.bat` to `-OutFile install.ps1; powershell -ExecutionPolicy Bypass -File install.ps1` - Added `-UseBasicParsing` flag to `iwr` (required on older Windows) - The install script is PowerShell, not batch — the old `.bat` extension caused Windows to try running it as CMD ### 3. `aggregator-agent/internal/service/windows.go` **F-6 (MEDIUM): Windows config path inconsistency** - `getConfigPath()` hardcoded `C:\ProgramData\RedFlag\config.json` (no `agent` subdir) - `constants.GetAgentConfigPath()` returns `C:\ProgramData\RedFlag\agent\config.json` - The agent's `main.go` uses `constants.GetAgentConfigPath()` for registration, loading, and saving - **Canonical path:** `C:\ProgramData\RedFlag\agent\config.json` (with `agent` subdir) - **Fix:** Changed `getConfigPath()` to call `constants.GetAgentConfigPath()` - The `constants` package was already imported in `windows.go` **Decision rationale:** The `main.go` registration flow (lines 219, 265, 468) consistently uses `constants.GetAgentConfigPath()`. The installer template creates config at `C:\ProgramData\RedFlag\config.json` — this means fresh Windows installs via the installer template would create config in one location while the Windows service reads from another. By making the service use `constants.GetAgentConfigPath()`, both paths converge. The installer template's config path (`$ConfigDir\config.json` where `$ConfigDir = C:\ProgramData\RedFlag`) will need a separate fix to include the `agent` subdirectory — flagged as future work. ### 4. `aggregator-server/internal/services/templates/install/scripts/linux.sh.tmpl` **F-9 (LOW): Duplicate variable declarations** - Lines 16-22 and 41-53 both declared `CONFIG_DIR`, `LOG_DIR`, `AGENT_USER`, `SUDOERS_FILE` - Merged into a single variables block (lines 16-31) containing all static and template variables - No values changed — all duplicates had identical values **F-10 (LOW): Duplicate step numbering** - Two "Step 4" and two "Step 5" existed - Renumbered sequentially: Steps 1-11 (was 1-5, 4-9) - No content changed — only the comment labels ### 5. Emoji Decision (F-7, F-8) **Decision: KEPT. Not an ETHOS violation.** All emoji in both templates (`linux.sh.tmpl`, `windows.ps1.tmpl`) are in user-facing terminal output (`echo`, `Write-Host`). Examples: - `echo "... Existing installation detected..."` (checkmark for user feedback) - `Write-Host "... Installation complete!" -ForegroundColor Green` ETHOS #1 applies to server log statements (`log.Printf`, structured logging). Installer scripts are user-facing CLI tools — their terminal output is equivalent to the setup wizard and terminal display, which have an existing exemption. No emoji appear in log file output or structured logging. ## Manual Test Plan ### Linux - [ ] Run install script on Ubuntu 22.04 (fresh VM or container) - [ ] Confirm service starts: `systemctl status redflag-agent` - [ ] Run script again (idempotency test) - [ ] Confirm backup created for existing install - [ ] Verify step numbers display sequentially in output ### Windows - [ ] Run script in PowerShell as Administrator - [ ] Confirm admin check blocks non-elevated execution - [ ] Confirm `$AgentBinary` resolves to `C:\Program Files\RedFlag\redflag-agent.exe` - [ ] Confirm service created: `Get-Service RedFlagAgent` - [ ] Run script again (idempotency test) ### Dashboard - [ ] Generate Linux one-liner from AgentManagement page - [ ] Generate Windows one-liner — confirm filename is `.ps1` not `.bat` - [ ] Confirm Windows command includes `-ExecutionPolicy Bypass` Note: Template changes cannot be automatically tested via Go tests (they are rendered shell/PowerShell scripts). Manual verification on target platforms is required. ## Go Test Results ``` Server: 7 packages passed, 0 failures (103 tests) Agent: 10 packages passed, 0 failures (60 tests) Total: 163 tests, 0 failures TypeScript: 0 errors ``` ## ETHOS Pre-Integration Checklist - [x] `$AgentBinary` undefined bug fixed (Windows) - [x] Admin check added (Windows) - [x] Dashboard outputs `.ps1` not `.bat` - [x] Config path consistent across Windows code - [x] Duplicate variables removed (Linux) - [x] Duplicate step numbers fixed (Linux) - [x] Emoji decision documented (keep UX, exempt from ETHOS #1) - [x] All Go tests pass - [x] No banned words in new template text - [x] No new `fmt.Printf` in server Go code