Blame lenses/syslog.aug

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