Unverified Commit 97f445e8 authored by Atemu's avatar Atemu Committed by GitHub
Browse files

Merge pull request #245005 from Scrumplex/nixos-monado

nixos/monado: init
parents b5c95626 3f7e9bae
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -87,6 +87,8 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m

- [go-camo](https://github.com/cactus/go-camo), a secure image proxy server. Available as [services.go-camo](#opt-services.go-camo.enable).

- [Monado](https://monado.freedesktop.org/), an open source XR runtime. Available as [services.monado](#opt-services.monado.enable).

- [Clevis](https://github.com/latchset/clevis), a pluggable framework for automated decryption, used to unlock encrypted devices in initrd. Available as [boot.initrd.clevis.enable](#opt-boot.initrd.clevis.enable).

- [TuxClocker](https://github.com/Lurkki14/tuxclocker), a hardware control and monitoring program. Available as [programs.tuxclocker](#opt-programs.tuxclocker.enable).
+1 −0
Original line number Diff line number Diff line
@@ -548,6 +548,7 @@
  ./services/hardware/lcd.nix
  ./services/hardware/lirc.nix
  ./services/hardware/nvidia-container-toolkit-cdi-generator
  ./services/hardware/monado.nix
  ./services/hardware/nvidia-optimus.nix
  ./services/hardware/openrgb.nix
  ./services/hardware/pcscd.nix
+102 −0
Original line number Diff line number Diff line
{ config
, lib
, pkgs
, ...
}:
let
  inherit (lib) mkDefault mkEnableOption mkIf mkOption mkPackageOption types;

  cfg = config.services.monado;

in
{
  options.services.monado = {
    enable = mkEnableOption "Monado user service";

    package = mkPackageOption pkgs "monado" { };

    defaultRuntime = mkOption {
      type = types.bool;
      description = ''
        Whether to enable Monado as the default OpenXR runtime on the system.

        Note that applications can bypass this option by setting an active
        runtime in a writable XDG_CONFIG_DIRS location like `~/.config`.
      '';
      default = false;
      example = true;
    };

    highPriority = mkEnableOption "high priority capability for monado-service"
      // mkOption { default = true; };
  };

  config = mkIf cfg.enable {
    security.wrappers."monado-service" = mkIf cfg.highPriority {
      setuid = false;
      owner = "root";
      group = "root";
      # cap_sys_nice needed for asynchronous reprojection
      capabilities = "cap_sys_nice+eip";
      source = lib.getExe' cfg.package "monado-service";
    };

    services.udev.packages = with pkgs; [ xr-hardware ];

    systemd.user = {
      services.monado = {
        description = "Monado XR runtime service module";
        requires = [ "monado.socket" ];
        conflicts = [ "monado-dev.service" ];

        unitConfig.ConditionUser = "!root";

        environment = {
          # Default options
          # https://gitlab.freedesktop.org/monado/monado/-/blob/4548e1738591d0904f8db4df8ede652ece889a76/src/xrt/targets/service/monado.in.service#L12
          XRT_COMPOSITOR_LOG = mkDefault "debug";
          XRT_PRINT_OPTIONS = mkDefault "on";
          IPC_EXIT_ON_DISCONNECT = mkDefault "off";
        };

        serviceConfig = {
          ExecStart =
            if cfg.highPriority
            then "${config.security.wrapperDir}/monado-service"
            else lib.getExe' cfg.package "monado-service";
          Restart = "no";
        };

        restartTriggers = [ cfg.package ];
      };

      sockets.monado = {
        description = "Monado XR service module connection socket";
        conflicts = [ "monado-dev.service" ];

        unitConfig.ConditionUser = "!root";

        socketConfig = {
          ListenStream = "%t/monado_comp_ipc";
          RemoveOnStop = true;

          # If Monado crashes while starting up, we want to close incoming OpenXR connections
          FlushPending = true;
        };

        restartTriggers = [ cfg.package ];

        wantedBy = [ "sockets.target" ];
      };
    };

    environment.systemPackages = [ cfg.package ];
    environment.pathsToLink = [ "/share/openxr" ];

    environment.etc."xdg/openxr/1/active_runtime.json" = mkIf cfg.defaultRuntime {
      source = "${cfg.package}/share/openxr/1/openxr_monado.json";
    };
  };

  meta.maintainers = with lib.maintainers; [ Scrumplex ];
}
+1 −0
Original line number Diff line number Diff line
@@ -537,6 +537,7 @@ in {
  mobilizon = handleTest ./mobilizon.nix {};
  mod_perl = handleTest ./mod_perl.nix {};
  molly-brown = handleTest ./molly-brown.nix {};
  monado = handleTest ./monado.nix {};
  monica = handleTest ./web-apps/monica.nix {};
  mongodb = handleTest ./mongodb.nix {};
  moodle = handleTest ./moodle.nix {};

nixos/tests/monado.nix

0 → 100644
+39 −0
Original line number Diff line number Diff line
import ./make-test-python.nix ({ pkgs, ... }: {
  name = "monado";

  nodes.machine =
    { pkgs, ... }:

    {
      hardware.opengl.enable = true;
      users.users.alice = {
        isNormalUser = true;
        uid = 1000;
      };

      services.monado = {
        enable = true;
        defaultRuntime = true;
      };
      # Stop Monado from probing for any hardware
      systemd.user.services.monado.environment.SIMULATED_ENABLE = "1";

      environment.systemPackages = with pkgs; [ openxr-loader ];
    };

  testScript = { nodes, ... }:
    let
      userId = toString nodes.machine.users.users.alice.uid;
      runtimePath = "/run/user/${userId}";
    in
    ''
      machine.succeed("loginctl enable-linger alice")
      machine.wait_for_unit("user@${userId}.service")

      machine.wait_for_unit("monado.socket", "alice")
      machine.systemctl("start monado.service", "alice")
      machine.wait_for_unit("monado.service", "alice")

      machine.succeed("su -- alice -c env XDG_RUNTIME_DIR=${runtimePath} openxr_runtime_list")
    '';
})
Loading