aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Isaac2023-12-14 18:32:01 +0000
committerArun Isaac2023-12-14 18:32:50 +0000
commite2e13f38d80cd655fd7e3e51ec714025fe00f8b3 (patch)
tree0a2b3a56e42643916bdef2d181cfc90f99c292f7
parent0d7f9810590890d45732eada77a08a7f4e872ea8 (diff)
downloadguix-arunisaac-e2e13f38d80cd655fd7e3e51ec714025fe00f8b3.tar.gz
guix-arunisaac-e2e13f38d80cd655fd7e3e51ec714025fe00f8b3.tar.lz
guix-arunisaac-e2e13f38d80cd655fd7e3e51ec714025fe00f8b3.zip
Add PowerDNS package and service.
* arunisaac/powerdns.scm: New file.
-rw-r--r--arunisaac/powerdns.scm203
1 files changed, 203 insertions, 0 deletions
diff --git a/arunisaac/powerdns.scm b/arunisaac/powerdns.scm
new file mode 100644
index 0000000..690c021
--- /dev/null
+++ b/arunisaac/powerdns.scm
@@ -0,0 +1,203 @@
+(define-module (arunisaac powerdns)
+ #:use-module (ice-9 match)
+ #:use-module (gnu packages admin)
+ #:use-module (gnu packages boost)
+ #:use-module (gnu packages lua)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages tls)
+ #:use-module (gnu services)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu system shadow)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix download)
+ #:use-module (guix gexp)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix packages)
+ #:use-module (guix records)
+ #:export (powerdns-configuration
+ powerdns-configuration?
+ powerdns-configuration-package
+ powerdns-configuration-backends
+ powerdns-configuration-expand-alias?
+ powerdns-configuration-local-address
+ powerdns-configuration-local-port
+ powerdns-configuration-socket-directory
+ powerdns-configuration-resolver
+ powerdns-configuration-zone-cache-refresh-interval
+ powerdns-configuration-bind-config
+ powerdns-configuration-bind-check-interval
+ powerdns-configuration-pipe-abi-version
+ powerdns-configuration-pipe-command
+ powerdns-configuration-pipe-timeout
+ powerdns-configuration-pipe-regex
+ powerdns-service-type))
+
+(define pdns
+ (package
+ (name "pdns")
+ (version "4.6.2")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append "https://downloads.powerdns.com/releases/pdns-"
+ version ".tar.bz2"))
+ (sha256
+ (base32
+ "1f0r1gp64wx5rak1srzjxdzvbzq178xn2882hnsbn4dv8j4q8hzl"))))
+ (build-system gnu-build-system)
+ (arguments
+ (list #:configure-flags
+ #~(list "--disable-lua-records"
+ "--with-modules=bind"
+ (string-append "--sbindir="
+ (assoc-ref %outputs "out") "/bin"))))
+ (inputs
+ (list luajit openssl))
+ (native-inputs
+ (list boost pkg-config))
+ (home-page "https://www.powerdns.com/index.html")
+ (synopsis "Authoritative DNS name server")
+ (description "The PowerDNS Authoritative Server is a versatile nameserver
+which supports a large number of backends. These backends can either be plain
+zone files or be more dynamic in nature. PowerDNS backends are datastores
+that the server will consult and contains DNS records (and some metadata).
+The backends range from database backends (MySQL, PostgreSQL) and BIND zone
+files to co-processes and JSON APIs. Multiple backends can be enabled in the
+configuration. Each backend can be configured separately.")
+ (license (list license:gpl2 ; main license
+ ;; ext/json11, ext/yahttp, src_js/d3.js, src_js/jquery.js,
+ ;; src_js/moment.js, src_js/rickshaw.js
+ license:expat
+ ;; ext/luawrapper
+ license:bsd-3))))
+
+(define-record-type* <powerdns-configuration>
+ powerdns-configuration make-powerdns-configuration
+ powerdns-configuration?
+ (package powerdns-configuration-package
+ (default pdns))
+ (backends powerdns-configuration-backends
+ (default (list)))
+ (expand-alias? powerdns-configuration-expand-alias?
+ (default 'unset))
+ (local-address powerdns-configuration-local-address
+ (default #f))
+ (local-port powerdns-configuration-local-port
+ (default #f))
+ ;; TODO: Reconsider unset for socket dir.
+ (socket-directory powerdns-configuration-socket-directory
+ (default "/var/run/powerdns"))
+ (resolver powerdns-configuration-resolver
+ (default #f))
+ (zone-cache-refresh-interval powerdns-configuration-zone-cache-refresh-interval
+ (default #f))
+ ;; BIND backend configuration
+ (bind-config powerdns-configuration-bind-config
+ (default #f))
+ (bind-check-interval powerdns-configuration-bind-check-interval
+ (default #f))
+ ;; Pipe backend configuration
+ (pipe-abi-version powerdns-configuration-pipe-abi-version
+ (default #f))
+ (pipe-command powerdns-configuration-pipe-command
+ (default #f))
+ (pipe-timeout powerdns-configuration-pipe-timeout
+ (default #f))
+ (pipe-regex powerdns-configuration-pipe-regex
+ (default #f)))
+
+(define %powerdns-accounts
+ (list (user-account
+ (name "powerdns")
+ (group "powerdns")
+ (system? #t)
+ (comment "PowerDNS daemon user")
+ (home-directory "/var/empty")
+ (shell (file-append shadow "/sbin/nologin")))
+ (user-group
+ (name "powerdns")
+ (system? #t))))
+
+(define (pdns-conf-gexp config)
+ (match config
+ (($ <powerdns-configuration> package backends expand-alias?
+ local-address local-port socket-directory
+ resolver zone-cache-refresh-interval
+ bind-config bind-check-interval
+ pipe-abi-version pipe-command
+ pipe-timeout pipe-regex)
+ (when (and (not (eq? expand-alias? 'unset))
+ expand-alias?
+ (not resolver))
+ (error "expand-alias? will be ignored without a resolver"))
+ (when (and (member "pipe" backends)
+ (not pipe-command))
+ (error "pipe-command is mandatory when pipe backend is used"))
+ #~(begin
+ (define (write-setting port key value)
+ "Write KEY=VALUE to PORT when VALUE is not #f."
+ (when value
+ (format port "~a=~a~%" key value)))
+
+ (call-with-output-file #$output
+ (lambda (port)
+ (write-setting port "setuid" "powerdns")
+ (write-setting port "setgid" "powerdns")
+ (write-setting port "launch" (and (not (null? '#$backends))
+ (string-join '#$backends ",")))
+ (write-setting port "expand-alias" #$(cond
+ ((eq? expand-alias? 'unset) #f)
+ (expand-alias? "yes")
+ (else "no")))
+ (write-setting port "local-port" #$local-address)
+ (write-setting port "local-port" #$local-port)
+ (write-setting port "socket-dir" #$socket-directory)
+ (write-setting port "resolver" #$resolver)
+ (write-setting port "zone-cache-refresh-interval" #$zone-cache-refresh-interval)
+ ;; BIND backend configuration
+ (write-setting port "bind-config" #$bind-config)
+ (write-setting port "bind-check-interval" #$bind-check-interval)
+ ;; Pipe backend configuration
+ (write-setting port "pipe-abi-version" #$pipe-abi-version)
+ (write-setting port "pipe-command" #$pipe-command)
+ (write-setting port "pipe-timeout" #$pipe-timeout)
+ (write-setting port "pipe-regex" #$pipe-regex)))))))
+
+(define (powerdns-activation config)
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+
+ (let ((user (getpw "powerdns"))
+ (socket-directory #$(powerdns-configuration-socket-directory config)))
+ ;; Create socket directory.
+ (mkdir-p socket-directory)
+ (chown socket-directory (passwd:uid user) (passwd:gid user))))))
+
+(define (powerdns-shepherd-service config)
+ (shepherd-service
+ (documentation "Run PowerDNS authoritative name server.")
+ (provision '(powerdns))
+ (requirement '(networking))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append (powerdns-configuration-package config)
+ "/bin/pdns_server")
+ (string-append
+ "--config-dir="
+ #$(file-union "powerdns"
+ `(("pdns.conf" ,(computed-file "pdns.conf"
+ (pdns-conf-gexp config)))))))
+ #:log-file "/var/log/pdns.log"))
+ (stop #~(make-kill-destructor))))
+
+(define powerdns-service-type
+ (service-type
+ (name 'powerdns)
+ (description "Run PowerDNS authoritative name server.")
+ (extensions (list (service-extension account-service-type
+ (const %powerdns-accounts))
+ (service-extension activation-service-type
+ powerdns-activation)
+ (service-extension shepherd-root-service-type
+ (compose list powerdns-shepherd-service))))
+ (default-value (powerdns-configuration))))