services: Add knot-resolver-service-type.
* gnu/services/dns.scm (<knot-resolver-configuration>): New record type. (knot-resolver-activation, knot-resolver-shpherd-services): New procedures. (%knot-resolver-accounts, %kresd.conf, knot-resolver-service-type): New variables. * doc/guix.texi (DNS Services): Document it.master
parent
a35e16c00d
commit
6ec68c69b0
|
@ -21086,6 +21086,44 @@ The list of knot-zone-configuration used by this configuration.
|
|||
@end table
|
||||
@end deftp
|
||||
|
||||
@subsubheading Knot Resolver Service
|
||||
|
||||
@deffn {Scheme Variable} knot-resolver-service-type
|
||||
This this the type of the knot resolver service, whose value should be
|
||||
an @code{knot-resolver-configuration} object as in this example:
|
||||
|
||||
@lisp
|
||||
(service knot-resolver-service-type
|
||||
(knot-resolver-configuration
|
||||
(kresd-config-file (plain-file "kresd.conf" "
|
||||
net.listen('192.168.0.1', 5353)
|
||||
user('knot-resolver', 'knot-resolver')
|
||||
modules = @{ 'hints > iterate', 'stats', 'predict' @}
|
||||
cache.size = 100 * MB
|
||||
"))))
|
||||
@end lisp
|
||||
|
||||
For more information, refer its @url{https://knot-resolver.readthedocs.org/en/stable/daemon.html#configuration, manual}.
|
||||
@end deffn
|
||||
|
||||
@deftp {Data Type} knot-resolver-configuration
|
||||
Data type representing the configuration of knot-resolver.
|
||||
|
||||
@table @asis
|
||||
@item @code{package} (default: @var{knot-resolver})
|
||||
Package object of the knot DNS resolver.
|
||||
|
||||
@item @code{kresd-config-file} (default: %kresd.conf)
|
||||
File-like object of the kresd configuration file to use, by default it
|
||||
will listen on @code{127.0.0.1} and @code{::1}.
|
||||
|
||||
@item @code{garbage-collection-interval} (default: 1000)
|
||||
Number of milliseconds for @code{kres-cache-gc} to periodically trim the cache.
|
||||
|
||||
@end table
|
||||
@end deftp
|
||||
|
||||
|
||||
@subsubheading Dnsmasq Service
|
||||
|
||||
@deffn {Scheme Variable} dnsmasq-service-type
|
||||
|
|
|
@ -45,6 +45,9 @@
|
|||
zone-file
|
||||
zone-entry
|
||||
|
||||
knot-resolver-service-type
|
||||
knot-resolver-configuration
|
||||
|
||||
dnsmasq-service-type
|
||||
dnsmasq-configuration
|
||||
|
||||
|
@ -637,6 +640,89 @@
|
|||
(service-extension account-service-type
|
||||
(const %knot-accounts))))))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Knot Resolver.
|
||||
;;;
|
||||
|
||||
(define-record-type* <knot-resolver-configuration>
|
||||
knot-resolver-configuration
|
||||
make-knot-resolver-configuration
|
||||
knot-resolver-configuration?
|
||||
(package knot-resolver-configuration-package
|
||||
(default knot-resolver))
|
||||
(kresd-config-file knot-resolver-kresd-config-file
|
||||
(default %kresd.conf))
|
||||
(garbage-collection-interval knot-resolver-garbage-collection-interval
|
||||
(default 1000)))
|
||||
|
||||
(define %kresd.conf
|
||||
(plain-file "kresd.conf" "-- -*- mode: lua -*-
|
||||
net = { '127.0.0.1', '::1' }
|
||||
user('knot-resolver', 'knot-resolver')
|
||||
modules = { 'hints > iterate', 'stats', 'predict' }
|
||||
cache.size = 100 * MB
|
||||
"))
|
||||
|
||||
(define %knot-resolver-accounts
|
||||
(list (user-group
|
||||
(name "knot-resolver")
|
||||
(system? #t))
|
||||
(user-account
|
||||
(name "knot-resolver")
|
||||
(group "knot-resolver")
|
||||
(system? #t)
|
||||
(home-directory "/var/cache/knot-resolver")
|
||||
(shell (file-append shadow "/sbin/nologin")))))
|
||||
|
||||
(define (knot-resolver-activation config)
|
||||
#~(begin
|
||||
(use-modules (guix build utils))
|
||||
(let ((rundir "/var/cache/knot-resolver")
|
||||
(owner (getpwnam "knot-resolver")))
|
||||
(mkdir-p rundir)
|
||||
(chown rundir (passwd:uid owner) (passwd:gid owner)))))
|
||||
|
||||
(define knot-resolver-shepherd-services
|
||||
(match-lambda
|
||||
(($ <knot-resolver-configuration> package
|
||||
kresd-config-file
|
||||
garbage-collection-interval)
|
||||
(list
|
||||
(shepherd-service
|
||||
(provision '(kresd))
|
||||
(requirement '(networking))
|
||||
(documentation "Run the Knot Resolver daemon.")
|
||||
(start #~(make-forkexec-constructor
|
||||
'(#$(file-append package "/sbin/kresd")
|
||||
"-c" #$kresd-config-file "-f" "1"
|
||||
"/var/cache/knot-resolver")))
|
||||
(stop #~(make-kill-destructor)))
|
||||
(shepherd-service
|
||||
(provision '(kres-cache-gc))
|
||||
(requirement '(user-processes))
|
||||
(documentation "Run the Knot Resolver Garbage Collector daemon.")
|
||||
(start #~(make-forkexec-constructor
|
||||
'(#$(file-append package "/sbin/kres-cache-gc")
|
||||
"-d" #$(number->string garbage-collection-interval)
|
||||
"-c" "/var/cache/knot-resolver")
|
||||
#:user "knot-resolver"
|
||||
#:group "knot-resolver"))
|
||||
(stop #~(make-kill-destructor)))))))
|
||||
|
||||
(define knot-resolver-service-type
|
||||
(service-type
|
||||
(name 'knot-resolver)
|
||||
(extensions
|
||||
(list (service-extension shepherd-root-service-type
|
||||
knot-resolver-shepherd-services)
|
||||
(service-extension activation-service-type
|
||||
knot-resolver-activation)
|
||||
(service-extension account-service-type
|
||||
(const %knot-resolver-accounts))))
|
||||
(default-value (knot-resolver-configuration))
|
||||
(description "Run the Knot DNS Resolver.")))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Dnsmasq.
|
||||
|
|
Reference in New Issue