From 85c15c4ccbd9f3b2ef1841cb2cfb476d0650bfed Mon Sep 17 00:00:00 2001 From: Bernardo Meurer Date: Mon, 28 Sep 2020 12:13:00 -0700 Subject: [PATCH 1/2] klipper: init at 0.8.0 --- pkgs/servers/klipper/default.nix | 49 ++++++++++++++++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 ++ 2 files changed, 51 insertions(+) create mode 100644 pkgs/servers/klipper/default.nix diff --git a/pkgs/servers/klipper/default.nix b/pkgs/servers/klipper/default.nix new file mode 100644 index 000000000000..0b4fa745460e --- /dev/null +++ b/pkgs/servers/klipper/default.nix @@ -0,0 +1,49 @@ +{ stdenv +, lib +, fetchFromGitHub +, python2 +}: +stdenv.mkDerivation rec { + name = "klipper"; + version = "0.8.0"; + + src = fetchFromGitHub { + owner = "KevinOConnor"; + repo = "klipper"; + rev = "v${version}"; + sha256 = "1ijy2ij9yii5hms10914i614wkjpsy0k4rbgnm6l594gphivdfm7"; + }; + + sourceRoot = "source/klippy"; + + # there is currently an attempt at moving it to Python 3, but it will remain + # Python 2 for the foreseeable future. + # c.f. https://github.com/KevinOConnor/klipper/pull/3278 + # NB: This is needed for the postBuild step + nativeBuildInputs = [ (python2.withPackages ( p: with p; [ cffi ] )) ]; + + buildInputs = [ (python2.withPackages (p: with p; [ cffi pyserial greenlet jinja2 ])) ]; + + # we need to run this to prebuild the chelper. + postBuild = "python2 ./chelper/__init__.py"; + + # NB: We don't move the main entry point into `/bin`, or even symlink it, + # because it uses relative paths to find necessary modules. We could wrap but + # this is used 99% of the time as a service, so it's not worth the effort. + installPhase = '' + runHook preInstall + mkdir -p $out/lib/klipper + cp -r ./* $out/lib/klipper + + chmod 755 $out/lib/klipper/klippy.py + runHook postInstall + ''; + + meta = with lib; { + description = "The Klipper 3D printer firmware"; + homepage = "https://github.com/KevinOConnor/klipper"; + maintainers = with maintainers; [ lovesegfault ]; + platforms = platforms.linux; + license = licenses.gpl3Only; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 57ee577e83f6..f03a4282bf3d 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -2164,6 +2164,8 @@ in kramdown-rfc2629 = callPackage ../tools/text/kramdown-rfc2629 { }; + klipper = callPackage ../servers/klipper { }; + lcdproc = callPackage ../servers/monitoring/lcdproc { }; languagetool = callPackage ../tools/text/languagetool { }; From 97eadef0c38c0b45d3cfa2287bc270000daed667 Mon Sep 17 00:00:00 2001 From: Bernardo Meurer Date: Mon, 28 Sep 2020 12:13:09 -0700 Subject: [PATCH 2/2] nixos/klipper: init --- nixos/modules/module-list.nix | 1 + nixos/modules/services/misc/klipper.nix | 59 +++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 nixos/modules/services/misc/klipper.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 39f28773eab0..82cc956ed24e 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -466,6 +466,7 @@ ./services/misc/irkerd.nix ./services/misc/jackett.nix ./services/misc/jellyfin.nix + ./services/misc/klipper.nix ./services/misc/logkeys.nix ./services/misc/leaps.nix ./services/misc/lidarr.nix diff --git a/nixos/modules/services/misc/klipper.nix b/nixos/modules/services/misc/klipper.nix new file mode 100644 index 000000000000..2f04c011a650 --- /dev/null +++ b/nixos/modules/services/misc/klipper.nix @@ -0,0 +1,59 @@ +{ config, lib, pkgs, ... }: +with lib; +let + cfg = config.services.klipper; + package = pkgs.klipper; + format = pkgs.formats.ini { mkKeyValue = generators.mkKeyValueDefault {} ":"; }; +in +{ + ##### interface + options = { + services.klipper = { + enable = mkEnableOption "Klipper, the 3D printer firmware"; + + octoprintIntegration = mkOption { + type = types.bool; + default = false; + description = "Allows Octoprint to control Klipper."; + }; + + settings = mkOption { + type = format.type; + default = { }; + description = '' + Configuration for Klipper. See the documentation + for supported values. + ''; + }; + }; + }; + + ##### implementation + config = mkIf cfg.enable { + assertions = [{ + assertion = cfg.octoprintIntegration -> config.services.octoprint.enable; + message = "Option klipper.octoprintIntegration requires Octoprint to be enabled on this system. Please enable services.octoprint to use it."; + }]; + + environment.etc."klipper.cfg".source = format.generate "klipper.cfg" cfg.settings; + + systemd.services.klipper = { + description = "Klipper 3D Printer Firmware"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + serviceConfig = { + ExecStart = "${package}/lib/klipper/klippy.py --input-tty=/run/klipper/tty /etc/klipper.cfg"; + RuntimeDirectory = "klipper"; + SupplementaryGroups = [ "dialout" ]; + WorkingDirectory = "${package}/lib"; + } // (if cfg.octoprintIntegration then { + Group = config.services.octoprint.group; + User = config.services.octoprint.user; + } else { + DynamicUser = true; + User = "klipper"; + }); + }; + }; +}