help-guix
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Help on writing config serialiser


From: Simon Streit
Subject: Help on writing config serialiser
Date: Mon, 24 Jan 2022 17:13:09 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux)

Hello!

I am trying to write a config serialiser for Samba's smb.conf.  While
developing the service, I noticed that my current approach should be
done in while using a config serialiser.  I modified the example that
is in the manual:
--8<---------------cut here---------------start------------->8---
(use-modules (gnu services)
             (guix gexp)
             (gnu services configuration)
             (srfi srfi-26)
             (srfi srfi-1))

;; Turn field names, which are Scheme symbols into strings
(define (uglify-field-name field-name)
  (let ((str (symbol->string field-name)))
    ;; field? -> is-field
    (if (string-suffix? "?" str)
        (string-append "is-" (string-drop-right str 1))
        str)))

(define (serialize-string field-name value)
  #~(string-append #$(uglify-field-name field-name) " = " #$value "\n"))

(define (serialize-integer field-name value)
  (serialize-string field-name (number->string value)))

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

;;; [sections]
(define (serialize-section-name field-name value)
  #~(string-append "\n[" #$value "]\n"))

(define (list-of-smb-conf-sections? lst) ;wrong type to apply?!?
  (every smb-conf-section? lst))

(define (serialize-list-of-smb-conf-sections field-name value)
  #~(string-append #$@(map (cut serialize-configuration <>
                                smb-conf-section-fields)
                           value)))

;;; [global]
(define (serialize-smb-conf configuration)
  (mixed-text-file
   "smb.conf"
   #~(string-append ;; "[global]\n"
                    #$(serialize-configuration
                       configuration smb-conf-fields))))

(define-maybe integer)
(define-maybe string)


;;; section part

(define-configuration smb-conf-section
  ;; (package
  ;;   (file-like samba)
  ;;   "The @var{samba} package.")

  (section-name
   (string)
   "Name of section that describes a shared resource, also known as
``share''.  The section name is the name of the shared resource and
the parameters withing the section define the shares attributes."
   serialize-section-name)

  ;; From here on all parameter options described in smb.conf(5)
  ;; should comes below.  Currently this list is incomplete, needs
  ;; testing, and it would be nice to have a converter to easily
  ;; convert the parameters directly found in Samba's sources.

  ;; For instance, the manpage for smb.conf is automatically
  ;; generated.  It should be possible to extract this from source,
  ;; and normalise it here.

  (workgroup                            ;(G)
   ;; (string "WORKGROUP")
   (maybe-string "WORKGROUP")
   "This controls what workgroup your server will appear to be in when
queried by clients.  Note that this parameter also controls the Domain
name used with the @code{security = domain} setting.

Default: @code{(\"WORKGROUP\")}

Example: @code{(\"MYGROUP\")}"))

;;; main part

(define-configuration smb-conf
  (workgroup
   (string "WORKGROUP")
   "")

  (sections
   (list-of-smb-conf-sections '())
   "List of sections are generated here."))

(define my-smb-conf
  (smb-conf
   ;; (workgroup "GNU")
   (sections
    (list
     (smb-conf-section
      (section-name "global")
      (workgroup "GNU")
      )))
   ))
--8<---------------cut here---------------end--------------->8---

Unfortunately, this procedure fails with an error:
--8<---------------cut here---------------start------------->8---
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
In procedure every: Wrong type argument: #<syntax-transformer smb-conf-section?>
--8<---------------cut here---------------end--------------->8---

And this error is not clear to me yet.  I've been stuck at comparing the
example with my version.  I'd be happy to receive a bit of help. 


Kind regards
Simon 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]