Hi

Attached is a lens I have written (largely copied from multipath.aug)
for corosync.conf (see www.corosync.org).

This is the first lenses that I have written so please could you give
me some review/feedback.

On the augeas web site you suggest keeping the lens with the project.
I agree this is a good idea, but how do you suggest packaging lenses?

For projects that have their own lenses, are they usually installed by
default or do they have their own rpm (<package>-augeas)?

So for corosync right now the lens will only be used by our test suite
and will not depend on augeas at all.

Also where should we install the lens to ("/usr/share/augeas/lenses" or
elsewhere)? So if someone wants to use augtool to configure corosync
they (or augtool) need to know where to find the lens.
Does augeas have a pathing system (some way corosync.rpm can configure
augeas where the lens is)?

Since I have largely copied this from multipath.aug are you happy for me
to license corosync.aug as BSD (to be consistent with the other corosync
files)? 

Regards
Angus Salkeld

module Test_corosync =

  let conf = "# Please read the corosync.conf.5 manual page
compatibility: whitetank

totem {
        version: 2
        secauth: off
        threads: 0
    clear_node_high_bit: no
    rrp_mode: none
    transport: udp
    token: 1000
        interface {
                ringnumber: 0
                bindnetaddr: 192.168.122.1
                mcastaddr: 226.94.1.1
                mcastport: 5405
        }
}

logging {
        fileline: off
    function_name: on
        to_stderr: yes
        to_logfile: yes
        to_syslog: yes
        logfile: /tmp/corosync.log
        debug: off
        timestamp: on
        logger_subsys {
            to_syslog: no
                subsys: CPG
                debug: on
        }
        logger_subsys {
            to_stderr: no
            logfile: /tmp/corosync-msg.log
                subsys: MSG
                debug: on
        }
}

amf {
        mode: disabled
}\n"

test Corosync.lns get conf =

  { "#comment" = "Please read the corosync.conf.5 manual page" }
  { "compatibility" = "whitetank" }
  { }
  { "totem"
        { "version" = "2" }
        { "secauth" = "off" }
        { "threads" = "0" }
    { "clear_node_high_bit" = "no" }
    { "rrp_mode" = "none" }
    { "transport" = "udp" }
    { "token" = "1000" }
        { "interface"
                { "ringnumber" = "0" }
                { "bindnetaddr" = "192.168.122.1" }
                { "mcastaddr" = "226.94.1.1" }
                { "mcastport" = "5405" } } }
  { }
  { "logging"
        { "fileline" = "off" }
        { "function_name" = "on" }
        { "to_stderr" = "yes" }
        { "to_logfile" = "yes" }
        { "to_syslog" = "yes" }
        { "logfile" = "/tmp/corosync.log" }
        { "debug" = "off" }
        { "timestamp" = "on" }
        { "logger_subsys"
            { "to_syslog" = "no" }
                { "subsys" = "CPG" }
                { "debug" = "on" } }
        { "logger_subsys"
            { "to_stderr" = "no" }
            { "logfile" = "/tmp/corosync-msg.log" }
                { "subsys" = "MSG" }
                { "debug" = "on" } } }
  { }
  { "amf"
        { "mode" = "disabled" } }
(* Process /etc/corosync/corosync.conf                             *)
(* The lens is based on the corosync.conf(5) man page     *)
module Corosync =

autoload xfm

let comment = Util.comment
let empty = Util.empty
let dels = Util.del_str
let eol = Util.eol

let ws = del /[ \t]+/ " "
let wsc = del /:[ \t]+/ ": "
let indent = del /[ \t]*/ ""
(* We require that braces are always followed by a newline *)
let obr = del /\{([ \t]*)\n/ "{\n"
let cbr = del /[ \t]*}[ \t]*\n/ "}\n"

let ikey (k:regexp) = indent . key k

let section (n:regexp) (b:lens) =
  [ ikey n . ws . obr . (b|empty|comment)* . cbr ]

let kv (k:regexp) (v:regexp) =
  [ ikey k .  wsc . store v . eol ]

(* FIXME: it would be much more concise to write                       *)
(* [ key k . ws . (bare | quoted) ]                                    *)
(* but the typechecker trips over that                                 *)
let qstr (k:regexp) =
  let delq = del /['"]/ "\"" in
  let bare = del /["']?/ "" . store /[^"' \t\n]+/ . del /["']?/ "" in
  let quoted = delq . store /.*[ \t].*/ . delq in
  [ ikey k . wsc . bare . eol ]
 |[ ikey k . wsc . quoted . eol ]

(* The compatibility option *)
let compatibility = kv "compatibility" /whitetank|none/


(* A integer subsection *)
let interface =
  let setting =
    kv "ringnumber" Rx.integer
    |kv "mcastport" Rx.integer
    |qstr /bindnetaddr|mcastaddr/ in
  section "interface" setting

(* The totem section *)
let totem =
  let setting =
    kv "clear_node_high_bit" /yes|no/
    |kv "rrp_mode" /none|active|passive/
    |kv "vsftype" /none|ykd/
    |kv "secauth" /on|off/
    |kv "transport" /udp|iba/
    |kv "version" Rx.integer
    |kv "nodeid" Rx.integer
    |kv "threads" Rx.integer
    |kv "netmtu" Rx.integer
    |kv "token" Rx.integer
    |kv "token_retransmit" Rx.integer
    |kv "hold" Rx.integer
    |kv "token_retransmits_before_loss_const" Rx.integer
    |kv "join" Rx.integer
    |kv "send_join" Rx.integer
    |kv "consensus" Rx.integer
    |kv "merge" Rx.integer
    |kv "downcheck" Rx.integer
    |kv "fail_to_recv_const" Rx.integer
    |kv "seqno_unchanged_const" Rx.integer
    |kv "heartbeat_failures_allowed" Rx.integer
    |kv "max_network_delay" Rx.integer
    |kv "max_messages" Rx.integer
    |kv "window_size" Rx.integer
    |kv "rrp_problem_count_timeout" Rx.integer
    |kv "rrp_problem_count_threshold" Rx.integer
    |kv "rrp_token_expired_timeout" Rx.integer
    |interface in
  section "totem" setting

let common_logging =
   kv "to_syslog" /yes|no|on|off/
   |kv "to_stderr" /yes|no|on|off/
   |kv "to_logfile" /yes|no|on|off/
   |kv "debug" /yes|no|on|off/
   |kv "logfile_priority" /alert|crit|debug|emerg|err|info|notice|warning/
   |kv "syslog_priority" /alert|crit|debug|emerg|err|info|notice|warning/
   |kv "syslog_facility" 
/daemon|local0|local1|local2|local3|local4|local5|local6|local7/
   |qstr /logfile|tags/

(* A logger_subsys subsection *)
let logger_subsys =
  let setting =
    qstr /subsys/
   |common_logging in
  section "logger_subsys" setting


(* The logging section *)
let logging =
  let setting =
   kv "fileline" /yes|no|on|off/
   |kv "function_name" /yes|no|on|off/
   |kv "timestamp" /yes|no|on|off/
   |common_logging
   |logger_subsys in
  section "logging" setting


(* The amf section *)
let amf =
  let setting =
   kv "mode" /enabled|disabled/ in
  section "amf" setting


let lns = (comment|empty|compatibility|totem|logging|amf)*

let xfm = transform lns (incl "/etc/corosync/corosync.conf")
_______________________________________________
augeas-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/augeas-devel

Reply via email to