forked from clan/clan-core
Merge pull request 'add wayland-proxy-virtwl module' (#646) from Mic92-wayland-update into main
This commit is contained in:
commit
a7d48fefb0
@ -19,6 +19,7 @@
|
|||||||
meshnamed = import ./meshnamed nixosTestArgs;
|
meshnamed = import ./meshnamed nixosTestArgs;
|
||||||
borgbackup = import ./borgbackup nixosTestArgs;
|
borgbackup = import ./borgbackup nixosTestArgs;
|
||||||
syncthing = import ./syncthing nixosTestArgs;
|
syncthing = import ./syncthing nixosTestArgs;
|
||||||
|
wayland-proxy-virtwl = import ./wayland-proxy-virtwl nixosTestArgs;
|
||||||
};
|
};
|
||||||
schemaTests = pkgs.callPackages ./schemas.nix {
|
schemaTests = pkgs.callPackages ./schemas.nix {
|
||||||
inherit self;
|
inherit self;
|
||||||
|
29
checks/wayland-proxy-virtwl/default.nix
Normal file
29
checks/wayland-proxy-virtwl/default.nix
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import ../lib/test-base.nix ({ config, pkgs, lib, ... }: {
|
||||||
|
name = "wayland-proxy-virtwl";
|
||||||
|
|
||||||
|
nodes.machine = { self, ... }: {
|
||||||
|
imports = [
|
||||||
|
self.nixosModules.clanCore
|
||||||
|
{
|
||||||
|
clanCore.machineName = "machine";
|
||||||
|
clanCore.clanDir = ./.;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
services.wayland-proxy-virtwl.enable = true;
|
||||||
|
|
||||||
|
virtualisation.qemu.options = [
|
||||||
|
"-vga none -device virtio-gpu-rutabaga,cross-domain=on,hostmem=4G,wsi=headless"
|
||||||
|
];
|
||||||
|
virtualisation.qemu.package = lib.mkForce self.packages.${pkgs.hostPlatform.system}.qemu-wayland;
|
||||||
|
};
|
||||||
|
# FIXME: currently we still see this error in the build sandbox,
|
||||||
|
# but it gives us some smoke test
|
||||||
|
# vm-test-run-wayland-proxy-virtwl> machine # qemu-kvm: The errno is ENOENT: No such file or directory
|
||||||
|
# vm-test-run-wayland-proxy-virtwl> machine # qemu-kvm: CHECK failed in rutabaga_cmd_submit_3d() ../hw/display/virtio-gpu-rutabaga.c:341
|
||||||
|
# vm-test-run-wayland-proxy-virtwl> machine # qemu-kvm: virtio_gpu_rutabaga_process_cmd: ctrl 0x207, error 0x1200
|
||||||
|
testScript = ''
|
||||||
|
start_all()
|
||||||
|
# use machinectl
|
||||||
|
machine.succeed("machinectl shell .host ${config.nodes.machine.systemd.package}/bin/systemctl --user start wayland-proxy-virtwl >&2")
|
||||||
|
'';
|
||||||
|
})
|
@ -41,7 +41,6 @@
|
|||||||
|
|
||||||
./lib/flake-module.nix
|
./lib/flake-module.nix
|
||||||
./nixosModules/flake-module.nix
|
./nixosModules/flake-module.nix
|
||||||
./nixosModules/clanCore/flake-module.nix
|
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
18
nixosModules/clanCore/default.nix
Normal file
18
nixosModules/clanCore/default.nix
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./backups.nix
|
||||||
|
./imports.nix
|
||||||
|
./meshnamed
|
||||||
|
./metadata.nix
|
||||||
|
./networking.nix
|
||||||
|
./nix-settings.nix
|
||||||
|
./options.nix
|
||||||
|
./outputs.nix
|
||||||
|
./packages.nix
|
||||||
|
./schema.nix
|
||||||
|
./secrets
|
||||||
|
./vm.nix
|
||||||
|
./wayland-proxy-virtwl.nix
|
||||||
|
./zerotier
|
||||||
|
];
|
||||||
|
}
|
@ -1,127 +0,0 @@
|
|||||||
{ self, inputs, lib, ... }: {
|
|
||||||
flake.nixosModules.clanCore = { config, pkgs, options, ... }: {
|
|
||||||
imports = [
|
|
||||||
./backups.nix
|
|
||||||
./clan-imports
|
|
||||||
./secrets
|
|
||||||
./zerotier
|
|
||||||
./meshnamed
|
|
||||||
./networking.nix
|
|
||||||
./packages.nix
|
|
||||||
./nix-settings.nix
|
|
||||||
inputs.sops-nix.nixosModules.sops
|
|
||||||
# just some example options. Can be removed later
|
|
||||||
./vm.nix
|
|
||||||
./options.nix
|
|
||||||
];
|
|
||||||
options.clanSchema = lib.mkOption {
|
|
||||||
type = lib.types.attrs;
|
|
||||||
description = "The json schema for the .clan options namespace";
|
|
||||||
default = self.lib.jsonschema.parseOptions options.clan;
|
|
||||||
};
|
|
||||||
options.clanCore = {
|
|
||||||
clanName = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = ''
|
|
||||||
the name of the clan
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
clanDir = lib.mkOption {
|
|
||||||
type = lib.types.either lib.types.path lib.types.str;
|
|
||||||
description = ''
|
|
||||||
the location of the flake repo, used to calculate the location of facts and secrets
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
clanIcon = lib.mkOption {
|
|
||||||
type = lib.types.nullOr lib.types.path;
|
|
||||||
description = ''
|
|
||||||
the location of the clan icon
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
machineName = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = ''
|
|
||||||
the name of the machine
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
clanPkgs = lib.mkOption {
|
|
||||||
default = self.packages.${pkgs.system};
|
|
||||||
defaultText = "self.packages.${pkgs.system}";
|
|
||||||
internal = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
# TODO: factor these out into a separate interface.nix.
|
|
||||||
# Also think about moving these options out of `system.clan`.
|
|
||||||
# Maybe we should not re-use the already polluted confg.system namespace
|
|
||||||
# and instead have a separate top-level namespace like `clanOutputs`, with
|
|
||||||
# well defined options marked as `internal = true;`.
|
|
||||||
options.system.clan = lib.mkOption {
|
|
||||||
type = lib.types.submodule {
|
|
||||||
options = {
|
|
||||||
deployment.data = lib.mkOption {
|
|
||||||
type = lib.types.attrs;
|
|
||||||
description = ''
|
|
||||||
the data to be written to the deployment.json file
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
deployment.file = lib.mkOption {
|
|
||||||
type = lib.types.path;
|
|
||||||
description = ''
|
|
||||||
the location of the deployment.json file
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
deploymentAddress = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = ''
|
|
||||||
the address of the deployment server
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
secretsUploadDirectory = lib.mkOption {
|
|
||||||
type = lib.types.path;
|
|
||||||
description = ''
|
|
||||||
the directory on the deployment server where secrets are uploaded
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
uploadSecrets = lib.mkOption {
|
|
||||||
type = lib.types.path;
|
|
||||||
description = ''
|
|
||||||
script to upload secrets to the deployment server
|
|
||||||
'';
|
|
||||||
default = "${pkgs.coreutils}/bin/true";
|
|
||||||
};
|
|
||||||
generateSecrets = lib.mkOption {
|
|
||||||
type = lib.types.path;
|
|
||||||
description = ''
|
|
||||||
script to generate secrets
|
|
||||||
'';
|
|
||||||
default = "${pkgs.coreutils}/bin/true";
|
|
||||||
};
|
|
||||||
vm.config = lib.mkOption {
|
|
||||||
type = lib.types.attrs;
|
|
||||||
description = ''
|
|
||||||
the vm config
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
vm.create = lib.mkOption {
|
|
||||||
type = lib.types.path;
|
|
||||||
description = ''
|
|
||||||
json metadata about the vm
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
description = ''
|
|
||||||
utility outputs for clan management of this machine
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
# optimization for faster secret generate/upload and machines update
|
|
||||||
config = {
|
|
||||||
system.clan.deployment.data = {
|
|
||||||
inherit (config.system.clan) uploadSecrets generateSecrets;
|
|
||||||
inherit (config.clan.networking) deploymentAddress;
|
|
||||||
inherit (config.clanCore) secretsUploadDirectory;
|
|
||||||
};
|
|
||||||
system.clan.deployment.file = pkgs.writeText "deployment.json" (builtins.toJSON config.system.clan.deployment.data);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
32
nixosModules/clanCore/metadata.nix
Normal file
32
nixosModules/clanCore/metadata.nix
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{ lib, pkgs, ... }: {
|
||||||
|
options.clanCore = {
|
||||||
|
clanName = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = ''
|
||||||
|
the name of the clan
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
clanDir = lib.mkOption {
|
||||||
|
type = lib.types.either lib.types.path lib.types.str;
|
||||||
|
description = ''
|
||||||
|
the location of the flake repo, used to calculate the location of facts and secrets
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
clanIcon = lib.mkOption {
|
||||||
|
type = lib.types.nullOr lib.types.path;
|
||||||
|
description = ''
|
||||||
|
the location of the clan icon
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
machineName = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = ''
|
||||||
|
the name of the machine
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
clanPkgs = lib.mkOption {
|
||||||
|
defaultText = "self.packages.${pkgs.system}";
|
||||||
|
internal = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
76
nixosModules/clanCore/outputs.nix
Normal file
76
nixosModules/clanCore/outputs.nix
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
{ config, lib, pkgs, ... }: {
|
||||||
|
# TODO: factor these out into a separate interface.nix.
|
||||||
|
# Also think about moving these options out of `system.clan`.
|
||||||
|
# Maybe we should not re-use the already polluted confg.system namespace
|
||||||
|
# and instead have a separate top-level namespace like `clanOutputs`, with
|
||||||
|
# well defined options marked as `internal = true;`.
|
||||||
|
options.system.clan = lib.mkOption {
|
||||||
|
type = lib.types.submodule {
|
||||||
|
options = {
|
||||||
|
deployment.data = lib.mkOption {
|
||||||
|
type = lib.types.attrs;
|
||||||
|
description = ''
|
||||||
|
the data to be written to the deployment.json file
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
deployment.file = lib.mkOption {
|
||||||
|
type = lib.types.path;
|
||||||
|
description = ''
|
||||||
|
the location of the deployment.json file
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
deploymentAddress = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = ''
|
||||||
|
the address of the deployment server
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
secretsUploadDirectory = lib.mkOption {
|
||||||
|
type = lib.types.path;
|
||||||
|
description = ''
|
||||||
|
the directory on the deployment server where secrets are uploaded
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
uploadSecrets = lib.mkOption {
|
||||||
|
type = lib.types.path;
|
||||||
|
description = ''
|
||||||
|
script to upload secrets to the deployment server
|
||||||
|
'';
|
||||||
|
default = "${pkgs.coreutils}/bin/true";
|
||||||
|
};
|
||||||
|
generateSecrets = lib.mkOption {
|
||||||
|
type = lib.types.path;
|
||||||
|
description = ''
|
||||||
|
script to generate secrets
|
||||||
|
'';
|
||||||
|
default = "${pkgs.coreutils}/bin/true";
|
||||||
|
};
|
||||||
|
vm.config = lib.mkOption {
|
||||||
|
type = lib.types.attrs;
|
||||||
|
description = ''
|
||||||
|
the vm config
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
vm.create = lib.mkOption {
|
||||||
|
type = lib.types.path;
|
||||||
|
description = ''
|
||||||
|
json metadata about the vm
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
description = ''
|
||||||
|
utility outputs for clan management of this machine
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
# optimization for faster secret generate/upload and machines update
|
||||||
|
config = {
|
||||||
|
system.clan.deployment.data = {
|
||||||
|
inherit (config.system.clan) uploadSecrets generateSecrets;
|
||||||
|
inherit (config.clan.networking) deploymentAddress;
|
||||||
|
inherit (config.clanCore) secretsUploadDirectory;
|
||||||
|
};
|
||||||
|
system.clan.deployment.file = pkgs.writeText "deployment.json" (builtins.toJSON config.system.clan.deployment.data);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
11
nixosModules/clanCore/schema.nix
Normal file
11
nixosModules/clanCore/schema.nix
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{ options, lib, ... }:
|
||||||
|
let
|
||||||
|
jsonschema = import ../../lib/jsonschema { inherit lib; };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.clanSchema = lib.mkOption {
|
||||||
|
type = lib.types.attrs;
|
||||||
|
description = "The json schema for the .clan options namespace";
|
||||||
|
default = jsonschema.parseOptions options.clan;
|
||||||
|
};
|
||||||
|
}
|
43
nixosModules/clanCore/wayland-proxy-virtwl.nix
Normal file
43
nixosModules/clanCore/wayland-proxy-virtwl.nix
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{ pkgs, config, lib, ... }:
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
# maybe upstream this?
|
||||||
|
services.wayland-proxy-virtwl = {
|
||||||
|
enable = lib.mkEnableOption "wayland-proxy-virtwl";
|
||||||
|
package = lib.mkPackageOption pkgs "wayland-proxy-virtwl" { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config = lib.mkIf config.services.wayland-proxy-virtwl.enable {
|
||||||
|
programs.xwayland.enable = lib.mkDefault true;
|
||||||
|
environment.etc."X11/xkb".source = config.services.xserver.xkb.dir;
|
||||||
|
|
||||||
|
environment.sessionVariables = {
|
||||||
|
WAYLAND_DISPLAY = "wayland-1";
|
||||||
|
DISPLAY = ":0";
|
||||||
|
QT_QPA_PLATFORM = "wayland"; # Qt Applications
|
||||||
|
GDK_BACKEND = "wayland"; # GTK Applications
|
||||||
|
XDG_SESSION_TYPE = "wayland"; # Electron Applications
|
||||||
|
SDL_VIDEODRIVER = "wayland";
|
||||||
|
CLUTTER_BACKEND = "wayland";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Is there a better way to do this?
|
||||||
|
programs.bash.loginShellInit = ''
|
||||||
|
if [ "$(tty)" = "/dev/ttyS0" ]; then
|
||||||
|
systemctl --user start graphical-session.target
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
systemd.user.services.wayland-proxy-virtwl = {
|
||||||
|
description = "Wayland proxy for virtwl";
|
||||||
|
before = [ "graphical-session.target" ];
|
||||||
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStart = "${config.services.wayland-proxy-virtwl.package}/bin/wayland-proxy-virtwl --virtio-gpu --x-display=0 --xwayland-binary=${pkgs.xwayland}/bin/Xwayland";
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = 5;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -1,6 +1,13 @@
|
|||||||
{ ... }: {
|
{ inputs, self, ... }: {
|
||||||
flake.nixosModules = {
|
flake.nixosModules = {
|
||||||
hidden-ssh-announce.imports = [ ./hidden-ssh-announce.nix ];
|
hidden-ssh-announce.imports = [ ./hidden-ssh-announce.nix ];
|
||||||
installer.imports = [ ./installer ];
|
installer.imports = [ ./installer ];
|
||||||
|
clanCore.imports = [
|
||||||
|
inputs.sops-nix.nixosModules.sops
|
||||||
|
./clanCore
|
||||||
|
({ pkgs, lib, ... }: {
|
||||||
|
clanCore.clanPkgs = lib.mkDefault self.packages.${pkgs.hostPlatform.system};
|
||||||
|
})
|
||||||
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user