diff --git a/modules/misc/news/2025/09/2025-09-17_07-03-26.nix b/modules/misc/news/2025/09/2025-09-17_07-03-26.nix new file mode 100644 index 000000000..c892fd84b --- /dev/null +++ b/modules/misc/news/2025/09/2025-09-17_07-03-26.nix @@ -0,0 +1,7 @@ +{ + time = "2025-09-17T05:03:26+00:00"; + condition = true; + message = '' + A new service is available: 'services.tailscale-systray'. + ''; +} diff --git a/modules/services/tailscale-systray.nix b/modules/services/tailscale-systray.nix new file mode 100644 index 000000000..fa4207aff --- /dev/null +++ b/modules/services/tailscale-systray.nix @@ -0,0 +1,47 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + cfg = config.services.tailscale-systray; +in +{ + meta.maintainers = [ lib.maintainers.yethal ]; + + options.services.tailscale-systray = { + enable = lib.mkEnableOption "Official Tailscale systray application for Linux"; + + package = lib.mkPackageOption pkgs "tailscale" { }; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "services.tailscale-systray" pkgs lib.platforms.linux) + { + assertion = lib.versionAtLeast cfg.package.version "1.88.1"; + message = '' + Tailscale systray is available since version 1.88.1 + ''; + } + ]; + + systemd.user.services.tailscale-systray = { + Unit = { + Description = "Official Tailscale systray application for Linux"; + Requires = [ "tray.target" ]; + After = [ + "graphical-session.target" + "tray.target" + ]; + PartOf = [ "graphical-session.target" ]; + }; + Install = { + WantedBy = [ "graphical-session.target" ]; + }; + Service.ExecStart = "${lib.getExe cfg.package} systray"; + }; + }; +} diff --git a/tests/modules/services/tailscale-systray/basic.nix b/tests/modules/services/tailscale-systray/basic.nix new file mode 100644 index 000000000..55cf11040 --- /dev/null +++ b/tests/modules/services/tailscale-systray/basic.nix @@ -0,0 +1,18 @@ +{ config, ... }: +{ + services.tailscale-systray = { + enable = true; + package = config.lib.test.mkStubPackage { + name = "tailscale"; + version = "1.88.1"; + outPath = "@tailscale@"; + }; + }; + + nmt.script = '' + serviceFile=home-files/.config/systemd/user/tailscale-systray.service + assertFileExists $serviceFile + assertFileRegex $serviceFile \ + '^ExecStart=@tailscale@/bin/tailscale systray$' + ''; +} diff --git a/tests/modules/services/tailscale-systray/default.nix b/tests/modules/services/tailscale-systray/default.nix new file mode 100644 index 000000000..0c5b66a70 --- /dev/null +++ b/tests/modules/services/tailscale-systray/default.nix @@ -0,0 +1,5 @@ +{ lib, pkgs, ... }: + +lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux { + tailscale-systray-basic = ./basic.nix; +}