Использование предварительно проанализированного определения протокола в скрипте и его актуализация

Для моей работы мне иногда приходится иметь дело с лог-файлами из двоичного протокола (лог-файлы содержат hexdumps сообщений). Я хочу написать сценарий Perl, который может интерпретировать двоичные данные для меня и распечатать содержимое в более удобном формате.

У меня есть (машиночитаемое) описание протокольных сообщений в проприетарном формате, и я (в основном) выяснил, как анализировать этот формат (части, которые я не могу полностью понять, не связаны с моей целью, поэтому я могу просто проигнорировать их), поэтому я могу преобразовать описание в структуру данных для использования в моем сценарии.

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

2 ответа

Решение

Предполагая, что описание протокола находится в файле, доступном для скрипта, есть функция для чтения проанализированных данных, которая кэширует проанализированные результаты в промежуточный файл. Логика очень очень проста, но шаги выглядят очень многословно, так как я попытался написать полную спецификацию - на самом деле это должно занять <10 строк кода Perl.

  1. Проверьте, существует ли промежуточный файл. Если это не (или не может быть прочитано), перейдите к проприетарному шагу разбора (#4)

  2. Если вы можете прочитать файл промежуточного кэша, прочитайте его в поле "метка времени описания протокола" (описано ниже). Затем узнайте время модификации файла "описания протокола" через stat() и сравни. Если время изменения файла "описания протокола">= кешированная временная метка файла кеша, перейдите к проприетарному шагу разбора (#4)

  3. В противном случае (например, время файла "описания протокола" составляет <временная метка, сохраненная в файле кэша), прочитайте данные промежуточного файла кэша через Data:: Dumper или Storable. Конец.

  4. Если вам необходимо выполнить повторный анализ из-за логики в № 1 или № 2, прочитайте файл "описания протокола", проанализируйте его в структуре данных.

  5. Затем создайте хеш с 2 ключами: "protocol_description_timestamp" (со значением, являющимся временем модификации файла описания протокола, полученного из stat call) и второй ключ "data", со значением, являющимся ссылкой на структуру данных, которую вы только что создали в результате анализа.

  6. Затем сохраните эту структуру данных в промежуточный файл кэша, используя Storable или же Data::Dumper или любой другой способ хранения структур данных Perl по вашему выбору.

Вы можете использовать Makefile для этого. Создайте структуру данных, которую вы используете для цели Makefile, которая зависит от описания протокола. Когда Make замечает, что протокол был обновлен позднее, чем скрипт, он будет запускать команды, которые вы укажете, чтобы воссоздать ваши данные.

Другие вопросы по тегам