summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Pykhalov <go.wigust@gmail.com>2018-07-28 01:37:56 +0300
committerOleg Pykhalov <go.wigust@gmail.com>2018-08-01 03:24:43 +0300
commit2c6b63a2f7e26099a1924aa4b9a3906aa0513694 (patch)
treec73b4dfc429e4655e734038e0e759b151753c675
parentwigust: services: Update ddclient service. (diff)
downloadguix-wigust-2c6b63a2f7e26099a1924aa4b9a3906aa0513694.tar.gz
wigust: services: Update ddclient service.
* wigust/services/dns.scm: Update ddclient service.
-rw-r--r--wigust/services/dns.scm105
1 files changed, 55 insertions, 50 deletions
diff --git a/wigust/services/dns.scm b/wigust/services/dns.scm
index 18c7614..db4584c 100644
--- a/wigust/services/dns.scm
+++ b/wigust/services/dns.scm
@@ -32,6 +32,7 @@
#:use-module (srfi srfi-35)
#:use-module (ice-9 match)
#:use-module (ice-9 regex)
+ #:use-module (ice-9 rdelim)
#:export (ddclient-service-type
ddclient-configuration
opaque-ddclient-configuration))
@@ -81,31 +82,29 @@
(string "root")
"Mail failed update to user.")
(pid
- (string "/var/run/ddclient.pid")
+ (string "/var/run/ddclient/ddclient.pid")
"The ddclient PID file.")
(ssl
(boolean #t)
"Enable SSL support.")
+ (user
+ (string "ddclient")
+ "Specifies the user name or ID that is used when running ddclient
+program.")
+ (group
+ (string "ddclient")
+ "Group of the user who will run the ddclient program.")
+ (secret-file
+ (string "/etc/ddclient/secrets.conf")
+ "Secret file which will be appended to ddclient.conf file.")
(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/ddclient.pid")
- "The ddclient PID file."))
-
(define (ddclient-account config)
"Return the user accounts and user groups for CONFIG."
- (let ((ddclient-user "ddclient")
- (ddclient-group "ddclient"))
+ (let ((ddclient-user (ddclient-configuration-user config))
+ (ddclient-group (ddclient-configuration-group config)))
(list (user-group
(name ddclient-group)
(system? #t))
@@ -118,39 +117,47 @@
(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)
+ (ice-9 rdelim))
#~(begin
- (use-modules (guix build utils))
- ;; 'ddclient' complains about ddclient.conf file permissions, which
- ;; rules out /gnu/store. Thus we copy the ddclient.conf to /etc.
- (let ((user (getpw "ddclient"))
- (group (getpw "ddclient")))
+ (use-modules (guix build utils)
+ (ice-9 rdelim))
+ (let ((ddclient-user
+ #$(passwd:uid (getpw (ddclient-configuration-user config))))
+ (ddclient-group
+ #$(passwd:gid (getpw (ddclient-configuration-group config))))
+ (ddclient-secret-file
+ #$(ddclient-configuration-secret-file config)))
+ ;; 'ddclient' complains about ddclient.conf file permissions, which
+ ;; rules out /gnu/store. Thus we copy the ddclient.conf to /etc.
(for-each (lambda (dir)
(mkdir-p dir)
(chmod dir #o700)
- (chown dir (passwd:uid user) (group:gid group)))
+ (chown dir ddclient-user ddclient-group))
'("/var/cache/ddclient" "/var/run/ddclient"
"/etc/ddclient"))
- (let ((file "/etc/ddclient/ddclient.conf"))
- (copy-file #$(plain-file "ddclient.conf" config-str) file)
- (chmod file #o600)
- (chown file (passwd:uid user) (group:gid group)))))))
+ (with-output-to-file "/etc/ddclient/ddclient.conf"
+ (lambda ()
+ (display
+ (string-append
+ "# Generated by 'ddclient-service'.\n\n"
+ #$(with-output-to-string
+ (lambda ()
+ (serialize-configuration config
+ ddclient-configuration-fields)))
+ "\n\n# Appended from '" ddclient-secret-file "'.\n\n"
+ (with-input-from-file ddclient-secret-file
+ read-string)))))
+ (chmod "/etc/ddclient/ddclient.conf" #o600)
+ (chown "/etc/ddclient/ddclient.conf"
+ ddclient-user ddclient-group)))))
(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))))
+ (let ((ddclient (ddclient-configuration-ddclient config))
+ (ddclient-pid (ddclient-configuration-pid config))
+ (ddclient-user (ddclient-configuration-user config))
+ (ddclient-group (ddclient-configuration-group config)))
(list (shepherd-service
(provision '(ddclient))
(documentation "Run ddclient daemon.")
@@ -158,23 +165,26 @@
(list #$(file-append ddclient "/bin/ddclient")
"-foreground" "-file" "/etc/ddclient/ddclient.conf"
"-debug" "-verbose")
- #:pid-file #$pid
+ #:pid-file #$ddclient-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")
- #:user "ddclient"
- #:group "ddclient"))
+ #:user ddclient-user
+ #:group ddclient-group))
(stop #~(make-kill-destructor))))))
(define ddclient-service-type
(service-type
(name 'ddclient)
(extensions
- (list (service-extension account-service-type ddclient-account)
- (service-extension shepherd-root-service-type ddclient-shepherd-service)
- (service-extension activation-service-type ddclient-activation)))
+ (list (service-extension account-service-type
+ ddclient-account)
+ (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.")))
@@ -183,8 +193,3 @@ ddclient.")))
(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))