# TASK: Bug fixes from v0.6.2 code scan
## Context
Comprehensive code scan of felhom-controller v0.6.2 found 4 minor bugs across templates, shell scripts, and Go code. None are critical, but all should be fixed for correctness.
**Current state:** Controller v0.6.2 running on demo-felhom.eu.
All changes in this task are in the **deploy-felhom-compose** repo only.
---
## Bug 1: Missing `require_arg` for `--hdd-path` in docker-setup.sh
**File:** `scripts/docker-setup.sh`
**Problem:** The `--hdd-path` flag parsing doesn't use `require_arg` validation like all other flags do. Under `set -u`, if `--hdd-path` is the last argument and has no value, `$2` is unbound and the script crashes with a cryptic bash error instead of a friendly message.
**Current code** (in the argument parsing `while` loop):
```bash
--hdd-path) HDD_PATH="$2"; shift 2 ;;
```
**Fix:** Add `require_arg` call, matching the pattern used by all other flags:
```bash
--hdd-path)
require_arg "$1" "${2:-}"
HDD_PATH="$2"; shift 2 ;;
```
**Verification:** Search for other flags in the same `while` loop — they all use `require_arg`. Confirm `require_arg` is defined earlier in the script (it is).
---
## Bug 2: Implicit `event` variable in `stackAction()` (layout.html)
**File:** `controller/internal/web/templates/layout.html`
**Problem:** The `stackAction` JavaScript function references `event.currentTarget` to get the clicked button, but `event` is never passed as a parameter. It relies on the implicit global `window.event` object, which is non-standard and deprecated. Works in Chrome/Firefox today but is not guaranteed.
**Current code:**
```javascript
async function stackAction(name, action) {
const btn = event.currentTarget;
```
**Fix — Step 1:** Change the function signature to accept `event`:
```javascript
async function stackAction(event, name, action) {
const btn = event.currentTarget;
```
**Fix — Step 2:** Update ALL `onclick` call sites in the same file that call `stackAction` to pass `event` as the first argument. Search for `stackAction(` in the template — each call looks like:
```html
onclick="stackAction('{{.Name}}', 'start')"
```
Change each to:
```html
onclick="stackAction(event, '{{.Name}}', 'start')"
```
There are multiple call sites (start, stop, restart buttons in the stacks section). Update **all** of them.
**Verification:** Search the entire file for `stackAction(` — every call site must pass `event` as the first argument. No other functions in the codebase call `stackAction`.
---
## Bug 3: Missing separator in page title (layout.html)
**File:** `controller/internal/web/templates/layout.html`
**Problem:** The `
` tag concatenates `.Title` and "Felhom.eu" with no separator, rendering as e.g. `"VezérlőpultFelhom.eu"` instead of `"Vezérlőpult — Felhom.eu"`.
**Current code:**
```html
{{.Title}}Felhom.eu
```
**Fix:**
```html
{{.Title}} — Felhom.eu
```
Uses em dash (U+2014) with spaces on both sides. This is a single-character change in the template.
**Edge case:** If `.Title` is empty, the title becomes ` — Felhom.eu` (leading space + dash). Check if any handler sets an empty `.Title`. If so, consider using a conditional:
```html
{{if .Title}}{{.Title}} — {{end}}Felhom.eu
```
Check all handlers that call `render()` or `renderTemplate()` — if every handler always sets a non-empty `.Title`, the simple fix (without conditional) is fine.
---
## Bug 4: `nextPruneLabel` edge case on Sunday before 4am (funcmap.go)
**File:** `controller/internal/web/funcmap.go`
**Problem:** The `nextPruneLabel` function calculates when the next weekly prune (Sunday 4:00) will occur. On Sunday before 4am, `daysUntilSunday` computes to 0, but the function returns the date in `"2006-01-02"` format instead of `"ma"` (Hungarian for "today"). Every other "today" scenario in the codebase uses the `"ma"` label.
**Current code:**
```go
daysUntilSunday := (7 - int(now.Weekday())) % 7
if daysUntilSunday == 0 && now.Hour() >= 4 {
daysUntilSunday = 7
}
next := time.Date(now.Year(), now.Month(), now.Day()+daysUntilSunday, 4, 0, 0, 0, now.Location())
return next.Format("2006-01-02")
```
The logic breakdown:
- Sunday, hour >= 4: `daysUntilSunday` = 0 → set to 7 (next week). Correct.
- Sunday, hour < 4: `daysUntilSunday` = 0 → stays 0, returns today's date as `"2006-01-02"`. Should return `"ma"`.
- Any other day: `daysUntilSunday` > 0 → returns future date. Correct.
**Fix:**
```go
daysUntilSunday := (7 - int(now.Weekday())) % 7
if daysUntilSunday == 0 {
if now.Hour() >= 4 {
daysUntilSunday = 7 // Already ran today, next week
} else {
return "ma" // Today (Sunday), hasn't run yet
}
}
next := time.Date(now.Year(), now.Month(), now.Day()+daysUntilSunday, 4, 0, 0, 0, now.Location())
return next.Format("2006-01-02")
```
**Verification:** Mentally walk through all cases:
- Monday–Saturday: `daysUntilSunday` is 1–6, returns future date ✓
- Sunday 03:00: returns `"ma"` ✓
- Sunday 04:00: `daysUntilSunday` = 7, returns next Sunday ✓
- Sunday 23:00: `daysUntilSunday` = 7, returns next Sunday ✓
---
## Build & Deploy
After all fixes, commit and deploy as v0.6.3:
```bash
# 1. Commit
cd /e/git/deploy-felhom-compose
git add -A && git commit -m "fix: require_arg for --hdd-path, explicit event in stackAction, title separator, nextPruneLabel Sunday edge case" && git push
# 2. Build (only needed for bugs 2-4 which affect the controller binary/templates)
ssh kisfenyo@192.168.0.180 "cd ~/build/felhom-controller && ./build.sh 0.6.3 --push"
# 3. Deploy to demo node
ssh kisfenyo@192.168.0.162 "docker pull gitea.dooplex.hu/admin/felhom-controller:0.6.3 && cd /opt/docker && docker compose up -d"
# 4. Verify
ssh kisfenyo@192.168.0.162 "docker logs felhom-controller --tail 5"
```
## Post-deploy checklist
- [ ] Page title shows separator: "Vezérlőpult — Felhom.eu" (check browser tab)
- [ ] Stack start/stop/restart buttons still work (Bug 2 didn't break onclick handlers)
- [ ] `docker-setup.sh --hdd-path` without value shows friendly error (test locally)
- [ ] Backup page shows "ma" on Sunday before 4am (only testable at that time, or adjust system clock)