我正在使用 IniFile 模块和 augeas 创建 Splunk 管理镜头。这适用于所有包含节头的文件,如普通 INI 文件,但有几个文件不遵循此方案,仅使用名称=值对。
有没有现成的方法可以将没有部分定义的条目映射到通用部分(如 main)?我宁愿不必为第二种文件类型学习另一个模块,因为目前有一种现成的方法可以避免这种情况。
module Splunk =
autoload xfm
let comment = IniFile.comment IniFile.comment_re IniFile.comment_default
let sep = IniFile.sep IniFile.sep_re IniFile.sep_default
let setting = IniFile.record_re
let title = IniFile.title ( IniFile.record_re )
let entry = IniFile.entry steting sep comment
let record = IniFile.record title entry
let lns = IniFile.lns record comment
let filter = incl "/etc/splunk/*.conf"
let xfm = transform lns filter
test lns get "[section]\ntest-value=yes\n" = ?
test lns get "test=yes\n" = ?
答案1
PHP 镜头提供了类似的功能,支持在定义部分之前的 INI 文件中进行设置。我已将其调整到您的镜头中,并修复了应该使用的“设置”镜头,IniFile.entry_re
以避免产生歧义。
module Splunk =
autoload xfm
let comment = IniFile.comment IniFile.comment_re IniFile.comment_default
let sep = IniFile.sep IniFile.sep_re IniFile.sep_default
let empty = IniFile.empty
let setting = IniFile.entry_re
let title = IniFile.title ( IniFile.record_re - ".anon" )
let entry = IniFile.entry setting sep comment
let record = IniFile.record title entry
let record_anon = [ label ".anon" . ( entry | empty )+ ]
let lns = record_anon | record*
let filter = incl "/etc/splunk/*.conf"
let xfm = transform lns filter
test lns get "[section]\ntest-value=yes\n" = ?
test lns get "test=yes\n" = ?
生成的树如下所示,其中部分之外的所有设置都位于“.anon”节点下:
Test result: splunk.aug:20.2-.31:
{ ".anon"
{ "test" = "yes" }
}
此节点对于避免 put 方向的歧义是必需的。举个例子,如果你要将这棵树写回到文件中:
{ "foo" }
它可以写成[foo]
(部分名称)或foo=
(部分之外的设置)。“.anon”子树确保此转换不会产生歧义。要删除它并拥有扁平结构,您需要为每种类型的文件创建第二个模块/镜头,我认为这将是一个更自然的解决方案。在 PHP 中,当同一文件中存在混合时,“.anon”节点更有意义。