Eu tenho um sistema de firewall personalizado com nosso próprio arquivo de configuração simples. Sua basicamente bash source definindo um bem conhecido variáveis:
SUPERACCESS="127.0.0.1 192.168.11.0/24"
SERVICES="ping 80/tcp 443/tcp 22/tcp"
FORWARDING=1
.....
e gostaria de gerenciar esses arquivos de configuração com o fantoche (provavelmente via augeas se necessário). Porque eu sou novo em todo o ecossistema de marionetes, eu estou procurando por "melhores práticas" de maneira razoavelmente simples e limpa como conseguir isso.
Eu preciso ser capaz de modificar apenas algumas das opções (por isso não posso enviar a configuração como arquivo inteiro do mestre de marionetes) e eu não quero limitar o acesso a esses arquivos exclusivamente para o fantoche. Tudo o que preciso é uma maneira de garantir que determinada sub-rede, serviço, etc ... esteja (ou não) na lista apropriada, ou seja, algo assim:
firewall::superaccess { "LAN" :
target => "192.168.11.0/24",
ensure=> "present",
}
Consegui forçar o augeas a usar a lente Shell_variables e consegui alterar os campos "simples" como FORWARDING. Infelizmente, não obtive êxito com os valores da lista (ou seja, SUPERACCESS) usando a lente Shell_variables_list.
Talvez exista uma maneira melhor do que usar o augeas. Eu tentei olhar no fantoche forjar, se houver algum módulo com formato de configuração semelhante, mas não consegui encontrar nenhum. Infelizmente eu não conheço muito de linguagem de lentes ruby e augeas, mas vou aprender algumas se necessário. Eu só não quero começar na direção errada ...
Atualização:
Graças ao Raphink, consegui localizar o problema. É o comentário no meio da linha. Se houver essa linha no arquivo:
service_ping="ping/icmp" #ping
Eu recebo este erro:
/tmp/augcheck.TCTUBq/parse_file.aug:3.0-.58:exception thrown in test
/tmp/augcheck.TCTUBq/parse_file.aug:3.5-.54:exception: Iterated lens matched less than it should
Lens: /usr/share/augeas/lenses/dist/shellvars_list.aug:40.12-.37:
Error encountered at 176:0 (9906 characters into string)
<--------\n#Built in services\n|=|service_ping="ping/icmp" #pi>
Tree generated so far:
Se eu mover o comentário em uma linha separada, ele carregará o arquivo na estrutura da árvore. Até mesmo o augtool funciona como esperado. Eu tenho essa versão de augeas instalada: ruby-augeas-0.4.1-3.fc17.x86_64, augeas-1.0.0-1.fc17.x86_64, augeas-libs-1.0.0-1.fc17.x86_64
Atualização 2:
Para resolver o problema com comentários inline, usei o código da lente ShellVars. A mudança é copiar / colar algumas definições de ShellVars e alterar a definição de linha:
let empty_part_re = Util.empty_generic_re . /\n+/
let semicol_eol = del (/[ \t]*[;\n]/ . empty_part_re*) "\n"
let eol_for_comment = del /([ \t]*\n)([ \t]*(#[ \t]*)?\n)*/ "\n"
(* comment_eol in shell MUST begin with a space *)
let comment_eol = Util.comment_generic_seteol /[ \t]+#[ \t]*/ " # " eol_for_comment
let comment_or_eol = comment_eol | semicol_eol
let kv = [ key key_re . eq . ( squote_arr | dquote_arr | unquot_val ) . comment_or_eol ]