pythonでMACアドレスのメーカ名置換

python

隣接機器に何が接続されているのか不明なことがある。いやマジで。
macアドレスのメーカ名を自動置換するプログラムを書いていたら面白いモジュールを見つけた。
manuf というもの。
テキストファイルのマックアドレスをベンダー名に置換するサンプルプログラム。
例えば、show mac address-table 表示結果など。

manfu

python-manufは、MACアドレスを分析・解析するためのPythonパッケージです。具体的には、以下のようなことができます。

  1. MACアドレスの解析:MACアドレスを入力すると、そのアドレスに対応するベンダー情報を取得することができます。例えば、”00:11:22:33:44:55″というMACアドレスを解析すると、”Cisco Systems, Inc.”というベンダー情報が取得できます。
  2. ベンダー情報の取得:ベンダー情報を入力すると、そのベンダーがどのようなMACアドレスを使用するかを取得することができます。例えば、”Cisco Systems, Inc.”というベンダー情報を入力すると、”00:01:42″〜”00:01:73″の範囲のMACアドレスを使用することがわかります。
  3. ファイルからの解析:ファイルに含まれるMACアドレスを解析することができます。例えば、ログファイルに含まれるMACアドレスを解析することで、どのような機器がどのような時間にアクセスしたかを分析することができます。

python-manufは、MACアドレスから製造元を特定するためのPythonライブラリであり、更新情報はIEEEが提供するMA-Lデータベースを元にしています。

IEEEは、MA-Lデータベースを毎週更新しており、python-manufの更新もその頻度で行われます。つまり、python-manufの更新頻度は1週間に1回程度となります。

データサイズについては、python-manufのGitHubページで配布されているデータファイルは、約6.5MB程度のサイズとなっています。ただし、MA-Lデータベースのアップデートによってデータサイズは変動する可能性があります。

また、python-manufはオープンソースプロジェクトであり、ユーザーが自分でMA-Lデータベースをダウンロードして更新することもできます。この場合、MA-Lデータベースのサイズは約23MB程度であり、ダウンロードする頻度はIEEEの更新頻度に依存します。

参考:ChatGPT(2023/03/05)による回答

get-mac-to-vender.py

import os
import manuf
import re

# スクリプトファイルの場所を取得
script_dir = os.path.dirname(os.path.abspath(__file__))
# カレントディレクトリを移動
os.chdir(script_dir)

#テキストファイル
input_file = "mac_address_table.txt"
output_file = f'vender_{input_file}'

# manufライブラリを使って、MACアドレスをベンダー名に置換するためのオブジェクトを作成
m = manuf.MacParser()

# テキストファイルを読み込み、各行を処理する
with open(input_file, "r") as f:
    lines = f.readlines()

# 置換後のMACアドレスを格納するリスト
new_lines = []

# テキストファイルからMACアドレスを抽出する正規表現
# 以下のいずれの形式にもマッチ
# 01:23:45:67:89:AB、
# 01.23.45.67.89.AB、
# 01-23-45-67-89-AB、
# 01 23 45 67 89 AB。
mac_pattern = re.compile(r'([0-9A-Fa-f]{2}[:.-]?){5}([0-9A-Fa-f]{2})')

for line in lines:
    # 行からMACアドレスを抽出する
    mac = mac_pattern.search(line)

    if mac:
        # MACアドレスをベンダー名に置換する
        vendor = m.get_manuf(mac.group(0))

        # 置換後の行を生成する
        new_line = mac_pattern.sub(vendor, line)

        # 置換後の行をリストに追加する
        new_lines.append(new_line)
    else:
        # MACアドレスが見つからない場合は、そのままの行をリストに追加する
        new_lines.append(line)

# 置換後の行をファイルに保存する
with open(output_file, "w") as f:
    f.writelines(new_lines)

例1 vender mac_address_table.txt

***************************************************************************
*  Nexus 9000v is strictly limited to use for evaluation, demonstration   *
*  and NX-OS education. Any use or disclosure, in whole or in part of     *
*  the Nexus 9000v Software or Documentation to any third party for any   *
*  purposes is expressly prohibited except as otherwise authorized by     *
*  Cisco in writing.                                                      *
***************************************************************************

dist-sw01# show mac address-table
Legend: 
        * - primary entry, G - Gateway MAC, (R) - Routed MAC, O - Overlay MAC
        age - seconds since last seen,+ - primary entry using vPC Peer-Link,
        (T) - True, (F) - False, C - ControlPlane MAC, ~ - vsan
   VLAN     MAC Address      Type      age     Secure NTFY Ports
---------+-----------------+--------+---------+------+----+------------------
G  101     All-HSRP-routers   static   -         F      F    sup-eth1(R)
G  102     All-HSRP-routers   static   -         F      F    vPC Peer-Link(R)
G  103     All-HSRP-routers   static   -         F      F    vPC Peer-Link(R)
G  104     All-HSRP-routers   static   -         F      F    vPC Peer-Link(R)
G  105     All-HSRP-routers   static   -         F      F    vPC Peer-Link(R)
G  101     RealtekU   static   -         F      F    vPC Peer-Link(R)
G  102     RealtekU   static   -         F      F    vPC Peer-Link(R)
G  103     RealtekU   static   -         F      F    vPC Peer-Link(R)
G  104     RealtekU   static   -         F      F    vPC Peer-Link(R)
G  105     RealtekU   static   -         F      F    vPC Peer-Link(R)
G    -     RealtekU   static   -         F      F    sup-eth1(R)
G  101     RealtekU   static   -         F      F    sup-eth1(R)
G  102     RealtekU   static   -         F      F    sup-eth1(R)
G  103     RealtekU   static   -         F      F    sup-eth1(R)
G  104     RealtekU   static   -         F      F    sup-eth1(R)
G  105     RealtekU   static   -         F      F    sup-eth1(R)

dist-sw01# 

環境がイマイチで、結果が面白くないけど、まぁ一応できた。

例2

Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-66-generic x86_64)

cisco@internet-host01:~$ ip neigh
10.10.20.254 dev ens9 lladdr VMware DELAY
cisco@internet-host01:~$ exit
logout

ほか

コマンド取得のプログラムと組み合わせればその場でメーカ確認ができる。
powershellで取得した情報は、日本語文字コードの関係でそもそもファイル読み込みが上手くできなかった。そのうち考える。

コメント

タイトルとURLをコピーしました