diff --git a/nixos/modules/virtualisation/vmware-guest.nix b/nixos/modules/virtualisation/vmware-guest.nix index c80181f287b3..5379a481be5b 100644 --- a/nixos/modules/virtualisation/vmware-guest.nix +++ b/nixos/modules/virtualisation/vmware-guest.nix @@ -1,50 +1,62 @@ { config, lib, pkgs, ... }: let + inherit (lib) getExe' literalExpression mkEnableOption mkIf mkOption mkRenamedOptionModule optionals optionalString types; cfg = config.virtualisation.vmware.guest; - open-vm-tools = if cfg.headless then pkgs.open-vm-tools-headless else pkgs.open-vm-tools; xf86inputvmmouse = pkgs.xorg.xf86inputvmmouse; in { imports = [ - (lib.mkRenamedOptionModule [ "services" "vmwareGuest" ] [ "virtualisation" "vmware" "guest" ]) + (mkRenamedOptionModule [ "services" "vmwareGuest" ] [ "virtualisation" "vmware" "guest" ]) ]; + meta = { + maintainers = [ lib.maintainers.kjeremy ]; + }; + options.virtualisation.vmware.guest = { - enable = lib.mkEnableOption "VMWare Guest Support"; - headless = lib.mkOption { - type = lib.types.bool; + enable = mkEnableOption "VMWare Guest Support"; + headless = mkOption { + type = types.bool; default = !config.services.xserver.enable; - defaultText = "!config.services.xserver.enable"; + defaultText = literalExpression "!config.services.xserver.enable"; description = "Whether to disable X11-related features."; }; + + package = mkOption { + type = types.package; + default = if cfg.headless then pkgs.open-vm-tools-headless else pkgs.open-vm-tools; + defaultText = literalExpression "if config.virtualisation.vmware.headless then pkgs.open-vm-tools-headless else pkgs.open-vm-tools;"; + example = literalExpression "pkgs.open-vm-tools"; + description = "Package providing open-vm-tools."; + }; }; - config = lib.mkIf cfg.enable { + config = mkIf cfg.enable { assertions = [ { assertion = pkgs.stdenv.hostPlatform.isx86 || pkgs.stdenv.hostPlatform.isAarch64; message = "VMWare guest is not currently supported on ${pkgs.stdenv.hostPlatform.system}"; } ]; boot.initrd.availableKernelModules = [ "mptspi" ]; - boot.initrd.kernelModules = lib.optionals pkgs.stdenv.hostPlatform.isx86 [ "vmw_pvscsi" ]; + boot.initrd.kernelModules = optionals pkgs.stdenv.hostPlatform.isx86 [ "vmw_pvscsi" ]; - environment.systemPackages = [ open-vm-tools ]; + environment.systemPackages = [ cfg.package ]; systemd.services.vmware = { description = "VMWare Guest Service"; wantedBy = [ "multi-user.target" ]; after = [ "display-manager.service" ]; unitConfig.ConditionVirtualization = "vmware"; - serviceConfig.ExecStart = "${open-vm-tools}/bin/vmtoolsd"; + serviceConfig.ExecStart = getExe' cfg.package "vmtoolsd"; }; # Mount the vmblock for drag-and-drop and copy-and-paste. - systemd.mounts = lib.mkIf (!cfg.headless) [ + systemd.mounts = mkIf (!cfg.headless) [ { description = "VMware vmblock fuse mount"; documentation = [ "https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/vmblock-fuse/design.txt" ]; unitConfig.ConditionVirtualization = "vmware"; - what = "${open-vm-tools}/bin/vmware-vmblock-fuse"; + what = getExe' cfg.package "vmware-vmblock-fuse"; where = "/run/vmblock-fuse"; type = "fuse"; options = "subtype=vmware-vmblock,default_permissions,allow_other"; @@ -52,19 +64,19 @@ in } ]; - security.wrappers.vmware-user-suid-wrapper = lib.mkIf (!cfg.headless) { + security.wrappers.vmware-user-suid-wrapper = mkIf (!cfg.headless) { setuid = true; owner = "root"; group = "root"; - source = "${open-vm-tools}/bin/vmware-user-suid-wrapper"; + source = getExe' cfg.package "vmware-user-suid-wrapper"; }; - environment.etc.vmware-tools.source = "${open-vm-tools}/etc/vmware-tools/*"; + environment.etc.vmware-tools.source = "${cfg.package}/etc/vmware-tools/*"; - services.xserver = lib.mkIf (!cfg.headless) { - modules = lib.optionals pkgs.stdenv.hostPlatform.isx86 [ xf86inputvmmouse ]; + services.xserver = mkIf (!cfg.headless) { + modules = optionals pkgs.stdenv.hostPlatform.isx86 [ xf86inputvmmouse ]; - config = lib.optionalString (pkgs.stdenv.hostPlatform.isx86) '' + config = optionalString (pkgs.stdenv.hostPlatform.isx86) '' Section "InputClass" Identifier "VMMouse" MatchDevicePath "/dev/input/event*" @@ -74,10 +86,10 @@ in ''; displayManager.sessionCommands = '' - ${open-vm-tools}/bin/vmware-user-suid-wrapper + ${getExe' cfg.package "vmware-user-suid-wrapper"} ''; }; - services.udev.packages = [ open-vm-tools ]; + services.udev.packages = [ cfg.package ]; }; }