Fun with dhcpd hooks

Today, I found out one of my switches had a hiccup and caused a packet loss of about 80%. This triggered me to build meshping, a distributed ping service that I'm going to integrate with FluxMon in order to notice such stuff more quickly in the future. Of course, I could just use any monitoring tool, but I just can't be arsed to configure one. I need something that configures itself.

So now that I have meshping, I want to integrate it with the ISC DHCPd that is running on my router so it automatically pings new clients via meshping. Turns out this is surprisingly easy because isc-dhcpd actually supports hooks in its config — and people even know how to use 'em!

So I just had to clone meshping onto my router and add these lines to dhcpd.conf:

on commit {
    set clip = binary-to-ascii(10, 8, ".", leased-address);
    execute("/opt/meshping/cli.py", "-qa", "-T", clip, "-t", option host-name);
}

on release {
    set clip = binary-to-ascii(10, 8, ".", leased-address);
    execute("/opt/meshping/cli.py", "-qd", "-T", clip);
}

on expiry {
    set clip = binary-to-ascii(10, 8, ".", leased-address);
    execute("/opt/meshping/cli.py", "-qd", "-T", clip);
}

I then triggered my client to renew its lease, and sure enough, it showed up in meshping (those avg/min/max/last values are milliseconds, btw):

Target                     Sent  Recv  Errs  Outd   Loss     Err    Outd      Avg       Min       Max      Last
192.168.0.165                 6     6     0     0   0.00%   0.00%   0.00%    3.71      0.00     12.46      1.38

Here's the output of meshping's CLI:

root@hive:/opt/meshping# ./cli.py
{
    ...
    "43625": {
        "last": 0.0013849735260009766,
        "name": "damien",
        "min": 0,
        "max": 0.012456893920898438,
        "due": 1441532131.453555,
        "errs": 0,
        "outd": 0,
        "itv": 30,
        "sum": 0.022266864776611328,
        "recv": 6,
        "id": 43625,
        "sent": 6,
        "addr": "192.168.0.165"
    },
    ...
}

This is awesome. Now I just need a little Flux sensor to query meshping and I'll have all the data I can dream of.

Of course, getting FluxMon to actually make sense of that is going to be a whole new story...