2024-12-10 20:29:24 +01:00
|
|
|
{
|
|
|
|
config,
|
|
|
|
lib,
|
|
|
|
pkgs,
|
|
|
|
...
|
|
|
|
}:
|
2019-08-05 18:26:14 +02:00
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
let
|
2021-06-10 07:00:05 +02:00
|
|
|
cfg = config.services.x2goserver;
|
2019-08-05 18:26:14 +02:00
|
|
|
|
|
|
|
defaults = {
|
2024-12-10 20:29:24 +01:00
|
|
|
superenicer = {
|
|
|
|
enable = cfg.superenicer.enable;
|
|
|
|
};
|
2019-08-05 18:26:14 +02:00
|
|
|
};
|
2024-12-10 20:29:24 +01:00
|
|
|
confText = generators.toINI { } (recursiveUpdate defaults cfg.settings);
|
2019-08-05 18:26:14 +02:00
|
|
|
x2goServerConf = pkgs.writeText "x2goserver.conf" confText;
|
|
|
|
|
|
|
|
x2goAgentOptions = pkgs.writeText "x2goagent.options" ''
|
|
|
|
X2GO_NXOPTIONS=""
|
|
|
|
X2GO_NXAGENT_DEFAULT_OPTIONS="${concatStringsSep " " cfg.nxagentDefaultOptions}"
|
|
|
|
'';
|
|
|
|
|
2024-12-10 20:29:24 +01:00
|
|
|
in
|
|
|
|
{
|
2021-06-10 07:00:05 +02:00
|
|
|
imports = [
|
2021-06-11 09:07:23 +02:00
|
|
|
(mkRenamedOptionModule [ "programs" "x2goserver" ] [ "services" "x2goserver" ])
|
2021-06-10 07:00:05 +02:00
|
|
|
];
|
|
|
|
|
|
|
|
options.services.x2goserver = {
|
2024-04-13 14:54:15 +02:00
|
|
|
enable = mkEnableOption "x2goserver" // {
|
|
|
|
description = ''
|
2019-08-05 18:26:14 +02:00
|
|
|
Enables the x2goserver module.
|
|
|
|
NOTE: This will create a good amount of symlinks in `/usr/local/bin`
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
superenicer = {
|
2024-04-13 14:54:15 +02:00
|
|
|
enable = mkEnableOption "superenicer" // {
|
|
|
|
description = ''
|
2019-08-05 18:26:14 +02:00
|
|
|
Enables the SupeReNicer code in x2gocleansessions, this will renice
|
|
|
|
suspended sessions to nice level 19 and renice them to level 0 if the
|
|
|
|
session becomes marked as running again
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
nxagentDefaultOptions = mkOption {
|
|
|
|
type = types.listOf types.str;
|
2024-12-10 20:29:24 +01:00
|
|
|
default = [
|
|
|
|
"-extension GLX"
|
|
|
|
"-nolisten tcp"
|
|
|
|
];
|
2024-04-13 14:54:15 +02:00
|
|
|
description = ''
|
2019-08-05 18:26:14 +02:00
|
|
|
List of default nx agent options.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
settings = mkOption {
|
|
|
|
type = types.attrsOf types.attrs;
|
2024-12-10 20:29:24 +01:00
|
|
|
default = { };
|
2024-04-13 14:54:15 +02:00
|
|
|
description = ''
|
2019-08-05 18:26:14 +02:00
|
|
|
x2goserver.conf ini configuration as nix attributes. See
|
|
|
|
`x2goserver.conf(5)` for details
|
|
|
|
'';
|
2021-10-03 18:06:03 +02:00
|
|
|
example = literalExpression ''
|
|
|
|
{
|
|
|
|
superenicer = {
|
|
|
|
"enable" = "yes";
|
|
|
|
"idle-nice-level" = 19;
|
|
|
|
};
|
|
|
|
telekinesis = { "enable" = "no"; };
|
|
|
|
}
|
2019-08-05 18:26:14 +02:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
|
2021-06-10 07:00:05 +02:00
|
|
|
# x2goserver can run X11 program even if "services.xserver.enable = false"
|
|
|
|
xdg = {
|
|
|
|
autostart.enable = true;
|
|
|
|
menus.enable = true;
|
|
|
|
mime.enable = true;
|
|
|
|
icons.enable = true;
|
|
|
|
};
|
|
|
|
|
2019-08-05 18:26:14 +02:00
|
|
|
environment.systemPackages = [ pkgs.x2goserver ];
|
|
|
|
|
2024-12-10 20:29:24 +01:00
|
|
|
users.groups.x2go = { };
|
2019-08-05 18:26:14 +02:00
|
|
|
users.users.x2go = {
|
|
|
|
home = "/var/lib/x2go/db";
|
|
|
|
group = "x2go";
|
2019-10-12 22:25:28 +02:00
|
|
|
isSystemUser = true;
|
2019-08-05 18:26:14 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
security.wrappers.x2gosqliteWrapper = {
|
|
|
|
source = "${pkgs.x2goserver}/lib/x2go/libx2go-server-db-sqlite3-wrapper.pl";
|
|
|
|
owner = "x2go";
|
|
|
|
group = "x2go";
|
2021-06-10 01:47:55 +02:00
|
|
|
setuid = false;
|
2019-08-05 18:26:14 +02:00
|
|
|
setgid = true;
|
|
|
|
};
|
|
|
|
security.wrappers.x2goprintWrapper = {
|
|
|
|
source = "${pkgs.x2goserver}/bin/x2goprint";
|
|
|
|
owner = "x2go";
|
|
|
|
group = "x2go";
|
2021-06-10 01:47:55 +02:00
|
|
|
setuid = false;
|
2019-08-05 18:26:14 +02:00
|
|
|
setgid = true;
|
|
|
|
};
|
|
|
|
|
2024-12-10 20:29:24 +01:00
|
|
|
systemd.tmpfiles.rules =
|
|
|
|
with pkgs;
|
|
|
|
[
|
|
|
|
"d /var/lib/x2go/ - x2go x2go - -"
|
|
|
|
"d /var/lib/x2go/db - x2go x2go - -"
|
|
|
|
"d /var/lib/x2go/conf - x2go x2go - -"
|
|
|
|
"d /run/x2go 0755 x2go x2go - -"
|
|
|
|
]
|
|
|
|
++
|
|
|
|
# x2goclient sends SSH commands with preset PATH set to
|
|
|
|
# "/usr/local/bin;/usr/bin;/bin". Since we cannot filter arbitrary ssh
|
|
|
|
# commands, we have to make the following executables available.
|
|
|
|
map (f: "L+ /usr/local/bin/${f} - - - - ${x2goserver}/bin/${f}") [
|
|
|
|
"x2goagent"
|
|
|
|
"x2gobasepath"
|
|
|
|
"x2gocleansessions"
|
|
|
|
"x2gocmdexitmessage"
|
|
|
|
"x2godbadmin"
|
|
|
|
"x2gofeature"
|
|
|
|
"x2gofeaturelist"
|
|
|
|
"x2gofm"
|
|
|
|
"x2gogetapps"
|
|
|
|
"x2gogetservers"
|
|
|
|
"x2golistdesktops"
|
|
|
|
"x2golistmounts"
|
|
|
|
"x2golistsessions"
|
|
|
|
"x2golistsessions_root"
|
|
|
|
"x2golistshadowsessions"
|
|
|
|
"x2gomountdirs"
|
|
|
|
"x2gopath"
|
|
|
|
"x2goprint"
|
|
|
|
"x2goresume-desktopsharing"
|
|
|
|
"x2goresume-session"
|
|
|
|
"x2goruncommand"
|
|
|
|
"x2goserver-run-extensions"
|
|
|
|
"x2gosessionlimit"
|
|
|
|
"x2gosetkeyboard"
|
|
|
|
"x2goshowblocks"
|
|
|
|
"x2gostartagent"
|
|
|
|
"x2gosuspend-desktopsharing"
|
|
|
|
"x2gosuspend-session"
|
|
|
|
"x2goterminate-desktopsharing"
|
|
|
|
"x2goterminate-session"
|
|
|
|
"x2goumount-session"
|
|
|
|
"x2goversion"
|
|
|
|
]
|
|
|
|
++ [
|
|
|
|
"L+ /usr/local/bin/awk - - - - ${gawk}/bin/awk"
|
|
|
|
"L+ /usr/local/bin/chmod - - - - ${coreutils}/bin/chmod"
|
|
|
|
"L+ /usr/local/bin/cp - - - - ${coreutils}/bin/cp"
|
|
|
|
"L+ /usr/local/bin/sed - - - - ${gnused}/bin/sed"
|
|
|
|
"L+ /usr/local/bin/setsid - - - - ${util-linux}/bin/setsid"
|
|
|
|
"L+ /usr/local/bin/xrandr - - - - ${xorg.xrandr}/bin/xrandr"
|
|
|
|
"L+ /usr/local/bin/xmodmap - - - - ${xorg.xmodmap}/bin/xmodmap"
|
|
|
|
];
|
2019-08-05 18:26:14 +02:00
|
|
|
|
|
|
|
systemd.services.x2goserver = {
|
|
|
|
description = "X2Go Server Daemon";
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
unitConfig.Documentation = "man:x2goserver.conf(5)";
|
|
|
|
serviceConfig = {
|
|
|
|
Type = "forking";
|
|
|
|
ExecStart = "${pkgs.x2goserver}/bin/x2gocleansessions";
|
|
|
|
PIDFile = "/run/x2go/x2goserver.pid";
|
|
|
|
User = "x2go";
|
|
|
|
Group = "x2go";
|
|
|
|
RuntimeDirectory = "x2go";
|
|
|
|
StateDirectory = "x2go";
|
|
|
|
};
|
|
|
|
preStart = ''
|
|
|
|
if [ ! -e /var/lib/x2go/setup_ran ]
|
|
|
|
then
|
|
|
|
mkdir -p /var/lib/x2go/conf
|
|
|
|
cp -r ${pkgs.x2goserver}/etc/x2go/* /var/lib/x2go/conf/
|
|
|
|
ln -sf ${x2goServerConf} /var/lib/x2go/conf/x2goserver.conf
|
|
|
|
ln -sf ${x2goAgentOptions} /var/lib/x2go/conf/x2goagent.options
|
|
|
|
${pkgs.x2goserver}/bin/x2godbadmin --createdb
|
|
|
|
touch /var/lib/x2go/setup_ran
|
|
|
|
fi
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
# https://bugs.x2go.org/cgi-bin/bugreport.cgi?bug=276
|
|
|
|
security.sudo.extraConfig = ''
|
|
|
|
Defaults env_keep+=QT_GRAPHICSSYSTEM
|
|
|
|
'';
|
2023-10-22 19:49:20 +00:00
|
|
|
security.sudo-rs.extraConfig = ''
|
|
|
|
Defaults env_keep+=QT_GRAPHICSSYSTEM
|
|
|
|
'';
|
2019-08-05 18:26:14 +02:00
|
|
|
};
|
|
|
|
}
|