Как я могу редактировать файлы конфигурации Kerberos 5 с помощью Perl? - PullRequest
4 голосов
/ 07 января 2009

Кто-нибудь сталкивался с модулем Perl, который будет анализировать (и записывать) файлы конфигурации Kerberos (то есть /etc/krb5.conf)? Я рассмотрел довольно много модулей синтаксического анализа, таких как Config :: General , Config :: Auto и т. Д., Но ни один из них не может обрабатывать вложенные структуры, подобные следующим: 1006 *

pam = {
  debug = false
  ticket_lifetime = 36000
  renew_lifetime = 36000
  forwardable = true
  krb4_convert = false
}

Он также должен обрабатывать секции стиля INI, например:

[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM

[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
 }

Более подробную информацию о формате можно найти по адресу в документации по krb5 conf

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

1 Ответ

3 голосов
/ 07 января 2009

Полагаю, если на написание парсера уходит около 10 минут, возможно, не очень интересно сделать его модулем. Вот фрагмент кода, который, вероятно, выполняет свою работу (отказ от ответственности: я ничего не знаю о формате конфигурации для Kerberos, код основан на том, что вы разместили здесь).

#!/usr/bin/perl -w
use strict;

my %conf;
my $section;

while (<>) {
    if (/^\s*(\S*)\s*=\s*\{\s*$/) {
        $section = $1;
        $conf{$section} = {};
    } elsif (/^\s*(\S*)\s*=\s*(\S*)\s*$/) {
        my $key = $1;
        my $value = $2;
        if ($section) {
            $conf{$section}{$key}=$value;
        }
    }
}

foreach (keys %conf) {
    $section = $_;
    foreach (keys %{$conf{$section}}) {
        print "$section:$_:$conf{$section}{$_}\n";
    }
}

РЕДАКТИРОВАТЬ: Парсинг INI-формат тоже не сложно. Вам просто нужно добавить еще несколько if в цикл while и немного усложнить структуру данных% conf. Вместо хэша хэша вам понадобится хэш хэша, где ключом первого уровня является ключевое слово в [...], а вторым уровнем является то, что я написал здесь (для «pam = {»).

...