Eruption: How do you "install" config files and systemd services of a package?

Hello nix community,

I am very new to nixos, so please apologize if I ask basic questions. I am currently writing a package for eruption, which is an RGB LED driver for ROCCAT devices (keyboards, mice etc.). Below you can find the default.nix and eruption.nix:

default.nix

let
    # rustc version 1.78.0
    nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/archive/05bbf675397d5366259409139039af8077d695ce.tar.gz";
    # nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-24.11.tar.gz";
    pkgs = import nixpkgs { config = {}; overlays = []; };
in
{
    eruption = pkgs.callPackage ./eruption.nix {};
}

eruption.nix

{ lib, rustPlatform, fetchFromGitHub, libevdev, hidapi, systemd, dbus, lua54Packages, gtksourceview4, gtk3, protobuf, xorg, libpulseaudio, pkg-config, libusb1, libxkbcommon, tree }:
rustPlatform.buildRustPackage rec {
    pname = "eruption";
    version = "v0.3.6";

    src = fetchFromGitHub {
        owner = "eruption-project";
        repo = "eruption";
        rev = "4884ace33ed560ba058e5fa2824b4f3852f0ca90";
        sha256 = "sha256-Ty5TWW+o2hQiAko20sqZEYKS2LOqkFmyOxqWVbRP7Kc=";
    };

    useFetchCargoVendor = true;
    cargoLock = {
        lockFile = "${src}/Cargo.lock";
        outputHashes = {
            "hidapi-2.5.0" = "sha256-3hivDzxdZ2w4++QkyTS1DMXTkUHi9BfK9vc2oeZslVE=";
            "rust-pulsectl-0.2.7" = "sha256-jkZJiTbCkPCe20d08ExY/VmdFOaV3GxMxMVOnXl2HlM=";
        };
    };

    nativeBuildInputs = [ pkg-config protobuf tree ];
    buildInputs = [ libevdev hidapi systemd dbus lua54Packages.lua lua54Packages.luasocket gtksourceview4 gtk3 xorg.libX11 xorg.libXrandr libpulseaudio libusb1 libxkbcommon];

    postInstall = ''
	mkdir -p "$out/etc/eruption"
	mkdir -p "$out/etc/profile.d"
	mkdir -p "$out/usr/share/doc/eruption"
	mkdir -p "$out/usr/share/eruption/scripts/lib/macros"
	mkdir -p "$out/usr/share/eruption/scripts/lib/keymaps"
	mkdir -p "$out/usr/share/eruption/scripts/lib/themes"
	mkdir -p "$out/usr/share/eruption/scripts/lib/hwdevices/keyboards"
	mkdir -p "$out/usr/share/eruption/scripts/lib/hwdevices/mice"
	mkdir -p "$out/usr/share/eruption/scripts/examples"
	mkdir -p "$out/usr/share/applications"
	mkdir -p "$out/usr/share/icons/hicolor/64x64/apps"
	mkdir -p "$out/usr/share/eruption-gui-gtk3/schemas"
	mkdir -p "$out/var/lib/eruption/profiles"
	mkdir -p "$out/lib/systemd/system"
	mkdir -p "$out/lib/systemd/system-preset"
	mkdir -p "$out/lib/systemd/user"
	mkdir -p "$out/lib/systemd/user-preset"
	mkdir -p "$out/lib/systemd/system-sleep"
	mkdir -p "$out/lib/udev/rules.d/"
	mkdir -p "$out/usr/share/dbus-1/system.d"
	mkdir -p "$out/usr/share/dbus-1/session.d"
	mkdir -p "$out/usr/share/polkit-1/actions"
	mkdir -p "$out/usr/share/man/man8"
	mkdir -p "$out/usr/share/man/man5"
	mkdir -p "$out/usr/share/man/man1"
	mkdir -p "$out/usr/share/bash-completion/completions"
	mkdir -p "$out/usr/share/fish/completions"
	mkdir -p "$out/usr/share/zsh/site-functions"
	mkdir -p "$out/usr/share/eruption/i18n"
	mkdir -p "$out/usr/share/eruption/sfx"
        mkdir -p "$out/usr/bin"

	cp "support/assets/eruption-gui-gtk3/eruption-gui-gtk3.desktop" "$out/usr/share/applications/"
	cp "support/assets/eruption-gui-gtk3/eruption-gui.png" "$out/usr/share/icons/hicolor/64x64/apps/"
	cp "eruption-gui-gtk3/schemas/gschemas.compiled" "$out/usr/share/eruption-gui-gtk3/schemas/"
	cp "support/systemd/eruption-suspend.sh" "$out/lib/systemd/system-sleep/eruption"
	cp "support/config/eruption.conf" "$out/etc/eruption/"
	cp "support/config/fx-proxy.conf" "$out/etc/eruption/"
	cp "support/config/audio-proxy.conf" "$out/etc/eruption/"
	cp "support/config/process-monitor.conf" "$out/etc/eruption/"
	cp "support/profile.d/eruption.sh" "$out/etc/profile.d/eruption.sh"
	cp "support/systemd/eruption.service" "$out/lib/systemd/system/"
	cp "support/systemd/eruption.preset" "$out/lib/systemd/system-preset/50-eruption.preset"
	cp "support/systemd/eruption-fx-proxy.service" "$out/lib/systemd/user/"
	cp "support/systemd/eruption-fx-proxy.preset" "$out/lib/systemd/user-preset/50-eruption-fx-proxy.preset"
	cp "support/systemd/eruption-audio-proxy.service" "$out/lib/systemd/user/"
	cp "support/systemd/eruption-audio-proxy.preset" "$out/lib/systemd/user-preset/50-eruption-audio-proxy.preset"
	cp "support/systemd/eruption-process-monitor.service" "$out/lib/systemd/user/"
	cp "support/systemd/eruption-process-monitor.preset" "$out/lib/systemd/user-preset/50-eruption-process-monitor.preset"
	cp "support/systemd/eruption-hotplug-helper.service" "$out/lib/systemd/system/"
	cp "support/systemd/eruption-hotplug-helper.preset" "$out/lib/systemd/system-preset/50-eruption-hotplug-helper.preset"
	cp "support/udev/99-eruption.rules" "$out/lib/udev/rules.d/"
	cp "support/dbus/org.eruption.control.conf" "$out/usr/share/dbus-1/system.d/"
	cp "support/dbus/org.eruption.process_monitor.conf" "$out/usr/share/dbus-1/session.d/"
	cp "support/dbus/org.eruption.fx_proxy.conf" "$out/usr/share/dbus-1/session.d/"
	cp "support/policykit/org.eruption.policy" "$out/usr/share/polkit-1/actions/"
	cp "support/man/eruption.8" "$out/usr/share/man/man8/"
	cp "support/man/eruption-cmd.8" "$out/usr/share/man/man8/"
	cp "support/man/eruption.conf.5" "$out/usr/share/man/man5/"
	cp "support/man/process-monitor.conf.5" "$out/usr/share/man/man5/"
	cp "support/man/eruptionctl.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-hwutil.8" "$out/usr/share/man/man8/"
	cp "support/man/eruption-macro.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-keymap.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-netfx.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-fx-proxy.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-audio-proxy.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-process-monitor.1" "$out/usr/share/man/man1/"
	cp "support/shell/completions/en_US/eruption-cmd.bash-completion" "$out/usr/share/bash-completion/completions/eruption-cmd"
	cp "support/shell/completions/en_US/eruption-hwutil.bash-completion" "$out/usr/share/bash-completion/completions/eruption-hwutil"
	cp "support/shell/completions/en_US/eruption-debug-tool.bash-completion" "$out/usr/share/bash-completion/completions/eruption-debug-tool"
	cp "support/shell/completions/en_US/eruption-macro.bash-completion" "$out/usr/share/bash-completion/completions/eruption-macro"
	cp "support/shell/completions/en_US/eruption-keymap.bash-completion" "$out/usr/share/bash-completion/completions/eruption-keymap"
	cp "support/shell/completions/en_US/eruption-netfx.bash-completion" "$out/usr/share/bash-completion/completions/eruption-netfx"
	cp "support/shell/completions/en_US/eruption-fx-proxy.bash-completion" "$out/usr/share/bash-completion/completions/eruption-fx-proxy"
	cp "support/shell/completions/en_US/eruption-audio-proxy.bash-completion" "$out/usr/share/bash-completion/completions/eruption-audio-proxy"
	cp "support/shell/completions/en_US/eruption-process-monitor.bash-completion" "$out/usr/share/bash-completion/completions/eruption-process-monitor"
	cp "support/shell/completions/en_US/eruptionctl.bash-completion" "$out/usr/share/bash-completion/completions/eruptionctl"
	cp "support/shell/completions/en_US/eruption-cmd.fish-completion" "$out/usr/share/fish/completions/eruption-cmd.fish"
	cp "support/shell/completions/en_US/eruption-hwutil.fish-completion" "$out/usr/share/fish/completions/eruption-hwutil.fish"
	cp "support/shell/completions/en_US/eruption-debug-tool.fish-completion" "$out/usr/share/fish/completions/eruption-debug-tool.fish"
	cp "support/shell/completions/en_US/eruption-macro.fish-completion" "$out/usr/share/fish/completions/eruption-macro.fish"
	cp "support/shell/completions/en_US/eruption-keymap.fish-completion" "$out/usr/share/fish/completions/eruption-keymap.fish"
	cp "support/shell/completions/en_US/eruption-netfx.fish-completion" "$out/usr/share/fish/completions/eruption-netfx.fish"
	cp "support/shell/completions/en_US/eruption-fx-proxy.fish-completion" "$out/usr/share/fish/completions/eruption-fx-proxy.fish"
	cp "support/shell/completions/en_US/eruption-audio-proxy.fish-completion" "$out/usr/share/fish/completions/eruption-audio-proxy.fish"
	cp "support/shell/completions/en_US/eruption-process-monitor.fish-completion" "$out/usr/share/fish/completions/eruption-process-monitor.fish"
	cp "support/shell/completions/en_US/eruptionctl.fish-completion" "$out/usr/share/fish/completions/eruptionctl.fish"
	cp "support/shell/completions/en_US/eruption-cmd.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-cmd"
	cp "support/shell/completions/en_US/eruption-hwutil.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-hwutil"
	cp "support/shell/completions/en_US/eruption-debug-tool.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-debug-tool"
	cp "support/shell/completions/en_US/eruption-macro.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-macro"
	cp "support/shell/completions/en_US/eruption-keymap.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-keymap"
	cp "support/shell/completions/en_US/eruption-netfx.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-netfx"
	cp "support/shell/completions/en_US/eruption-fx-proxy.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-fx-proxy"
	cp "support/shell/completions/en_US/eruption-audio-proxy.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-audio-proxy"
	cp "support/shell/completions/en_US/eruption-process-monitor.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-process-monitor"
	cp "support/shell/completions/en_US/eruptionctl.zsh-completion" "$out/usr/share/zsh/site-functions/_eruptionctl"
	cp "support/sfx/typewriter1.wav" "$out/usr/share/eruption/sfx/"
	cp "support/sfx/phaser1.wav" "$out/usr/share/eruption/sfx/"
	cp "support/sfx/phaser2.wav" "$out/usr/share/eruption/sfx/"

	chmod 0755 $out/lib/systemd/system-sleep/eruption

	ln -fs "phaser1.wav" "$out/usr/share/eruption/sfx/key-down.wav"
	ln -fs "phaser2.wav" "$out/usr/share/eruption/sfx/key-up.wav"

	cp -r eruption/src/scripts/* $out/usr/share/eruption/scripts/
	cp -r support/profiles/* $out/var/lib/eruption/profiles/

        ln -fs "../../bin/eruption" "$out/usr/bin/eruption"
        ln -fs "../../bin/eruption-fx-proxy" "$out/usr/bin/eruption-fx-proxy"
        ln -fs "../../bin/eruption-audio-proxy" "$out/usr/bin/eruption-audio-proxy"
        ln -fs "../../bin/eruption-process-monitor" "$out/usr/bin/eruption-process-monitor"
	'';
}

I then build it using nix-build -A eruption while in the directory of default.nix.

As you can see eruption contains a lot of additional files and systemd services. But if I “install” the package into my configuration.nix like this:

environment.systemPackages = with pkgs;
let eruption_pkg = import /path/to/default.nix in [
...
eruption_pkg.eruption
...
]

This works and the eruption binary is available and can be executed (also the systemd services are accessable via systemctl). It even has access to my keyboard and turns of the default rainbow wave. But none of the config files have been “installed”. eruption also needs to write into /var/lib/eruption which seems to fail.

What is the correct way to “install” these config files? I had a look at the openrgb service. Do I need to define these systemd services differently like there? Do I maybe need to patch eruption to make it compatible with nixos?

I am currently stuck. Any help would be appreciated.

I found systemd.services and systemd.user.services. I will have a look at these.

If you got this working, I would be interested in seeing the final product. It seems the eruption profile switcher is in nixpkgs, but not eruption itself?

1 Like

Yes I got it working. I was working on contributing to nixpkgs and make eruption a module. You can have a look at this on my fork: GitHub - PucklaJ/nixpkgs at eruption-module

If you use the eruption-module branch you can just enable eruption by setting services.hardware.eruption.enable to true. The only problem is just that you can’t really edit profiles, but it does run and you can switch between the preinstalled profiles.

I made some parts configurable. Just look for eruption in man 5 configuration.nix