📝

dhcpd.lease を PHP で解析、CSV出力してみたりする!

2021/04/05に公開

いままでDHCPサーバは、ルータに付属している機能を使用していたのですが、折角Linuxサーバが起動しているのに使ってなかったのでそのネタです。しかもDHCPサーバの立ち上げ方でなくログ(dhcpd.leases)の解析であります。

dhcpd.leases を解析してみる

dhcpd サーバが起動しているときDHCPクライアントに払い出された情報(貸し出しデータベース、って言うらしい)が /var/lib/dhcp/dhcpd.lease に出力されます。ただ接続機器が多いと出力結果をパッと見でわかりづらい(わからん)のです。なのでいい解析ツールがあればということで探してみました。

ちなみに dhcpd.lease は下記のフォーマットで出力されます。
dhcpd.leases Format

とりあえず Git で探してみる

Git で dhcpd.leases 探してみると結構あります。とりあえず PHP でよさげなのを探してみました。

jpereira/php-dhcpdleases

JSON形式にも出力できるし使い勝手がよさそう。

時間がUTCなんだが…

出力結果の時間をみるとなんだか +9時間ずれている、と思ったら、タイゾーンが UTC でした。
なので解析時に UTC ⇒ JST 変換するロジックを追加してみる。

$m[2] = trim($m[2], '"');
if ($this->filter_field && $this->filter_value) {

    if ($this->filter_value != $m[1]) {
        //echo "TESTANDO: (".$this->filter_value." == ".$m[2].")<br>";
        //continue;
    }
}

// UTC->JST ここから追加
if ($m[1] == 'starts' or $m[1] == 'ends' or $m[1] == 'tstp' or $m[1] == 'cltt' ) {
    if (preg_match("/^.* (.*) (.*)/", $m[2], $dt)) {
        $date = new DateTime($dt[1] . " " . $dt[2], new DateTimeZone('GMT')); 
        $date->setTimeZone(new DateTimeZone('Asia/Tokyo'));
        $m[2] = $date->format('Y/m/d H:i:s') ;
    }
}

CSV出力が欲しい

JSON形式でもいいのですが、自分はExcelでちゃちゃっとみたいって思う時の方が多いので処理を追加してみる。

function PutArrayCSV($putCSV_file = null)
{
    $p = $this->row_array;
    $outputFile = new SplFileObject($putCSV_file, 'w');

    $outputFile->fputcsv(array("ip", "starts", "ends", "binding", "hardware-ethernet", "tvendor-class-identifier", "client-hostnamen"));
    foreach($p as $key => $value) {
        if (!isset($p[$key]['client-hostname'])) { $p[$key]['client-hostname'] = ""; }
        if (!isset($p[$key]['vendor-class-identifier'])) { $p[$key]['vendor-class-identifier'] = ""; }
       
        $outputFile->fputcsv(array($key, $p[$key]['starts'], $p[$key]['ends'], $p[$key]['binding'], $p[$key]['hardware-ethernet'], $p[$key]['vendor-class-identifier'], $p[$key]['client-hostname']));
    }
}

呼び出してみる

<?php
require_once("class.DhcpdLeases.php");

// main()
$dl = new DhcpdLeases("/var/lib/dhcp/dhcpd.lease");

if ($dl->process() > 0) {
    $p = $dl->GetResultArray();
    $dl->PutArrayCSV("test.csv");
}
?>

思いとおりの出力!満足w
スマフォ、タブレットなど以外と接続していることが判る(無駄遣いしているという説もある)、面白いですね。

自宅で運用する??

とりあえず勢いで作ってみたが、これ年に数回使うかどうかなのかなって感じ??なのかな。
会社で運用するとしたら「不正な機器が接続された?」とか監視するに役立つのかもしれませんね。

いますぐ実践! Linux システム管理 / Vol.251

GitHubで編集を提案

Discussion