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