[FreeBSD][Linux] DHCPサーバ(isc-dhcpd)でリースしているIPアドレスの数を監視するには

Pocket

DHCPサーバのIPアドレス数を監視したい。

具体的には、リースしているIPアドレス数と、空いているIPアドレス数のそれぞれである。

基になるデータはdhcpd.leasesにあるのだが、そのままでは使えない。
manなど読めば分かるのだが、ここにはIPアドレスの貸与、更新、破棄が末尾にだらだらと追記されていくので、同じクライアントが複数回出てきたりする。
だからリースされたもの、空いているものを数えようとすると意外に手間取るのである。

同じ悩みを持つ方はいるようで、少し検索すると、こういったIPアドレス数を数えるスクリプトはいくつか見つかる。
調べてみた結果を記す。

なお先に結論を言っておくと、どこかの誰かが作ってくれたawkスクリプトを使用することにした。

 

いくつかのスクリプト

いずれも判で押したようにperlスクリプトである。
繰り返すがここにあるものは使っていない。

 

DHCPstatus

面倒くさい。
サイトからファイルをダウンロードして展開するとこのように。

$ ls
INSTALL README libraries.tar dhcpstatus.ini
LICENSE VERSION scripts

ここにあるibraries.tarを展開すると、dhcpstatusというディレクトリが出来る。
それを/usr/local/にコピー。
つまり/usr/local/dhcpstatusというディレクトリが出来る。

さらに、dhcpstatus.iniも/usr/local/dhcpstatusの下へコピー。
そしてdhcpstatus.iniを修正
dhcpdの設定ファイル、leaseファイルの場所を指定する。
複数のサブネットを運用しているのでなければ、show_whole_subnetを1に変更

# location of the .conf file.
conf_file=/usr/local/etc/dhcpd.conf
leases_file=/var/db/dhcpd/dhcpd.leases
show_whole_subnet=1

そして実行

$ perl ./scripts/dhcpstatus
Legacy library timelocal.pl will be removed from the Perl core distribution in the next major release. Please install it from the CPAN distribution Perl4::CoreLibs. It is being used at dhcpstatus/dhcpstatus.pm, line 26.
DHCP Subnet Information

Subnet: 192.168.100.0 Netmask: 255.255.255.0
IP range: 192.168.10.101 - 192.168.10.199 Router: 192.168.10.254
IPs defined: 99 IPs used: 21 IPs free: 78

ベースにしているPerlが古すぎるので却下。

 

DHCP leasecount

こんな感じ。

$ ./dhcp-leasecount -l /var/db/dhcpd/dhcpd.leases 172.29.16.0-172.29.16.255
defined(%hash) is deprecated at ./dhcp-leasecount line 100.
(Maybe you should just omit the defined()?)
defined(%hash) is deprecated at ./dhcp-leasecount line 102.
(Maybe you should just omit the defined()?)
defined(%hash) is deprecated at ./dhcp-leasecount line 104.
(Maybe you should just omit the defined()?)
Total available addresses: 256
Active leases: 37 (14.5%)
Expired leases: 75 (29.3%)
Available addresses: 144 (56.2%)

なんかこれも間もなく使えなくなりそうな予感。perlスクリプト修正するのやだし。

 

Report DHCP

出力がhtmlなのですぐにやる気をなくした。

 

結局awkで。

こういうawkスクリプトを使うことにした。stackoverflow.comとかで見つけたと思う。
例えばgetDhcpStatus.shとして保存しておく。

#!/bin/sh
awk '/^lease / { curlease = $2; } /^ binding state/ { lstates[curlease] = $3; } END { for (curl in lstates) { tstates[lstates[curl]]++; } for (curs in tstates) { print curs, tstates[curs]; } }' /var/db/dhcpd/dhcpd.leases

出力結果は例えば以下のように。

active; 66
free; 275

うーん。minimalでよろしい。

 

出力をMRTGに。

でこれをMRTGに食わせる場合には、さらに以下のようなスクリプトを使ってMRTGから呼ぶ。
#!/bin/sh

~/bin/mrtg/getDhcpStatus.sh | cut -f2 -d" "|head -2
uptime | awk '{print $3}' | sed "s/,//"
echo "leased, free IP addresses"

 

 

 

No tags for this post.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です