diff --git a/flake.nix b/flake.nix index de0a695..5921f06 100644 --- a/flake.nix +++ b/flake.nix @@ -10,7 +10,25 @@ }; }; - outputs = { self, flake-parts, ... } @ inputs: flake-parts.lib.mkFlake {inherit inputs;} { - systems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"]; - }; + outputs = { + self, + flake-parts, + ... + } @ inputs: + flake-parts.lib.mkFlake {inherit inputs;} { + systems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"]; + + perSystem = {pkgs, ...}: { + packages = self.overlays.default {} pkgs; + formatter = pkgs.alejandra; + }; + + flake = { + overlays.default = import ./pkgs/all-packages.nix; + + nixosModules = { + reposilite = import ./modules/reposilite.nix self; + }; + }; + }; } diff --git a/modules/reposilite.nix b/modules/reposilite.nix new file mode 100644 index 0000000..7dab9ea --- /dev/null +++ b/modules/reposilite.nix @@ -0,0 +1,79 @@ +self: { + lib, + config, + pkgs, + ... +}: let + cfg = config.services.reposilite; + + inherit (pkgs.stdenv.hostPlatform) system; + + inherit + (lib) + getExe + literalExpression + mdDoc + mkDefault + mkEnableOption + mkIf + mkOption + mkPackageOption + types + ; +in { + options.services.reposilite = { + enable = mkEnableOption "reposilite"; + package = mkPackageOption self.packages.${system} "reposilite" {}; + environmentFile = mkOption { + description = mdDoc '' + Environment file as defined in {manpage}`systemd.exec(5)` + ''; + type = types.nullOr types.path; + default = null; + example = literalExpression '' + "/run/agenix.d/1/reposilite" + ''; + }; + }; + + config = mkIf cfg.enable { + users = { + users.reposilite = { + isSystemUser = true; + group = "reposilite"; + }; + + groups.reposilite = {}; + }; + + systemd.services."reposilite" = { + enable = true; + wantedBy = mkDefault ["multi-user.target"]; + after = mkDefault ["network.target"]; + script = '' + ${getExe cfg.package} + ''; + + serviceConfig = { + Type = "simple"; + Restart = "always"; + + EnvironmentFile = mkIf (cfg.environmentFile != null) cfg.environmentFile; + + StateDirectory = "reposilite"; + StateDirectoryMode = "0700"; + WorkingDirectory = "/var/lib/reposilite"; + + User = "reposilite"; + Group = "reposilite"; + + LimitNOFILE = "1048576"; + PrivateTmp = true; + PrivateDevices = true; + ProtectHome = true; + ProtectSystem = "strict"; + AmbientCapabilities = "CAP_NET_BIND_SERVICE"; + }; + }; + }; +} diff --git a/pkgs/all-packages.nix b/pkgs/all-packages.nix new file mode 100644 index 0000000..48c3943 --- /dev/null +++ b/pkgs/all-packages.nix @@ -0,0 +1,10 @@ +final: prev: { + reposilite = prev.callPackage ./reposilite.nix {}; + enigma = prev.callPackage ./enigma.nix {}; + vineflower = prev.callPackage ./vineflower.nix {}; + koi = prev.kdePackages.callPackage ./koi.nix {}; + + wine-discord-ipc-bridge = prev.callPackage ./wine-discord-ipc-bridge.nix { + inherit (prev.pkgsCross.mingw32) stdenv; + }; +} diff --git a/pkgs/enigma.nix b/pkgs/enigma.nix new file mode 100644 index 0000000..5b3ebfe --- /dev/null +++ b/pkgs/enigma.nix @@ -0,0 +1,42 @@ +{ + stdenv, + fetchurl, + jdk, + makeWrapper, + makeDesktopItem, + copyDesktopItems, +}: +stdenv.mkDerivation (finalAttrs: { + name = "enigma"; + version = "2.5.0"; + + src = fetchurl { + url = with finalAttrs; "https://maven.fabricmc.net/cuchaz/enigma-swing/${version}/enigma-swing-${version}-all.jar"; + hash = "sha256-yOPPTKt96aRSbziYDBLBKqfLS2R9GeXgz5m2t1fgFHo="; + }; + + dontUnpack = true; + + nativeBuildInputs = [makeWrapper copyDesktopItems]; + + installPhase = with finalAttrs; '' + runHook preInstall + + mkdir -p $out/bin $out/share/${name} + cp ${src} $out/share/${name}/${name}.jar + makeWrapper ${jdk}/bin/java $out/bin/${name} --add-flags "-jar $out/share/${name}/${name}.jar" + + runHook postInstall + ''; + + desktopItems = [ + (makeDesktopItem { + name = "enigma"; + desktopName = "Enigma"; + exec = "enigma"; + terminal = false; + }) + ]; + + meta.mainProgram = "enigma"; +}) diff --git a/pkgs/koi.nix b/pkgs/koi.nix new file mode 100644 index 0000000..0a68c5a --- /dev/null +++ b/pkgs/koi.nix @@ -0,0 +1,28 @@ +{ + stdenv, + fetchFromGitHub, + cmake, + ninja, + wrapQtAppsHook, + qtbase, + qtwayland, + kcoreaddons, + kwidgetsaddons, + kconfig, +}: +stdenv.mkDerivation (finalAttrs: { + name = "koi"; + version = "0.3.1"; + + src = fetchFromGitHub { + owner = "baduhai"; + repo = "Koi"; + rev = finalAttrs.version; + hash = "sha256-dhpuKIY/Xi62hzJlnVCIOF0k6uoQ3zH129fLq/r+Kmg="; + }; + + sourceRoot = "source/src"; + + nativeBuildInputs = [cmake ninja wrapQtAppsHook]; + buildInputs = [qtbase qtwayland kcoreaddons kwidgetsaddons kconfig]; +}) diff --git a/pkgs/reposilite.nix b/pkgs/reposilite.nix new file mode 100644 index 0000000..ebb9195 --- /dev/null +++ b/pkgs/reposilite.nix @@ -0,0 +1,38 @@ +{ + lib, + stdenv, + fetchurl, + makeWrapper, + jre_headless, +}: +stdenv.mkDerivation (finalAttrs: { + name = "reposilite"; + version = "3.5.16"; + + src = fetchurl { + url = with finalAttrs; "https://maven.reposilite.com/releases/com/reposilite/reposilite/${version}/reposilite-${version}-all.jar"; + hash = "sha256-zketAvn0XgBRAS+Bb3KcUcpdydbQQruS+gZ5Bfrjiig="; + }; + + nativeBuildInputs = [makeWrapper]; + + dontUnpack = true; + + installPhase = with finalAttrs; '' + runHook preInstall + + mkdir -p $out/bin $out/share/${name} + cp ${src} $out/share/${name}/${name}.jar + makeWrapper ${jre_headless}/bin/java $out/bin/${name} --add-flags "-jar $out/share/${name}/${name}.jar" + + runHook postInstall + ''; + + meta = with lib; { + description = "Lightweight and easy-to-use repository management software dedicated for the Maven based artifacts in the JVM ecosystem"; + homepage = "https://reposilite.com/"; + license = licenses.asl20; + platforms = platforms.unix; + mainProgram = "reposilite"; + }; +}) diff --git a/pkgs/vineflower.nix b/pkgs/vineflower.nix new file mode 100644 index 0000000..a376c57 --- /dev/null +++ b/pkgs/vineflower.nix @@ -0,0 +1,31 @@ +{ + stdenv, + fetchurl, + makeWrapper, + jre_headless, +}: +stdenv.mkDerivation (finalAttrs: { + name = "vineflower"; + version = "1.10.1"; + + src = fetchurl { + url = with finalAttrs; "https://github.com/Vineflower/vineflower/releases/download/${version}/vineflower-${version}.jar"; + hash = "sha256-ubII5QeTtkZXprYpIGdSZhP1Sd50BfkkNiSwL0J25Ak="; + }; + + nativeBuildInputs = [makeWrapper]; + + dontUnpack = true; + + installPhase = with finalAttrs; '' + runHook preInstall + + mkdir -p $out/bin $out/share/${name} + cp ${src} $out/share/${name}/${name}.jar + makeWrapper ${jre_headless}/bin/java $out/bin/${name} --add-flags "-jar $out/share/${name}/${name}.jar" + + runHook postInstall + ''; + + meta.mainProgram = "vineflower"; +}) diff --git a/pkgs/wine-discord-ipc-bridge.nix b/pkgs/wine-discord-ipc-bridge.nix new file mode 100644 index 0000000..bd7b7ae --- /dev/null +++ b/pkgs/wine-discord-ipc-bridge.nix @@ -0,0 +1,26 @@ +{ + stdenv, + fetchFromGitHub, +}: +stdenv.mkDerivation { + name = "wine-discord-ipc-bridge"; + + src = fetchFromGitHub { + owner = "0e4ef622"; + repo = "wine-discord-ipc-bridge"; + rev = "f8198c9d52e708143301017a296f7557c4387127"; + hash = "sha256-tAknITFlG63+gI5cN9SfUIUZkbIq/MgOPoGIcvoNo4Q="; + }; + + postPatch = '' + patchShebangs winediscordipcbridge-steam.sh + ''; + + installPhase = '' + mkdir -p $out/bin + cp winediscordipcbridge.exe $out/bin + cp winediscordipcbridge-steam.sh $out/bin + ''; + + meta.platforms = ["i686-windows" "x86_64-linux"]; +}