Merge pull request #165386 from zhaofengli/moonraker-2022-03-10

moonraker: unstable-2021-12-05 -> unstable-2022-03-10

authored by Bernardo Meurer and committed by GitHub 25d1efa9 3bcfdb0e

+138 -6
+40
nixos/modules/services/misc/moonraker.nix
··· 79 79 for supported values. 80 80 ''; 81 81 }; 82 + 83 + allowSystemControl = mkOption { 84 + type = types.bool; 85 + default = false; 86 + description = '' 87 + Whether to allow Moonraker to perform system-level operations. 88 + 89 + Moonraker exposes APIs to perform system-level operations, such as 90 + reboot, shutdown, and management of systemd units. See the 91 + <link xlink:href="https://moonraker.readthedocs.io/en/latest/web_api/#machine-commands">documentation</link> 92 + for details on what clients are able to do. 93 + ''; 94 + }; 82 95 }; 83 96 }; 84 97 85 98 config = mkIf cfg.enable { 86 99 warnings = optional (cfg.settings ? update_manager) 87 100 ''Enabling update_manager is not supported on NixOS and will lead to non-removable warnings in some clients.''; 101 + 102 + assertions = [ 103 + { 104 + assertion = cfg.allowSystemControl -> config.security.polkit.enable; 105 + message = "services.moonraker.allowSystemControl requires polkit to be enabled (security.polkit.enable)."; 106 + } 107 + ]; 88 108 89 109 users.users = optionalAttrs (cfg.user == "moonraker") { 90 110 moonraker = { ··· 128 148 exec ${pkg}/bin/moonraker -c ${cfg.configDir}/moonraker-temp.cfg 129 149 ''; 130 150 151 + # Needs `ip` command 152 + path = [ pkgs.iproute2 ]; 153 + 131 154 serviceConfig = { 132 155 WorkingDirectory = cfg.stateDir; 133 156 Group = cfg.group; 134 157 User = cfg.user; 135 158 }; 136 159 }; 160 + 161 + security.polkit.extraConfig = lib.optionalString cfg.allowSystemControl '' 162 + // nixos/moonraker: Allow Moonraker to perform system-level operations 163 + // 164 + // This was enabled via services.moonraker.allowSystemControl. 165 + polkit.addRule(function(action, subject) { 166 + if ((action.id == "org.freedesktop.systemd1.manage-units" || 167 + action.id == "org.freedesktop.login1.power-off" || 168 + action.id == "org.freedesktop.login1.power-off-multiple-sessions" || 169 + action.id == "org.freedesktop.login1.reboot" || 170 + action.id == "org.freedesktop.login1.reboot-multiple-sessions" || 171 + action.id.startsWith("org.freedesktop.packagekit.")) && 172 + subject.user == "${cfg.user}") { 173 + return polkit.Result.YES; 174 + } 175 + }); 176 + ''; 137 177 }; 138 178 }
+1
nixos/tests/all-tests.nix
··· 308 308 molly-brown = handleTest ./molly-brown.nix {}; 309 309 mongodb = handleTest ./mongodb.nix {}; 310 310 moodle = handleTest ./moodle.nix {}; 311 + moonraker = handleTest ./moonraker.nix {}; 311 312 morty = handleTest ./morty.nix {}; 312 313 mosquitto = handleTest ./mosquitto.nix {}; 313 314 moosefs = handleTest ./moosefs.nix {};
+45
nixos/tests/moonraker.nix
··· 1 + import ./make-test-python.nix ({ pkgs, ...} : { 2 + name = "moonraker"; 3 + meta = with pkgs.lib.maintainers; { 4 + maintainers = [ zhaofengli ]; 5 + }; 6 + 7 + nodes = { 8 + printer = { config, pkgs, ... }: { 9 + security.polkit.enable = true; 10 + 11 + services.moonraker = { 12 + enable = true; 13 + allowSystemControl = true; 14 + 15 + settings = { 16 + authorization = { 17 + trusted_clients = [ "127.0.0.0/8" "::1/128" ]; 18 + }; 19 + }; 20 + }; 21 + 22 + services.klipper = { 23 + enable = true; 24 + 25 + user = "moonraker"; 26 + group = "moonraker"; 27 + 28 + # No mcu configured so won't even enter `ready` state 29 + settings = {}; 30 + }; 31 + }; 32 + }; 33 + 34 + testScript = '' 35 + printer.start() 36 + 37 + printer.wait_for_unit("klipper.service") 38 + printer.wait_for_unit("moonraker.service") 39 + printer.wait_until_succeeds("curl http://localhost:7125/printer/info | grep -v 'Not Found' >&2", timeout=30) 40 + 41 + with subtest("Check that we can perform system-level operations"): 42 + printer.succeed("curl -X POST http://localhost:7125/machine/services/stop?service=klipper | grep ok >&2") 43 + printer.wait_until_succeeds("systemctl --no-pager show klipper.service | grep ActiveState=inactive", timeout=10) 44 + ''; 45 + })
+31
pkgs/development/python-modules/preprocess-cancellation/default.nix
··· 1 + { lib, fetchFromGitHub, buildPythonPackage, pythonOlder, poetry-core 2 + , pytestCheckHook, pytest-cov 3 + , shapely }: 4 + 5 + buildPythonPackage rec { 6 + pname = "preprocess-cancellation"; 7 + version = "0.2.0"; 8 + disabled = pythonOlder "3.6"; # >= 3.6 9 + format = "pyproject"; 10 + 11 + # No tests in PyPI 12 + src = fetchFromGitHub { 13 + owner = "kageurufu"; 14 + repo = "cancelobject-preprocessor"; 15 + rev = version; 16 + hash = "sha256-mn3/etXA5dkL+IsyxwD4/XjU/t4/roYFVyqQxlLOoOI="; 17 + }; 18 + 19 + nativeBuildInputs = [ poetry-core ]; 20 + 21 + propagatedBuildInputs = [ shapely ]; 22 + 23 + checkInputs = [ pytestCheckHook pytest-cov ]; 24 + 25 + meta = with lib; { 26 + description = "Klipper GCode Preprocessor for Object Cancellation"; 27 + homepage = "https://github.com/kageurufu/cancelobject-preprocessor"; 28 + license = licenses.gpl3Only; 29 + maintainers = with maintainers; [ zhaofengli ]; 30 + }; 31 + }
+5
pkgs/servers/klipper/default.nix
··· 36 36 mkdir -p $out/lib/klipper 37 37 cp -r ./* $out/lib/klipper 38 38 39 + # Moonraker expects `config_examples` and `docs` to be available 40 + # under `klipper_path` 41 + cp -r $src/docs $out/lib/docs 42 + cp -r $src/config $out/lib/config 43 + 39 44 chmod 755 $out/lib/klipper/klippy.py 40 45 runHook postInstall 41 46 '';
+14 -6
pkgs/servers/moonraker/default.nix
··· 1 - { lib, stdenvNoCC, fetchFromGitHub, python3, makeWrapper, unstableGitUpdater }: 1 + { lib, stdenvNoCC, fetchFromGitHub, python3, makeWrapper, unstableGitUpdater, nixosTests }: 2 2 3 3 let 4 4 pythonEnv = python3.withPackages (packages: with packages; [ 5 5 tornado 6 - pyserial 6 + pyserial-asyncio 7 7 pillow 8 8 lmdb 9 9 streaming-form-data ··· 12 12 libnacl 13 13 paho-mqtt 14 14 pycurl 15 + zeroconf 16 + preprocess-cancellation 17 + jinja2 18 + dbus-next 19 + apprise 15 20 ]); 16 21 in stdenvNoCC.mkDerivation rec { 17 22 pname = "moonraker"; 18 - version = "unstable-2021-12-05"; 23 + version = "unstable-2022-03-10"; 19 24 20 25 src = fetchFromGitHub { 21 26 owner = "Arksine"; 22 27 repo = "moonraker"; 23 - rev = "ac73036857cc1ca83df072dd94bf28eb9d0ed8b0"; 24 - sha256 = "Oqjt0z4grt+hdQ4t7KQSwkkCeRGoFFedJsTpMHwMm34="; 28 + rev = "ee312ee9c6597c8d077d7c3208ccea4e696c97ca"; 29 + sha256 = "l0VOQIfKgZ/Je4z+SKhWMgYzxye8WKs9W1GkNs7kABo="; 25 30 }; 26 31 27 32 nativeBuildInputs = [ makeWrapper ]; ··· 34 39 --add-flags "$out/lib/moonraker/moonraker.py" 35 40 ''; 36 41 37 - passthru.updateScript = unstableGitUpdater { url = meta.homepage; }; 42 + passthru = { 43 + updateScript = unstableGitUpdater { url = meta.homepage; }; 44 + tests.moonraker = nixosTests.moonraker; 45 + }; 38 46 39 47 meta = with lib; { 40 48 description = "API web server for Klipper";
+2
pkgs/top-level/python-packages.nix
··· 6466 6466 6467 6467 premailer = callPackage ../development/python-modules/premailer { }; 6468 6468 6469 + preprocess-cancellation = callPackage ../development/python-modules/preprocess-cancellation { }; 6470 + 6469 6471 preshed = callPackage ../development/python-modules/preshed { }; 6470 6472 6471 6473 pretend = callPackage ../development/python-modules/pretend { };