Skip to content

Instantly share code, notes, and snippets.

@DaikiSuganuma
Last active August 31, 2025 23:31
Show Gist options
  • Save DaikiSuganuma/b22aff486d216c57aa569a31603ba4aa to your computer and use it in GitHub Desktop.
Save DaikiSuganuma/b22aff486d216c57aa569a31603ba4aa to your computer and use it in GitHub Desktop.
Check metadata of mmdb file. Generate by Gemini 2.5 Pro
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ==============================================================================
# GeoIPデータベース(.mmdb)のメタデータ表示スクリプト
#
# [機能]
# 指定されたGeoLite2-Country.mmdbファイルのメタデータを読み込み、
# 人間が読みやすい形式でターミナルに表示します。
#
# [前提]
# Python 3 および 'maxminddb' ライブラリがインストールされている必要があります。
# FreeBSDの場合: `sudo pkg install py311-maxminddb`
#
# [使い方]
# 1. 下の `DB_FILE` 定数のパスを、ご自身の環境に合わせて修正します。
# 2. ターミナルで `python3 check_mmdb_meta.py` を実行します。
# ==============================================================================
# --- ライブラリのインポート ---
# maxminddb: MaxMind社の.mmdbデータベースファイルを読み込むためのライブラリ
import maxminddb
# datetime: 日付や時刻を扱うためのライブラリ
import datetime
# os: ファイルパスの操作など、OSの機能を利用するためのライブラリ
import os
# --- 設定項目 ---
# ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
# GeoIPデータベースファイルのパスを指定します。
# ご自身の環境に合わせてこのパスを修正してください。
#
# FreeBSDでpkg経由でgeoipupdateをインストールした場合、
# デフォルトのパスは '/usr/local/share/GeoIP/GeoLite2-Country.mmdb' です。
#
# Linux (Debian/Ubuntu) の場合は、
# '/usr/share/GeoIP/GeoLite2-Country.mmdb' であることが多いです。
# ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
# OSを判定して、デフォルトのDBパスを自動で設定
if [ -f /etc/redhat-release ]; then
# CentOS/RHEL系
DB_FILE="/usr/share/GeoIP/GeoLite2-Country.mmdb"
else
# FreeBSD (またはその他)
DB_FILE="/usr/local/share/GeoIP/GeoLite2-Country.mmdb"
fi
def main():
"""
メイン処理を行う関数。
"""
# --- ステップ1: データベースファイルの存在チェック ---
# 指定されたパスにファイルが実際に存在するかどうかを確認します。
if not os.path.exists(DB_FILE):
print(f"エラー: データベースファイルが見つかりません。パスを確認してください。")
print(f"指定されたパス: '{DB_FILE}'")
return # ファイルがない場合は処理を中断
# --- ステップ2: データベースの読み込みとメタデータ取得 ---
# try...exceptブロックで、ファイル読み込み中にエラーが発生した場合に備えます。
try:
# 'with'構文を使うことで、処理が終わった後に自動的にファイルを閉じてくれます。
with maxminddb.open_database(DB_FILE) as reader:
# readerオブジェクトからメタデータ(データベースに関する付随情報)を取得します。
metadata = reader.metadata()
# --- ステップ3: ビルド日時の変換 ---
# メタデータからビルド日時(UNIXエポックタイム)を取得します。
# ※エポックタイム: 1970年1月1日 00:00:00 (UTC)からの経過秒数
build_epoch = metadata.build_epoch
# エポックタイムを、人間が読める「datetimeオブジェクト」に変換します。
# まずは基準となる協定世界時(UTC)に変換します。
build_dt_utc = datetime.datetime.fromtimestamp(build_epoch, tz=datetime.timezone.utc)
# 次に、UTCの時刻をサーバーのローカルタイムゾーン(例: JST)に変換します。
build_dt_local = build_dt_utc.astimezone()
# --- ステップ4: 結果の表示 ---
# 取得・変換した情報を整形して画面に出力します。
print(f"■■■ GeoIPデータベース メタデータ情報 ■■■")
print(f"データベースファイル: {DB_FILE}")
print("--------------------------------------------------")
# ビルド情報
print(f"【ビルド日時】")
print(f" ビルドエポックタイム: {build_epoch}")
print(f" ビルド日時 (UTC): {build_dt_utc.strftime('%Y-%m-%d %H:%M:%S %Z')}")
print(f" ビルド日時 (ローカル): {build_dt_local.strftime('%Y-%m-%d %H:%M:%S %Z')}")
print("") # 改行して見やすくする
# データベースの仕様情報
print(f"【データベース仕様】")
print(f" データベース種別: {metadata.database_type}")
print(f" 説明: {metadata.description.get('en', 'N/A')}")
print(f" 対応IPバージョン: IPv{metadata.ip_version}")
# node_countとrecord_sizeを3桁区切りで表示します。
# f-stringの書式指定 `{数値:,}` を使うと自動的にカンマが挿入されます。
print(f" ノード数: {metadata.node_count:,}")
print(f" レコードサイズ: {metadata.record_size} bits")
except maxminddb.errors.InvalidDatabaseError as e:
# データベースファイルが壊れている、または不正な形式の場合のエラー処理
print(f"エラー: データベースファイルが不正です。ファイルが破損している可能性があります。")
print(f"詳細: {e}")
except Exception as e:
# その他の予期せぬエラーが発生した場合の処理
print(f"予期せぬエラーが発生しました: {e}")
# --- スクリプトのエントリーポイント ---
# このスクリプトが直接実行された場合にのみ、main()関数を呼び出します。
# (他のスクリプトからライブラリとしてインポートされた場合は実行されません)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment