diffing configuration files made easy

Let's assume you are a sysadmin and have to debug a daemon giving bad performance on one machine, but not on the other. Of course, you did not setup either machine, have only basic knowledge of the said daemon and would really love to watch that awesome piece of cinematographic art with a bunch of friends and a couple of beers. So it's like every day, right?

The problem with understanding running setups is that you often have to read configuration files. And when reading one is not enough, you have to compare two or more of them. Suddenly, a wild problem occurs: order and indentation do not matter (unless they do), comments are often just beautiful noise and why the hell did "that guy" smoke/drink/eat while explicitly setting ALL THE OPTIONS to their defaults before actually setting them as he wanted.

If you are using diff(1), you probably love to read a lot of differences, which are none in reality. Want an example?

[foo]
bar = bar
foo = foo

and

# settings for foo
[foo]
# foo is best
foo = foo
# bar is ok here, FIXME?
bar = bar

and

[foo]
foo = x
bar = x

[foo]
foo = foo
bar = bar

are actually the same, at least for some parsers. XTaran suggested using something like wdiff or dwdiff, which often helps, but not in the above case. Others suggested vimdiff, which is nice, but not really helpful here either.

As there is a problem, and I love to solve these, I started a small new project: cfgdiff. It tries to parse two given files and give a diff of the content after normalizing it (merging duplicate keys, sorting keys, ignoring comments and blank lines, you name it). Currently it can parse various INI files, JSON, YAML and XML. That's probably not enough to be the single diff tool for configuration files, but it is quite a nice start. And you can extend it, of course ;)

Comments

Leo Antunes wrote on 2014-02-16 17:49:

I never actually used it, so this may be a stupid suggestion, but what about augeas? If it does what it says, it could already handle parsing of many config formats and leave only the actual diffing up to you. Plus it has python bindings…

Paul Wise wrote on 2014-02-17 03:51:

How about basing it on augeas + Config::Model instead? Config::Model can deal with migrations of variables, so diffing two different versions of a config file where nothing was changed between them would print with no diffs.

Thomas Goirand wrote on 2014-02-17 11:40:

This looks like a very useful tool to me. How about uploading it to Debian?

sharuzzaman wrote on 2017-08-23 02:48:

Please make your cgdiff installable with pip. Currently there is no python app in PyPI that can do yaml diff

Send your comments to evgeni+blogcomments@golov.de and I will publish them here (if you want).