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

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

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

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

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

いくつかのスクリプト

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

DHCPstatus

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

$ ls<br /> INSTALL README libraries.tar dhcpstatus.ini<br /> 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.<br /> conf_file=/usr/local/etc/dhcpd.conf<br /> leases_file=/var/db/dhcpd/dhcpd.leases<br /> show_whole_subnet=1<br />

そして実行

$ perl ./scripts/dhcpstatus<br /> 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.<br /> DHCP Subnet Information
Subnet: 192.168.100.0 Netmask: 255.255.255.0<br /> IP range: 192.168.10.101 - 192.168.10.199 Router: 192.168.10.254<br /> 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<br /> defined(%hash) is deprecated at ./dhcp-leasecount line 100.<br /> (Maybe you should just omit the defined()?)<br /> defined(%hash) is deprecated at ./dhcp-leasecount line 102.<br /> (Maybe you should just omit the defined()?)<br /> defined(%hash) is deprecated at ./dhcp-leasecount line 104.<br /> (Maybe you should just omit the defined()?)<br /> Total available addresses: 256<br /> Active leases: 37 (14.5%)<br /> Expired leases: 75 (29.3%)<br /> Available addresses: 144 (56.2%)

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

Report DHCP

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

結局awkで。

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

#!/bin/sh<br /> 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<br /> free; 275

うーん。minimalでよろしい。

出力をMRTGに。

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

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