(* Parse the /etc/cobbler/settings file which is in YAML 1.0 format. The lens can handle the following contructs * key: value * key: "value" * key: 'value' * key: [value1, value2] * key: - value1 - value2 * key: key2: value1 key3: value2 Author: Bryan Kearney About: License This file is licensed under the LGPLv2+, like the rest of Augeas. *) module CobblerSettings = autoload xfm let kw = /[a-zA-Z0-9_]+/ (* TODO Would be better if this stripped off the " and ' chracters *) let kv = /([^ \t\n#:@]+|"[^"\n]*"|'[^'\n]*')/ let lbr = del /[ \t]*\[[ \t]*/ "[ " let rbr = del /[ \t]*\][ \t]*/ " ]" let colon = del /[ \t]*:[ \t]*/ ": " let dash = del /[ \t]*-[ \t]*/ "- " let eol = Util.eol (* TODO Would be better to make items a child of a document *) let docmarker = /-{3}/ let comment = Util.comment let empty = Util.empty let indent = Util.indent let comma = del /,[ \t]*(\n[ \t]+)?/ ", " let value_list = Build.opt_list ([ label "value" . store kv]) comma let indented_value_list = Build.opt_list ([ label "value" . indent . dash . store kv]) eol let setting = [key kw . colon . store kv] . eol let setting_seq = [key kw . colon . lbr . value_list . rbr ] .eol let setting_list = [key kw . colon . eol . indented_value_list] let nested_setting = [key kw . colon . eol . (indent . setting)*] let document = [label "---" . store docmarker] . eol let lns = (document | comment | empty | setting_list | nested_setting | setting_seq | setting)* let xfm = transform lns (incl "/etc/cobbler/settings") test lns get "Hello_there: Bryan\n" = ? test lns get "# Hello_there: bryan\n" = ? test lns get "---\n" = ? (* Local Variables: *) (* mode: caml *) (* End: *)