summary refs log tree commit diff
path: root/gnu/services/dns.scm
diff options
context:
space:
mode:
authorMarius Bakke <mbakke@fastmail.com>2018-06-11 23:52:15 +0200
committerMarius Bakke <mbakke@fastmail.com>2018-06-11 23:52:15 +0200
commita032b4454b3fc67e11e9fc2d8c2345288065fa29 (patch)
treec208124b79dbd2224b68c52106aa72ff2ebfa7ab /gnu/services/dns.scm
parentb5724230fed2d043206df20d12a45bb962b7ee77 (diff)
parent6321ce42ab4d9ab788d858cb19bde4aa7a0e3ecc (diff)
downloadguix-a032b4454b3fc67e11e9fc2d8c2345288065fa29.tar.gz
Merge branch 'master' into staging
Diffstat (limited to 'gnu/services/dns.scm')
-rw-r--r--gnu/services/dns.scm81
1 files changed, 80 insertions, 1 deletions
diff --git a/gnu/services/dns.scm b/gnu/services/dns.scm
index 673ab1a98d..2c57a36b84 100644
--- a/gnu/services/dns.scm
+++ b/gnu/services/dns.scm
@@ -27,6 +27,7 @@
   #:use-module (guix records)
   #:use-module (guix gexp)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-34)
   #:use-module (srfi srfi-35)
   #:use-module (ice-9 match)
@@ -41,7 +42,10 @@
             knot-configuration
             define-zone-entries
             zone-file
-            zone-entry))
+            zone-entry
+
+            dnsmasq-service-type
+            dnsmasq-configuration))
 
 ;;;
 ;;; Knot DNS.
@@ -591,3 +595,78 @@
                                            knot-activation)
                         (service-extension account-service-type
                                            (const %knot-accounts))))))
+
+
+;;;
+;;; Dnsmasq.
+;;;
+
+(define-record-type* <dnsmasq-configuration>
+  dnsmasq-configuration make-dnsmasq-configuration
+  dnsmasq-configuration?
+  (package          dnsmasq-configuration-package
+                    (default dnsmasq))  ;package
+  (no-hosts?        dnsmasq-configuration-no-hosts?
+                    (default #f))       ;boolean
+  (port             dnsmasq-configuration-port
+                    (default 53))       ;integer
+  (local-service?   dnsmasq-configuration-local-service?
+                    (default #t))       ;boolean
+  (listen-addresses dnsmasq-configuration-listen-address
+                    (default '()))      ;list of string
+  (resolv-file      dnsmasq-configuration-resolv-file
+                    (default "/etc/resolv.conf")) ;string
+  (no-resolv?       dnsmasq-configuration-no-resolv?
+                    (default #f))       ;boolean
+  (servers          dnsmasq-configuration-servers
+                    (default '()))      ;list of string
+  (cache-size       dnsmasq-configuration-cache-size
+                    (default 150))      ;integer
+  (negative-cache?  dnsmasq-configuration-negative-cache?
+                    (default #t)))      ;boolean
+
+(define dnsmasq-shepherd-service
+  (match-lambda
+    (($ <dnsmasq-configuration> package
+                                no-hosts?
+                                port local-service? listen-addresses
+                                resolv-file no-resolv? servers
+                                cache-size negative-cache?)
+     (shepherd-service
+      (provision '(dnsmasq))
+      (requirement '(networking))
+      (documentation "Run the dnsmasq DNS server.")
+      (start #~(make-forkexec-constructor
+                '(#$(file-append package "/sbin/dnsmasq")
+                  "--keep-in-foreground"
+                  "--pid-file=/run/dnsmasq.pid"
+                  #$@(if no-hosts?
+                         '("--no-hosts")
+                         '())
+                  #$(format #f "--port=~a" port)
+                  #$@(if local-service?
+                         '("--local-service")
+                         '())
+                  #$@(map (cut format #f "--listen-address=~a" <>)
+                          listen-addresses)
+                  #$(format #f "--resolv-file=~a" resolv-file)
+                  #$@(if no-resolv?
+                         '("--no-resolv")
+                         '())
+                  #$@(map (cut format #f "--server=~a" <>)
+                          servers)
+                  #$(format #f "--cache-size=~a" cache-size)
+                  #$@(if negative-cache?
+                         '()
+                         '("--no-negcache")))
+                #:pid-file "/run/dnsmasq.pid"))
+      (stop #~(make-kill-destructor))))))
+
+(define dnsmasq-service-type
+  (service-type
+   (name 'dnsmasq)
+   (extensions
+    (list (service-extension shepherd-root-service-type
+                             (compose list dnsmasq-shepherd-service))))
+   (default-value (dnsmasq-configuration))
+   (description "Run the dnsmasq DNS server.")))