diff --git a/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml index 908d1ab46e8f..8bbb8665219a 100644 --- a/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml +++ b/nixos/doc/manual/from_md/release-notes/rl-2211.section.xml @@ -43,8 +43,9 @@ - Please remove this line when you add the first item since - docbook requires the section to be non-empty + appvm, + Nix based app VMs. Available as + virtualisation.appvm. diff --git a/nixos/doc/manual/release-notes/rl-2211.section.md b/nixos/doc/manual/release-notes/rl-2211.section.md index 87fdf4e77f25..5dc8e958c896 100644 --- a/nixos/doc/manual/release-notes/rl-2211.section.md +++ b/nixos/doc/manual/release-notes/rl-2211.section.md @@ -23,7 +23,7 @@ In addition to numerous new and upgraded packages, this release has the followin ## New Services {#sec-release-22.11-new-services} -- Please remove this line when you add the first item since docbook requires the section to be non-empty +- [appvm](https://github.com/jollheef/appvm), Nix based app VMs. Available as [virtualisation.appvm](options.html#opt-virtualisation.appvm.enable). diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 5f01c6bcfdf7..f7357036d69d 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -1236,6 +1236,7 @@ ./tasks/powertop.nix ./testing/service-runner.nix ./virtualisation/anbox.nix + ./virtualisation/appvm.nix ./virtualisation/build-vm.nix ./virtualisation/container-config.nix ./virtualisation/containerd.nix diff --git a/nixos/modules/virtualisation/appvm.nix b/nixos/modules/virtualisation/appvm.nix new file mode 100644 index 000000000000..24315a85d0ed --- /dev/null +++ b/nixos/modules/virtualisation/appvm.nix @@ -0,0 +1,49 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.virtualisation.appvm; + +in { + + options = { + virtualisation.appvm = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + This enables AppVMs and related virtualisation settings. + ''; + }; + user = mkOption { + type = types.str; + description = '' + AppVM user login. Currenly only AppVMs are supported for a single user only. + ''; + }; + }; + + }; + + config = mkIf cfg.enable { + virtualisation.libvirtd = { + enable = true; + qemu.verbatimConfig = '' + namespaces = [] + user = "${cfg.user}" + group = "users" + remember_owner = 0 + ''; + }; + + users.users."${cfg.user}" = { + packages = [ pkgs.appvm ]; + extraGroups = [ "libvirtd" ]; + }; + + }; + +} + diff --git a/pkgs/applications/virtualization/appvm/0001-Remove-menu-bar.patch b/pkgs/applications/virtualization/appvm/0001-Remove-menu-bar.patch new file mode 100644 index 000000000000..5a15686353a3 --- /dev/null +++ b/pkgs/applications/virtualization/appvm/0001-Remove-menu-bar.patch @@ -0,0 +1,12 @@ +diff --git a/src/resources/ui/virt-viewer.ui b/src/resources/ui/virt-viewer.ui +index 430f879..68856fc 100644 +--- a/src/resources/ui/virt-viewer.ui ++++ b/src/resources/ui/virt-viewer.ui +@@ -137,7 +137,6 @@ + + + +- True + False + True + diff --git a/pkgs/applications/virtualization/appvm/0002-Do-not-grab-keyboard-mouse.patch b/pkgs/applications/virtualization/appvm/0002-Do-not-grab-keyboard-mouse.patch new file mode 100644 index 000000000000..012c37be6452 --- /dev/null +++ b/pkgs/applications/virtualization/appvm/0002-Do-not-grab-keyboard-mouse.patch @@ -0,0 +1,15 @@ +diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c +index 2265f02..1d60d81 100644 +--- a/src/virt-viewer-display-spice.c ++++ b/src/virt-viewer-display-spice.c +@@ -317,8 +317,8 @@ virt_viewer_display_spice_new(VirtViewerSessionSpice *session, + gtk_container_add(GTK_CONTAINER(self), GTK_WIDGET(self->display)); + gtk_widget_show(GTK_WIDGET(self->display)); + g_object_set(self->display, +- "grab-keyboard", TRUE, +- "grab-mouse", TRUE, ++ "grab-keyboard", FALSE, ++ "grab-mouse", FALSE, + "resize-guest", FALSE, + "scaling", TRUE, + NULL); diff --git a/pkgs/applications/virtualization/appvm/0003-Use-name-of-appvm-applications-as-a-title.patch b/pkgs/applications/virtualization/appvm/0003-Use-name-of-appvm-applications-as-a-title.patch new file mode 100644 index 000000000000..51a47bbbac6d --- /dev/null +++ b/pkgs/applications/virtualization/appvm/0003-Use-name-of-appvm-applications-as-a-title.patch @@ -0,0 +1,14 @@ +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index fe740ce..d45fd4f 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -1342,6 +1342,9 @@ virt_viewer_window_update_title(VirtViewerWindow *self) + grabhint, + g_get_application_name()); + } ++ } else if (g_str_has_prefix(self->subtitle, "appvm_")) { ++ /* Use name of the application as a title */ ++ title = g_strdup_printf(_("%s"), &self->subtitle[strlen("appvm_")]); + } else if (self->subtitle) { + /* translators: + * This is " - " diff --git a/pkgs/applications/virtualization/appvm/0004-Use-title-application-name-as-subtitle.patch b/pkgs/applications/virtualization/appvm/0004-Use-title-application-name-as-subtitle.patch new file mode 100644 index 000000000000..3c517867aac7 --- /dev/null +++ b/pkgs/applications/virtualization/appvm/0004-Use-title-application-name-as-subtitle.patch @@ -0,0 +1,12 @@ +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index b977b7b..36bce34 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -976,6 +976,7 @@ virt_viewer_app_set_window_subtitle(VirtViewerApp *app, + *d = '%'; + } else + subtitle = g_strdup_printf("%s (%s)", title, desc); ++ subtitle = g_strdup_printf("%s", title); + g_free(desc); + } + diff --git a/pkgs/applications/virtualization/appvm/default.nix b/pkgs/applications/virtualization/appvm/default.nix new file mode 100644 index 000000000000..27002bac405f --- /dev/null +++ b/pkgs/applications/virtualization/appvm/default.nix @@ -0,0 +1,48 @@ +{ lib +, buildGoModule +, fetchFromGitHub +, nix +, virt-viewer +, fetchpatch +, makeWrapper }: + +let + # Upstream patches fail with newer virt-viewer. These are own ports to the + # newest virt-viewer version, see: + # https://github.com/jollheef/appvm/issues/28 + virt-manager-without-menu = virt-viewer.overrideAttrs(oldAttrs: { + patches = oldAttrs.patches ++ [ + ./0001-Remove-menu-bar.patch + ./0002-Do-not-grab-keyboard-mouse.patch + ./0003-Use-name-of-appvm-applications-as-a-title.patch + ./0004-Use-title-application-name-as-subtitle.patch + ]; + }); +in +buildGoModule rec { + pname = "appvm"; + version = "unstable-2021-12-20"; + + src = fetchFromGitHub { + owner = "jollheef"; + repo = pname; + rev = "17f17be7846d872e7e26d5cb6759a52ea4113587"; + sha256 = "sha256-FL5olOy1KufULyqI2dJeS0OnKzC3LfPWxnia2i4f4yY="; + }; + + vendorSha256 = "sha256-8eU+Mf5dxL/bAMMShXvj8I1Kdd4ysBTWvgYIXwLStPI="; + + buildInputs = [ makeWrapper ]; + + postFixup = '' + wrapProgram $out/bin/appvm \ + --prefix PATH : "${lib.makeBinPath [ nix virt-manager-without-menu ]}" + ''; + + meta = with lib; { + description = "Nix-based app VMs"; + homepage = "https://code.dumpstack.io/tools/${pname}"; + maintainers = with maintainers; [ dump_stack cab404 onny ]; + license = licenses.gpl3; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index bb090dad3979..cdb1dc71df2c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -25095,6 +25095,8 @@ with pkgs; adobe-reader = pkgsi686Linux.callPackage ../applications/misc/adobe-reader { }; + appvm = callPackage ../applications/virtualization/appvm { }; + masterpdfeditor = libsForQt5.callPackage ../applications/misc/masterpdfeditor { }; masterpdfeditor4 = libsForQt5.callPackage ../applications/misc/masterpdfeditor4 { };