Как мне эффективно определить неизвестный формат файла - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу написать программу, которая анализирует файлы конфигурации yum.Эти файлы выглядят так:

[google-chrome]
name=google-chrome - 64-bit
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

Этот формат выглядит так, как будто его очень легко разобрать, но я не хочу изобретать велосипед.Если есть существующая библиотека, которая может в общем разбирать этот формат, я хочу использовать ее.Но как найти библиотеку для чего-то, что вы не можете назвать?Расширение файла здесь не поможет.Термин «.repo» не дает никаких общих результатов, кроме самого yum.

Итак, пожалуйста, научите меня ловить рыбу: как мне эффективно найти название формата файла, который мне неизвестен?

1 Ответ

0 голосов
/ 21 сентября 2018

Идентификация неизвестного формата файла может быть проблемой.Но у вас есть несколько вариантов.Я начну с очень очевидного.

Ask

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

В случае с вашим файлом репозитория yum я бы сказал, что это обычный старый INI-файл.Но давайте проведем еще несколько исследований по этому вопросу.

Реверс-инжиниринг

Реверс-инжиниринг, возможно, ваш лучший выбор, если никто не узнает ваш формат.Возьмите эталонную реализацию и выясните, что они используют для разбора формата.К счастью, Yum с открытым исходным кодом.Так что легко смотреть вверх.Давайте посмотрим, что авторы yum используют для анализа своего репо-файла:

try:
    ini = INIConfig(open(repo.repofile))
except:
    return None

https://github.com/rpm-software-management/yum/blob/master/yum/config.py#L1304

Теперь импорт этой функции можно найти здесь:

from iniparse import INIConfig

https://github.com/rpm-software-management/yum/blob/master/yum/config.py#L32

Это приводит нас к библиотеке под названием iniparse (https://pypi.org/project/iniparse/). Так что yum использует INI-парсер для своих файлов конфигурации.

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

Я использую инструмент под названием ripgrep (https://github.com/BurntSushi/ripgrep).. Мои начальные привязки обычно являются хорошо известными путями к файлам. В случае yum,Я взял /etc/yum.repos.d для моего первоначального поиска:

# assuming you are in the root directory of yum's source code
rg /etc/yum.repos.d yum
yum/config.py
769:    reposdir = ListOption(['/etc/yum/repos.d', '/etc/yum.repos.d'])

yum/__init__.py
556:        # (typically /etc/yum/repos.d)

Это сузит его до двух файлов. Если вы продолжите с такими терминами, как read или parse, вы быстро найдете результаты, которые выwant.

Что если у вас нет ссылочного источника?

Ну, иногда у вас нет доступа к исходному коду ссылочной реализации. Например: ссылочная реализация является закрытым исходным кодом.Попробуйте сломать формат. Вставьте немногомусора и наблюдать за файлами журналов впоследствии.Если вам повезет, вы можете найти полезное сообщение об ошибке, которое может дать вам подсказки о формате.Если вы чувствуете себя очень смелым, вы можете попробовать использовать и настоящий декомпилятор.Это может или не может быть незаконным и может или не может быть пустой тратой времени.Лично я бы сделал это только в крайнем случае.

...