我想编写一个解析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
这种格式看起来很容易解析,但是我不想重蹈覆辙。如果有一个可以通用解析此格式的现有库,我想使用它。 但是,如何为您无法命名的内容找到一个库? 文件扩展名在这里没有帮助。 yum本身并不会产生任何一般结果。
所以,请教我如何钓鱼: 如何有效地找到我不知道的文件格式的名称?
答案 0 :(得分:1)
识别未知文件格式可能会很麻烦。 但是您有一些选择。我将从一个非常明显的开始。
向他人展示格式可能是找出其名称的最佳方法。 有人可能会意识到这一点。如果没有人这样做,那么很有可能 您面前拥有专有的文件格式。
对于您的yum存储库文件,我会说它是一个普通的旧INI文件。 但是,让我们对此进行更多研究。
如果没有人认识您的格式,那么逆向工程也许是最好的选择。 使用参考实现,找出它们用于解析格式的内容。 幸运的是,yum是开源的。因此很容易查找。 让我们看看yum作者用来解析其repo文件的内容:
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
之类的术语,
您将快速找到所需的结果。
有时候,您无权访问参考实现的源代码。例如:参考实现是封闭源。 尝试破坏格式。插入一些垃圾,然后观察日志文件。如果幸运的话,您可能会发现 有用的错误消息,可能会给您有关格式的提示。 如果您觉得自己很勇敢,也可以尝试使用实际的反编译器。这可能是非法的,也可能不是非法的,也可能不是浪费时间。 我个人只会在万不得已时这样做。