LINUX.ORG.RU
решено ФорумAdmin

Есть ли редактор с cli-интерфейсом для конфигов хитрого формата?

 , ,


0

2

Пример конфига

akka {
  actor {
    debug {
      receive = on
    }
  }
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = "DEBUG"
  stdout-loglevel = "DEBUG"

    redis-subscriber-worker-dispatcher {
      mailbox-type = "akka.dispatch.SingleConsumerOnlyUnboundedMailbox"
      # Throughput defines the maximum number of messages to be
      # processed per actor before the thread jumps to the next actor.
      # Set to 1 for as fair as possible.
      throughput = 512
    }
}
Хочу утилиту которая бы могла изменить «receive = on» на «receive = off»

типа

confedit file_config.conf --key akka.actor.debug.receive --set off
и
confedit file_config.conf --key akka.loglevel --set '"ERROR"'

И при этом не трогать форматирование других строк.

Перемещено hobbit из general

★★★★★

Решение в лоб — ed. Составляешь поисковый запрос, возможно несколько, который точно будет работать всегда. Если конфиг 99% времени статичен, то норм.

Возможно, этот конфиг можно генерить из JSON/YAML. Тогда можно jq.

kaldeon
()

Сначала, не разобравшись, хотел посоветовать sed, потом дочитал и понял, что такую совокупность условий он, пожалуй, не осилит (если я не прав, объясните мне, как, мне тоже интересно).

Я для плюс-минус похожих задач делаю скрипты на перле. Но не исключаю, что это из пушки по воробьям. Может, действительно, как выше предлагали, jq справится, а то я его использую исключительно как форматилку JSON для обработки отчётов сканера чеков от ФНС :) (кстати, отличная программа и с открытым форматом на выходе, рекомендую).

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

Ты даже JSON так не поменяешь, которые все умеют парсить. А тут какой-то инопланетный формат. Только самому писать. На практике пользуй sed как все… Или дорабатывай программу, чтобы вытащить интересующее в переменные окружения. К примеру в спринге подобное можно менять через AKKA_ACTOR_DEBUG_RECEIVE=off

vbr ★★★★★
()

Я бы поискал либы, которыми целевое приложение само парсит этот конфиг, предварительно помолившись, чтобы там была опция сохранения комментариев. И если бог услышал бы мои молитвы, то набросал утилиту с помощью этой либы или нашёл готовую.

Формат нестандартный, вряд ли много кто умеет с ним работать за пределами экосистемы приложения или фреймворка. Это только под всякие xml/yaml/json есть либы и утилиты под любой язык и платформу.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)

Это конфиг какой-то из частей проекта BigBleButton.
Там адская смесь разных форматов конфигов.

Этот конфиг от какого-то жабо-приложения.
У него 2 конфига: один на xml, а другой вот такой непонятный.

Похоже свой парсер придётся написать.

Там нужно править несколько файлов, в нескольких местах.

Похоже, что на перле будет не так сложно сделать такой «редактор»

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

если я не прав, объясните мне, как, мне тоже интересно

Я не силён в sed. Насколько я понимаю, он итерирует по строкам. В таком контексте сложно понять, что «receive» найден в контексте «debug».

Есть какие-то «hold space» и «pattern space», но я их не осилил.

Можно попробовать ed. Там нет итерации по строкам. Запустил первый поисковый запрос, потом второй, потом третий, выполнил замену.

/^ *akka *{/
/^ *actor *{/
/^ *debug *{/
/^ *receive *= *..*/
s/on/off/
wq

Запуск:

cat script |ed file

Что может потенциально сломать скрипт: повторяющиеся блоки с одинаковым названием, рекурсивность, multi-line строки.

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

Sam сможет чуть больше. Например, проверить что akka->actor->debug->receive идут строго друг за другом (или между ними нет ^ *}$), а не debug где-то в другом блоке. Но в целом, конфиг рекурсивный, а регулярные выражения нет, поэтому сделать одновременно надёжно и гибко не получится.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 2)
Ответ на: комментарий от eve

по синтаксису это hocon

https://manpages.ubuntu.com/manpages/focal/man1/hocon.1.html

confedit file_config.conf --key akka.actor.debug.receive --set off

$ hocon -i input.hocon set akka.actor.debug.receive off
akka {
  actor {
    debug {
      receive = off
    }
  }
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = "DEBUG"
  stdout-loglevel = "DEBUG"

    redis-subscriber-worker-dispatcher {
      mailbox-type = "akka.dispatch.SingleConsumerOnlyUnboundedMailbox"
      # Throughput defines the maximum number of messages to be
      # processed per actor before the thread jumps to the next actor.
      # Set to 1 for as fair as possible.
      throughput = 512
    }
}

confedit file_config.conf –key akka.loglevel –set ‘«ERROR»’

$ hocon -i input.hocon set akka.loglevel ERROR
akka {
  actor {
    debug {
      receive = on
    }
  }
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = ERROR
  stdout-loglevel = "DEBUG"

    redis-subscriber-worker-dispatcher {
      mailbox-type = "akka.dispatch.SingleConsumerOnlyUnboundedMailbox"
      # Throughput defines the maximum number of messages to be
      # processed per actor before the thread jumps to the next actor.
      # Set to 1 for as fair as possible.
      throughput = 512
    }
}
gagarin0
()