diff --git a/nixos/doc/manual/release-notes/rl-1709.xml b/nixos/doc/manual/release-notes/rl-1709.xml
index fc7fd49907e..c64cdd583f2 100644
--- a/nixos/doc/manual/release-notes/rl-1709.xml
+++ b/nixos/doc/manual/release-notes/rl-1709.xml
@@ -101,6 +101,9 @@ rmdir /var/lib/ipfs/.ipfs
The mysql default dataDir has changed from /var/mysql to /var/lib/mysql.
+
+ Radicale's default package has changed from 1.x to 2.x. Instructions to migrate can be found here . It is also possible to use the newer version by setting the package to radicale2, which is done automatically when stateVersion is 17.09 or higher.
+
diff --git a/nixos/modules/services/networking/radicale.nix b/nixos/modules/services/networking/radicale.nix
index ef860e7e5df..f1b8edf4371 100644
--- a/nixos/modules/services/networking/radicale.nix
+++ b/nixos/modules/services/networking/radicale.nix
@@ -1,4 +1,4 @@
-{config, lib, pkgs, ...}:
+{ config, lib, pkgs, ... }:
with lib;
@@ -8,17 +8,35 @@ let
confFile = pkgs.writeText "radicale.conf" cfg.config;
+ # This enables us to default to version 2 while still not breaking configurations of people with version 1
+ defaultPackage = if versionAtLeast "17.09" config.system.stateVersion then {
+ pkg = pkgs.radicale2;
+ text = "pkgs.radicale2";
+ } else {
+ pkg = pkgs.radicale1;
+ text = "pkgs.radicale1";
+ };
in
{
options = {
-
services.radicale.enable = mkOption {
type = types.bool;
default = false;
description = ''
- Enable Radicale CalDAV and CardDAV server
+ Enable Radicale CalDAV and CardDAV server.
+ '';
+ };
+
+ services.radicale.package = mkOption {
+ type = types.package;
+ default = defaultPackage.pkg;
+ defaultText = defaultPackage.text;
+ description = ''
+ Radicale package to use. This defaults to version 1.x if
+ system.stateVersion < 17.09 and version 2.x
+ otherwise.
'';
};
@@ -27,13 +45,13 @@ in
default = "";
description = ''
Radicale configuration, this will set the service
- configuration file
+ configuration file.
'';
- };
+ };
};
config = mkIf cfg.enable {
- environment.systemPackages = [ pkgs.radicale ];
+ environment.systemPackages = [ cfg.package ];
users.extraUsers = singleton
{ name = "radicale";
@@ -52,11 +70,13 @@ in
description = "A Simple Calendar and Contact Server";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
- script = "${pkgs.radicale}/bin/radicale -C ${confFile} -f";
- serviceConfig.User = "radicale";
- serviceConfig.Group = "radicale";
+ serviceConfig = {
+ ExecStart = "${cfg.package}/bin/radicale -C ${confFile} -f";
+ User = "radicale";
+ Group = "radicale";
+ };
};
};
- meta.maintainers = with lib.maintainers; [ aneeshusa ];
+ meta.maintainers = with lib.maintainers; [ aneeshusa infinisil ];
}
diff --git a/nixos/release.nix b/nixos/release.nix
index 761a151e12e..ca2a164bb6c 100644
--- a/nixos/release.nix
+++ b/nixos/release.nix
@@ -298,6 +298,7 @@ in rec {
tests.pumpio = callTest tests/pump.io.nix {};
# tests.quagga = callTest tests/quagga.nix {};
tests.quake3 = callTest tests/quake3.nix {};
+ tests.radicale = callTest tests/radicale.nix {};
tests.runInMachine = callTest tests/run-in-machine.nix {};
tests.samba = callTest tests/samba.nix {};
tests.sddm = callSubTests tests/sddm.nix {};
diff --git a/nixos/tests/radicale.nix b/nixos/tests/radicale.nix
index 4c2ed8456dd..bec86d2cb28 100644
--- a/nixos/tests/radicale.nix
+++ b/nixos/tests/radicale.nix
@@ -1,80 +1,39 @@
let
- port = 5232;
- radicaleOverlay = self: super: {
- radicale = super.radicale.overrideAttrs (oldAttrs: {
- propagatedBuildInputs = with self.pythonPackages;
- (oldAttrs.propagatedBuildInputs or []) ++ [
- passlib
- ];
- });
- };
- common = { config, pkgs, ...}: {
+ user = "someuser";
+ password = "some_password";
+ port = builtins.toString 5232;
+in
+ import ./make-test.nix ({ pkgs, lib, ... }: {
+ name = "radicale";
+ meta.maintainers = with lib.maintainers; [ aneeshusa infinisil ];
+
+ machine = {
services.radicale = {
enable = true;
- config = let home = config.users.extraUsers.radicale.home; in ''
- [server]
- hosts = 127.0.0.1:${builtins.toString port}
- daemon = False
- [encoding]
- [well-known]
+ config = ''
[auth]
type = htpasswd
htpasswd_filename = /etc/radicale/htpasswd
htpasswd_encryption = bcrypt
- [git]
- [rights]
+
[storage]
- type = filesystem
- filesystem_folder = ${home}/collections
+ filesystem_folder = /tmp/collections
+
[logging]
- [headers]
+ debug = True
'';
};
# WARNING: DON'T DO THIS IN PRODUCTION!
# This puts secrets (albeit hashed) directly into the Nix store for ease of testing.
- environment.etc."radicale/htpasswd".source = with pkgs; let
- py = python.withPackages(ps: with ps; [ passlib ]);
- in runCommand "htpasswd" {} ''
- ${py}/bin/python -c "
-from passlib.apache import HtpasswdFile
-ht = HtpasswdFile(
- '$out',
- new=True,
- default_scheme='bcrypt'
-)
-ht.set_password('someuser', 'really_secret_password')
-ht.save()
-"
+ environment.etc."radicale/htpasswd".source = pkgs.runCommand "htpasswd" {} ''
+ ${pkgs.apacheHttpd}/bin/htpasswd -bcB "$out" ${user} ${password}
'';
};
-
-in import ./make-test.nix ({ lib, ... }: {
- name = "radicale";
- meta.maintainers = with lib.maintainers; [ aneeshusa ];
-
- # Test radicale with bcrypt-based htpasswd authentication
- nodes = {
- py2 = { config, pkgs, ... }@args: (common args) // {
- nixpkgs.overlays = [
- radicaleOverlay
- ];
- };
- py3 = { config, pkgs, ... }@args: (common args) // {
- nixpkgs.overlays = [
- (self: super: {
- python = self.python3;
- pythonPackages = self.python3.pkgs;
- })
- radicaleOverlay
- ];
- };
- };
-
+
+ # This tests whether the web interface is accessible to an authenticated user
testScript = ''
- for my $machine ($py2, $py3) {
- $machine->waitForUnit('radicale.service');
- $machine->waitForOpenPort(${builtins.toString port});
- $machine->succeed('curl -s http://someuser:really_secret_password@127.0.0.1:${builtins.toString port}/someuser/calendar.ics/');
- }
+ $machine->waitForUnit('radicale.service');
+ $machine->waitForOpenPort(${port});
+ $machine->succeed('curl --fail http://${user}:${password}@localhost:${port}/.web/');
'';
})
diff --git a/pkgs/servers/radicale/1.x.nix b/pkgs/servers/radicale/1.x.nix
new file mode 100644
index 00000000000..13db868845a
--- /dev/null
+++ b/pkgs/servers/radicale/1.x.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl, pythonPackages }:
+
+pythonPackages.buildPythonApplication rec {
+ name = "radicale-${version}";
+ version = "1.1.6";
+
+ src = fetchurl {
+ url = "mirror://pypi/R/Radicale/Radicale-${version}.tar.gz";
+ sha256 = "0ay90nj6fmr2aq8imi0mbjl4m2rzq7a83ikj8qs9gxsylj71j1y0";
+ };
+
+ propagatedBuildInputs = stdenv.lib.optionals (!pythonPackages.isPy3k) [
+ pythonPackages.flup
+ pythonPackages.ldap
+ pythonPackages.sqlalchemy
+ ];
+
+ doCheck = !pythonPackages.isPy3k;
+
+ meta = with stdenv.lib; {
+ homepage = http://www.radicale.org/;
+ description = "CalDAV CardDAV server";
+ longDescription = ''
+ The Radicale Project is a complete CalDAV (calendar) and CardDAV
+ (contact) server solution. Calendars and address books are available for
+ both local and remote access, possibly limited through authentication
+ policies. They can be viewed and edited by calendar and contact clients
+ on mobile phones or computers.
+ '';
+ license = licenses.gpl3Plus;
+ platforms = platforms.all;
+ maintainers = with maintainers; [ edwtjo pSub aneeshusa ];
+ };
+}
diff --git a/pkgs/servers/radicale/default.nix b/pkgs/servers/radicale/default.nix
index b6d61e29395..ee38783a899 100644
--- a/pkgs/servers/radicale/default.nix
+++ b/pkgs/servers/radicale/default.nix
@@ -1,21 +1,27 @@
-{ stdenv, fetchurl, pythonPackages }:
+{ stdenv, fetchFromGitHub, python3Packages }:
-pythonPackages.buildPythonApplication rec {
+let
+ version = "2.1.2";
+ sha256 = "0gmbnvm17j0ilcnci1k2jh0vkbz5g8xlk9lgia5mlx790048hlm8";
+in
+
+python3Packages.buildPythonApplication {
name = "radicale-${version}";
- version = "1.1.4";
+ inherit version;
- src = fetchurl {
- url = "mirror://pypi/R/Radicale/Radicale-${version}.tar.gz";
- sha256 = "17p0hayyw30pfb81xqvd7jhjm6yrk2dnbgvqagx1nqdsr89ar0ss";
+ src = fetchFromGitHub {
+ owner = "Kozea";
+ repo = "Radicale";
+ rev = version;
+ inherit sha256;
};
- propagatedBuildInputs = stdenv.lib.optionals (!pythonPackages.isPy3k) [
- pythonPackages.flup
- pythonPackages.ldap
- pythonPackages.sqlalchemy
- ];
+ doCheck = false;
- doCheck = !pythonPackages.isPy3k;
+ propagatedBuildInputs = with python3Packages; [
+ vobject
+ passlib
+ ];
meta = with stdenv.lib; {
homepage = http://www.radicale.org/;
@@ -29,6 +35,6 @@ pythonPackages.buildPythonApplication rec {
'';
license = licenses.gpl3Plus;
platforms = platforms.all;
- maintainers = with maintainers; [ edwtjo pSub aneeshusa ];
+ maintainers = with maintainers; [ edwtjo pSub aneeshusa infinisil ];
};
}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index aa96c677f3f..58e43cec68b 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -11545,7 +11545,10 @@ with pkgs;
inherit (darwin.apple_sdk.frameworks) AppKit Carbon Cocoa;
};
- radicale = callPackage ../servers/radicale { };
+ radicale1 = callPackage ../servers/radicale/1.x.nix { };
+ radicale2 = callPackage ../servers/radicale/default.nix { };
+
+ radicale = radicale2;
rake = callPackage ../development/tools/build-managers/rake { };