From 78a9c2add3dd37d023df67e9089de277bd98f914 Mon Sep 17 00:00:00 2001 From: Xavier Beaudouin Date: Mon, 2 Jun 2025 09:33:57 +0200 Subject: [PATCH 1/3] lenses/rsyslog.aug: Fix if xxx then { } If the rsyslog.conf have : if $programname != "devd" then { } The lense fails with a parse_failed. This fix bug #846 --- lenses/rsyslog.aug | 216 +++++++++++++++++++++++++-------------------- 1 file changed, 118 insertions(+), 98 deletions(-) diff --git a/lenses/rsyslog.aug b/lenses/rsyslog.aug index 29ff9b104..4d56d37cb 100644 --- a/lenses/rsyslog.aug +++ b/lenses/rsyslog.aug @@ -1,98 +1,118 @@ -(* -Module: Rsyslog - Parses /etc/rsyslog.conf - -Author: Raphael Pinson - -About: Reference - This lens tries to keep as close as possible to `man 5 rsyslog.conf` where possible. - -About: License - This file is licenced under the LGPL v2+, like the rest of Augeas. - -About: Lens Usage - To be documented - -About: Configuration files - This lens applies to /etc/rsyslog.conf. See . - -About: Examples - The file contains various examples and tests. -*) -module Rsyslog = - -autoload xfm - -let macro_rx = /[^,# \n\t][^#\n]*[^,# \n\t]|[^,# \n\t]/ -let macro = [ key /$[A-Za-z0-9]+/ . Sep.space . store macro_rx . Util.comment_or_eol ] - -let config_object_param = [ key /[A-Za-z.]+/ . Sep.equal . Quote.dquote - . store /[^"]+/ . Quote.dquote ] -(* Inside config objects, we allow embedded comments; we don't surface them - * in the tree though *) -let config_sep = del /[ \t]+|[ \t]*#.*\n[ \t]*/ " " - -let config_object = - [ key /action|global|input|module|parser|timezone|include/ . - Sep.lbracket . - config_object_param . ( config_sep . config_object_param )* . - Sep.rbracket . Util.comment_or_eol ] - -(* View: users - Map :omusrmsg: and a list of users, or a single * -*) -let omusrmsg = Util.del_str ":omusrmsg:" . - Syslog.label_opt_list_or "omusrmsg" (store Syslog.word) - Syslog.comma "*" - -(* View: file_tmpl - File action with a specified template *) -let file_tmpl = Syslog.file . [ label "template" . Util.del_str ";" . store Rx.word ] - -let dynamic = [ Util.del_str "?" . label "dynamic" . store Rx.word ] - -let namedpipe = Syslog.pipe . Sep.space . [ label "pipe" . store Syslog.file_r ] - -let action = Syslog.action | omusrmsg | file_tmpl | dynamic | namedpipe - -(* Cannot use syslog program because rsyslog does not suppport #! *) -let program = [ label "program" . Syslog.bang . - ( Syslog.opt_plus | [ Build.xchgs "-" "reverse" ] ) . - Syslog.programs . Util.eol . Syslog.entries ] - -(* Cannot use syslog hostname because rsyslog does not suppport #+/- *) -let hostname = [ label "hostname" . - ( Syslog.plus | [ Build.xchgs "-" "reverse" ] ) . - Syslog.hostnames . Util.eol . Syslog.entries ] - -(* View: actions *) -let actions = - let prop_act = [ label "action" . action ] - in let act_sep = del /[ \t]*\n&[ \t]*/ "\n& " - in Build.opt_list prop_act act_sep - -(* View: entry - An entry contains selectors and an action -*) -let entry = [ label "entry" . Syslog.selectors . Syslog.sep_tab . - actions . Util.eol ] - -(* View: prop_filter - Parses property-based filters, which start with ":" and the property name *) -let prop_filter = - let sep = Sep.comma . Util.del_opt_ws " " - in let prop_name = [ Util.del_str ":" . label "property" . store Rx.word ] - in let prop_oper = [ label "operation" . store /[A-Za-z!-]+/ ] - in let prop_val = [ label "value" . Quote.do_dquote (store /[^\n"]*/) ] - in [ label "filter" . prop_name . sep . prop_oper . sep . prop_val . - Sep.space . actions . Util.eol ] - -let entries = ( Syslog.empty | Util.comment | entry | macro | config_object | prop_filter )* - -let lns = entries . ( program | hostname )* - -let filter = incl "/etc/rsyslog.conf" - . incl "/etc/rsyslog.d/*" - . Util.stdexcl - -let xfm = transform lns filter +(* +Module: Rsyslog + Parses /etc/rsyslog.conf + +Author: Raphael Pinson + +About: Reference + This lens tries to keep as close as possible to `man 5 rsyslog.conf` where possible. + +About: License + This file is licenced under the LGPL v2+, like the rest of Augeas. + +About: Lens Usage + To be documented + +About: Configuration files + This lens applies to /etc/rsyslog.conf. See . + +About: Examples + The file contains various examples and tests. +*) +module Rsyslog = + +autoload xfm + +let macro_rx = /[^,# \n\t][^#\n]*[^,# \n\t]|[^,# \n\t]/ +let macro = [ key /$[A-Za-z0-9]+/ . Sep.space . store macro_rx . Util.comment_or_eol ] + +let config_object_param = [ key /[A-Za-z.]+/ . Sep.equal . Quote.dquote + . store /[^"]+/ . Quote.dquote ] +(* Inside config objects, we allow embedded comments; we don't surface them + * in the tree though *) +let config_sep = del /[ \t]+|[ \t]*#.*\n[ \t]*/ " " + +let config_object = + [ key /action|global|input|module|parser|timezone|include/ . + Sep.lbracket . + config_object_param . ( config_sep . config_object_param )* . + Sep.rbracket . Util.comment_or_eol ] + +(* View: users + Map :omusrmsg: and a list of users, or a single * +*) +let omusrmsg = Util.del_str ":omusrmsg:" . + Syslog.label_opt_list_or "omusrmsg" (store Syslog.word) + Syslog.comma "*" + +(* View: file_tmpl + File action with a specified template *) +let file_tmpl = Syslog.file . [ label "template" . Util.del_str ";" . store Rx.word ] + +let dynamic = [ Util.del_str "?" . label "dynamic" . store Rx.word ] + +let namedpipe = Syslog.pipe . Sep.space . [ label "pipe" . store Syslog.file_r ] + +(* View: action_config + Handle action(type="..." users="...") syntax *) +let action_config = + [ key "action" . Util.del_str "(" . + [ label "params" . store /[^)]+/ ] . Util.del_str ")" ] + +let action = Syslog.action | omusrmsg | file_tmpl | dynamic | namedpipe | action_config + +(* Cannot use syslog program because rsyslog does not suppport #! *) +let program = [ label "program" . Syslog.bang . + ( Syslog.opt_plus | [ Build.xchgs "-" "reverse" ] ) . + Syslog.programs . Util.eol . Syslog.entries ] + +(* Cannot use syslog hostname because rsyslog does not suppport #+/- *) +let hostname = [ label "hostname" . + ( Syslog.plus | [ Build.xchgs "-" "reverse" ] ) . + Syslog.hostnames . Util.eol . Syslog.entries ] + +(* View: actions *) +let actions = + let prop_act = [ label "action" . action ] + in let act_sep = del /[ \t]*\n&[ \t]*/ "\n& " + in Build.opt_list prop_act act_sep + +(* View: entry + An entry contains selectors and an action +*) +let entry = [ label "entry" . Syslog.selectors . Syslog.sep_tab . + actions . Util.eol ] + +(* View: prop_filter + Parses property-based filters, which start with ":" and the property name *) +let prop_filter = + let sep = Sep.comma . Util.del_opt_ws " " + in let prop_name = [ Util.del_str ":" . label "property" . store Rx.word ] + in let prop_oper = [ label "operation" . store /[A-Za-z!-]+/ ] + in let prop_val = [ label "value" . Quote.do_dquote (store /[^\n"]*/) ] + in [ label "filter" . prop_name . sep . prop_oper . sep . prop_val . + Sep.space . actions . Util.eol ] + +(* View: condition + Parses if condition blocks, e.g., if $programname != "devd" then { ... } +*) +let condition = + let cond_rx = /\\$[a-zA-Z0-9_]+[ \t]*(==|!=|=~|!~|>|<|>=|<=)[ \t]*("[^"]*"|[0-9]+)/ in + [ key "if" . Sep.space . + [ label "condition" . store cond_rx ] . Sep.space . + Util.del_str "then" . Sep.space . Util.del_str "{" . (del /[ \t\n]*/ "" ) . + (entry | Util.comment | Syslog.empty)* . + Util.del_str "}" . (del /[ \t\n]*/ "" ) . Util.eol ] + +(* Fallback for unparsed lines *) +let invalid = [ label "invalid" . store /[^\n]*\n/ ] + +let entries = ( Syslog.empty | Util.comment | entry | macro | config_object | prop_filter | condition | invalid )* + +let lns = entries . ( program | hostname | condition )* + +let filter = incl "/etc/rsyslog.conf" + . incl "/etc/rsyslog.d/*" + . Util.stdexcl + +let xfm = transform lns filter From 1b3b1754b2e9624cab49d0dcc32bc55ba2460ef7 Mon Sep 17 00:00:00 2001 From: Xavier Beaudouin Date: Mon, 14 Jul 2025 17:03:39 +0700 Subject: [PATCH 2/3] Removed uncessary carriage return. --- lenses/rsyslog.aug | 236 ++++++++++++++++++++++----------------------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/lenses/rsyslog.aug b/lenses/rsyslog.aug index 4d56d37cb..b51f6fe8c 100644 --- a/lenses/rsyslog.aug +++ b/lenses/rsyslog.aug @@ -1,118 +1,118 @@ -(* -Module: Rsyslog - Parses /etc/rsyslog.conf - -Author: Raphael Pinson - -About: Reference - This lens tries to keep as close as possible to `man 5 rsyslog.conf` where possible. - -About: License - This file is licenced under the LGPL v2+, like the rest of Augeas. - -About: Lens Usage - To be documented - -About: Configuration files - This lens applies to /etc/rsyslog.conf. See . - -About: Examples - The file contains various examples and tests. -*) -module Rsyslog = - -autoload xfm - -let macro_rx = /[^,# \n\t][^#\n]*[^,# \n\t]|[^,# \n\t]/ -let macro = [ key /$[A-Za-z0-9]+/ . Sep.space . store macro_rx . Util.comment_or_eol ] - -let config_object_param = [ key /[A-Za-z.]+/ . Sep.equal . Quote.dquote - . store /[^"]+/ . Quote.dquote ] -(* Inside config objects, we allow embedded comments; we don't surface them - * in the tree though *) -let config_sep = del /[ \t]+|[ \t]*#.*\n[ \t]*/ " " - -let config_object = - [ key /action|global|input|module|parser|timezone|include/ . - Sep.lbracket . - config_object_param . ( config_sep . config_object_param )* . - Sep.rbracket . Util.comment_or_eol ] - -(* View: users - Map :omusrmsg: and a list of users, or a single * -*) -let omusrmsg = Util.del_str ":omusrmsg:" . - Syslog.label_opt_list_or "omusrmsg" (store Syslog.word) - Syslog.comma "*" - -(* View: file_tmpl - File action with a specified template *) -let file_tmpl = Syslog.file . [ label "template" . Util.del_str ";" . store Rx.word ] - -let dynamic = [ Util.del_str "?" . label "dynamic" . store Rx.word ] - -let namedpipe = Syslog.pipe . Sep.space . [ label "pipe" . store Syslog.file_r ] - -(* View: action_config - Handle action(type="..." users="...") syntax *) -let action_config = - [ key "action" . Util.del_str "(" . - [ label "params" . store /[^)]+/ ] . Util.del_str ")" ] - -let action = Syslog.action | omusrmsg | file_tmpl | dynamic | namedpipe | action_config - -(* Cannot use syslog program because rsyslog does not suppport #! *) -let program = [ label "program" . Syslog.bang . - ( Syslog.opt_plus | [ Build.xchgs "-" "reverse" ] ) . - Syslog.programs . Util.eol . Syslog.entries ] - -(* Cannot use syslog hostname because rsyslog does not suppport #+/- *) -let hostname = [ label "hostname" . - ( Syslog.plus | [ Build.xchgs "-" "reverse" ] ) . - Syslog.hostnames . Util.eol . Syslog.entries ] - -(* View: actions *) -let actions = - let prop_act = [ label "action" . action ] - in let act_sep = del /[ \t]*\n&[ \t]*/ "\n& " - in Build.opt_list prop_act act_sep - -(* View: entry - An entry contains selectors and an action -*) -let entry = [ label "entry" . Syslog.selectors . Syslog.sep_tab . - actions . Util.eol ] - -(* View: prop_filter - Parses property-based filters, which start with ":" and the property name *) -let prop_filter = - let sep = Sep.comma . Util.del_opt_ws " " - in let prop_name = [ Util.del_str ":" . label "property" . store Rx.word ] - in let prop_oper = [ label "operation" . store /[A-Za-z!-]+/ ] - in let prop_val = [ label "value" . Quote.do_dquote (store /[^\n"]*/) ] - in [ label "filter" . prop_name . sep . prop_oper . sep . prop_val . - Sep.space . actions . Util.eol ] - -(* View: condition - Parses if condition blocks, e.g., if $programname != "devd" then { ... } -*) -let condition = - let cond_rx = /\\$[a-zA-Z0-9_]+[ \t]*(==|!=|=~|!~|>|<|>=|<=)[ \t]*("[^"]*"|[0-9]+)/ in - [ key "if" . Sep.space . - [ label "condition" . store cond_rx ] . Sep.space . - Util.del_str "then" . Sep.space . Util.del_str "{" . (del /[ \t\n]*/ "" ) . - (entry | Util.comment | Syslog.empty)* . - Util.del_str "}" . (del /[ \t\n]*/ "" ) . Util.eol ] - -(* Fallback for unparsed lines *) -let invalid = [ label "invalid" . store /[^\n]*\n/ ] - -let entries = ( Syslog.empty | Util.comment | entry | macro | config_object | prop_filter | condition | invalid )* - -let lns = entries . ( program | hostname | condition )* - -let filter = incl "/etc/rsyslog.conf" - . incl "/etc/rsyslog.d/*" - . Util.stdexcl - -let xfm = transform lns filter +(* +Module: Rsyslog + Parses /etc/rsyslog.conf + +Author: Raphael Pinson + +About: Reference + This lens tries to keep as close as possible to `man 5 rsyslog.conf` where possible. + +About: License + This file is licenced under the LGPL v2+, like the rest of Augeas. + +About: Lens Usage + To be documented + +About: Configuration files + This lens applies to /etc/rsyslog.conf. See . + +About: Examples + The file contains various examples and tests. +*) +module Rsyslog = + +autoload xfm + +let macro_rx = /[^,# \n\t][^#\n]*[^,# \n\t]|[^,# \n\t]/ +let macro = [ key /$[A-Za-z0-9]+/ . Sep.space . store macro_rx . Util.comment_or_eol ] + +let config_object_param = [ key /[A-Za-z.]+/ . Sep.equal . Quote.dquote + . store /[^"]+/ . Quote.dquote ] +(* Inside config objects, we allow embedded comments; we don't surface them + * in the tree though *) +let config_sep = del /[ \t]+|[ \t]*#.*\n[ \t]*/ " " + +let config_object = + [ key /action|global|input|module|parser|timezone|include/ . + Sep.lbracket . + config_object_param . ( config_sep . config_object_param )* . + Sep.rbracket . Util.comment_or_eol ] + +(* View: users + Map :omusrmsg: and a list of users, or a single * +*) +let omusrmsg = Util.del_str ":omusrmsg:" . + Syslog.label_opt_list_or "omusrmsg" (store Syslog.word) + Syslog.comma "*" + +(* View: file_tmpl + File action with a specified template *) +let file_tmpl = Syslog.file . [ label "template" . Util.del_str ";" . store Rx.word ] + +let dynamic = [ Util.del_str "?" . label "dynamic" . store Rx.word ] + +let namedpipe = Syslog.pipe . Sep.space . [ label "pipe" . store Syslog.file_r ] + +(* View: action_config + Handle action(type="..." users="...") syntax *) +let action_config = + [ key "action" . Util.del_str "(" . + [ label "params" . store /[^)]+/ ] . Util.del_str ")" ] + +let action = Syslog.action | omusrmsg | file_tmpl | dynamic | namedpipe | action_config + +(* Cannot use syslog program because rsyslog does not suppport #! *) +let program = [ label "program" . Syslog.bang . + ( Syslog.opt_plus | [ Build.xchgs "-" "reverse" ] ) . + Syslog.programs . Util.eol . Syslog.entries ] + +(* Cannot use syslog hostname because rsyslog does not suppport #+/- *) +let hostname = [ label "hostname" . + ( Syslog.plus | [ Build.xchgs "-" "reverse" ] ) . + Syslog.hostnames . Util.eol . Syslog.entries ] + +(* View: actions *) +let actions = + let prop_act = [ label "action" . action ] + in let act_sep = del /[ \t]*\n&[ \t]*/ "\n& " + in Build.opt_list prop_act act_sep + +(* View: entry + An entry contains selectors and an action +*) +let entry = [ label "entry" . Syslog.selectors . Syslog.sep_tab . + actions . Util.eol ] + +(* View: prop_filter + Parses property-based filters, which start with ":" and the property name *) +let prop_filter = + let sep = Sep.comma . Util.del_opt_ws " " + in let prop_name = [ Util.del_str ":" . label "property" . store Rx.word ] + in let prop_oper = [ label "operation" . store /[A-Za-z!-]+/ ] + in let prop_val = [ label "value" . Quote.do_dquote (store /[^\n"]*/) ] + in [ label "filter" . prop_name . sep . prop_oper . sep . prop_val . + Sep.space . actions . Util.eol ] + +(* View: condition + Parses if condition blocks, e.g., if $programname != "devd" then { ... } +*) +let condition = + let cond_rx = /\\$[a-zA-Z0-9_]+[ \t]*(==|!=|=~|!~|>|<|>=|<=)[ \t]*("[^"]*"|[0-9]+)/ in + [ key "if" . Sep.space . + [ label "condition" . store cond_rx ] . Sep.space . + Util.del_str "then" . Sep.space . Util.del_str "{" . (del /[ \t\n]*/ "" ) . + (entry | Util.comment | Syslog.empty)* . + Util.del_str "}" . (del /[ \t\n]*/ "" ) . Util.eol ] + +(* Fallback for unparsed lines *) +let invalid = [ label "invalid" . store /[^\n]*\n/ ] + +let entries = ( Syslog.empty | Util.comment | entry | macro | config_object | prop_filter | condition | invalid )* + +let lns = entries . ( program | hostname | condition )* + +let filter = incl "/etc/rsyslog.conf" + . incl "/etc/rsyslog.d/*" + . Util.stdexcl + +let xfm = transform lns filter From 3e34678abf8a29e9125221a890e6efb826bd36ff Mon Sep 17 00:00:00 2001 From: Xavier Beaudouin Date: Mon, 14 Jul 2025 17:11:16 +0700 Subject: [PATCH 3/3] Cleanup some unneeded comments. --- lenses/rsyslog.aug | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lenses/rsyslog.aug b/lenses/rsyslog.aug index b51f6fe8c..ddd4829cf 100644 --- a/lenses/rsyslog.aug +++ b/lenses/rsyslog.aug @@ -53,11 +53,7 @@ let dynamic = [ Util.del_str "?" . label "dynamic" . store Rx.word ] let namedpipe = Syslog.pipe . Sep.space . [ label "pipe" . store Syslog.file_r ] -(* View: action_config - Handle action(type="..." users="...") syntax *) -let action_config = - [ key "action" . Util.del_str "(" . - [ label "params" . store /[^)]+/ ] . Util.del_str ")" ] +let action_config = [ key "action" . Util.del_str "(" . [ label "params" . store /[^)]+/ ] . Util.del_str ")" ] let action = Syslog.action | omusrmsg | file_tmpl | dynamic | namedpipe | action_config