595 words
3 minutes
LAN内のPCをカウントするpy
2025-05-01

代用としての開発でした#

元々使用していた起動しているPCの台数をカウントしているサービスが終了したため、代用を作りました(製作期間2h) ユースケースとしては、部署ごとにVLANを切ったりしてIPのこの範囲はこの部署が使用しているとか分けられていると思います。なのでLAN内のIPアドレスをarp-scanコマンドで一覧を取得→これをどのIP範囲が使用しているのか振り分ける→部署のPCが何台起動しているのかわかる…みたいな?感じです。

一応以下がソースコードです。最後らへんは最悪なことになっていますが、動けばいいの精神でやっつけました。

import sys
import ipaddress
from ipaddress import IPv4Address
import subprocess
iprange = {
"部屋名1": {"start":ipaddress.ip_address("xxx.xxx.xxx.xxx") , "end": ipaddress.ip_address("xxx.xxx.xxx.xxx")},...
}
pcnum = {
"部屋名1": 0,...
}
def is_valid_ipv4(ip_str):
try:
IPv4Address(ip_str)
return True
except ValueError:
return False
result = subprocess.run(
["timeout", "10s", "arp-scan", "--interface=enp2s0", "--localnet"],
capture_output=True,
text=True
)
data = result.stdout
for i in data.split("\n")[2:]:
if len(i.split()) > 0:
if is_valid_ipv4(i.split()[0]):
for classname in iprange.keys():
if iprange[classname]["start"] <= ipaddress.ip_address(i.split()[0]) <= iprange[classname]["end"]:
pcnum[classname] = pcnum[classname] + 1
break
import requests
import json
URL = "https://script.google.com/~~~~~"
TOKEN = "~~~~"
params = {'token': TOKEN}
response = requests.post(URL, params=params, json=pcnum, headers={"Content-Type": "application/json"})

後半の方はGASのAPIに投げることでスプレッドシートにログを残しています。python側からスプシを直接操作するためには、Google Cloud コンソールにアクセスしてAPIキーを発行しないといけないのですが、(面倒だったので)APIをそのためだけに使うのも勿体無いと思ったのでGASでAPIを立ててそこからスプシを操作することで回避しました。 postだけだと誰でも編集できてしまうことになるのでTOKENをオリジナルで作成して、GAS側でTOKENが一致していないと編集を受け付けないようにしました。

私の感想#

もっとクリーンコードを目指したいお気持ちはありますが、うーん…ChatGPTに投げてリファクタリングできるので実はそこまで重要な技術ではないのかもという言い訳をしておきます。

今度からは書いたコードをAIに投げてリファクタリングして納品していきたいです。

LAN内のPCをカウントするpy
https://fuwari.vercel.app/posts/soto/diary/2025/05/2025-05-01/
Author
Lorem Ipsum
Published at
2025-05-01
License
CC BY-NC-SA 4.0