[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#32141] [PATCH] services: Add ddclient service.
From: |
Oleg Pykhalov |
Subject: |
[bug#32141] [PATCH] services: Add ddclient service. |
Date: |
Fri, 13 Jul 2018 17:58:54 +0300 |
* gnu/services/dns.scm (ddclient-configuration, opaque-ddclient-configuration,
ddclient-service-type): New variables.
(uglify-field-name, serialize-field, serialize-boolean, serialize-integer,
serialize-string, serialize-list, serialize-extra-options,
ddclient-activation, ddclient-shepherd-service,
generate-ddclient-documentation, generate-opaque-ddclient-documentation): New
procedures.
* doc/guix.texi (DNS Services): Document it.
---
doc/guix.texi | 107 +++++++++++++++++++++++++++++++++
gnu/services/dns.scm | 137 ++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 243 insertions(+), 1 deletion(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index eaec4c422..fcc7c0037 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -17123,6 +17123,113 @@ When false, disable negative caching.
@end table
@end deftp
address@hidden ddclient Service
+
address@hidden ddclient
address@hidden://sourceforge.net/projects/ddclient/, ddclient} is an address
+updating utility for dynamic DNS services.
+
+The following example will configure the service with values from
address@hidden file. You could get a @file{ddclient.conf} sample from
address@hidden package.
+
address@hidden
+(use-modules (ice-9 textual-ports))
+
+(service ddclient-service-type
+ (opaque-ddclient-configuration
+ (ddclient-conf
+ (call-with-input-file "ddclient.conf"
+ get-string-all))))
address@hidden example
+
address@hidden %start of fragment
+
+Available @code{opaque-ddclient-configuration} fields are:
+
address@hidden address@hidden parameter} package ddclient
+The ddclient package.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} string ddclient-conf
+The contents of the @file{ddclient.conf} to use.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} string pid
+The ddclient PID file.
+
+Defaults to @samp{"/var/run/ddclient.pid"}.
+
address@hidden deftypevr
+
+
address@hidden %end of fragment
+
+
address@hidden %start of fragment
+
+Available @code{ddclient-configuration} fields are:
+
address@hidden address@hidden parameter} package ddclient
+The ddclient package.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} integer daemon
+The period after which ddclient will retry to check IP and domain name.
+
+Defaults to @samp{300}.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} boolean syslog
+Use syslog for the output.
+
+Defaults to @samp{#t}.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} string mail
+Mail to user.
+
+Defaults to @samp{"root"}.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} string mail-failure
+Mail failed update to user.
+
+Defaults to @samp{"root"}.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} string pid
+The ddclient PID file.
+
+Defaults to @samp{"/var/run/ddclient.pid"}.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} boolean ssl
+Enable SSL support.
+
+Defaults to @samp{#t}.
+
address@hidden deftypevr
+
address@hidden address@hidden parameter} list extra-options
+Extra options will be appended to ddclient configuration file.
+
+Defaults to @samp{()}.
+
address@hidden deftypevr
+
+
address@hidden %end of fragment
+
+
@node VPN Services
@subsubsection VPN Services
@cindex VPN (virtual private network)
diff --git a/gnu/services/dns.scm b/gnu/services/dns.scm
index 2c57a36b8..7a3184b42 100644
--- a/gnu/services/dns.scm
+++ b/gnu/services/dns.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017 Julien Lepiller <address@hidden>
+;;; Copyright © 2018 Oleg Pykhalov <address@hidden>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -45,7 +46,11 @@
zone-entry
dnsmasq-service-type
- dnsmasq-configuration))
+ dnsmasq-configuration
+
+ ddclient-service-type
+ ddclient-configuration
+ opaque-ddclient-configuration))
;;;
;;; Knot DNS.
@@ -670,3 +675,133 @@
(compose list dnsmasq-shepherd-service))))
(default-value (dnsmasq-configuration))
(description "Run the dnsmasq DNS server.")))
+
+
+;;;
+;;; ddclient
+;;;
+
+(define (uglify-field-name field-name)
+ (string-delete #\? (symbol->string field-name)))
+
+(define (serialize-field field-name val)
+ (format #t "~a=~a\n" (uglify-field-name field-name) val))
+
+(define (serialize-boolean field-name val)
+ (serialize-field field-name (if val "yes" "no")))
+
+(define (serialize-integer field-name val)
+ (serialize-field field-name (number->string val)))
+
+(define (serialize-string field-name val)
+ (if (and (string? val) (string=? val ""))
+ ""
+ (serialize-field field-name val)))
+
+(define (serialize-list field-name val)
+ (if (null? val) "" (serialize-field field-name (string-join val))))
+
+(define (serialize-extra-options extra-options)
+ (string-join extra-options "\n" 'suffix))
+
+(define-configuration ddclient-configuration
+ (ddclient
+ (package ddclient)
+ "The ddclient package.")
+ (daemon
+ (integer 300)
+ "The period after which ddclient will retry to check IP and domain name.")
+ (syslog
+ (boolean #t)
+ "Use syslog for the output.")
+ (mail
+ (string "root")
+ "Mail to user.")
+ (mail-failure
+ (string "root")
+ "Mail failed update to user.")
+ (pid
+ (string "/var/run/ddclient.pid")
+ "The ddclient PID file.")
+ (ssl
+ (boolean #t)
+ "Enable SSL support.")
+ (extra-options
+ (list '())
+ "Extra options will be appended to ddclient configuration file."))
+
+(define-configuration opaque-ddclient-configuration
+ (ddclient
+ (package ddclient)
+ "The ddclient package.")
+ (ddclient-conf
+ (string (configuration-missing-field 'opaque-ddclient-configuration
+ 'ddclient-conf))
+ "The contents of the @file{ddclient.conf} to use.")
+ (pid
+ (string "/var/run/ddclient.pid")
+ "The ddclient PID file."))
+
+(define (ddclient-activation config)
+ "Return the activation GEXP for CONFIG."
+ (let ((config-str
+ (if (opaque-ddclient-configuration? config)
+ (opaque-ddclient-configuration-ddclient-conf config)
+ (with-output-to-string
+ (lambda ()
+ (serialize-configuration config
+ ddclient-configuration-fields))))))
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+ (mkdir-p "/var/cache/ddclient")
+ ;; 'ddclient' complains about ddclient.conf file permissions, which
+ ;; rules out /gnu/store. Thus we copy the ddclient.conf to /etc.
+ (mkdir-p "/etc/ddclient")
+ (let ((file "/etc/ddclient/ddclient.conf"))
+ (copy-file #$(plain-file "ddclient.conf" config-str) file)
+ (chmod file #o600))))))
+
+(define (ddclient-shepherd-service config)
+ "Return a <shepherd-service> for ddclient with CONFIG."
+ (let* ((opaque-config? (opaque-ddclient-configuration? config))
+ (pid (if opaque-config?
+ (opaque-ddclient-configuration-pid config)
+ (ddclient-configuration-pid config)))
+ (ddclient (if opaque-config?
+ (opaque-ddclient-configuration-ddclient config)
+ (ddclient-configuration-ddclient config))))
+ (list (shepherd-service
+ (provision '(ddclient))
+ (documentation "Run ddclient daemon.")
+ (start #~(make-forkexec-constructor
+ (list #$(file-append ddclient "/bin/ddclient")
+ "-foreground" "-file" "/etc/ddclient/ddclient.conf"
+ "-debug" "-verbose")
+ #:pid-file #$pid
+ #:environment-variables
+ (list "SSL_CERT_DIR=/run/current-system/profile\
+/etc/ssl/certs"
+ "SSL_CERT_FILE=/run/current-system/profile\
+/etc/ssl/certs/ca-certificates.crt")))
+ (stop #~(make-kill-destructor))))))
+
+(define ddclient-service-type
+ (service-type
+ (name 'ddclient)
+ (extensions
+ (list (service-extension shepherd-root-service-type
ddclient-shepherd-service)
+ (service-extension activation-service-type ddclient-activation)))
+ (default-value (ddclient-configuration))
+ (description "Configure address updating utility for dynamic DNS services,
+ddclient.")))
+
+(define (generate-ddclient-documentation)
+ (generate-documentation
+ `((ddclient-configuration ,ddclient-configuration-fields))
+ 'ddclient-configuration))
+
+(define (generate-opaque-ddclient-documentation)
+ (generate-documentation
+ `((opaque-ddclient-configuration ,opaque-ddclient-configuration-fields))
+ 'opaque-ddclient-configuration))
--
2.18.0
- [bug#32141] [PATCH] services: Add ddclient service.,
Oleg Pykhalov <=