うさラボ

お勉強と備忘録

考えるのが嫌なのでIPアドレス計算ツール作ってみました

192.168.99.43/28のネットワークアドレスってなんだっけ

IPアドレスをパッとみたときにネットワークアドレスとか利用IPなどを頭の中で計算することってありませんか?

私はよくやっていて、その度に念のためググって確認しようってなっていました。

そこでPythonのipaddressモジュールを使いIPアドレスの計算をしてくれるCLIツールを作ってみました。

f:id:usage_automate:20201225183812p:plain

f:id:usage_automate:20201225183821p:plain

簡単なものですが紹介します。

構成

(ipcal) usalab!:ipcal-1.0 $ tree
.
├── ipcal
│   ├── __init__.py
│   ├── main.py
│   └── util.py
└── setup.py

main.pyはutil.pyを呼び出しのとclickで--ipのオプションで実行時にもIPセグメントの入力ができます。

from . import util
import click

@click.command()
@click.option('--ip',default='', type=str, help='ipaddress')
def main(ip):
  ipnetwork = util.input_value_cast_to_ipv4network(ip)
  util.ipnetwork_information(ipnetwork)

if __name__ == '__main__':
  main()

util.py(名前つけるセンスがない)ではipaddressモジュールを利用して、入力値をIPv4Networkオブジェクトにして返すinput_valueと計算結果を表示するipnetwork_informationの2つのメソッドを作成してます。

import ipaddress
import sys

def input_value_cast_to_ipv4network(input_ip):
  '''
  入力値をipaddressオブジェクトにキャストして戻す
  '''
  if input_ip:
    try:
      ipnetwork = ipaddress.ip_network(input_ip,strict=False)
      return ipnetwork
    except ValueError:
      print(f"Error: Value Error")
      sys.exit(1)
    except Exception as e:
      print(f"Error: {e}")
      sys.exit(1)
  else:
    value = input('IPアドレス入力[X.X.X.X/X]>> ')
    try:
      ipnetwork = ipaddress.ip_network(value,strict=False)
      return ipnetwork
    except ValueError:
      print(f"Error: Value Error")
      sys.exit(1)
    except Exception as e:
      print(f"Error: {e}")
      sys.exit(1)

def ipnetwork_information(ipnetwork):
  print(f'Prefix          : {ipnetwork.with_prefixlen}')
  print(f'SubnetMask      : {ipnetwork.netmask}')
  print(f'WildCardMask    : {ipnetwork.with_hostmask}')
  print(f'NetworkAddress  : {ipnetwork.network_address}')
  print(f'BroadCastAddress: {ipnetwork.broadcast_address}')

ipaddressモジュールのメソッドを呼び出すだけで簡単にネットワークアドレスやブロードキャストアドレスを表示することができます。

どうやって公開するのがいいのかよくわからない。。

python setup sdistを実施してpip install dist/ipcal-1.0.tar.gzすることでipcalコマンドで実行することができます。

ググる時間が減ったのでヨシ!!

参考にさせていただいたサイト

qiita.com

blog.amedama.jp

buildersbox.corp-sansan.com

docs.python.org