parses /etc/syslog.conf
Author: Mathieu Arnold m@FreeB SD.org at
Syslog | parses /etc/syslog.conf |
Reference | This lens tries to keep as close as possible to `man 5 resolv.conf` where possible. |
Licence | This file is licensed under the BSD License. |
Lens Usage | To be documented |
Configuration files | This lens applies to /etc/syslog.conf. |
USEFUL PRIMITIVES | |
Comments and empty lines | |
empty | |
eol | |
sep_tab | |
sep_tab_opt | |
comment | Map comments into “#comment” nodes Can’t use Util.comment as #+ and #! |
single characters macro | |
comma | Deletes a comma and default to it |
colon | Deletes a colon and default to it |
semicolon | Deletes a semicolon and default to it |
dot | Deletes a dot and default to it |
pipe | Deletes a pipe and default to it |
plus | Deletes a plus and default to it |
bang | Deletes a bang and default to it |
opt_hash | deletes an optional # sign |
opt_plus | deletes an optional + sign |
various macros | |
word | our version can’t start with [_.-] because it would mess up the grammar |
comparison | a comparison is an optional ! |
protocol | means UDP means TCP |
token | alphanum or “*” |
file_r | a file begins with a / and get almost anything else after |
loghost_r | Matches a hostname, that is labels speparated by dots, labels can’t start or end with a “-”. |
Function | |
label_opt_list | Uses Build.opt_list to generate a list of labels |
label_opt_list_or | Either label_opt_list matches something or it emits a single label with the “or” string. |
LENSE DEFINITION | |
selector | |
facilities | a list of facilities, separated by commas |
selector | a selector is a list of facilities, an optional comparison and a level |
selectors | a list of selectors, separated by semicolons |
action | |
file | a file may start with a “-” meaning it does not gets sync’ed everytime |
loghost | a loghost is an @ sign followed by the hostname and a possible port |
users | a list of users or a “*” |
logprogram | a log program begins with a pipe |
discard | discards matching messages |
action | an action is either a file, a host, users, a program, or discard |
Entry | |
entry | an entry contains selectors and an action |
entries | entries are either comments/empty lines or entries |
Program matching | |
programs | a list of programs |
program | a program begins with an optional hash, a bang, and an optional + or - |
Hostname maching | |
hostnames | a list of hostnames |
hostname | a program begins with an optional hash, and a + or - |
Top of the tree | |
lns | generic entries then programs or hostnames matching blocs |
filter | all you need is /etc/syslog.conf |
This lens tries to keep as close as possible to `man 5 resolv.conf` where possible. An online source being : http://www.freebsd.org
This lens applies to /etc/syslog.conf. See filter.
let comment_gen (space:regexp) (sto:regexp) = [ label "#comment" . del (Rx.opt_space . "#" . space) "# " . store sto . eol ]
Map comments into “#comment” nodes Can’t use Util.comment as #+ and #! have a special meaning. However, ‘# !’ and ‘# +’ have no special meaning so they should be allowed.
let label_opt_list_or (l:string) (r:lens) (s:lens) (or:string) = ( label_opt_list l r s | [ label l . store or ] )
Either label_opt_list matches something or it emits a single label with the “or” string.
l:string | the label name |
r:lens | the lens going after the label |
s:lens | the separator lens passed to Build.opt_list |
or:string | the string used if the label_opt_list does not match anything |
let empty = Util.empty
let eol = Util.eol
let sep_tab = del /([ \t]+|[ \t]*\\\\\n[ \t]*)/ "\t"
let sep_tab_opt = del /([ \t]*|[ \t]*\\\\\n[ \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 ]
Deletes a comma and default to it
let comma = sep_tab_opt . Util.del_str "," . sep_tab_opt
Deletes a colon and default to it
let colon = sep_tab_opt . Util.del_str ":" . sep_tab_opt
Deletes a semicolon and default to it
let semicolon = sep_tab_opt . Util.del_str ";" . sep_tab_opt
Deletes a dot and default to it
let dot = Util.del_str "."
Deletes a pipe and default to it
let pipe = Util.del_str "|"
Deletes a plus and default to it
let plus = Util.del_str "+"
Deletes a bang and default to it
let bang = Util.del_str "!"
deletes an optional # sign
let opt_hash = del /#?/ ""
deletes an optional + sign
let opt_plus = del /\+?/ ""
our version can’t start with [_.-] because it would mess up the grammar
let word = /[A-Za-z0-9][A-Za-z0-9_.-]*/
a comparison is an optional !
let comparison = /(!|[<=>]+|![<=>]+)/
means UDP means TCP
let protocol = /@{1,2}/
alphanum or “*”
let token = /([A-Za-z0-9]+|\*)/
a file begins with a / and get almost anything else after
let file_r = /\/[^ \t\n;]+/
Matches a hostname, that is labels speparated by dots, labels can’t start or end with a “-”.
let loghost_r = /[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*/ | "[" . Rx.ipv6 . "]"
Uses Build.opt_list to generate a list of labels
let label_opt_list (l:string) (r:lens) (s:lens) = Build.opt_list [ label l . r ] s
Either label_opt_list matches something or it emits a single label with the “or” string.
let label_opt_list_or (l:string) (r:lens) (s:lens) (or:string) = ( label_opt_list l r s | [ label l . store or ] )
a list of facilities, separated by commas
let facilities = label_opt_list "facility" (store token) comma
a selector is a list of facilities, an optional comparison and a level
let selector = facilities . dot . [ label "comparison" . store comparison]? . [ label "level" . store token ]
a list of selectors, separated by semicolons
let selectors = label_opt_list "selector" selector semicolon
a file may start with a “-” meaning it does not gets sync’ed everytime
let file = [ Build.xchgs "-" "no_sync" ]? . [ label "file" . store file_r ]
a loghost is an @ sign followed by the hostname and a possible port
let loghost = [label "protocol" . store protocol] . [ label "hostname" . store loghost_r ] . (colon . [ label "port" . store /[0-9]+/ ] )?
a list of users or a “*”
let users = label_opt_list_or "user" (store word) comma "*"
a log program begins with a pipe
let logprogram = pipe . [ label "program" . store /[^ \t\n][^\n]+[^ \t\n]/ ]
discards matching messages
let discard = [ label "discard" . Util.del_str "~" ]
an action is either a file, a host, users, a program, or discard
let action = (file | loghost | users | logprogram | discard)
an entry contains selectors and an action
let entry = [ label "entry" . selectors . sep_tab . [ label "action" . action ] . eol ]
entries are either comments/empty lines or entries
let entries = (empty | comment | entry )*
a list of programs
let programs = label_opt_list_or "program" (store word) comma "*"
a program begins with an optional hash, a bang, and an optional + or -
let program = [ label "program" . opt_hash . bang . ( opt_plus | [ Build.xchgs "-" "reverse" ] ) . programs . eol . entries ]
a list of hostnames
let hostnames = label_opt_list_or "hostname" (store Rx.word) comma "*"
a program begins with an optional hash, and a + or -
let hostname = [ label "hostname" . opt_hash . ( plus | [ Build.xchgs "-" "reverse" ] ) . hostnames . eol . entries ]
generic entries then programs or hostnames matching blocs
let lns = entries . ( program | hostname | include )*