;; disfluid, implementation of the Solid specification
;; Copyright (C) 2020, 2021 Vivien Kraus
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.
;; This program 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 Affero General Public License for more details.
;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see .
(define-module (vkraus services disfluid)
#:use-module (gnu services)
#:use-module (gnu services shepherd)
#:use-module (gnu services admin)
#:use-module (gnu services web)
#:use-module (gnu system shadow)
#:use-module (gnu packages admin)
#:use-module (vkraus packages disfluid)
#:use-module (guix gexp)
#:use-module (guix modules)
#:use-module (guix records)
#:use-module (ice-9 match)
#:use-module (ice-9 optargs))
(define-record-type*
disfluid-configuration
make-disfluid-configuration
disfluid-configuration?
(disfluid disfluid-configuration-disfluid
(default disfluid))
(complete-corresponding-source
disfluid-configuration-complete-corresponding-source)
(configuration disfluid-configuration-configuration)
(port disfluid-issuer-configuration-port (default 8088))
(extra-options
disfluid-issuer-configuration-extra-options
(default '())))
(export
disfluid-configuration
make-disfluid-configuration
disfluid-configuration?
disfluid-configuration-disfluid
disfluid-configuration-complete-corresponding-source
disfluid-configuration-configuration
disfluid-issuer-configuration-port
disfluid-issuer-configuration-extra-options)
(define configuration->shepherd-service
(match-lambda
(($
disfluid ccs configuration port extra-options)
`(,(shepherd-service
(provision (list 'disfluid))
(documentation (format #f "Run disfluid"))
(requirement '(user-processes))
(modules '((gnu build shepherd)
(gnu system file-systems)))
(start
(with-imported-modules
(source-module-closure
'((gnu build shepherd)
(gnu system file-systems)))
#~(begin
(let* ((user (getpwnam "disfluid"))
(prepare-directory
(lambda (dir)
(mkdir-p dir)
(chown dir (passwd:uid user) (passwd:gid user))
(chmod dir #o700))))
(prepare-directory "/var/log/disfluid")
(prepare-directory "/var/lib/disfluid")
(prepare-directory "/var/cache/disfluid"))
(make-forkexec-constructor
(list
(string-append #$disfluid "/bin/disfluid")
"-S" #$ccs
"-c" #$configuration
"-p" (with-output-to-string (lambda () (display #$port)))
"-l" "server.log"
"-e" "server.err"
#$@extra-options)
#:user "disfluid"
#:group "disfluid"
#:directory "/var/log/disfluid"
#:environment-variables
'("XDG_DATA_HOME=/var/lib/disfluid"
"XDG_CACHE_HOME=/var/cache/disfluid")))))
(stop #~(make-kill-destructor)))))))
(define %disfluid-accounts
(list (user-group (name "disfluid")
(system? #t))
(user-account
(name "disfluid")
(group "disfluid")
(system? #t)
(comment "The user that runs the disfluid servers.")
(home-directory "/var/empty")
(shell (file-append shadow "/sbin/nologin")))))
(define configuration->log-rotation
(match-lambda
(($
disfluid ccs configuration port extra-options)
`(,(log-rotation
(frequency 'daily)
(files
(map (lambda (ext)
(format #f "/var/log/disfluid/server.~a" ext))
'("log err")))
(options '("sharedscripts" "storedir /var/log/disfluid")))))))
(define-public disfluid-service-type
(service-type
(name 'disfluid)
(extensions
(list
(service-extension account-service-type
(const %disfluid-accounts))
(service-extension rottlog-service-type
configuration->log-rotation)
(service-extension
shepherd-root-service-type
configuration->shepherd-service)))))
(define-public disfluid-website
(nginx-server-configuration
(server-name '("disfluid.planete-kraus.eu" "webid-oidc.planete-kraus.eu"))
(listen '("443 ssl" "[::]:443 ssl"))
(ssl-certificate "/etc/letsencrypt/live/planete-kraus.eu/fullchain.pem")
(ssl-certificate-key "/etc/letsencrypt/live/planete-kraus.eu/privkey.pem")
(root disfluid:website)
(locations
(list
(nginx-location-configuration
(uri "/project")
(body
(list "default_type text/turtle ;")))))))