使用无接头的 Augeas INI 镜头

使用无接头的 Augeas INI 镜头

我正在使用 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”节点更有意义。

请在完成并添加测试后将您的镜头提交给 Augeas 项目,我们很乐意将其纳入。通过以下方式提交跟踪或发送至列表

相关内容