Re: [PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-26 Thread Ludovic Courtès
Julien Lepiller  skribis:

> From 1b60fac10caa9ab05cf169206004f46b46f2db40 Mon Sep 17 00:00:00 2001
> From: Julien Lepiller 
> Date: Wed, 23 Nov 2016 21:43:42 +0100
> Subject: [PATCH] services: factorize configuration abstraction
>
> * gnu/services/mail.scm and gnu/services/cups.scm (&configuration-error)
> (configuration-error, configuration-field-error)
> (configuration-missing-field, configuration-field, serialize-configuration)
> (validate-configuration, define-configuration, uglify-field-name)
> (serialize-field, serialize-package, serialize-string)
> (serialize-space-separated-string-list, space-separated-string-list?)
> (serialize-file-name, file-name?, serialize-field-name)
> (generate-documentation): Move duplicate code...
> * gnu/services/configuration.scm: ...to this new file.
> * gnu/local.mk (GNU_SYSTEM_MODULES): Add configuration.scm.

Applied.

I changed the copyright line back to Andy, since he wrote this, and
added #:autoload instead of #:use-module for the Texinfo modules.

Thank you!

Ludo’.



Re: [PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-26 Thread Ludovic Courtès
John Darrington  skribis:

> On Thu, Nov 24, 2016 at 07:17:42PM +0100, Julien Lepiller wrote:
>
>
>  +(define (serialize-string field-name val)
>  +  (serialize-field field-name val))
>
> I find it useful to allow such fields to take the value #f and meaning
> that they will be ignored by their respective serialize- procedures.
> For example:
>   (define (serialize-string field-name val)
>(if val
>  (serialize-field field-name val)))
>
>  +(define (serialize-boolean field-name val)
>  +  (serialize-string field-name (if val "yes" "no")))
>
> Some configs require "true" and "false" instead of "yes" and "no".  So perhaps
> this can be generalised a little.

Probably, but this patch is just about moving code around.  :-)

Ludo’.



Re: [PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-26 Thread John Darrington
On Thu, Nov 24, 2016 at 07:17:42PM +0100, Julien Lepiller wrote:


 +(define (serialize-string field-name val)
 +  (serialize-field field-name val))

I find it useful to allow such fields to take the value #f and meaning
that they will be ignored by their respective serialize- procedures.
For example:
  (define (serialize-string field-name val)
   (if val
 (serialize-field field-name val)))

 +(define (serialize-boolean field-name val)
 +  (serialize-string field-name (if val "yes" "no")))

Some configs require "true" and "false" instead of "yes" and "no".  So perhaps
this can be generalised a little.

J'
 


-- 
Avoid eavesdropping.  Send strong encrypted email.
PGP Public key ID: 1024D/2DE827B3 
fingerprint = 8797 A26D 0854 2EAB 0285  A290 8A67 719C 2DE8 27B3
See http://sks-keyservers.net or any PGP keyserver for public key.



signature.asc
Description: Digital signature


Re: [PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-24 Thread Julien Lepiller
On Thu, 24 Nov 2016 14:25:05 +0100
l...@gnu.org (Ludovic Courtès) wrote:

> Clément Lassieur  skribis:
> 
> >>> I would suggest moving it to a new (gnu services configuration)
> >>> module instead, if that’s fine with you.
> >>> 
> >>> Could you send an updated patch?  
> >> Here it is ;)  
> >
> > I think you forgot to add gnu/services/configuration.scm to your
> > patch :)  
> 
> And the gnu/local.mk changes in the commit log.
hm, sorry about that

> 
> Ludo'.

From 1b60fac10caa9ab05cf169206004f46b46f2db40 Mon Sep 17 00:00:00 2001
From: Julien Lepiller 
Date: Wed, 23 Nov 2016 21:43:42 +0100
Subject: [PATCH] services: factorize configuration abstraction

* gnu/services/mail.scm and gnu/services/cups.scm (&configuration-error)
(configuration-error, configuration-field-error)
(configuration-missing-field, configuration-field, serialize-configuration)
(validate-configuration, define-configuration, uglify-field-name)
(serialize-field, serialize-package, serialize-string)
(serialize-space-separated-string-list, space-separated-string-list?)
(serialize-file-name, file-name?, serialize-field-name)
(generate-documentation): Move duplicate code...
* gnu/services/configuration.scm: ...to this new file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add configuration.scm.
---
 gnu/local.mk   |   1 +
 gnu/services/configuration.scm | 205 +
 gnu/services/cups.scm  | 180 +++-
 gnu/services/mail.scm  | 183 +++-
 4 files changed, 233 insertions(+), 336 deletions(-)
 create mode 100644 gnu/services/configuration.scm

diff --git a/gnu/local.mk b/gnu/local.mk
index 4913727..03f4ad4 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -400,6 +400,7 @@ GNU_SYSTEM_MODULES =\
   %D%/services/admin.scm			\
   %D%/services/avahi.scm			\
   %D%/services/base.scm\
+  %D%/services/configuration.scm		\
   %D%/services/cups.scm\
   %D%/services/databases.scm			\
   %D%/services/dbus.scm\
diff --git a/gnu/services/configuration.scm b/gnu/services/configuration.scm
new file mode 100644
index 000..ed9285f
--- /dev/null
+++ b/gnu/services/configuration.scm
@@ -0,0 +1,205 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Julien Lepiller 
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see .
+
+(define-module (gnu services configuration)
+  #:use-module (guix packages)
+  #:use-module (guix records)
+  #:use-module (guix gexp)
+  #:use-module (texinfo)
+  #:use-module (texinfo serialize)
+  #:use-module (ice-9 match)
+  #:use-module ((srfi srfi-1) #:select (append-map))
+  #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-35)
+  #:export (configuration-field
+configuration-field-name
+configuration-missing-field
+configuration-field-error
+serialize-configuration
+define-configuration
+validate-configuration
+generate-documentation
+serialize-field
+serialize-string
+serialize-name
+serialize-space-separated-string-list
+space-separated-string-list?
+serialize-file-name
+file-name?
+serialize-boolean
+serialize-package))
+
+;;; Commentary:
+;;;
+;;; Syntax for defining complex configurations
+;;;
+;;; Code:
+
+(define-condition-type &configuration-error &error
+  configuration-error?)
+
+(define (configuration-error message)
+  (raise (condition (&message (message message))
+(&configuration-error
+(define (configuration-field-error field val)
+  (configuration-error
+   (format #f "Invalid value for field ~a: ~s" field val)))
+(define (configuration-missing-field kind field)
+  (configuration-error
+   (format #f "~a configuration missing required field ~a" kind field)))
+
+(define-record-type* 
+  configuration-field make-configuration-field configuration-field?
+  (name configuration-field-name)
+  (type configuration-field-type)
+  (getter configuration-field-getter)
+  (predicate configuration-field-predicate)
+  (serializer configuration-field-serializer)
+  (default-value-thunk configuration-field-default-value-thunk)
+  (documentation configuration-field-documentation))
+
+(define (serialize-configuration conf

Re: [PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-24 Thread Ludovic Courtès
Clément Lassieur  skribis:

>>> I would suggest moving it to a new (gnu services configuration) module
>>> instead, if that’s fine with you.
>>> 
>>> Could you send an updated patch?
>> Here it is ;)
>
> I think you forgot to add gnu/services/configuration.scm to your patch :)

And the gnu/local.mk changes in the commit log.

Ludo'.



Re: [PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-23 Thread Clément Lassieur
>> I would suggest moving it to a new (gnu services configuration) module
>> instead, if that’s fine with you.
>> 
>> Could you send an updated patch?
> Here it is ;)

I think you forgot to add gnu/services/configuration.scm to your patch :)



Re: [PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-23 Thread Julien Lepiller
On Tue, 22 Nov 2016 23:49:23 +0100
l...@gnu.org (Ludovic Courtès) wrote:

> Hi Julien,
> 
> Julien Lepiller  skribis:
> 
> > since I will probably use it in openvpn-service and maybe in
> > nginx-service, I moved the definitions of the documentation that was
> > duplicated in cups and dovecot to services.scm. Is it the best place
> > for it?  
> 
> Thanks for looking into it!
> 
> I would suggest moving it to a new (gnu services configuration) module
> instead, if that’s fine with you.
> 
> Could you send an updated patch?
Here it is ;)

> 
> BTW, I just checked and there’s at least one subtle difference between
> cups.scm and mail.scm: ‘define-configuration’ in cups.scm defines the
> constructor as a macro that calls ‘validate-configuration’:
> 
>(define-syntax-rule (stem arg (... ...))
>  (let ((conf (#,(id #'stem #'% #'stem) arg
> (... ... (validate-configuration conf
>#,(id #'stem #'stem
> #'-fields)) conf))
> 
> The version in mail.scm does not do that, but I think we want to
> preserve it (and your patch does seem to preserve that already).
> 
> Probably the are serializers that can be factorized as well.
I factorized what I saw that was in common between the two files in this
new patch.

> 
> > From 9acc9456f4e61506105bc109298aedb66e31efd0 Mon Sep 17 00:00:00
> > 2001 From: Julien Lepiller 
> > Date: Sun, 20 Nov 2016 17:56:08 +0100
> > Subject: [PATCH] services: Make dovecot and cups configuration
> > abstractions available.
> >
> > * gnu/services.scm: Add configuration-field,
> > configuration-missing-field, configuration-field-error,
> > serialize-confgiuration, define-configuration,
> > validate-configuration, validate-configuration and
> > generate-documetation.
> > * gnu/services/cups.scm: Use it.
> > * gnu/services/mail.scm: Use it.  
> 
> Please take some time to see the ChangeLog convention for this.
Is it better now?

> 
> > + ; (define (str x) (object->string x))
> > + ; (define (generate configuration-name)
> > + ;   (match (assq-ref documentation configuration-name)
> > + ; ((fields . sub-documentation)
> > + ;  `((para "Available " (code ,(str configuration-name)) "
> > fields are:")
> > + ;,@(map
> > + ;   (lambda (f)
> > + ; (let ((field-name (configuration-field-name f))  
> 
> Why comment things out?  Could it be moved to (gnu services
> configuration) as well?
> 
> Thanks!
> 
> Ludo’.

>From 5301dd605678686c1c37c0b6be92ff0d567ee63b Mon Sep 17 00:00:00 2001
From: Julien Lepiller 
Date: Wed, 23 Nov 2016 21:43:42 +0100
Subject: [PATCH] services: factorize configuration abstraction

* gnu/services/mail.scm and gnu/services/cups.scm (&configuration-error)
(configuration-error, configuration-field-error)
(configuration-missing-field, configuration-field, serialize-configuration)
(validate-configuration, define-configuration, uglify-field-name)
(serialize-field, serialize-package, serialize-string)
(serialize-space-separated-string-list, space-separated-string-list?)
(serialize-file-name, file-name?, serialize-field-name)
(generate-documentation): Move duplicate code...
* gnu/services/configuration.scm: ...to this new file.
---
 gnu/local.mk  |   1 +
 gnu/services/cups.scm | 180 -
 gnu/services/mail.scm | 183 +-
 3 files changed, 28 insertions(+), 336 deletions(-)

diff --git a/gnu/local.mk b/gnu/local.mk
index 4913727..03f4ad4 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -400,6 +400,7 @@ GNU_SYSTEM_MODULES =\
   %D%/services/admin.scm			\
   %D%/services/avahi.scm			\
   %D%/services/base.scm\
+  %D%/services/configuration.scm		\
   %D%/services/cups.scm\
   %D%/services/databases.scm			\
   %D%/services/dbus.scm\
diff --git a/gnu/services/cups.scm b/gnu/services/cups.scm
index 7542ee2..391046a 100644
--- a/gnu/services/cups.scm
+++ b/gnu/services/cups.scm
@@ -19,6 +19,7 @@
 (define-module (gnu services cups)
   #:use-module (gnu services)
   #:use-module (gnu services shepherd)
+  #:use-module (gnu services configuration)
   #:use-module (gnu system shadow)
   #:use-module (gnu packages admin)
   #:use-module (gnu packages cups)
@@ -26,16 +27,9 @@
   #:use-module (guix packages)
   #:use-module (guix records)
   #:use-module (guix gexp)
-  #:use-module (texinfo)
-  #:use-module (texinfo serialize)
   #:use-module (ice-9 match)
   #:use-module ((srfi srfi-1) #:select (append-map))
-  #:use-module (srfi srfi-34)
-  #:use-module (srfi srfi-35)
-  #:export (&cups-configuation-error
-cups-configuration-error?
-
-  

Re: [PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-22 Thread Ludovic Courtès
Hi Julien,

Julien Lepiller  skribis:

> since I will probably use it in openvpn-service and maybe in
> nginx-service, I moved the definitions of the documentation that was
> duplicated in cups and dovecot to services.scm. Is it the best place
> for it?

Thanks for looking into it!

I would suggest moving it to a new (gnu services configuration) module
instead, if that’s fine with you.

Could you send an updated patch?

BTW, I just checked and there’s at least one subtle difference between
cups.scm and mail.scm: ‘define-configuration’ in cups.scm defines the
constructor as a macro that calls ‘validate-configuration’:

   (define-syntax-rule (stem arg (... ...))
 (let ((conf (#,(id #'stem #'% #'stem) arg (... ...
   (validate-configuration conf
   #,(id #'stem #'stem #'-fields))
   conf))

The version in mail.scm does not do that, but I think we want to
preserve it (and your patch does seem to preserve that already).

Probably the are serializers that can be factorized as well.

> From 9acc9456f4e61506105bc109298aedb66e31efd0 Mon Sep 17 00:00:00 2001
> From: Julien Lepiller 
> Date: Sun, 20 Nov 2016 17:56:08 +0100
> Subject: [PATCH] services: Make dovecot and cups configuration abstractions
>  available.
>
> * gnu/services.scm: Add configuration-field, configuration-missing-field,
> configuration-field-error, serialize-confgiuration, define-configuration,
> validate-configuration, validate-configuration and generate-documetation.
> * gnu/services/cups.scm: Use it.
> * gnu/services/mail.scm: Use it.

Please take some time to see the ChangeLog convention for this.

> + ; (define (str x) (object->string x))
> + ; (define (generate configuration-name)
> + ;   (match (assq-ref documentation configuration-name)
> + ; ((fields . sub-documentation)
> + ;  `((para "Available " (code ,(str configuration-name)) " fields are:")
> + ;,@(map
> + ;   (lambda (f)
> + ; (let ((field-name (configuration-field-name f))

Why comment things out?  Could it be moved to (gnu services
configuration) as well?

Thanks!

Ludo’.



[PATCH] services: Make dovecot and cups configuration abstractions available

2016-11-20 Thread Julien Lepiller
Hi,

since I will probably use it in openvpn-service and maybe in
nginx-service, I moved the definitions of the documentation that was
duplicated in cups and dovecot to services.scm. Is it the best place
for it?>From 9acc9456f4e61506105bc109298aedb66e31efd0 Mon Sep 17 00:00:00 2001
From: Julien Lepiller 
Date: Sun, 20 Nov 2016 17:56:08 +0100
Subject: [PATCH] services: Make dovecot and cups configuration abstractions
 available.

* gnu/services.scm: Add configuration-field, configuration-missing-field,
configuration-field-error, serialize-confgiuration, define-configuration,
validate-configuration, validate-configuration and generate-documetation.
* gnu/services/cups.scm: Use it.
* gnu/services/mail.scm: Use it.
---
 gnu/services.scm  | 134 ++-
 gnu/services/cups.scm | 162 ---
 gnu/services/mail.scm | 170 ++
 3 files changed, 220 insertions(+), 246 deletions(-)

diff --git a/gnu/services.scm b/gnu/services.scm
index 693a7f8..abab1a6 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -28,6 +28,8 @@
   #:use-module (guix modules)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
+  #:use-module (texinfo)
+  #:use-module (texinfo serialize)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-9 gnu)
@@ -81,7 +83,16 @@
 %activation-service
 etc-service
 
-file-union))  ;XXX: for lack of a better place
+file-union  ;XXX: for lack of a better place
+  
+configuration-field
+configuration-field-name
+configuration-missing-field
+configuration-field-error
+serialize-configuration
+define-configuration
+validate-configuration
+generate-documentation))
 
 ;;; Comment:
 ;;;
@@ -612,4 +623,125 @@ TARGET-TYPE; return the root service adjusted accordingly."
(_ "more than one target service of type '~a'")
(service-type-name target-type)
 
+(define-condition-type &configuration-error &error
+  configuration-error?)
+
+(define (configuration-error message)
+  (raise (condition (&message (message message))
+(&configuration-error
+
+(define (configuration-field-error field val)
+  (configuration-error
+(format #f "Invalid value for field ~a: ~s" field val)))
+
+(define (configuration-missing-field kind field)
+  (configuration-error
+(format #f "~a configuration missing required field ~a" kind field)))
+
+(define-record-type* 
+  configuration-field make-configuration-field configuration-field?
+  (name configuration-field-name)
+  (type configuration-field-type)
+  (getter configuration-field-getter)
+  (predicate configuration-field-predicate)
+  (serializer configuration-field-serializer)
+  (default-value-thunk configuration-field-default-value-thunk)
+  (documentation configuration-field-documentation))
+
+(define (serialize-configuration config fields)
+  (for-each (lambda (field)
+  ((configuration-field-serializer field)
+   (configuration-field-name field)
+   ((configuration-field-getter field) config)))
+fields))
+
+(define (validate-configuration config fields)
+  (for-each (lambda (field)
+  (let ((val ((configuration-field-getter field) config)))
+(unless ((configuration-field-predicate field) val)
+  (configuration-field-error
+(configuration-field-name field) val
+fields))
+
+(define-syntax define-configuration
+  (lambda (stx)
+(define (id ctx part . parts)
+  (let ((part (syntax->datum part)))
+(datum->syntax
+ ctx
+ (match parts
+   (() part)
+   (parts (symbol-append part
+ (syntax->datum (apply id ctx parts
+(syntax-case stx ()
+  ((_ stem (field (field-type def) doc) ...)
+   (with-syntax (((field-getter ...)
+  (map (lambda (field)
+ (id #'stem #'stem #'- field))
+   #'(field ...)))
+ ((field-predicate ...)
+  (map (lambda (type)
+ (id #'stem type #'?))
+   #'(field-type ...)))
+ ((field-serializer ...)
+  (map (lambda (type)
+ (id #'stem #'serialize- type))
+   #'(field-type ...
+   #`(begin
+   (define-record-type* #,(id #'stem #'< #'stem #'>)
+ #,(id #'ste