diff --git a/flake.lock b/flake.lock index 7ba959d..13ca140 100644 --- a/flake.lock +++ b/flake.lock @@ -74,16 +74,16 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1779467186, - "narHash": "sha256-nOesoDCiXcUftqbRBMz9tt4blI5PvljMWbm3kuCA+0s=", + "lastModified": 1780902259, + "narHash": "sha256-q8yYEC5f1mFlQO9RGna4LTc9QrcvWunX6FYp83munkQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b77b3de8775677f84492abe84635f87b0e153f0f", + "rev": "bd0ff2d3eac24699c3664d5966b9ef36f388e2ca", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-25.11", + "ref": "nixos-26.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 3a09f3f..6192da9 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Miller Nix User Repository"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; flake-utils.url = "github:numtide/flake-utils"; home-manager.url = "github:nix-community/home-manager"; darwin.url = "github:LnL7/nix-darwin"; @@ -41,8 +41,7 @@ ); overlays.default = import ./overlays; - - homeManagerModules.default = import ./modules/home-manager; + homeManagerModules = import ./modules/home-manager self; nixosModules.default = import ./modules/nixos; darwinModules.default = import ./modules/darwin; }; diff --git a/modules/home-manager/default.nix b/modules/home-manager/default.nix index e69de29..70a65fe 100644 --- a/modules/home-manager/default.nix +++ b/modules/home-manager/default.nix @@ -0,0 +1,4 @@ +self: { + # TODO: add more home-manager modules here + swaytreesave = import ./swaytreesave.nix self; +} diff --git a/modules/home-manager/swaytreesave.nix b/modules/home-manager/swaytreesave.nix new file mode 100644 index 0000000..1a78eca --- /dev/null +++ b/modules/home-manager/swaytreesave.nix @@ -0,0 +1,20 @@ +self: { config, lib, pkgs, ... }: +let + cfg = config.programs.swaytreesave; +in +{ + options.programs.swaytreesave = { + enable = lib.mkEnableOption "swaytreesave"; + + package = lib.mkOption { + type = lib.types.package; + default = self.packages.${pkgs.system}.swaytreesave; + defaultText = lib.literalExpression "self.packages.\${pkgs.system}.swaytreesave"; + description = "The swaytreesave package to install."; + }; + }; + + config = lib.mkIf cfg.enable { + home.packages = [ cfg.package ]; + }; +} diff --git a/pkgs/default.nix b/pkgs/default.nix index bf304eb..a556f03 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -1,7 +1,9 @@ -{ pkgs }: { +{ pkgs }: +{ # sable-web = pkgs.callPackage ./common/sable.nix {}; swaytreesave = pkgs.callPackage ./linux/swaytreesave.nix {}; musicpresence = pkgs.callPackage ./linux/musicpresence.nix {}; vintage-story = pkgs.callPackage ./linux/vintage-story.nix {}; archon = pkgs.callPackage ./linux/archon.nix {}; + yubilock = pkgs.callPackage ./linux/yubilock/default.nix { }; } diff --git a/pkgs/linux/vintage-story.nix b/pkgs/linux/vintage-story.nix index 3119a9c..295ff89 100644 --- a/pkgs/linux/vintage-story.nix +++ b/pkgs/linux/vintage-story.nix @@ -1,100 +1,129 @@ -{ pkgs }: -let - x11Support = true; - waylandSupport = true; -in pkgs.stdenv.mkDerivation (finalAttrs: - let - inherit (pkgs) lib; - in { - pname = "vintagestory"; - version = "1.21.6"; +{ + lib, + stdenv, + fetchurl, + makeWrapper, + makeDesktopItem, + copyDesktopItems, + versionCheckHook, + cairo, + libGLU, + libglvnd, + pipewire, + libpulseaudio, + dotnet-runtime_10, + x11Support ? true, + libxi, + libxcursor, + libx11, + waylandSupport ? false, + wayland ? null, + libxkbcommon ? null, +}: - src = pkgs.fetchurl { - url = "https://cdn.vintagestory.at/gamefiles/stable/vs_client_linux-x64_${finalAttrs.version}.tar.gz"; - hash = "sha256-LkiL/8W9MKpmJxtK+s5JvqhOza0BLap1SsaDvbLYR0c="; - }; +assert x11Support || waylandSupport; +assert waylandSupport -> wayland != null; +assert waylandSupport -> libxkbcommon != null; - nativeBuildInputs = with pkgs; [ - makeWrapper - copyDesktopItems - ]; +stdenv.mkDerivation (finalAttrs: { + pname = "vintagestory"; + version = "1.22.3"; - runtimeLibs = with pkgs; [ - gtk2 - sqlite - openal + src = fetchurl { + url = "https://cdn.vintagestory.at/gamefiles/stable/vs_client_linux-x64_${finalAttrs.version}.tar.gz"; + hash = "sha256-sa4Pj1DwT6W6LJCAYznmbyqPtMUTaLSNTkXS1imQp04="; + }; + + __structuredAttrs = true; + + nativeBuildInputs = [ + makeWrapper + copyDesktopItems + ]; + + desktopItems = [ + (makeDesktopItem { + name = "vintagestory"; + desktopName = "Vintage Story"; + exec = "vintagestory"; + icon = "vintagestory"; + comment = "Innovate and explore in a sandbox world"; + categories = [ "Game" ]; + }) + + (makeDesktopItem { + name = "vsmodinstall-handler"; + desktopName = "Vintage Story 1-click Mod Install Handler"; + comment = "Handler for vintagestorymodinstall:// URI scheme"; + exec = "vintagestory -i %u"; + mimeTypes = [ "x-scheme-handler/vintagestorymodinstall" ]; + noDisplay = true; + terminal = false; + }) + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/share/vintagestory $out/bin $out/share/icons/hicolor/512x512/apps $out/share/fonts/truetype + cp -r * $out/share/vintagestory + install -Dm444 $out/share/vintagestory/assets/gameicon.png $out/share/icons/hicolor/512x512/apps/vintagestory.png + cp $out/share/vintagestory/assets/game/fonts/*.ttf $out/share/fonts/truetype + + rm -rvf $out/share/vintagestory/{install,run,server}.sh + + runHook postInstall + ''; + + makeWrapperArgs = [ + "--set-default" + "mesa_glthread" + "true" + ] + ++ lib.optionals waylandSupport [ + "--set-default" + "OPENTK_4_USE_WAYLAND" + "1" + ]; + + runtimeLibraryPath = lib.makeLibraryPath finalAttrs.passthru.runtimeLibs; + preFixup = '' + makeWrapperArgs+=(--prefix LD_LIBRARY_PATH : "$runtimeLibraryPath") + + makeWrapper ${lib.meta.getExe dotnet-runtime_10} $out/bin/vintagestory \ + "''${makeWrapperArgs[@]}" \ + --add-flags $out/share/vintagestory/Vintagestory.dll + + makeWrapper ${lib.getExe dotnet-runtime_10} $out/bin/vintagestory-server \ + "''${makeWrapperArgs[@]}" \ + --add-flags $out/share/vintagestory/VintagestoryServer.dll + + find "$out/share/vintagestory/assets/" -not -path "*/fonts/*" -regex ".*/.*[A-Z].*" | while read -r file; do + local filename="$(basename -- "$file")" + ln -sf "$filename" "''${file%/*}"/"''${filename,,}" + done + ''; + + doInstallCheck = true; + installCheckInputs = [ versionCheckHook ]; + + passthru = { + updateScript = ./update.sh; + runtimeLibs = [ cairo libGLU - SDL2 - freealut libglvnd pipewire libpulseaudio ] - ++ lib.optionals x11Support (with pkgs.xorg; [ - libX11 - libXi - libXcursor - ]) - ++ lib.optionals waylandSupport (with pkgs; [ + ++ lib.optionals x11Support [ + libx11 + libxi + libxcursor + ] + ++ lib.optionals waylandSupport [ wayland libxkbcommon - ]); - - desktopItems = [ - (pkgs.makeDesktopItem { - name = "vintagestory"; - desktopName = "Vintage Story"; - exec = "vintagestory"; - icon = "vintagestory"; - comment = "Innovate and explore in a sandbox world"; - categories = [ "Game" ]; - }) - - (pkgs.makeDesktopItem { - name = "vsmodinstall-handler"; - desktopName = "Vintage Story 1-click Mod Install Handler"; - comment = "Handler for vintagestorymodinstall:// URI scheme"; - exec = "vintagestory -i %u"; - mimeTypes = [ "x-scheme-handler/vintagestorymodinstall" ]; - noDisplay = true; - terminal = false; - }) ]; - - installPhase = '' - runHook preInstall - - mkdir -p $out/share/vintagestory $out/bin $out/share/pixmaps $out/share/fonts/truetype - cp -r * $out/share/vintagestory - cp $out/share/vintagestory/assets/gameicon.xpm $out/share/pixmaps/vintagestory.xpm - cp $out/share/vintagestory/assets/game/fonts/*.ttf $out/share/fonts/truetype - - runHook postInstall - ''; - - preFixup = - let - runtimeLibs' = lib.strings.makeLibraryPath finalAttrs.runtimeLibs; - in - '' - makeWrapper ${lib.meta.getExe pkgs.dotnet-runtime_8} $out/bin/vintagestory \ - --prefix LD_LIBRARY_PATH : "${runtimeLibs'}" \ - --set-default mesa_glthread true \ - ${lib.strings.optionalString waylandSupport '' - --set-default OPENTK_4_USE_WAYLAND 1 \ - ''} \ - --add-flags $out/share/vintagestory/Vintagestory.dll - - makeWrapper ${lib.meta.getExe pkgs.dotnet-runtime_8} $out/bin/vintagestory-server \ - --prefix LD_LIBRARY_PATH : "${runtimeLibs'}" \ - --set-default mesa_glthread true \ - --add-flags $out/share/vintagestory/VintagestoryServer.dll - - find "$out/share/vintagestory/assets/" -not -path "*/fonts/*" -regex ".*/.*[A-Z].*" | while read -r file; do - local filename="$(basename -- "$file")" - ln -sf "$filename" "''${file%/*}"/"''${filename,,}" - done - ''; - } - ) + }; +}) diff --git a/pkgs/linux/yubilock/README.md b/pkgs/linux/yubilock/README.md new file mode 100644 index 0000000..5134204 --- /dev/null +++ b/pkgs/linux/yubilock/README.md @@ -0,0 +1,3 @@ +# Yubilock + +A Yubikey unlocking script that allows unlocking of sessions when attached. diff --git a/pkgs/linux/yubilock/default.nix b/pkgs/linux/yubilock/default.nix new file mode 100644 index 0000000..078456e --- /dev/null +++ b/pkgs/linux/yubilock/default.nix @@ -0,0 +1,21 @@ +{ pkgs }: +let + name = "yubilock"; + runtimeInputs = with pkgs; [ + systemd + coreutils + yubikey-manager + gawk + getent + logger + ]; + yubilock = (pkgs.writeScriptBin name (builtins.readFile ./yubilock.sh)).overrideAttrs (old: { + buildCommand = "${old.buildCommand}\n patchShebangs $out"; + }); +in +pkgs.symlinkJoin { + inherit name; + paths = [ yubilock ] ++ runtimeInputs; + buildInputs = [ pkgs.makeWrapper ]; + postBuild = "wrapProgram $out/bin/${name} --prefix PATH : $out/bin"; +} diff --git a/pkgs/linux/yubilock/yubilock.sh b/pkgs/linux/yubilock/yubilock.sh new file mode 100644 index 0000000..6c7ce17 --- /dev/null +++ b/pkgs/linux/yubilock/yubilock.sh @@ -0,0 +1,33 @@ +#!/bin/bash +SESSIONS=($(loginctl list-sessions --no-legend | awk '{ print $1 }')) + +for SESSION_ID in "${SESSIONS[@]}" +do + USERNAME=$(loginctl show-session ${SESSION_ID} -p Name --value) + SESSION_TYPE=$(loginctl show-session ${SESSION_ID} -p Type --value) # should be x11 or wayland + SESSION_LOCKED=$(loginctl show-session ${SESSION_ID} -p LockedHint --value) # yes/no + USER_DIR=$(getent passwd "$USERNAME" | cut -d: -f6) + KEY_FILE="$USER_DIR/.yubikeys" + + if ! [[ "$SESSION_TYPE" == "x11" || "$SESSION_TYPE" == "wayland" ]]; then + continue + fi + if ! [ -e "$KEY_FILE" ]; then + continue + fi + + MATCHING_KEYS=$(comm -12 <(ykman list --serials | sort) <(sort $KEY_FILE)) + + if [[ $MATCHING_KEYS == "" ]]; then + if [[ $SESSION_LOCKED == "no" ]]; then + logger "All YubiKeys Removed ($USERNAME)" + loginctl lock-session ${SESSION_ID} + fi + else + if [[ $SESSION_LOCKED == "yes" ]]; then + logger "YubiKey Found, Unlocking ($USERNAME)" + loginctl activate ${SESSION_ID} + loginctl unlock-session ${SESSION_ID} + fi + fi +done