A | |
access, Access | |
address, Pg_Hba | |
alias | |
alias_entry, Sudoers | |
alias_entry_single, Sudoers | |
alias_field, Sudoers | |
alias_list, Sudoers | |
alias_name, Sudoers | |
B | |
block, Keepalived | |
body, Xinetd | |
brackets, Build | |
C | |
cmd_kv, Solaris_System | |
cmd_moddir, Solaris_System | |
cmd_set, Solaris_System | |
cmnd_alias, Sudoers | |
cmnd_spec, Sudoers | |
cmnd_spec_list, Sudoers | |
comma_sep_list | |
comment | |
comment_c_style, Util | |
comment_eol | |
comment_generic, Util | |
comment_multiline, Util | |
comment_or_eol | |
common_entry, Mke2fs | |
D | |
database | |
dayofmonth, Cron | |
dayofweek, Cron | |
default_depth, Xorg | |
default_type, Sudoers | |
defaults | |
defaults_entry, Mke2fs | |
defaults_title, Mke2fs | |
del_negate, Sudoers | |
device, Xorg | |
display, Xorg | |
display_entry, Xorg | |
display_modes, Xorg | |
domain, Resolv | |
driver, Xorg |
Allow (+) or deny (-) access
let access = label "access" . store /[+-]/
let address = [ label "address" . store ipaddr ]
let alias = [ label "alias" . store word_re ]
Every kind of Alias entry, see user_alias, runas_alias, host_alias and cmnd_alias
let alias = user_alias | runas_alias | host_alias | cmnd_alias
Alias entry, a list of comma-separated alias_entry_single fields
let alias_entry ( kw:string ) (field:string) (sto:lens) = [ indent . key kw . sep_cont . alias_entry_single field sto . ( sep_col . alias_entry_single field sto )* . eol ]
Single alias_entry, named using alias_name and listing alias_list
let alias_entry_single ( field:string ) (sto:lens) = [ label "alias" . alias_name . sep_eq . alias_list field sto ]
Generic alias field to gather all Alias definitions
let alias_field ( kw:string ) (sto:lens) = [ label kw . sto ]
List of alias_fields, separated by commas
let alias_list ( kw:string ) (sto:lens) = alias_field kw sto . ( sep_com . alias_field kw sto )*
Name of an alias_entry_single
let alias_name = [ label "name" . store /[A-Z][A-Z0-9_]*/ ]
A simple block with just a block title
let block ( kw:string ) (sto:lens) = lens_block (key kw) sto
We would really like to say “the body can contain any of a list of a list of attributes, each of them at most once”; but that would require that we build a lens that matches the permutation of all attributes; with around 40 individual attributes, that’s not computationally feasible, even if we didn’t have to worry about how to write that down.
let body ( attr:lens ) = Util.del_str "\n{\n" . (empty|comment|attr)* . del /[ \t]*}[ \t]*\n/ "}\n"
Put a lens inside brackets
let brackets ( l:lens ) (r:lens) (lns:lens) = l . lns . r
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 = cmnd_spec . ( sep_com . cmnd_spec )*
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
Map comments into “#comment” nodes
let comment ( pat:regexp ) (default:string) = [ label "#comment" . sep pat default . sto_to_eol? . eol ]
Map comments in “#comment” nodes
let comment = Util.comment_generic /[ \t]*[#!][ \t]*/ "# "
let comment = IniFile.comment IniFile.comment_re IniFile.comment_default
let comment = Util.comment
let comment = Util.comment_generic /[ \t]*[;#][ \t]*/ "# "
let comment = Util.comment_generic /[ \t]*\*[ \t]*/ "* "
Map comments in “#comment” nodes
let comment = let sto_to_eol = store ( /([^ \t\n].*[^ \t\n]|[^ \t\n])/ - /includedir.*/ ) in [ label "#comment" . del /[ \t]*#[ \t]*/ "# " . sto_to_eol . eol ]
Map comments into “#comment” nodes Can’t use Util.comment as #+ and #!
let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n+!-].*[^ \t\n]|[^ \t\n+!-])/ . eol ]
Map comments into “#comment” nodes
let comment = comment_generic /[ \t]*#[ \t]*/ "# "
A comment line, C-style
let comment_c_style = comment_generic /[ \t]*\/\/[ \t]*/ "// "
Map comments at eol
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) = [ label "#comment" . del r d . store /([^ \t\n].*[^ \t\n]|[^ \t\n])/ . eol ]
A C-style multiline comment
let comment_multiline = let mline_re = ( /[^ \t\n].*[^ \t\n]|[^ \t\n]/ - /.*\*\/.*/ ) in
A comment_eol or eol
let comment_or_eol = comment_eol | ( del /[ \t]*#?\n/ "\n" )
A comment_eol or eol
let comment_or_eol = comment_eol | ( del /[ \t]*#?\n/ "\n" )
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
let database = let database_kw = "aliases" | "automount" | "bootparams" | "ethers" | "group" | "hosts" | "netgroup" | "netmasks" | "networks" | "passwd" | "protocols" | "publickey" | "rpc" | "sendmailvars" | "services" | "shadow" in [ label "database" . store database_kw . sep_colon . (Build.opt_list (service|reaction) Sep.space) . Util.eol ]
TODO: support for quoted strings
let database = comma_sep_list "database"
let dayofmonth = [ label "dayofmonth" . store num ]
let dayofweek = [ label "dayofweek" . store alphanum ]
let default_depth = entry_int "DefaultDepth" /[dD]efault[dD]epth/
Type definition for defaults
let default_type = let value = store /[@:>][^ \t\n\\\\]+/ in [ label "type" . value ]
A defaults section
let defaults = IniFile.record defaults_title ( (Util.indent . (defaults_entry|common_entry)) | comment )
A Defaults entry
let defaults = [ indent . key "Defaults" . default_type? . sep_cont . parameter_list . eol ]
Possible entries under the defaults section
let defaults_entry = entry_sto "force_undo" ( "true"|"false" ) | entry_sto "fs_type" Rx.word | entry_sto "undo_dir" Rx.fspath
Title for the defaults section
let defaults_title = IniFile.title "defaults"
Delete an even number of ‘!’
let del_negate = del /( !! )*/ ""
let device = entry_str "Device" /[dD]evice/
let display = [ indent . del "SubSection" "SubSection" . sep_spc . sep_dquote . key "Display" . sep_dquote . eol . display_entry* . indent . del "EndSubSection" "EndSubSection" . eol ]
Known values for entries in the Display subsection
let display_entry = entry_int "Depth" /[dD]epth/ | entry_int "FbBpp" /[fF]b[bB]pp/ | entry_rgb "Weight" /[wW]eight/ | entry_xy "Virtual" /[vV]irtual/ | entry_xy "ViewPort" /[vV]iew[pP]ort/ | display_modes | entry_str "Visual" /[vV]isual/ | entry_rgb "Black" /[bB]lack/ | entry_rgb "White" /[wW]hite/ | entry_str "Options" /[oO]ptions/ | empty | comment
let display_modes = [ indent . del /[mM]odes/ "Modes" . label "Modes" . [ label "mode" . sep_spc . quoted_string_val ]+ . eol ]
let domain = Build.key_value_line "domain" Sep.space ( store Rx.word )
let driver = entry_str "Driver" /[dD]river/