Использование предварительно проанализированного определения протокола в скрипте и его актуализация - PullRequest
1 голос
/ 28 октября 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 29 октября 2010

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

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

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

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

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

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

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

0 голосов
/ 28 октября 2010

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

...