Compare commits

...

2 Commits

Author SHA1 Message Date
c1e5ba2297 neo-layout/de-layout; added netflix via chrome 2025-06-15 10:04:19 +00:00
62b1cd72db disabled udev-settle 2025-06-15 09:22:59 +00:00

View File

@ -1,24 +1,25 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
let let
hdmiHandler = pkgs.writeShellScript "hdmi-handler" '' hdmiHandler = pkgs.writeShellScript "hdmi-display-manager" ''
#!/usr/bin/env bash #!/usr/bin/env bash
PORT="/sys/class/drm/card0-HDMI-A-1/status" set -euo pipefail
USER="nicole" PORT=$(ls /sys/class/drm/card*-HDMI-A-*/*status 2>/dev/null | head -n1 || true)
[[ -z "$PORT" ]] && exit 0
status=$(cat "$PORT" || echo "disconnected")
read status < "$PORT"
if [[ "$status" == "connected" ]]; then if [[ "$status" == "connected" ]]; then
runuser -l "$USER" -c "systemctl --user start kodi.service" systemctl start display-manager.service
# runuser -l "$USER" -c "systemctl --user start vm-viewer@ha-vm.service"
else else
runuser -l "$USER" -c "systemctl --user stop vm-viewer@ha-vm.service" || true systemctl stop display-manager.service
runuser -l "$USER" -c "systemctl --user stop kodi.service"
fi fi
exit 0
''; '';
in in
{ {
imports = [ ./hardware/hardware-configuration.nix ]; imports = [ ./hardware/hardware-configuration.nix ];
nixpkgs.config.allowUnfree = true;
boot.loader.systemd-boot.enable = true; boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true; boot.loader.efi.canTouchEfiVariables = true;
boot.initrd.kernelModules = [ "overlay" "vmd" ]; boot.initrd.kernelModules = [ "overlay" "vmd" ];
@ -59,13 +60,21 @@ in
users.users.nicole = { users.users.nicole = {
isNormalUser = true; isNormalUser = true;
hashedPassword = "$6$p73d5mOLoSuJGOol$KRlszaPXZK9/frADlfR3kAr/57DD5f4.CPTGNNX80QWEWFE5y.bM1WiZwmRHiAlrws3q/zCDQ6AqeSyCUX.8U/"; hashedPassword = "$6$p73d5mOLoSuJGOol$KRlszaPXZK9/frADlfR3kAr/57DD5f4.CPTGNNX80QWEWFE5y.bM1WiZwmRHiAlrws3q/zCDQ6AqeSyCUX.8U/";
extraGroups = [ "wheel" "docker" "libvirtd" ]; extraGroups = [ "wheel" "docker" "libvirtd" "video" "render" ];
linger = true;
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGAsiKDWCwyf1usprg3K6Zk0xE9S4DX6+Bc4+nIOZGmf drezil@Manticore" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGAsiKDWCwyf1usprg3K6Zk0xE9S4DX6+Bc4+nIOZGmf drezil@Manticore"
]; ];
}; };
users.users.kodi = {
isNormalUser = true;
home = "/home/kodi";
description = "Kodi Auto-Login User";
extraGroups = [ "video" "render" ]; # GPU-/DRM-Zugriff
linger = true; # User-Scope darf headless laufen
# kein wheel ⇒ kein sudo
};
system.stateVersion = "25.05"; # ← einmalig festnageln system.stateVersion = "25.05"; # ← einmalig festnageln
security.sudo.wheelNeedsPassword = false; security.sudo.wheelNeedsPassword = false;
@ -77,12 +86,21 @@ in
serviceConfig.ExecStart = "/run/current-system/sw/bin/zfs-prune-snapshots -r --keep=2w"; serviceConfig.ExecStart = "/run/current-system/sw/bin/zfs-prune-snapshots -r --keep=2w";
startAt = "daily"; startAt = "daily";
}; };
systemd.services.systemd-udev-settle.enable = false;
systemd.services.NetworkManager-wait-online.enable = false;
# Wir pinnen den Kernel, bis ZFS 2.3.x für 6.13 bereit ist # Wir pinnen den Kernel, bis ZFS 2.3.x für 6.13 bereit ist
boot.kernelPackages = pkgs.linuxPackages_6_12; boot.kernelPackages = pkgs.linuxPackages_6_12;
environment.systemPackages = with pkgs; [ git vim zfs virt-viewer kodi ]; ##########################################################################
### SYSTEM PACKAGES #####################################################
##########################################################################
environment.systemPackages = with pkgs; [
git vim zfs virt-viewer
kodi netflix
];
#### Virtualisation #### Virtualisation
@ -115,32 +133,36 @@ in
### Kodi & TV-Detect ##################################################### ### Kodi & TV-Detect #####################################################
########################################################################## ##########################################################################
services.xserver = {
enable = true;
videoDrivers = [ "modesetting" ]; # Intel iGPU
desktopManager.kodi = {
enable = true;
package = (pkgs.kodi.withPackages (kodiPkgs: with kodiPkgs; [
jellyfin
netflix
mediacccde
mediathekview
sponsorblock
youtube
]));
};
displayManager.startx.enable = false; # nutzt LightDM intern
xkb = {
layout = "de,de";
variant = ",neo";
};
};
console.useXkbConfig = true;
services.displayManager.autoLogin = {
enable = true;
user = "kodi";
};
### UDEV-Regel + Skript ################################################## ### UDEV-Regel + Skript ##################################################
services.udev.extraRules = '' services.udev.extraRules = ''
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="${hdmiHandler}" ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="${hdmiHandler}"
''; '';
## Kodi GBM/Wayland Stand-alone ###################################
systemd.user.services.kodi = {
description = "Kodi Media Center (stand-alone)";
# wird nur manuell/über den Udev-Hook gestartet → kein wantedBy nötig
# wantedBy = [ "default.target" ]; # auskommentieren, falls immer laufen soll
after = [ "graphical-session.target" ]; # optional
serviceConfig = {
Type = "simple";
ExecStart = "${pkgs.kodi}/bin/kodi-standalone";
Restart = "on-failure";
};
};
### Virt-Viewer Template-Unit (optional) #################################
systemd.user.services."vm-viewer@" = {
description = "Virt-viewer fullscreen for %i";
serviceConfig = {
ExecStart = "${pkgs.virt-viewer}/bin/virt-viewer --full-screen --wait --domain-name %i";
Restart = "on-failure";
};
};
} }