Usando a lente Augeas INI sem cabeçalho

3

Estou usando o módulo IniFile com augeas para criar uma lente de gerenciamento do Splunk. Isso funciona bem para todos os arquivos que contêm cabeçalhos de seção, como um arquivo INI normal, mas há alguns arquivos que não seguem esse esquema, usando apenas os pares nome = valor.

Existe uma maneira de mapear essas entradas sem uma seção definida para algo genérico, como main? Eu prefiro não ter que aprender outro módulo para este segundo tipo de arquivo, há uma maneira pronta para evitá-lo no momento.

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" = ?
    
por Tim Brigham 18.06.2012 / 20:44

1 resposta

4

A lente PHP fornece funcionalidade semelhante, suportando configurações em um arquivo INI antes das seções definidas. Eu adaptei isso em sua lente e consertei a lente "setting" que deveria ter usado IniFile.entry_re para evitar ambiguidades.

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

A árvore que será gerada é semelhante a essa, com todas as configurações fora da seção que estão no nó ".anon":

Test result: splunk.aug:20.2-.31:
  { ".anon"
    { "test" = "yes" }
  }

Este nó é necessário para evitar ambiguidades na direção de entrada. Tomando um exemplo, se você foi encarregado de escrever esta árvore de volta em um arquivo:

{ "foo" }

Pode ser escrito como [foo] (um nome de seção) ou foo= (uma configuração fora de uma seção). A subárvore ".anon" garante que essa transformação esteja livre de ambigüidade. Para removê-lo e ter uma estrutura plana, você precisaria criar um segundo módulo / lente para cada tipo de arquivo, o que eu acho que seria uma solução mais natural. O nó ".anon" faz mais sentido no caso do PHP, onde há um mix no mesmo arquivo.

Por favor submeta sua (s) lente (s) ao projeto Augeas quando terminar e tiver adicionado testes, gostaríamos de incluí-la. Envie via trac ou envie para o list .

    
por 18.06.2012 / 23:51