(define-module (rodion services miniflux) #:use-module (gnu services shepherd) #:use-module (gnu services) #:use-module (gnu services configuration) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix records) #:use-module (gnu packages admin) #:use-module (gnu services databases) #:use-module (rodion packages go) #:use-module (ice-9 string-fun) #:export (miniflux-service-type miniflux-configuration miniflux-configuration? miniflux-configuration-test?)) (define (initial-string? val) (string? val)) (define (serialize-string field-name val) (format #f "~a=~a\n" (string-upcase (string-replace-substring (if (symbol? field-name) (symbol->string field-name) field-name) "-" "_")) val)) (define (serialize-initial-string field-name val) (serialize-string (string-drop (symbol->string field-name) 8) val)) (define (non-negative-integer? val) (and (exact-integer? val) (not (negative? val)))) (define (serialize-non-negative-integer field-name val) (serialize-string field-name (number->string val))) (define-configuration miniflux-configuration (port (non-negative-integer 8080) "Listening port") (initial-admin-username (initial-string "admin") "Initial admin username") (initial-admin-password (initial-string "password") "Initial admin password") (user (string "miniflux") "User name for Postgresql and system account") (database-url (string "host=/var/run/postgresql") "PostgreSQL connection string") (group (string "miniflux") "Group for the system account" empty-serializer) (log-file (string "/var/log/miniflux.log") "Path to the log file" empty-serializer)) (define (miniflux-shepherd-service config) (let* ((config-file (mixed-text-file "miniflux.conf" (serialize-configuration config miniflux-configuration-fields)))) (list (shepherd-service (documentation "Run Miniflux server") (provision '(miniflux)) (requirement '(networking postgresql)) (start #~(make-forkexec-constructor (list (string-append #$miniflux "/bin/miniflux") "-config-file" #$config-file) #:user #$(miniflux-configuration-user config) #:group #$(miniflux-configuration-group config) #:log-file #$(miniflux-configuration-log-file config))) (stop #~(make-kill-destructor)))))) (define (miniflux-account config) (list (user-group (name (miniflux-configuration-group config)) (system? #t)) (user-account (name (miniflux-configuration-user config)) (group (miniflux-configuration-group config)) (home-directory "/var/empty") (shell (file-append shadow "/sbin/nologin")) (system? #t)))) (define (miniflux-postgresql-role config) (list (postgresql-role (name (miniflux-configuration-user config)) (create-database? #t)))) (define miniflux-service-type (service-type (name 'miniflux) (description "Miniflux service") (default-value (miniflux-configuration)) (extensions (list (service-extension account-service-type miniflux-account) (service-extension postgresql-service-type (const #t)) (service-extension postgresql-role-service-type miniflux-postgresql-role) (service-extension shepherd-root-service-type miniflux-shepherd-service)))))