Использование объектива 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" }
  }

Этот узел необходим, чтобы избежать двусмысленности в положенном направлении. Например, если вам было поручено записать это дерево обратно в файл:

{ "foo" }

Это может быть написано как либо просто [foo] (название раздела) или foo= (настройка вне раздела). Поддерево ".anon" гарантирует, что обратное преобразование не будет содержать двусмысленности. Чтобы удалить его и иметь плоскую структуру, вам потребуется создать второй модуль / линзу для каждого типа файла, что, я думаю, было бы более естественным решением. Узел ".anon" имеет больше смысла в случае PHP, где в одном и том же файле есть микс.

Пожалуйста, отправьте ваши линзы в проект Augeas, когда вы закончите и добавите тесты, мы будем рады включить их. Отправить либо через trac или отправить в список.

Другие вопросы по тегам