LINUX.ORG.RU

Чтение конфигурации и обработка текста

 , ,


0

1

Нужно сделать некое подобие централизованной конфигурации и текстового препроцессора используя стандартные средства (поставку) RHEL (LSB): bash/perl/make/sed/awk/... .

Ставить дополнительные модули крайне нежелательно. Иначе бы я заюзал Perl (JSON/Config::IniFiles и Template Toolkit/Text::Template/Mason)

Т.е. юз-кейс такой:
1. Прочитать конфиг (чтоб его значения были доступны в качестве переменных внутри программы)
2. Выполнить некие действия (исходя из значений в конфиге)
3. Обработать текстовые файлы: подставить в них значения из программной среды на предопределённые места

З.Ы. PHP нет и не будет.

если конфиг в bash-стиле, можно сделать так:

. /etc/config

Lincor
()
Ответ на: комментарий от Gvidon

Напиши на перле простенький разборщик инишников, делов-то

Проблемнее потом это всё дело подставить в файл

KennyMinigun ★★★★★
() автор топика

Ставить дополнительные модули крайне нежелательно

local::lib

Нужно сделать

И в каком месте возникло затруднение?

Olegymous ★★★
()

Конфиг надо шарить между perl // bash // etc? Если нет, то можно и перловую структуру данных хранить в файле и подключать через require. Ну и как вариант, написать прогу которая будет вытаскивать значения из этого конфига `./get_settings.pl param_name`, `./set_settings.pl param_name param_value`.

outtaspace ★★★
()
Ответ на: комментарий от Olegymous

И в каком месте возникло затруднение?

Затруднение в том, что хочется иметь минимальную и при том достаточно надёжную инфраструктуру. По этому велосипедостроение отходит на последние места в списке претендентов на вариант реализации.

local::lib

те же яйца, только в профиль, но тоже вариант

KennyMinigun ★★★★★
() автор топика
Ответ на: комментарий от outtaspace

Та не, тут еще стадия проектирования: то есть выбор языка реализации. Так что шарить данные между башем и перлом надеюсь не придётся.

Меня больше всего мучает вопрос «как же правильно обрабатывать текстовые шаблоны?».

KennyMinigun ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

А что сложного?

my %changes = {
  'param1' => 'value1',
  'param2' => 'value2',
};

my %config;

# считываем и парсим конфиг
my $CONFFILE;
open $CONFFILE, "$conf_file_name";
while ( my $line = <$CONFFILE> ) {
  if ( $line =~ m/^\s*(\S+)\s*=\s*(\S+)\s*$/ ) {
     my $param = $1; my $value = $2;
     $config{$param} = $value;
  };
};
close $CONFFILE;

# применяем %changes
for my $param ( keys %changes ){
  $config{$param} = $changes{$param};
};

# записываем результат
open $CONFFILE, ">$conf_file_name";
for my $param (sort keys %config) {
   PRINTF $CONFFILE "%s = %s\n", $param, $config{$param}
};
close $CONFFILE;

Или даже так

my @config;

my $CONFFILE;
open $CONFFILE, "$conf_file_name";
while ( my $line = <$CONFFILE> ) {
   chomp $line;
   for my $param ( keys %changes ) {
      # если нашли подходящую строку - правим её.
      if ( $line =~ m/^\s*${param}\s*=/ ) {
         my $line = sprintf "%s = %s\n", $param, $changes{$param};
         delete $changes{$param};
      };
      push @config, $line;
   };
};
close $CONFFILE;
# если подходящую строку не нашли, дописываем новый параметр в конец
for my $param ( keys %changes ) {
   push @config, sprintf( "%s = %s\n", $param, $changes{$param});
};

# ну и потом записываем @config в файл

З.Ы. код писал прямо в окне добавления комментария, не отлаживал

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

а чем не устраивают готовые варианты вроде puppet, cfengine, chef ( вроде ещё ansible ) ?

В puppet например, при необходимости редактирования файлов можно использовать augeas, который парсит файл и применяет к нему заданные изменения. Отдельно от puppet не использовал augeas, но apt-cache search подсказывает, что есть пакет augeas-tools

http://projects.puppetlabs.com/projects/1/wiki/puppet_augeas

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

а чем не устраивают готовые варианты вроде puppet, cfengine, chef ( вроде ещё ansible ) ?

А ты ОП внимательно прочитал? Надо сделать из того, что есть.

Кстати, как насчет Python? У него изкоробочные батарейки богаче перловских, ConfigParser, например, есть.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

ConfigParser, например, есть.

О, прикольно, спасибо. Посмотрю завтра.

KennyMinigun ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.