diff --git a/flake.nix b/flake.nix index d007398..1b91866 100644 --- a/flake.nix +++ b/flake.nix @@ -64,6 +64,17 @@ modules = [ ./dad/configuration.nix ]; + }; + lnf = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + ({ pkgs, modulesPath, ... }: { + imports = [ (modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix") ]; + + }) + + ./lnf/configuration.nix + ]; }; }; }; diff --git a/lnf/configuration.nix b/lnf/configuration.nix new file mode 100644 index 0000000..788b196 --- /dev/null +++ b/lnf/configuration.nix @@ -0,0 +1,212 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running 'nixos-help'). +{ config, pkgs, ... }: +{ + imports = [ + ./hardware-configuration.nix + ]; + + boot.loader.grub.enable = true; + boot.loader.grub.device = "/dev/vda"; + boot.loader.grub.useOSProber = true; + + networking.hostName = "nixos-lnf"; + networking.wireless.enable = true; + networking.networkmanager.enable = true; + networking.firewall.enable = false; + + time.timeZone = "Europe/Vienna"; + + i18n.defaultLocale = "en_US.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "de_AT.UTF-8"; + LC_IDENTIFICATION = "de_AT.UTF-8"; + LC_MEASUREMENT = "de_AT.UTF-8"; + LC_MONETARY = "de_AT.UTF-8"; + LC_NAME = "de_AT.UTF-8"; + LC_NUMERIC = "de_AT.UTF-8"; + LC_PAPER = "de_AT.UTF-8"; + LC_TELEPHONE = "de_AT.UTF-8"; + LC_TIME = "de_AT.UTF-8"; + }; + + services.xserver.xkb = { + layout = "de"; + variant = ""; + }; + console.keyMap = "de"; + + users.users.kemp = { + isNormalUser = true; + description = "user"; + extraGroups = [ "networkmanager" "wheel" "video" ]; + packages = with pkgs; [ ]; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINGHadFhDCUU/ta3p1FQgpm7NExHkyHNrJbNJP6np5w9 kempinger@ins.jku.at" + ]; + }; + users.users.root = { + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINGHadFhDCUU/ta3p1FQgpm7NExHkyHNrJbNJP6np5w9 kempinger@ins.jku.at" + ]; + }; + + nixpkgs.config.allowUnfree = true; + + environment.systemPackages = with pkgs; [ + git + nil + nixd + wlr-randr + kmsxx + libinput + vlc + jq + sway + ffmpeg + python3 + + (pkgs.writeScriptBin "run-on-output" '' + #!/usr/bin/env bash + # Usage: run-on-output + # Example: run-on-output 1 firefox --kiosk https://example.com + # run-on-output 2 vlc --fullscreen /path/to/video.mp4 + + set -euo pipefail + + if [[ $# -lt 2 ]]; then + echo "Usage: run-on-output " >&2 + exit 1 + fi + + IDX="$1" + shift + + MYUID=$(id -u) + SOCK=$(ls /run/user/"$MYUID"/sway-ipc.* 2>/dev/null | head -n1) + if [[ -z "$SOCK" ]]; then + echo "Error: no sway IPC socket found for uid $MYUID" >&2 + exit 1 + fi + export SWAYSOCK="$SOCK" + + # Inherit Wayland env from the running sway instance + export WAYLAND_DISPLAY=$(${pkgs.sway}/bin/swaymsg -t get_version -r \ + | ${pkgs.jq}/bin/jq -r '.loaded_config_file' 2>/dev/null \ + | xargs -I{} sh -c 'echo "wayland-1"' 2>/dev/null || echo "wayland-1") + export XDG_RUNTIME_DIR="/run/user/$MYUID" + + OUT=$(${pkgs.sway}/bin/swaymsg -t get_outputs -r \ + | ${pkgs.jq}/bin/jq -r ".[$((IDX-1))].name") + + if [[ "$OUT" == "null" || -z "$OUT" ]]; then + echo "Error: no output found at index $IDX" >&2 + ${pkgs.sway}/bin/swaymsg -t get_outputs -r \ + | ${pkgs.jq}/bin/jq -r '.[].name' | nl -v1 -ba >&2 + exit 1 + fi + + echo "Launching on output $IDX ($OUT): $*" + + # Workspace management only — no exec via swaymsg + ${pkgs.sway}/bin/swaymsg "[workspace=$IDX] kill" 2>/dev/null || true + sleep 0.3 + ${pkgs.sway}/bin/swaymsg "workspace $IDX; move workspace to output $OUT" + + # Launch directly — inherits full PATH and Wayland env from this shell + nohup "$@" >> /tmp/run-on-output-$IDX.log 2>&1 & + + echo "Launched PID $! on workspace $IDX ($OUT)" + '') + ]; + + programs.firefox.enable = true; + + # ── Sway: multi-monitor Wayland compositor ───────────────────────────────── + programs.sway = { + enable = true; + wrapperFeatures.gtk = true; + }; + + # Script that runs inside the sway session. + # It detects every active output, pins a numbered workspace to each, + # then launches one VLC per workspace (→ per monitor). + environment.etc."sway/kiosk-start.sh" = { + mode = "0755"; + text = '' + #!/usr/bin/env bash + exec >> /tmp/kiosk-start.log 2>&1 + echo "[$(date)] kiosk-start.sh running" + sleep 2 # give sway more time to settle + + readarray -t outputs < <( + ${pkgs.sway}/bin/swaymsg -t get_outputs \ + | ${pkgs.jq}/bin/jq -r '.[] | select(.active) | .name' + ) + + echo "[$(date)] Found outputs: ''${outputs[*]}" + + # for i in "''${!outputs[@]}"; do + # ws=$(( i + 1 )) + # output="''${outputs[$i]}" + # echo "[$(date)] Launching VLC on output $output (workspace $ws)" + + # ${pkgs.sway}/bin/swaymsg "workspace $ws output $output" + # ${pkgs.sway}/bin/swaymsg "workspace $ws" + # ${pkgs.sway}/bin/swaymsg "exec ${pkgs.firefox}/bin/firefox" + # sleep 0.5 + # done + + echo "[$(date)] Done" + + ''; + }; + + # Minimal sway config for the kiosk session + environment.etc."sway/kiosk.conf".text = '' + output * bg #000000 solid_color + default_border none + hide_edge_borders both + + input * { + xkb_layout de + } + + for_window [app_id="vlc"] fullscreen enable, inhibit_idle open + for_window [class="vlc"] fullscreen enable, inhibit_idle open + for_window [title="VLC.*"] fullscreen enable, inhibit_idle open + + exec /etc/sway/kiosk-start.sh + ''; + + environment.sessionVariables = { + QT_QPA_PLATFORM = "wayland"; + WLR_NO_HARDWARE_CURSORS = "1"; + }; + + # ── greetd: replaces cage, autologins kemp and starts sway ───────────────── + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.sway}/bin/sway --config /etc/sway/kiosk.conf"; + user = "kemp"; + }; + }; + }; + + # ── SSH ───────────────────────────────────────────────────────────────────── + services.openssh = { + enable = true; + settings = { + PasswordAuthentication = false; + KbdInteractiveAuthentication = false; + PermitRootLogin = "prohibit-password"; + }; + }; + + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + system.stateVersion = "25.11"; +} \ No newline at end of file diff --git a/lnf/hardware-configuration.nix b/lnf/hardware-configuration.nix new file mode 100644 index 0000000..3578db9 --- /dev/null +++ b/lnf/hardware-configuration.nix @@ -0,0 +1,24 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/profiles/qemu-guest.nix") + ]; + + boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/88cc8a52-5a15-4782-a322-fe280fa0f7b8"; + fsType = "ext4"; + }; + + swapDevices = [ ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +}