summaryrefslogtreecommitdiff
path: root/gnu/services
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/services')
-rw-r--r--gnu/services/dav.scm107
1 files changed, 107 insertions, 0 deletions
diff --git a/gnu/services/dav.scm b/gnu/services/dav.scm
new file mode 100644
index 00000000000..875d197f2c6
--- /dev/null
+++ b/gnu/services/dav.scm
@@ -0,0 +1,107 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2024 Wilko Meyer <w@wmeyer.eu>
+;;;
+;;; 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 <http://www.gnu.org/licenses/>.
+
+(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 <xandikos-configuration>
+ (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.")))