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