Skip to content

Instantly share code, notes, and snippets.

@xorel
Last active February 19, 2020 16:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xorel/7a960d39ef2e8bdfd2340861b5c9b404 to your computer and use it in GitHub Desktop.
Save xorel/7a960d39ef2e8bdfd2340861b5c9b404 to your computer and use it in GitHub Desktop.
Augeas lens for oned.conf
module Oned =
autoload xfm
(* primitives *)
let sep = del /[ \t]*=[ \t]*/ " = "
let eol = del /\n/ "\n"
let opt_space = del /[ \t]*/ ""
let opt_space_nl = del /[ \t\n]*/ "\n"
let comma = del /,/ ","
let left_br = del /\[/ "["
let right_br = del /\]/ "]"
(* Regexes *)
(* Match everyhting within quotes *)
let re_quoted_str = /"[^\"]*"/
(* Match everything except spaces, quote("), l-bracket([) and num-sign(#) *)
let re_value_str = /[^ \t\n"\[#]+/
(* Match everything except spaces, quote("), num-sign(#) and comma(,) *)
let re_section_value_str = /[^ \t\n"#,]+/
(* Store either after-value comment or full-line comment *)
let comment (l:string) = [ label l . store /#[^\n]*/ ]
let tail_comment = comment "tail_comment"
let line_comment = comment "line_comment" . eol
(* Simple words *)
let name = key /[A-Za-z_0-9]+/
let re_simple_value = re_quoted_str | re_value_str
(* Top level entry like `PORT = 2633` *)
let top_level_entry = [ name . sep . store re_simple_value ]
let top_level_line = opt_space
. top_level_entry
. opt_space . (tail_comment)?
. eol
(* Section lens for section like `LOG = [ ... ]` *)
let section_value = re_quoted_str | re_section_value_str
let section_entry = [ name . sep . store section_value ]
let section_entry_list =
( section_entry . opt_space . comma . opt_space_nl
| line_comment . opt_space )*
. section_entry . opt_space_nl
. ( line_comment )*
let section = opt_space
. [ name . sep
. left_br
. opt_space_nl
. section_entry_list
. right_br ]
. eol
let empty_line = [ del /[ \t]*\n/ "\n" ]
(* Main lens *)
let lns = ( top_level_line | line_comment | section | empty_line )*
(* Variable: filter *)
let filter = incl "/etc/one/oned.conf"
. incl "/etc/one/sched.conf"
. incl "/etc/one/vmm_exec/vmm_exec_kvm.conf"
let xfm = transform lns filter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment