This is a simple “key value” setup
let cacheconfig = [ key (entry_key - nocull) . space . store entry_value . eol ]
let caid = let caid_entry = [ label "caid" . store Rx.word ] in Build.opt_list caid_entry comma
let chainloader = [ command "chainloader" "\t" . [ spc . switch "force" ]? . spc . store Rx.no_spaces . eol ]
pw_change
let change_date = [ label "change_date" . store integer? . colon ]
change-add = “add” SEP 1*attrval-spec
let change_add = [ attr_changetype "add" ] . ( sep_line* . attr_val_spec )+
“control:” FILL ldap-oid 0*1(1*SPACE (“true” / “false”)) 0*1(value-spec)
let change_control = let attr_criticality = [ Util.del_ws_spc . label "criticality" . store /true|false/ ] in let attr_ctrlvalue = [ label "value" . (attr_safe_string | attr_base64_string | attr_url_string ) ] in [ key "control" . sep_colon . store ldapoid_re . attr_criticality? . attr_ctrlvalue? . eol ]
change-delete = “add” SEP 1*attrval-spec
let change_delete = [ attr_changetype "delete" ]
change-modify = “modify” SEP *mod-spec
let change_modify = [ attr_changetype "modify" ] . ( sep_line* . [ change_modspec . sep_line* . sep_modspec ] )+
(“modrdn” / “moddn”) SEP newrdn/newsuperior/deleteoldrdn
let change_modrdn = let attr_deleteoldrdn = [ key "deleteoldrdn" . attr_intflag . eol ] in let attrs_modrdn = attr_dn_value "newrdn" | attr_dn_value "newsuperior" | attr_deleteoldrdn in [ attr_changetype /modr?dn/ ] . ( sep_line | attrs_modrdn )* . attrs_modrdn
change-modspec = add/delete/replace: AttributeDesc SEP *attrval-spec “-”
let change_modspec = attr_modspec . ( sep_line* . attr_val_spec )*
changerecord = “changetype:” FILL (changeadd/delete/modify/moddn)
let change_record = ( change_add | change_delete | change_modify | change_modrdn)
pw_class
let class = [ label "class" . sto_to_col? . colon ]
A list of variables to clear /!\ The manpage is not clear on the syntax
let clear = let name = [ label "name" . store name_re_colons ] in [ indent . key "#clear" . Sep.space . Build.opt_list name Sep.space . eol ]
let client = let user = [ label "user" . list_item . Util.del_str "@" ] in [ label "client" . user? . client_host_item ]
let client_file = [ label "file" . client_file_item ]
let client_file_item = let client_file_rx = /\/[^ \t\n,:]+/ in store ( client_file_rx - /EXCEPT/i )
Allows @ for netgroups, supports [ipv6] syntax
let client_host_item = let client_hostname_rx = /[A-Za-z0-9_.@?*-][A-Za-z0-9_.?*-]*/ in let client_ipv6_rx = "[" . /[A-Za-z0-9:?*%]+/ . "]" in let client_host_rx = client_hostname_rx | client_ipv6_rx in let netmask = [ Util.del_str "/" . label "netmask" . store Rx.word ] in store ( client_host_rx - /EXCEPT/i ) . netmask?
A list of clients
let client_list = Build.opt_list ( client | client_file ) list_sep
Entries identified by the “client-output-buffer-limit” keyword can be found more than once.
let client_output_buffer_limit_entry = [ indent . key cobl_cmd . del_ws_spc . class . del_ws_spc . hard_limit . del_ws_spc . soft_limit . del_ws_spc . soft_seconds . eol ]
Can be a tuple `(nodes, node_type)` or simple `nodes`
let cluster_nodes = let nodes = Erlang.opt_list (Erlang.make_value Erlang.quoted) in let value = Erlang.tuple nodes Erlang.bare | nodes in Erlang.value "cluster_nodes" value
Can be single value or `{pause_if_all_down, [nodes], ignore | autoheal}`
let cluster_partition_handling = let nodes = Erlang.opt_list (Erlang.make_value Erlang.quoted) in let value = Erlang.tuple3 Erlang.bare nodes Erlang.bare | Erlang.bare in Erlang.value "cluster_partition_handling" value
Function for simple key/value setting commands such as rootfs
let cmd_kv (cmd:string) (value:regexp) = Build.key_value_line cmd sep_colon (store value)
The moddir command for specifying module search paths
let cmd_moddir = Build.key_value_line "moddir" sep_colon (Build.opt_list modpath sep_moddir)
The set command for individual kernel/module parameters
let cmd_set = [ key "set" . Util.del_ws_spc . ( set_var | set_varmod ) . set_sep_spc . [ label "operator" . store set_operators ] . set_sep_spc . set_value . Util.eol ]
Cmnd_Alias, see alias_field
let cmnd_alias = alias_entry "Cmnd_Alias" "command" sto_to_com_cmnd
Command specification for spec, with optional runas_spec and any amount of tag_specs
let cmnd_spec = [ label "command" . runas_spec? . tag_spec* . sto_to_com_cmnd ]
A list of comma-separated cmnd_specs
let cmnd_spec_list = Build.opt_list cmnd_spec sep_com
Separation between the alias and it’s destinations
let colon = del /[ \t]*:[ \t]*/ ":\t"
let colon = del /:[ \t]*/ ": "
Separation between selinux attributes
let colon = Sep.colon
let colon = Sep.colon
let colon = del /[ \t]*(\\\\[ \t]*\n[ \t]+)?:[ \t]*(\\\\[ \t]*\n[ \t]+)?/ ": "
let colon = Sep.colon
let colon = Sep.colon
let color =
The color filter definition
let color = kw_word "COLOR"
Combine three lenses
let combine_three (a:lens) (b:lens) (c:lens) = combine_three_ord a b c | combine_three_ord b a c | combine_three_ord c b a
A minimalistic optional combination lens
let combine_three = let entry (k:string) = [ key k ] in Build.combine_three (entry "a") (entry "b") (entry "c")
Combine three lenses optionally (either a, b, c, or any of them, in any order)
let combine_three_opt (a:lens) (b:lens) (c:lens) = combine_three_opt_ord a b c | combine_three_opt_ord b a c | combine_three_opt_ord c b a
A minimalistic optional combination lens
let combine_three_opt = let entry (k:string) = [ key k ] in Build.combine_three_opt (entry "a") (entry "b") (entry "c")
Combine three lenses optionally, ensuring first lens is first (a followed by either b, c, or any of them, in any order)
let combine_three_opt_ord (a:lens) (b:lens) (c:lens) = combine_two_opt_ord a (combine_two_opt b c)
Combine three lenses, ensuring first lens is first (a followed by either b, c, in any order)
let combine_three_ord (a:lens) (b:lens) (c:lens) = combine_two_ord a (combine_two b c)
Combine two lenses
let combine_two (a:lens) (b:lens) = combine_two_ord a b | combine_two_ord b a
A minimalistic combination lens
let combine_two = let entry (k:string) = [ key k ] in Build.combine_two (entry "a") (entry "b")
Combine two lenses optionally (either a, b, or both, in any order)
let combine_two_opt (a:lens) (b:lens) = combine_two_opt_ord a b | combine_two_opt_ord b a
A minimalistic optional combination lens
let combine_two_opt = let entry (k:string) = [ key k ] in Build.combine_two_opt (entry "a") (entry "b")
Combine two lenses optionally, ensuring first lens is first (a, and optionally b)
let combine_two_opt_ord (a:lens) (b:lens) = a . b?
Combine two lenses, ensuring first lens is first
let combine_two_ord (a:lens) (b:lens) = a . b
Separation between multiple destinations
let comma = del /[ \t]*,[ \t]*(\n[ \t]+)?/ ", "
let comma = Sep.comma
let comma = Sep.comma
let comma = space_or_eol "," ", "
a comma, optionally preceded or followed by spaces or newlines
let comma = del /[ \t\n]*,[ \t\n]*/ ", "
let comma_sep = del /,[ \t]*/ ", "
Parses options for filesystems
let comma_sep_list (l:string) = let value = [ label "value" . Util.del_str "=" . store Rx.neg1 ] in let lns = [ label l . store optlabel . value? ] in Build.opt_list lns Sep.comma
A comma separated list of options (opt=value or opt)
let comma_sep_list (l:string) = let value = [ label "value" . Util.del_str "=" . store optval ] in let lns = [ label l . store word . value? ] in Build.opt_list lns comma
Parses options either for filesystems or autofs
let comma_spc_sep_list (l:string) = let value = [ label "value" . Util.del_str "=" . store Rx.neg1 ] in let lns = [ label l . store optlabel . value? ] in Build.opt_list lns optsep
let command = boot | echo | ls | machine | set | stty
Map commands started with “!”
let command = [ command_start . key commands . Sep.space . store Rx.fspath . eol ]
let command (kw:regexp) (indent:string) = Util.del_opt_ws indent . key kw
nrpe.cfg usually has many entries defining commands to run
let command = let obrkt = del /\[/ "[" in let cbrkt = del /\]/ "]" in [ key "command" . [ obrkt . key /[^]\/\n]+/ . cbrkt . eq . store /[^\n]+/ . del /\n/ "\n" ] ]
let command_start = Util.del_str "!"
let comment = Util.comment
let comment = Util.comment
let comment = [ indent . label "#comment" . del /[#;][ \t]*/ "# " . store /([^ \t\n].*[^ \t\n]|[^ \t\n])/ . eol ]
let comment = IniFile.comment IniFile.comment_re IniFile.comment_default
A comment, either comment_simple or comment_multi
let comment = comment_simple | comment_multi
let comment = Util.comment
let comment = Util.comment
let comment = Util.comment
let comment = IniFile.comment "#" "#"
let comment = Util.comment
let comment = Util.comment
let comment = Util.comment_generic /;[ \t]*/ "; "
from 4.2.1 of the upstream doc Chrony comments start with: !
let comment = Util.comment_generic /[ \t]*[!;#%][ \t]*/ "# "
let comment = Util.comment | [ del /#[ \t]*\r?\n/ "#\n" ]
Map comments in “#comment” nodes.
let comment = Util.comment
let comment = Util.comment_generic /%[ \t]*/ "% "
let comment = [ Util.indent . label "#comment" . del /#[ \t]*/ "# " . store comment_re . eol ]
Map comments into “#comment” nodes
let comment (pat:regexp) (default:string) = Util.comment_generic_seteol (Rx.opt_space . pat . Rx.opt_space) default eol
Map comments in “#comment” nodes
let comment = Util.comment_generic /[ \t]*[#!][ \t]*/ "# "
let comment = Util.comment_generic /#[ \t]*/ "# "
let comment = IniFile.comment IniFile.comment_re IniFile.comment_default
let comment = Util.comment
let comment = Util.comment
Nrpe comments must start at beginning of line
let comment = Util.comment_generic /#[ \t]*/ "# "
let comment = Util.comment
let comment = Util.comment
let comment = Util.comment
let comment = IniFile.comment "#" "#"
let comment = Util.comment_generic /[ \t]*[;#][ \t]*/ "# "
An IniFile.comment entry
let comment = IniFile.comment "#" "#"
let comment = Util.comment_generic /[ \t]*\*[ \t]*/ "* "
let comment = IniFile.comment_noindent "#" "#"
Map comments in “#comment” nodes
let comment = let sto_to_eol = store (/([^ \t\n].*[^ \t\n]|[^ \t\n])/ - /include(dir)?.*/) in [ label "#comment" . del /[ \t]*#[ \t]*/ "# " . sto_to_eol . eol ]
let comment = Util.comment_generic /[ \t]*[#;][ \t]*/ "# "
Map comments into “#comment” nodes Can’t use Util.comment as #+ and #!
let comment_gen (space:regexp) (sto:regexp) = [ label "#comment" . del (Rx.opt_space . "#" . space) "# " . store sto . eol ]
Comments
let comment = Util.comment
A simple comment
let comment = IniFile.comment "#" "#"
let comment = Util.comment
Map comments into “#comment” nodes
let comment = comment_generic /[ \t]*#[ \t]*/ "# "
let comment = Util.comment
A comment line, C-style
let comment_c_style = comment_generic /[ \t]*\/\/[ \t]*/ "// "
A comment line, C-style or hash
let comment_c_style_or_hash = comment_generic /[ \t]*((\/\/)|#)[ \t]*/ "// "
Map comments at eol
let comment_eol = Util.comment_generic /[ \t]*[#!][ \t]*/ " # "
let comment_eol = Util.comment_generic /[ \t]*[;#][ \t]*/ " # "
Requires a space before the #
let comment_eol = Util.comment_generic /[ \t]+#[ \t]*/ " # "
Map eol comments into “#comment” nodes Add a space before # for end of line comments
let comment_eol = comment_generic /[ \t]*#[ \t]*/ " # "
Map comments and set default comment sign
let comment_generic (r:regexp) (d:string) = comment_generic_seteol r d doseol
Map comments and set default comment sign
let comment_generic_seteol (r:regexp) (d:string) (eol:lens) = [ label "#comment" . del r d . store /([^ \t\r\n].*[^ \t\r\n]|[^ \t\r\n])/ . eol ]
A multiline comment, C-style
let comment_multi = Util.comment_multiline
A C-style multiline comment
let comment_multiline = let mline_re = (/[^ \t\r\n].*[^ \t\r\n]|[^ \t\r\n]/ - /.*\*\/.*/) in let mline = [ seq "mline" . del /[ \t\r\n]*/ "\n" . store mline_re ] in [ label "#mcomment" . del /[ \t]*\/\*/ "/*" . counter "mline" . mline . (eol . mline)* . del /[ \t\r\n]*\*\/[ \t]*\r?\n/ "\n*/\n" ]
Map comments into “#comment” nodes, no indentation allowed
let comment_noindent (pat:regexp) (default:string) = Util.comment_generic_seteol (pat . Rx.opt_space) default eol
Map comments into “#comment” nodes, without indentation
let comment_noindent = comment_generic /#[ \t]*/ "# "
A comment_eol or eol
let comment_or_eol = comment_eol | (del /[ \t]*[#!]?\n/ "\n")
let comment_or_eol = Util.comment_or_eol
A comment_eol or eol
let comment_or_eol = comment_eol | (del /([ \t]+#\n|[ \t]*\n)/ "\n")
A comment_eol or eol, with an optional empty comment
let comment_or_eol = comment_eol | (del /[ \t]*(#[ \t]*)?\n/ "\n")
let comment_re = /([^ \t\n].*[^ \t\n]|[^ \t\n])/ - /# ## (Start|End) Default Options ##/
A one-line comment, C-style
let comment_simple = Util.comment_c_style_or_hash
Entries shared between defaults and fs_types sections
let common_entry = list_sto ("base_features"|"default_features") (key Rx.word) | entry_sto "blocksize" ("-"? . Rx.integer) | entry_sto "hash_alg" ("legacy"|"half_md4"|"tea") | entry_sto ("inode_ratio"|"inode_size") Rx.integer
An “if” declaration, recursive
let rec condition = [ Util.del_str "$if" . label "@if" . Sep.space . store Rx.space_in . Util.eol . (Util.empty | Util.comment | condition | variable | entry)* . [ Util.del_str "$else" . label "@else" . Util.eol . (Util.empty | Util.comment | condition | variable | entry)* ] ? . Util.del_str "$endif" . Util.eol ]
A condition is an ‘and’ node, representing a union of condition_fields, listed under ‘or’ subnodes:
let condition = logic_construct_condition "or" condition_field
A single condition field is an ‘or’ node.
let condition_field = let sto_condition = Util.del_str "'" . store /[^'\n]+/ . Util.del_str "'" in [ key "not" . Sep.space ]? . store condition_re . [ Sep.space . key "contain" ]? . Sep.space . logic_construct_field "or" "|" sto_condition
A list of conditions, inspired by Debctrl.dependency_list An upload condition list is either the wildcard ‘*’, stored verbatim, or an intersection of conditions listed under ‘and’ subnodes:
let condition_list = store "*" | logic_construct_condition "and" condition
let condition_re = "source" | "byhand" | "sections" | "binaries" | "architectures" | "distribution"
let conf = "# comment * username:password [mail.isp.example] username:password [mail.isp.example]:submission username:password [mail.isp.example]:587 username:password mail.isp.example username:password user@mail.isp.example username: mail.isp.example username2:password2 "
let conf = "# a comment the.backed-up.domain.tld relay:[their.mail.host.tld] .my.domain : * smtp:outbound-relay.my.domain example.com uucp:example example.com slow: example.com :[gateway.example.com] user.foo@example.com smtp:bar.example:2025 .example.com error:mail for *.example.com is not deliverable "
let conf = "# a comment virtual-alias.domain anything postmaster@virtual-alias.domain postmaster user1@virtual-alias.domain address1 user2@virtual-alias.domain address2, address3 root robert.oot@domain.com @example.net root,postmaster postmaster mtaadmin+root=mta1 some_user localuser "
A top-level config
let config (app:lens) = (Util.empty | comment)* . rspace lbrack . Build.opt_list (kernel | app) (lrspace comma) . lrspace rbrack . Util.del_str "." . Util.eol . (Util.empty | comment)*
let config = Build.key_value_line_comment "config" sep_space (store /binary_indexes|yes|no/) comment
let configfile = [ command "configfile" "\t" . spc . store Rx.no_spaces . eol ]
should actually only match between -127000000 and 127000000
let correction_re = Rx.relinteger_noplus