0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-12

いままで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 変換するロジックを追加してみる。

class.DhcpdLeases.php
$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でちゃちゃっとみたいって思う時の方が多いので処理を追加してみる。

class.DhcpdLeases.php
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']));
    }
}

呼び出してみる

test.php
<?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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?