app.py:
- Remove 'raw' field from export dict entries (only comment/blank
kinds need raw; export entries are always reconstructed from
path/rest/enabled when writing back)
- Remove extra blank line
shares.js:
- Remove unused pathJson variable in SMB row (was only needed for
the quota button, which was removed)
docker-compose.yml:
- Deleted entirely: was missing templates/ and static/ mounts so the
Flask app couldn't serve pages; SYS_ADMIN cap_add was only needed
for quotas; deployment is systemd, not Docker
README.md:
- Remove quota package from apt install command
- Remove quota setup section (feature removed)
- Remove docker-compose from Dev section
CLAUDE.md / PLANNING.md:
- Remove docker-compose.yml references and quotas.js from file tree
.gitignore:
- Remove redundant micronas.env entry (already covered by *.env)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Linux setquota/repquota require quota support on the underlying
filesystem. The target deployment is a Proxmox LXC on ZFS storage where
this is not available inside the container.
Removed: /api/quota endpoint, _quota_supported, _quota_usage,
_find_quota_fs, quotas.js, quota modal, dashboard quota table,
Quota button from share rows.
PLANNING.md updated: notes quota as out of scope with reason.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- _quota_supported() checks df -T /srv; returns false + reason for ZFS,
tmpfs, overlay — surfaces as quota_supported/quota_reason in dashboard API
- Dashboard quota section shows the reason string instead of an empty table
- Quota button hidden from share rows when quota_supported is false
- Prevents setquota errors for ZFS-backed Proxmox LXC containers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- shares.js, users.js: JSON.stringify() inside onclick="..." attributes
produced unescaped " chars that broke HTML attribute parsing — all
dynamic onclick JSON now passed through esc() so the browser decodes
" back to " before executing the handler
- Replace browser confirm() dialogs with a styled Bootstrap modal
(#deleteModal) for share and user deletion — reusable across all tabs
- users.js: rename shadow variable 'confirm' → 'pwConfirm' to avoid
shadowing the now-removed confirm() call
- main.js: auto-refresh now reloads shares and users every 30 s,
not just the dashboard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backend:
- SMB config parser/writer (_parse_smb_conf, _write_smb_conf) for
safe whole-file rewrites instead of append-only
- NFS exports parser/writer (_parse_exports, _write_exports) with
support for disabled (commented-out) exports
- DELETE/PATCH/toggle endpoints for SMB and NFS shares
- parse_smb() now returns enabled field (reads available = no)
- get_nfs_shares() uses the new parser and returns enabled field
- Replace HTTP Basic Auth with Flask session auth (secret key derived
from MICRONAS_PASS so sessions survive restarts)
- /login GET/POST, /logout routes
Frontend:
- Login page (templates/login.html) with same dark theme
- Sign out button in header
- Edit modal pre-filled with current share values
- Delete buttons wired up (with confirm dialog)
- Enable/Disable toggle per share (green/grey dot status indicator)
- Disabled shares shown at reduced opacity
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>