うたカモ技術ブログ

ツール ChatGPT python

設定ファイル比較スクリプトの紹介   

post: 

このメモ記事では、2つの設定ファイルのパラメーター差分を確認するpythonスクリプトについて紹介します。

今回、<key>=<value>のパターンで設定値を管理するような 設定ファイルを対象に、2つのファイル間のパラメーター差分を確認するスクリプトをChatGPTに作成してもらいました。

度々、使いたい機会があるかもしれないので、本メモ記事として掲載します。

設定ファイル比較スクリプト(compare.py)

ChatGPTに作成してもらったpythonスクリプトは以下の差分をコンソールに出力するプログラムです。

  1. 2つの設定ファイルのどちらか一方だけが持つパラメーター
  2. 両方の設定ファイル中に存在するパラメーターだけど値が異なるもの

スクリプトは以下の通りです。

# compare.py
def read_conf_file(file_path):
    parameters = {}
    with open(file_path, 'r') as file:
        for line in file:
            line = line.strip()
            if line and not line.startswith('#') and '=' in line:
                key, value = line.split('=', 1)
                parameters[key.strip()] = value.strip()
    return parameters

def compare_conf_files(file1, file2):
    params1 = read_conf_file(file1)
    params2 = read_conf_file(file2)

    # どちらか一方だけが持つパラメーター
    only_in_one = {k: v for k, v in params1.items() if k not in params2}
    only_in_one.update({k: v for k, v in params2.items() if k not in params1})

    # パラメーターが存在するが値が異なるもの
    different_values = {k: (params1[k], params2[k]) for k in params1 if k in params2 and params1[k] != params2[k]}

    if only_in_one:
        print("Parameters present in only one of the conf files:")
        for key, value in only_in_one.items():
            print(f"{key}={value}")
    else:
        print("No parameters found that are present in only one of the conf files.")

    if different_values:
        print("\nParameters with different values:")
        for key, values in different_values.items():
            print(f"{key}: {values[0]} (first file) != {values[1]} (second file)")
    else:
        print("No parameters found with different values between the two conf files.")

# 使用例
file1 = 'test1.conf'
file2 = 'test2.conf'
compare_conf_files(file1, file2)

この比較スクリプトの特徴は、ファイル差分を確認するWinmergeなどのdiffツールと違い、 特定のパターンで記述された設定ファイルの中で、片方のファイルのみ記述されたパラメーターと パラメーターの値違いのものを抜き出すことです。逆にパラメーターの記述行などの違いは差分としてカウントされません。

ということで、次節では、このスクリプトを実行した結果を掲載します。

実行結果

動作確認のために、今回は次の2つの設定ファイルを用意しました。

# test1.conf
network_mode=bridge
ip_address=192.168.1.1
subnet_mask=255.255.255.0
dns_server=8.8.8.8
max_connections=100
dnsmasq=on
# test2.conf
network_mode=router
ip_address=192.168.1.2
subnet_mask=255.255.255.0
dns_server=8.8.4.4
max_users=50
mtu=1500
dhcp=off

これら2つの設定ファイルの比較をした結果は以下となります。

$ python ./compare.py
Parameters present in only one of the conf files:
max_connections=100
dnsmasq=on
max_users=50
mtu=1500
dhcp=off

Parameters with different values:
network_mode: bridge (first file) != router (second file)
ip_address: 192.168.1.1 (first file) != 192.168.1.2 (second file)
dns_server: 8.8.8.8 (first file) != 8.8.4.4 (second file)

ChatGPTに代表される生成AIは凄いですね。ちょっとしたツールなら作ってくれます。

たまに使用することがあるかもしれないスクリプトは、技術ブログなどに掲載してストックするのはアリだなと思いました。