ipv4 アドレスをでソートしたい。
OpenWrtでDHCPの固定割当を設定している。MAC ADDRごとにIPアドレスを静的割当している。
これを一覧画面で閲覧すると、ソートされてない。追加順に末尾に足されるだけなのだ。
追加順だととても不便なのだ。IPアドレス順に並び替えたい。
仮想マシンの台数が増えてきたので、どのIPが未使用なのか、一瞥で判明させたい。
ということで、IPアドレス順にソートして見やすくしたい。
uci で dhcp 取得、書き換え、取り消し。
uci コマンドを使って、dhcp の静的な固定割当のホスト一覧を取り出せる。
DHCP固定割当ホスト一覧の取り出し
uci show dhcp
ここから、hostsに関係するものだけにする
uci show dhcp | grep 'dhcp.host'
dhcp の割当を全削除
インデックスで指定項目を消せる
uci del dhcp.@host[5]
インデックスを[-1]
にすれば末尾を消せる
uci del dhcp.@host[-1]
全消しするなら、末尾から順に消せば、すべて消すことができる。
while uci del dhcp.@host[-1] ; do : ; done;
dhcp の固定割当を追加する。
最初、配列を増やす。項目の末尾に空欄のエントリを追加する。
[-1]
が末尾を示すので、末尾の要素に設定項目を加えていく。
項目追加の例
### add a new dhcp.host uci add dhcp host uci set dhcp.@host[-1].dns='1' uci set dhcp.@host[-1].mac='dc:a6:32:dd:23:c6' uci set dhcp.@host[-1].ip='192.168.1.22' uci set dhcp.@host[-1].leasetime='86400' uci set dhcp.@host[-1].name='raspi-ubuntu'
既存のDHCPをソートする
既存のDHCPをソートするには、ちょっとめんどくさいが、eval を活用するのが早そう。
たとえば、次のようにコマンドを指定すれば。
ssh root@192.168.1.1 'uci show dhcp' \ | \grep dhcp.@host | sed -E 's/@//' | sed -E 's/=host/={}/'
ruby や python や javascript や lua で使えそうなコードになる。
実行結果の例
dhcp.host[0]={} dhcp.host[0].mac='xxxx' dhcp.host[0].name='EPSONxxxx' dhcp.host[0].dns='1' dhcp.host[0].ip='192.168.1.12' dhcp.host[0].leasetime='3600' dhcp.host[1]={} dhcp.host[1].name='DESKTOP-xxxx' dhcp.host[1].dns='1' dhcp.host[1].mac='xxxx' dhcp.host[1].ip='192.168.1.111' dhcp.host[1].leasetime='3600' dhcp.host[2]={} dhcp.host[2].ip='192.168.1.115' dhcp.host[2].mac='xxx' dhcp.host[2].name='ps4' dhcp.host[2].dns='1' dhcp.host[2].leasetime='3600' dhcp.host[3]={} dhcp.host[3].name='RE505x' dhcp.host[3].dns='1' dhcp.host[3].mac='xxx' dhcp.host[3].ip='192.168.1.3' dhcp.host[3].leasetime='144400'
ソートを登録
ここまで来たら、あとは、IPアドレスでソートし、OpenWrtにadd host して確認してからcommit すればいい。
ソート手順をスクリプトにした
とはいっても。ソートを手作業で起動するのは辛い。 openwrt で動かせるようなスクリプトにしてみた。wrt は lua が使えるようなので Lua のコードにした。