Merge pull request #76178 from 0x4A6F/master-xandikos
xandikos: add tests and module
This commit is contained in:
commit
55b0129a14
@ -735,6 +735,7 @@
|
|||||||
./services/networking/wicd.nix
|
./services/networking/wicd.nix
|
||||||
./services/networking/wireguard.nix
|
./services/networking/wireguard.nix
|
||||||
./services/networking/wpa_supplicant.nix
|
./services/networking/wpa_supplicant.nix
|
||||||
|
./services/networking/xandikos.nix
|
||||||
./services/networking/xinetd.nix
|
./services/networking/xinetd.nix
|
||||||
./services/networking/xl2tpd.nix
|
./services/networking/xl2tpd.nix
|
||||||
./services/networking/xrdp.nix
|
./services/networking/xrdp.nix
|
||||||
|
148
nixos/modules/services/networking/xandikos.nix
Normal file
148
nixos/modules/services/networking/xandikos.nix
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.services.xandikos;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
options = {
|
||||||
|
services.xandikos = {
|
||||||
|
enable = mkEnableOption "Xandikos CalDAV and CardDAV server";
|
||||||
|
|
||||||
|
package = mkOption {
|
||||||
|
type = types.package;
|
||||||
|
default = pkgs.xandikos;
|
||||||
|
defaultText = "pkgs.xandikos";
|
||||||
|
description = "The Xandikos package to use.";
|
||||||
|
};
|
||||||
|
|
||||||
|
address = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "localhost";
|
||||||
|
description = ''
|
||||||
|
The IP address on which Xandikos will listen.
|
||||||
|
By default listens on localhost.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
port = mkOption {
|
||||||
|
type = types.port;
|
||||||
|
default = 8080;
|
||||||
|
description = "The port of the Xandikos web application";
|
||||||
|
};
|
||||||
|
|
||||||
|
routePrefix = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "/";
|
||||||
|
description = ''
|
||||||
|
Path to Xandikos.
|
||||||
|
Useful when Xandikos is behind a reverse proxy.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
extraOptions = mkOption {
|
||||||
|
default = [];
|
||||||
|
type = types.listOf types.str;
|
||||||
|
example = literalExample ''
|
||||||
|
[ "--autocreate"
|
||||||
|
"--defaults"
|
||||||
|
"--current-user-principal user"
|
||||||
|
"--dump-dav-xml"
|
||||||
|
]
|
||||||
|
'';
|
||||||
|
description = ''
|
||||||
|
Extra command line arguments to pass to xandikos.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
nginx = mkOption {
|
||||||
|
default = {};
|
||||||
|
description = ''
|
||||||
|
Configuration for nginx reverse proxy.
|
||||||
|
'';
|
||||||
|
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
Configure the nginx reverse proxy settings.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
hostName = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The hostname use to setup the virtualhost configuration
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable (
|
||||||
|
mkMerge [
|
||||||
|
{
|
||||||
|
meta.maintainers = [ lib.maintainers."0x4A6F" ];
|
||||||
|
|
||||||
|
systemd.services.xandikos = {
|
||||||
|
description = "A Simple Calendar and Contact Server";
|
||||||
|
after = [ "network.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
User = "xandikos";
|
||||||
|
Group = "xandikos";
|
||||||
|
DynamicUser = "yes";
|
||||||
|
RuntimeDirectory = "xandikos";
|
||||||
|
StateDirectory = "xandikos";
|
||||||
|
StateDirectoryMode = "0700";
|
||||||
|
PrivateDevices = true;
|
||||||
|
# Sandboxing
|
||||||
|
CapabilityBoundingSet = "CAP_NET_RAW CAP_NET_ADMIN";
|
||||||
|
ProtectSystem = "strict";
|
||||||
|
ProtectHome = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
ProtectKernelTunables = true;
|
||||||
|
ProtectKernelModules = true;
|
||||||
|
ProtectControlGroups = true;
|
||||||
|
RestrictAddressFamilies = "AF_INET AF_INET6 AF_UNIX AF_PACKET AF_NETLINK";
|
||||||
|
RestrictNamespaces = true;
|
||||||
|
LockPersonality = true;
|
||||||
|
MemoryDenyWriteExecute = true;
|
||||||
|
RestrictRealtime = true;
|
||||||
|
RestrictSUIDSGID = true;
|
||||||
|
ExecStart = ''
|
||||||
|
${cfg.package}/bin/xandikos \
|
||||||
|
--directory /var/lib/xandikos \
|
||||||
|
--listen_address ${cfg.address} \
|
||||||
|
--port ${toString cfg.port} \
|
||||||
|
--route-prefix ${cfg.routePrefix} \
|
||||||
|
${lib.concatStringsSep " " cfg.extraOptions}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
(
|
||||||
|
mkIf cfg.nginx.enable {
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
virtualHosts."${cfg.nginx.hostName}" = {
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://${cfg.address}:${toString cfg.port}/";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
@ -295,6 +295,7 @@ in
|
|||||||
wireguard-generated = handleTest ./wireguard/generated.nix {};
|
wireguard-generated = handleTest ./wireguard/generated.nix {};
|
||||||
wireguard-namespaces = handleTest ./wireguard/namespaces.nix {};
|
wireguard-namespaces = handleTest ./wireguard/namespaces.nix {};
|
||||||
wordpress = handleTest ./wordpress.nix {};
|
wordpress = handleTest ./wordpress.nix {};
|
||||||
|
xandikos = handleTest ./xandikos.nix {};
|
||||||
xautolock = handleTest ./xautolock.nix {};
|
xautolock = handleTest ./xautolock.nix {};
|
||||||
xfce = handleTest ./xfce.nix {};
|
xfce = handleTest ./xfce.nix {};
|
||||||
xmonad = handleTest ./xmonad.nix {};
|
xmonad = handleTest ./xmonad.nix {};
|
||||||
|
70
nixos/tests/xandikos.nix
Normal file
70
nixos/tests/xandikos.nix
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
import ./make-test-python.nix (
|
||||||
|
{ pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
name = "xandikos";
|
||||||
|
|
||||||
|
meta.maintainers = [ lib.maintainers."0x4A6F" ];
|
||||||
|
|
||||||
|
nodes = {
|
||||||
|
xandikos_client = {};
|
||||||
|
xandikos_default = {
|
||||||
|
networking.firewall.allowedTCPPorts = [ 8080 ];
|
||||||
|
services.xandikos.enable = true;
|
||||||
|
};
|
||||||
|
xandikos_proxy = {
|
||||||
|
networking.firewall.allowedTCPPorts = [ 80 8080 ];
|
||||||
|
services.xandikos.enable = true;
|
||||||
|
services.xandikos.address = "localhost";
|
||||||
|
services.xandikos.port = 8080;
|
||||||
|
services.xandikos.routePrefix = "/xandikos/";
|
||||||
|
services.xandikos.extraOptions = [
|
||||||
|
"--defaults"
|
||||||
|
];
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
recommendedProxySettings = true;
|
||||||
|
virtualHosts."xandikos" = {
|
||||||
|
serverName = "xandikos.local";
|
||||||
|
basicAuth.xandikos = "snakeOilPassword";
|
||||||
|
locations."/xandikos/" = {
|
||||||
|
proxyPass = "http://localhost:8080/";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
start_all()
|
||||||
|
|
||||||
|
with subtest("Xandikos default"):
|
||||||
|
xandikos_default.wait_for_unit("multi-user.target")
|
||||||
|
xandikos_default.wait_for_unit("xandikos.service")
|
||||||
|
xandikos_default.wait_for_open_port(8080)
|
||||||
|
xandikos_default.succeed("curl --fail http://localhost:8080/")
|
||||||
|
xandikos_default.succeed(
|
||||||
|
"curl -s --fail --location http://localhost:8080/ | grep -qi Xandikos"
|
||||||
|
)
|
||||||
|
xandikos_client.wait_for_unit("network.target")
|
||||||
|
xandikos_client.fail("curl --fail http://xandikos_default:8080/")
|
||||||
|
|
||||||
|
with subtest("Xandikos proxy"):
|
||||||
|
xandikos_proxy.wait_for_unit("multi-user.target")
|
||||||
|
xandikos_proxy.wait_for_unit("xandikos.service")
|
||||||
|
xandikos_proxy.wait_for_open_port(8080)
|
||||||
|
xandikos_proxy.succeed("curl --fail http://localhost:8080/")
|
||||||
|
xandikos_proxy.succeed(
|
||||||
|
"curl -s --fail --location http://localhost:8080/ | grep -qi Xandikos"
|
||||||
|
)
|
||||||
|
xandikos_client.wait_for_unit("network.target")
|
||||||
|
xandikos_client.fail("curl --fail http://xandikos_proxy:8080/")
|
||||||
|
xandikos_client.succeed(
|
||||||
|
"curl -s --fail -u xandikos:snakeOilPassword -H 'Host: xandikos.local' http://xandikos_proxy/xandikos/ | grep -qi Xandikos"
|
||||||
|
)
|
||||||
|
xandikos_client.succeed(
|
||||||
|
"curl -s --fail -u xandikos:snakeOilPassword -H 'Host: xandikos.local' http://xandikos_proxy/xandikos/user/ | grep -qi Xandikos"
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
)
|
Loading…
x
Reference in New Issue
Block a user