Commit Graph

997 Commits (211763d2c8b2bb49a3f17a6e4359a3b86a26d5a3)

Author SHA1 Message Date
Amir Alexander Abdelbaki 211763d2c8 fix(nvim): guarantee abook pane is at least 20 lines tall
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 13:40:45 +02:00
Amir Alexander Abdelbaki c2514b6fb5 fix(nvim): guarantee abook/calendar column is at least 80 cols wide
Right column was derived as W - left_w, making it too narrow on smaller
terminals. Now right_w = max(80, 45% of W) and left_w takes the rest.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 13:39:04 +02:00
Amir Alexander Abdelbaki 50c5b72683 fix(nvim): auto-insert in terminal buffers, add terminal window nav
- BufEnter term://* auto-calls startinsert so alot/abook receive keys
  immediately without needing to press i/a first (skips floaterm)
- <C-hjkl> in terminal-insert mode exits to normal then moves window,
  matching the existing normal-mode nav mappings

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 13:35:31 +02:00
Amir Alexander Abdelbaki ddd632fb7e fix(alot): restore esc = exit in search mode, add / = refineprompt
esc closes the search buffer (exits alot only if it is the last buffer).
/ opens a prompt pre-filled with the current query for regex refinement.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 13:31:22 +02:00
Amir Alexander Abdelbaki 050d91d544 fix(alot): remove esc = exit from search mode
In the inbox/search view, exit has nowhere to go back to so it quit
alot entirely. Esc is now only bound in thread/taglist/bufferlist where
it navigates back without closing the application.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 13:25:44 +02:00
Amir Alexander Abdelbaki e9ff562c1e feat(alot): track alot config in dotfiles and symlink like other configs
- Add alot/config with account details and esc keybindings
- shell-setup.sh: rm -rf ~/.config/alot && ln -sf ~/Dotfiles/alot
- mail-notmuch.sh: patch account block in Dotfiles/alot/config via
  python3 regex instead of overwriting the whole file

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 13:19:28 +02:00
Amir Alexander Abdelbaki 85e810d70b feat(nvim,alot): full-screen PIM layout + alot Esc bindings
- x now opens a full-screen overlay: alot left (55%), abook top-right,
  calendar bottom-right
- Add esc = exit bindings to alot config for search/thread/taglist/
  bufferlist modes, applied to live ~/.config/alot/config and to the
  mail-notmuch.sh setup script

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 13:12:25 +02:00
Amir Alexander Abdelbaki 9db080dc0f refactor(nvim): remap PIM toggle from r to x
Removes the old x → DBUI_ExecuteQuery binding to free the key.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 12:30:05 +02:00
Amir Alexander Abdelbaki b1bdb3c540 fix(nvim): set winhighlight via nvim_set_option_value, not open_win
winhighlight is a window option, not an nvim_open_win config key.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 12:09:15 +02:00
Amir Alexander Abdelbaki 766cfc0f8f fix(nvim): fix black float backgrounds and guarantee abook 24-line height
- Add winhighlight=Normal:Normal to all floats so they inherit the
  colorscheme background instead of showing NormalFloat (black)
- Pin abook to min 24 lines; mail/calendar split the remaining height

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 12:08:20 +02:00
Amir Alexander Abdelbaki 890cb8819b fix(nvim): pass -position=here to Calendar to open in current window
calendar.vim defaults to tabnew, which escaped the floating window.
-position=here makes it edit into the current buffer instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 12:06:21 +02:00
Amir Alexander Abdelbaki 47b94056ac fix(nvim): correct PIM layout to sideward-T left-column overlay
r now opens three stacked floating windows in a left column (the bar
of the sideward T), leaving the document visible to the right (stem).
Order top→bottom: alot 40%, calendar 30%, abook remainder.
Column is min(90, 45% of screen) cols wide. All sizes are clamped to
≥1 to prevent nvim_open_win errors on small terminals.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 12:02:32 +02:00
Amir Alexander Abdelbaki 96610b7ed0 feat(nvim,mail): floating PIM windows + notmuch/alot setup script
- Replace tab/vsplit PIM approach with nvim_open_win floating windows:
  r opens a tiled full-screen overlay (alot top, calendar+abook bottom)
  n/g/f open individual centered floats with rounded border
- Add setup/modules/optional-Modules/apps/mail-notmuch.sh:
  configures mbsync, msmtp, notmuch, alot from interactive prompts
  installs a systemd user timer for 5-min periodic mail sync

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 11:57:43 +02:00
Amir Alexander Abdelbaki 00b178103e feat(nvim): add PIM panel with calendar, alot mail, and abook
Adds itchyny/calendar.vim plugin and keybinds for a PIM sidebar:
- r: full-screen tab with alot (top), calendar + abook (bottom split)
- n/g/f: individual vsplit toggles for alot, calendar, abook
- Restores <C-hjkl> window nav inside calendar buffers
- shell-setup.sh installs notmuch, alot, abook (AUR) and syncs lazy.nvim

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 11:52:05 +02:00
Amir Alexander Abdelbaki 867686e409 fix(eww-touch): use hyprctl dispatch for close window button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 10:30:52 +02:00
Amir Alexander Abdelbaki 21ec76c6eb Revert "fix(eww-touch): fix middle button close window action"
This reverts commit 266a032cb3.
2026-05-23 10:29:17 +02:00
Amir Alexander Abdelbaki 266a032cb3 fix(eww-touch): fix middle button close window action
hl.dsp.window.close() is not a valid Hyprland Lua API method;
replace with hyprctl dispatch killactive.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 10:28:10 +02:00
Amir Alexander Abdelbaki 612c13b4c0 fix(rotate): add pen/stylus rotation with explicit output mapping
Tablet devices require output= in hl.device() for transform to take
effect, unlike touchscreens which auto-bind to their display.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 10:23:22 +02:00
Amir Alexander Abdelbaki 3e78c7cb2a fix(installer): allow root execution in archiso by shimming sudo
When running as root (archiso chroot context), all three TUI installers
previously died immediately. Replace the hard die with a sudo passthrough
shim ($TMP_D/bin/sudo → exec "$@") prepended to PATH, so every module's
`sudo pacman`, `sudo systemctl` etc. just executes directly as root.
The shim lives in TMP_D and is cleaned up by the existing EXIT trap.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 05:04:55 +02:00
Amir Alexander Abdelbaki f358cb6d2c fix(installer): fix FIDO2 user login and AUR module failures
- Pin pamu2fcfg enrollment to the target hostname (-o/-i pam://$HOSTNAME)
  so the credential origin matches pam_u2f.so at runtime; enrolling outside
  the chroot previously used the live ISO hostname, causing auth to fail
- Add `cue` to the pam_u2f.so PAM line so ly prompts the user to touch
  the key after password entry
- Add --needed to hyprlua AUR yay call to survive re-runs
- Degrade gracefully in lamco-rdp-server when no user D-Bus session is
  active (systemctl --user enable would abort the module under set -e)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 04:06:49 +02:00
Amir Alexander Abdelbaki 0c88a09a0f feat(installer): add structured logging to all modules and installers
Add modules/lib/logging.sh with log(), skip(), warn(), err() helpers.
Source it in all 84 scripts (core, DEs, optional apps) and replace bare
echo calls with structured log messages. Add log file capture to install.sh.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 01:44:31 +02:00
Amir Alexander Abdelbaki 242a544909 added create-webapp.sh - via claude 2026-05-22 00:53:04 +02:00
Amir Alexander Abdelbaki 69f5b3c13b feat(modules): add sauerbraten and stuntrally modules
sauerbraten: open-source Cube 2 FPS (pacman)
stuntrally: rally racing game via Flatpak (io.github.stuntrally.StuntRally3)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 00:17:17 +02:00
Amir Alexander Abdelbaki 6d27c189f3 feat(modules): add openarena, tetris CLI, and doom modules
openarena: open-source Quake III Arena (pacman)
tetris: bastet + vitetris (pacman + AUR)
doom: Chocolate Doom + Freedoom game data (pacman)

Wired up in simple-install.sh, tui-install.sh, and install-modules.sh.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 23:51:33 +02:00
Amir Alexander Abdelbaki 33d2fe7715 fix(installer): replace nmtui with iwctl instructions in network check
nmtui is not available on the archiso live environment; direct users to
iwctl (WiFi) or ethernet instead, and pause for input before re-checking.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 23:47:36 +02:00
Amir Alexander Abdelbaki 832eb2df5b feat(installer): add xournal++ module, merge blender+povray, sync tui with simple
- Add apps/xournal.sh (xournalpp) wired into both installers
- Merge apps/blender.sh + apps/povray.sh → apps/blender-povray.sh; remove old files
- Sync tui-install.sh with simple-install.sh: add the 13 missing app modules
  (gimp, inkscape, krita, ardour, audacity, lmms, mixxx, cecilia,
   kdenlive, openshot, shotcut, anti-malware, timeshift) to checklist,
   count_steps, summary, and run_module sections

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 23:35:29 +02:00
Amir Alexander Abdelbaki e7873d2874 feat(installer): wire up all missing optional modules in simple-install.sh
Adds 13 previously unlinked app modules (gimp, inkscape, krita, ardour,
audacity, lmms, mixxx, cecilia, kdenlive, openshot, shotcut, anti-malware,
timeshift) to the checklist, summary loop, and dispatch block, with three
new TUI sections: Graphics & Design, Audio & Music, and Video Editing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 23:21:46 +02:00
Amir Alexander Abdelbaki 379dfc4885 feat(installer): replace number-input checklist with scrollable TUI
Arrow keys navigate a viewport-bounded list, Space toggles items,
Enter/n confirms — fixes overflow on the app selection screen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 22:58:02 +02:00
Amir Alexander Abdelbaki cdccc7634a feat(installer): replace dialog with pure-bash TUI in simple-install.sh
Rewrites simple-install.sh to use ANSI/read-based TUI primitives
(tui_msg, tui_yesno, tui_input, tui_checklist, tui_menu) instead of
dialog, removing the dialog dependency entirely.

Updates archbaseos-guided-install.sh to invoke simple-install.sh and
drops dialog from the archiso package list; error_handler now uses the
plain read-based croc prompt unconditionally.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 22:23:11 +02:00
Amir Alexander Abdelbaki 1f1e9f6f9c fix(installer): fix tui-install on bare console + add network check to archiso installers
tui-install.sh: dialog height=40 apps checklist and height=24 confirm
dialog both exceeded the standard 24-row VT console, causing dialog to
exit with code 1 and silently skip all apps. Make both heights
terminal-adaptive via tput lines/cols. Also extend the EXIT trap to
reset the terminal so Ctrl-C during a dialog doesn't leave the console
in raw/no-echo mode.

arch-autoinstall.sh, archbaseos-guided-install.sh: add a ping 1.1.1.1
check early in both scripts. In interactive mode, launches nmtui if
offline, then re-checks; prompts to abort if still down. Answerfile
mode logs a warning and continues.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 21:18:46 +02:00
Amir Alexander Abdelbaki dbb1be0081 fix(installer): show password input in plain text
Remove -s flag from read so the password is visible while typing,
enabling piped input to work visibly on the ISO installer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 20:45:17 +02:00
Amir Alexander Abdelbaki fb4cef6a09 fix(archiso): chmod 777 build and out dirs after mkarchiso
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 20:36:49 +02:00
Amir Alexander Abdelbaki cfe102b26f fix(installer): run pamu2fcfg outside arch-chroot to fix FIDO2 user enrollment
Inside the chroot the host's udev manages /dev/hidraw* with permissions
scoped to live-system groups; the new user has none of them, so pamu2fcfg
timed out with "No FIDO authenticator found". Move enrollment to after
CHROOT_EOF where it runs as root on the live system, then fix ownership
using the new system's UID/GID.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 20:29:30 +02:00
Amir Alexander Abdelbaki aae5042258 fix(installer): remove lvm2 hook from mkinitcpio — setup uses LUKS2+btrfs, no LVM
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 19:37:01 +02:00
Amir Alexander Abdelbaki a0a2b66ccf feat(installer): show croc log-send TUI on install error
On any ERR, both installers now trap the failure, log the line/exit
code, and pop a dialog yes/no asking whether to send the log to another
system via croc. Falls back to a plain read prompt if dialog is absent.
Added dialog and croc to packages.extra so they are present in the live ISO.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 19:28:43 +02:00
Amir Alexander Abdelbaki 319af7bde7 fix(installer): add logging to guided installer and fix NVMe partition naming
- Add full session logging (tee to logfile) to archbaseos-guided-install.sh,
  matching the pattern already in arch-autoinstall.sh; copy log to /mnt/boot/
  at the end so it survives into the new system
- Add part() helper to both installers so NVMe/eMMC drives use the correct
  'p' separator (e.g. /dev/nvme0n1p1 instead of the broken /dev/nvme0n11)
- Add disk size guard to arch-autoinstall.sh: fail early with a clear message
  if ROOT_GIB would be < 8GiB instead of passing a nonsense value to parted

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:54:57 +02:00
Amir Alexander Abdelbaki 95617dd673 fix(keymaps): fall back to :q when :wq fails on bufferless windows
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 16:15:18 +02:00
Amir Alexander Abdelbaki 547c997614 feat(ansipa): rework scan-notify as per-user policy
policy-scan-notify is now a FreeIPA *user* group instead of a host group,
so alert notifications follow the user to every enrolled machine. The
fetch-alerts timer is installed fleet-wide on any host where the group exists;
the profile.d snippet gates notification daemon start on runtime group
membership (id(1) / SSSD) so non-members log in unaffected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:41:35 +02:00
Amir Alexander Abdelbaki 87b62f368b feat(ansipa): rework binary blocking as per-user policy; add local_sudo device policy
policy-block-binary-<name> is now a FreeIPA *user* group instead of a host group,
so restrictions follow the user to every enrolled machine. The PATH wrapper is
installed on all hosts and checks group membership at runtime via id(1)/SSSD,
passing non-members through transparently. __ in the group name decodes to .
so Flatpak app IDs are supported (flatpak run fallback included). AppArmor layer
removed since per-user confinement requires a different approach and the wrapper
alone is sufficient. Adds local_sudo_<username> host group policy which writes
a sudoers drop-in granting that user full sudo on the specific device, reverted
on group leave.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:31:43 +02:00
Amir Alexander Abdelbaki 6ad8d0d488 feat(ansipa): add no_local_users device policy to lock all local account passwords
Adds a new host group policy `no_local_users` that locks the passwords of root
and all local users (UID >= 1000) via `passwd -l`, ensuring only FreeIPA domain
accounts with centrally-managed sudo rules can authenticate and gain elevated
privileges. Leaving the group reverts by unlocking every account tracked in the
state file. Updates docs with group reference entry and Local User Lockdown section.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:18:48 +02:00
Amir Alexander Abdelbaki 3ef916290c docs: add graphic design, video editing, and audio modules to modules reference
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:48:46 +02:00
Amir Alexander Abdelbaki 5d976f5aad feat(modules): add graphic design, video editing, and audio app modules
Add separate install modules for GIMP, Inkscape, Krita, Kdenlive, OpenShot,
Shotcut, Audacity, LMMS, Ardour, Mixxx, and Cecilia.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:47:12 +02:00
Amir Alexander Abdelbaki 6f2b24c51a docs: update readme and docs for recent changes
- freeipa-ansible.md: expand into full container installation guide
  covering SMB shares (ansipa-scans, ansipa-luks-keys), KeyAdmin access
  control, LUKS_KEY_UPLOAD_PASSWORD env var, updated collect-luks-keys
  flow via SMB, daemon enable/disable policy, security scan + alert
  pipeline, and Keycloak section
- modules.md: add Virtualisation & Remote Desktop section (qemu,
  rdp-client, lamco-rdp-server)
- archiso.md: document system reset mode (reset-arch.sh), launch.sh
  action selection, libfido2 in packages.extra
- readme.md: update Cliff Notes and docs table to reflect all changes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:39:38 +02:00
Amir Alexander Abdelbaki 5d56984e38 feat(ansipa): store LUKS backup keys on SMB share with KeyAdmin access control
ansipa-smb-setup.sh:
- Adds KeyAdmin Linux group and luks-upload service account (member of
  KeyAdmin) on the IPA container, both persisted across restarts.
- LUKS base dir /data/luks-keys owned root:KeyAdmin, mode 2750 (setgid
  so new files inherit the group).
- New [ansipa-luks-keys] SMB share: valid users = @KeyAdmin, read only,
  write list = luks-upload. Human admins gain read access by being added
  to KeyAdmin: useradd -r -G KeyAdmin <user> && smbpasswd -a <user>.
- LUKS_KEY_UPLOAD_PASSWORD sourced from env / /data/samba/ansipa-smb.env
  alongside the existing SMB_SCAN_PASSWORD.

collect-luks-keys.yml:
- After fetching /_LUKS_BACKUP_KEY from each client, uploads it to the
  ansipa-luks-keys share via smbclient using a temp credentials file
  (no_log, deleted in post_tasks).
- Local staging copy is removed after a successful upload.
- SMB credentials file uses an epoch-stamped path to avoid collisions.

.env.example: documents LUKS_KEY_UPLOAD_PASSWORD.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:33:17 +02:00
Amir Alexander Abdelbaki aced2c754e feat(ansipa): add daemon enable/disable policy via host-group regex
Host groups named policy-daemon-enable-<unit> and
policy-daemon-disable-<unit> are now matched by a wildcard case arm in
the group parser — no per-service configuration required.

Enforcement (every 30 min via existing timer):
  enable:  systemctl enable --now <unit>; state written to
           /var/lib/ansipa-policies/daemon-enabled
  disable: systemctl disable --now <unit>; state written to
           /var/lib/ansipa-policies/daemon-disabled
  revert:  when a host leaves a group the opposite action is applied
           on the next run (enable→disable, disable→enable)
  conflict: unit in both lists is skipped with a warning

The .service suffix is optional — _svc_unit() appends it when the name
contains no dot, so all systemd unit types work as-is.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:25:15 +02:00
Amir Alexander Abdelbaki 63cd59fb91 feat(modules): add lamco-rdp-server module
Installs lamco-rdp-server from AUR (native Wayland RDP server, Rust,
H.264/VA-API). Enables lamco-rdp-server.service as a systemd user
service. Wired into tui-install.sh alongside the existing rdp-client
and qemu entries.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:15:59 +02:00
Amir Alexander Abdelbaki eb3ae766a5 feat(modules): add RDP client and QEMU/KVM modules
rdp-client.sh: installs Remmina with the FreeRDP and libvncserver plugins
for RDP and VNC sessions.

qemu.sh: installs the full QEMU/KVM stack (qemu-full, libvirt, virt-manager,
virt-viewer, dnsmasq, bridge-utils, edk2-ovmf, swtpm, vde2), enables and
starts libvirtd, auto-starts the default NAT network, and adds the user to
the libvirt and kvm groups.

Both modules are wired into tui-install.sh: count_steps, checklist,
confirmation summary, and run_module dispatch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:12:21 +02:00
Amir Alexander Abdelbaki a84e6ac41c feat(archiso): add system reset mode to installer
Adds a post-keymap action selection to launch.sh (Install vs Reset).
The reset routine (reset-arch.sh) unlocks LUKS via FIDO2 token and/or
passphrase, snapshots /etc credentials and config, wipes and recreates
the @ btrfs subvolume, reinstalls base packages via pacstrap, restores
auth files (passwd/shadow/pam.d/sudoers) and system config, then
regenerates the initramfs and GRUB menu from chroot. User home data is
preserved; ~/.config is cleared except Yubico/ auth keys so FIDO2 PAM
login continues to work. libfido2 added to packages.extra for live-env
token unlock support.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:09:00 +02:00
Amir Alexander Abdelbaki c56c86d57b fix(freeipa): harden container SMB setup and fetch-alerts script
ansipa-smb.service: WantedBy=multi-user.target (was smb.service) so the
  setup service always runs at boot, not only when smb.service pulls it in

docker-compose.yml: add NetBIOS UDP ports 137/138 to match Dockerfile EXPOSE
  and nmb.service being enabled

ansipa-smb-setup.sh:
  - use printf '%q' when writing SMB_SCAN_PASSWORD to ansipa-smb.env so
    passwords with spaces or shell-special chars are correctly quoted
  - always write /etc/cron.d/ansipa-check-scans (remove the [[ ! -f ]] guard)
    since /etc/cron.d is on the ephemeral container layer and is lost on
    container recreation; the service runs on every start anyway

Dockerfile: add -e SMB_SCAN_PASSWORD and -p 445:445 to the quick-test comment

ansipa-fetch-alerts.sh: replace $NEW && log with [[ "$NEW" == true ]] && log
  to avoid set -e ambiguity with the 'false' builtin

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 13:13:53 +02:00
Amir Alexander Abdelbaki 11e66dbddd feat(freeipa): scan result reporting, alert notifications, and SMB share
Container (ansipa image):
- Add samba + cronie to Dockerfile; expose ports 445/139
- ansipa-smb-setup.sh: idempotent setup of smbd + scanupload user +
  /data/scan-results/{archive,alerts}/ on every container start
- ansipa-smb.service: runs setup before smb.service on each boot
- ansipa-check-scans.sh: hourly cron on server; analyses archive logs for
  ClamAV/rkhunter/chkrootkit findings and writes <host>/<date>.alert files
- docker-compose.yml: add SMB_SCAN_PASSWORD env var + port mappings
- .env.example: document SMB_SCAN_PASSWORD

Client (policy-security-scan):
- Scan script now uploads log to //ipa-server/ansipa-scans/archive/<host>/
  via smbclient after each run

Client (policy-scan-notify — new policy group):
- ansipa-fetch-alerts.sh: root timer (10 min) downloads alerts from SMB into
  ~/administration/<hostname>/ for each active login session; deletes server
  alert when user removes local file (acknowledgment)
- ansipa-scan-notify.sh: user daemon started via /etc/profile.d/ansipa-notify.sh;
  sends notify-send every 10 min while *.alert files remain in ~/administration/
- deploy-ansipa-policies.yml: installs samba-client, deploys SMB creds file
  (/etc/ansipa-smb.creds, 0600), and deploys both notification scripts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 12:32:21 +02:00