Назад | Перейти на главную страницу

Использование объектива Augeas INI без заголовка

Я использую модуль IniFile с augeas для создания линзы управления Splunk. Это хорошо работает для всех файлов, содержащих заголовки разделов, как обычный файл INI, но есть пара файлов, которые не следуют этой схеме, просто используют пары имя = значение.

Есть ли готовый способ сопоставить эти записи без определенного раздела с чем-то общим, например, с основным? Я бы предпочел не изучать другой модуль для этого второго типа файлов, на данный момент есть готовый способ избежать этого.

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" = ?

Объектив 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, когда вы закончите и добавите тесты, мы будем рады включить их. Отправить через трассировка или отправить в список.