diff --git a/doc/guix.texi b/doc/guix.texi index cb22e612e4..9d41b43d94 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -131,6 +131,7 @@ Copyright @copyright{} 2024 Dariqq@* Copyright @copyright{} 2024 Denis 'GNUtoo' Carikli@* Copyright @copyright{} 2024 Fabio Natali@* Copyright @copyright{} 2024 Arnaud Daby-Seesaram@* +Copyright @copyright{} 2024 Wilko Meyer@* Copyright @copyright{} 2024-2025 Nigko Yerden@* Copyright @copyright{} 2024 Troy Figiel@* Copyright @copyright{} 2024 Sharlatan Hellseher@* @@ -431,6 +432,7 @@ Services * DNS Services:: DNS daemons. * VNC Services:: VNC daemons. * VPN Services:: VPN daemons. +* DAV Services:: DAV daemons. * Network File System:: NFS related services. * Samba Services:: Samba services. * Continuous Integration:: Cuirass and Laminar services. @@ -19882,6 +19884,7 @@ declaration. * DNS Services:: DNS daemons. * VNC Services:: VNC daemons. * VPN Services:: VPN daemons. +* DAV Services:: DAV daemons. * Network File System:: NFS related services. * Samba Services:: Samba services. * Continuous Integration:: Cuirass and Laminar services. @@ -37736,6 +37739,60 @@ a firewall. @end table @end deftp +@node DAV Services +@subsection DAV Services +@cindex CalDAV + +@defvar xandikos-service-type +This service starts @code{xandikos}, a lightweight CardDAV/CalDAV +server backed by a Git repository. + +The service's value is a @code{xandikos-configuration} record. +@end defvar + +@deftp {Data Type} xandikos-configuration +This is the data type representing the configuration for the +@code{xandikos-shepherd-service}. + +It has the following parameters: + +@table @asis +@item @code{package} (default: @code{xandikos}) +The @code{xandikos} package to use. + +@item @code{directory} (default: @code{"/var/xandikos/dav"}) +The directory to serve from. + +@item @code{listen-address} (default: @code{127.0.0.1}) +The address @command{xandikos} listens on. + +@item @code{port} (default: @code{8080}) +The port to run @command{xandikos} on. + +@item @code{current-user-principal} (default: @code{"/user/"}) +Path to current user principal. + +@item @code{route-prefix} (default: @code{"/"}) +Path to @command{xandikos} (useful when Xandikos is behind a reverse proxy). + +@item @code{defaults?} (default: @code{#t}) +Create initial calendar and address book. Implies @option{--autocreate}. + +@item @code{dump?} (default: @code{#f}) +Print DAV XML request/responses. + +@item @code{avahi?} (default: @code{#f}) +Announce services with avahi. + +@item @code{autocreate?} (default: @code{#f}) +Automatically create necessary directories. + +@item @code{no-strict?} (default: @code{#f}) +Enable workarounds for buggy CalDAV/CardDAV client implementations. +@end table +@end deftp + + @node Network File System @subsection Network File System @cindex NFS diff --git a/gnu/local.mk b/gnu/local.mk index 07b2390315..eee6019353 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -67,6 +67,7 @@ # Copyright © 2024, 2025 David Elsing # Copyright © 2024 Ashish SHUKLA # Copyright © 2024 Fabio Natali +# Copyright © 2024 Wilko Meyer # Copyright © 2024 Noé Lopez # Copyright © 2024 Runciter # Copyright © 2024 Ashvith Shetty @@ -735,6 +736,7 @@ GNU_SYSTEM_MODULES = \ %D%/services/cuirass.scm \ %D%/services/cups.scm \ %D%/services/databases.scm \ + %D%/services/dav.scm \ %D%/services/dbus.scm \ %D%/services/desktop.scm \ %D%/services/dict.scm \ diff --git a/gnu/services/dav.scm b/gnu/services/dav.scm new file mode 100644 index 0000000000..875d197f2c --- /dev/null +++ b/gnu/services/dav.scm @@ -0,0 +1,107 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2024 Wilko Meyer +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (gnu services dav) + #:use-module (gnu packages dav) + #:use-module (gnu services) + #:use-module (gnu services configuration) + #:use-module (gnu services shepherd) + #:use-module (guix deprecation) + #:use-module (guix gexp) + #:use-module (guix records) + #:use-module (ice-9 match) + #:export (xandikos-configuration + xandikos-configuration? + xandikos-service-type)) + +;;; +;;; Xandikos. +;;; + +(define (port? x) + (and (number? x) + (and (>= x 0) (<= x 65535)))) + +(define-configuration/no-serialization xandikos-configuration + (package + (file-like xandikos) + "Xandikos package to use.") + (directory + (string "/var/xandikos/dav") + "Directory to serve from.") + (listen-address + (string "127.0.0.1") + "The address Xandikos listens on.") + (port + (port 8080) + "The port to run Xandikos on.") + (current-user-principal + (string "/user/") + "Path to current user principal.") + (route-prefix + (string "/") + "Path to Xandikos. (Useful when Xandikos is behind a reverse proxy.)") + (defaults? + (boolean #t) + "Create initial calendar and address book.") + (dump? + (boolean #f) + "Print DAV XML request/responses.") + (avahi? + (boolean #f) + "Announce services with avahi.") + (autocreate? + (boolean #f) + "Automatically create necessary directories.") + (no-strict? + (boolean #f) + "Enable workarounds for buggy CalDAV/CardDAV client implementations.")) + +(define (xandikos-shepherd-service config) + (match-record config + (package directory listen-address port current-user-principal + route-prefix defaults? dump? avahi? autocreate? + no-strict?) + (list + (shepherd-service + (provision '(xandikos)) + (documentation "Caldav/CardDAV server") + (requirement '(networking user-processes)) + (start #~(make-forkexec-constructor + (list #$(file-append xandikos "/bin/xandikos") + "--listen-address" #$listen-address + "--port" #$(number->string port) + "-d" #$directory + "--route-prefix" #$route-prefix + "--current-user-principal" #$current-user-principal + #$@(if dump? '("--dump-dav-xml") '()) + #$@(if avahi? '("--avahi") '()) + #$@(if autocreate? '("--autocreate") '()) + #$@(if defaults? '("--defaults") '()) + #$@(if no-strict? '("--no-strict") '())))) + (stop #~(make-kill-destructor)) + (respawn? #t))))) + +(define xandikos-service-type + (service-type + (name 'xandikos) + (extensions + (list (service-extension shepherd-root-service-type + xandikos-shepherd-service))) + (default-value (xandikos-configuration)) + (description "Service to run the @code{Xandikos} CalDAV/CardDAV server.")))