[augeas-devel] leanse for corosync.conf and thoughts about packaging lenses
Angus Salkeld
asalkeld at redhat.com
Tue Feb 16 00:06:21 UTC 2010
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
-------------- next part --------------
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" } }
-------------- next part --------------
(* 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")
More information about the augeas-devel
mailing list