diff --git a/modules/misc/news/2025/05/2025-05-24_18-18-40.nix b/modules/misc/news/2025/05/2025-05-24_18-18-40.nix new file mode 100644 index 000000000..d80583dbc --- /dev/null +++ b/modules/misc/news/2025/05/2025-05-24_18-18-40.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + time = "2025-05-24T18:18:40+00:00"; + condition = pkgs.stdenv.hostPlatform.isLinux; + message = '' + A new module is available: `services.wayvnc` + + wayvnc is a VNC server for wlroots based Wayland compositors. + ''; +} diff --git a/modules/modules.nix b/modules/modules.nix index e155d3627..3f0fa75af 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -470,6 +470,7 @@ let ./services/vdirsyncer.nix ./services/volnoti.nix ./services/way-displays.nix + ./services/wayvnc.nix ./services/window-managers/awesome.nix ./services/window-managers/bspwm/default.nix ./services/window-managers/fluxbox.nix diff --git a/modules/services/wayvnc.nix b/modules/services/wayvnc.nix new file mode 100644 index 000000000..9dce47f69 --- /dev/null +++ b/modules/services/wayvnc.nix @@ -0,0 +1,95 @@ +{ + config, + lib, + pkgs, + ... +}: +let + inherit (lib) + getExe + literalExpression + mkEnableOption + mkIf + mkOption + mkPackageOption + types + ; + + cfg = config.services.wayvnc; + + format = pkgs.formats.keyValue { }; +in +{ + meta.maintainers = with lib.maintainers; [ Scrumplex ]; + + options.services.wayvnc = { + enable = mkEnableOption "wayvnc VNC server"; + + package = mkPackageOption pkgs "wayvnc" { }; + + autoStart = mkEnableOption "autostarting of wayvnc"; + + systemdTarget = mkOption { + type = types.str; + default = config.wayland.systemd.target; + defaultText = literalExpression "config.wayland.systemd.target"; + description = '' + Systemd target to bind to. + ''; + }; + + settings = mkOption { + type = types.submodule { + freeformType = format.type; + + options = { + address = mkOption { + description = '' + The address to which the server shall bind, e.g. 0.0.0.0 or + localhost. + ''; + type = types.str; + example = "0.0.0.0"; + }; + port = mkOption { + description = '' + The port to which the server shall bind. + ''; + type = types.port; + example = 5901; + }; + }; + }; + description = '' + See CONFIGURATION section in {manpage}`wayvnc(1)`. + ''; + default = { }; + example = { + address = "0.0.0.0"; + port = 5901; + }; + }; + }; + + config = mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "services.wayvnc" pkgs lib.platforms.linux) + ]; + + systemd.user.services."wayvnc" = { + Unit = { + Description = "wayvnc VNC server"; + Documentation = [ "man:wayvnc(1)" ]; + After = [ cfg.systemdTarget ]; + PartOf = [ cfg.systemdTarget ]; + }; + Service.ExecStart = [ (getExe cfg.package) ]; + Install.WantedBy = lib.mkIf cfg.autoStart [ cfg.systemdTarget ]; + }; + + # For manpage and wayvncctl + home.packages = [ cfg.package ]; + + xdg.configFile."wayvnc/config".source = format.generate "wayvnc.conf" cfg.settings; + }; +} diff --git a/tests/default.nix b/tests/default.nix index 8b2c66622..bfe9ff4c8 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -496,6 +496,7 @@ import nmtSrc { ./modules/services/udiskie ./modules/services/volnoti ./modules/services/way-displays + ./modules/services/wayvnc ./modules/services/window-managers/bspwm ./modules/services/window-managers/herbstluftwm ./modules/services/window-managers/hyprland diff --git a/tests/modules/services/wayvnc/default.nix b/tests/modules/services/wayvnc/default.nix new file mode 100644 index 000000000..144fd8fb9 --- /dev/null +++ b/tests/modules/services/wayvnc/default.nix @@ -0,0 +1,3 @@ +{ + wayvnc-simple = ./simple.nix; +} diff --git a/tests/modules/services/wayvnc/simple-config b/tests/modules/services/wayvnc/simple-config new file mode 100644 index 000000000..c298f1c0b --- /dev/null +++ b/tests/modules/services/wayvnc/simple-config @@ -0,0 +1,3 @@ +address=0.0.0.0 +port=5901 +username=foobar diff --git a/tests/modules/services/wayvnc/simple.nix b/tests/modules/services/wayvnc/simple.nix new file mode 100644 index 000000000..8a5f03c85 --- /dev/null +++ b/tests/modules/services/wayvnc/simple.nix @@ -0,0 +1,26 @@ +{ config, ... }: +{ + services.wayvnc = { + enable = true; + package = config.lib.test.mkStubPackage { }; + + autoStart = true; + + settings = { + address = "0.0.0.0"; + port = 5901; + username = "foobar"; + }; + }; + + nmt.script = '' + assertFileExists home-files/.config/systemd/user/wayvnc.service + assertFileContent \ + $(normalizeStorePaths home-files/.config/systemd/user/wayvnc.service) \ + ${./simple.service} + + assertFileExists home-files/.config/wayvnc/config + assertFileContent home-files/.config/wayvnc/config ${./simple-config} + ''; + +} diff --git a/tests/modules/services/wayvnc/simple.service b/tests/modules/services/wayvnc/simple.service new file mode 100644 index 000000000..e644585b5 --- /dev/null +++ b/tests/modules/services/wayvnc/simple.service @@ -0,0 +1,11 @@ +[Install] +WantedBy=graphical-session.target + +[Service] +ExecStart=/nix/store/00000000000000000000000000000000-dummy/bin/dummy + +[Unit] +After=graphical-session.target +Description=wayvnc VNC server +Documentation=man:wayvnc(1) +PartOf=graphical-session.target