FreeBSD で MAC アドレスから NIC 名を固定したかったのだが

USB の LAN アダプタを複数挿すとどれが ue0 でどれが ue1 で ue2 なのかわかったもんじゃなくなる
Linux とかだと HWaddr で固定みたいなの結構あったと思うんだけど
FreeBSD だとそれっぽいのが見当たらない。
もしかしたらそんな設定できるようになってないのかもしれない


なので、とりあえずちょっと精度が粗くてデータとロジックが一緒くたになっているが
基本的なアイディアとしては割と単純な事だと実証してみる

#!/bin/sh

fix_ifname_by_etheraddr()
{
	_ifn_list="`ifconfig -l`"
	[ -z "$_ifn_list" ] && return 0
	for _if in ${_ifn_list} ; do
		_ifethaddr="`ifconfig $_if | sed 's/^.*ether[ ]\{1,\}\([0-9a-f:]\{17\}\).*$/\1/' | egrep '^[0-9a-f:]{17}$'`"
		# echo "$_if = $_ifethaddr"
		[ -z "$_ifethaddr" ] && continue
		case $_ifethaddr in
		"00:00:00:00:00:00")
			ifconfig $_if name net0
			;;
		"01:00:00:00:00:00")
			ifconfig $_if name net1
			;;
		"02:00:00:00:00:00")
			ifconfig $_if name net2
			;;
		"03:00:00:00:00:00")
			ifconfig $_if name net3
			;;
		*)
			continue
			;;
		esac
	done
	return 0
}

fix_ifname_by_etheraddr


この時、置き換え後の名前に使えるのはとりあえず net しかわからない。
mknod とかで特殊ノードを作れば好きな名前にできるのかもしれない(未検証)。


あとこのスクリプトを走らせるタイミングをどうするか。
USB nic が挿さったタイミングで実行したいようなしたくないような。
ipfw とかどうなるんだろうかとか気になる。

ケイパビリティの設定

ちょっと wireshark でパケットでもキャプチャーしてみるけぇと思ったら
それを root で起動するなんてとんでもないと怒られたりするのでちゃんと設定する方法


簡単に要約するとパケットキャプチャを行う部分である /usr/bin/dumpcap に生のデータを扱うケイパビリティを設定してあげる事で怒られなくなる。


参考情報
http://linuxandxx.blog.fc2.com/blog-entry-39.html
http://www005.upp.so-net.ne.jp/develop-tom/deb/wireshark-deb.html
http://www.usupi.org/sysad/183.html


やってみた事
まず /usr/bin/dumpcap があるかどうか確認

$ ls -al /usr/bin/dumpcap
-rwxr-xr-x 1 root root 77080 Mar 11  2014 /usr/bin/dumpcap


ある。そして誰でも実行できるようになっている。
この後ケイパビリティを与えるが、それに先立って誰でも実行可能な状態を制限する。

$ sudo chmod o-x /usr/bin/dumpcap


これで所有者とグループにしか実行できなくなっている

$ ls -al /usr/bin/dumpcap
-rwxr-xr-- 1 root root 77080 Mar 11  2014 /usr/bin/dumpcap


専用のグループを作る(gid と名前は適当に)

$ sudo addgroup -gid 1500 packet_ops
Adding group `packet_ops' (GID 1500) ...
Done.


自分をグループに入れる。USER の所を適切に自分のアカウントに変更
尚、これは一度ログアウトしてログインしないと反映しないはず

$ sudo gpasswd -a USER packet_ops
Adding user USER to group packet_ops


対象の所有グループを先ほど作ったグループに変更する

$ sudo chgrp packet_ops /usr/bin/dumpcap


現在のケイパビリティを確認

$ getcap /usr/bin/dumpcap


ここで何も返ってこないのは何のケイパビリティもないから



ケイパビリティを与える

$ sudo setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap


そして確認してみる

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip


今度は cap_net_admin と cap_net_raw に e と i と p が設定されてるのが確認できる。


この状態で root じゃなくても怒られなくなっているはず。
尚、ファイルのケイパビリティは owner や group を変更すると全部外れる模様。

7gogo にあやかって久しぶりに C のプログラムを書いた

ファイルのパーミッションの八進数が苦手である。
7が全部許可な事はわかる。
rwx の順番なのもわかる。
が、そこから 1 bit でもずれると『そもそも read は下の桁だっけ一番上の桁だっけ?』となる。


変換スクリプトを書こうと思った。
パーミッションといえば 755 とかよく出てくるから 7gogo.jp にあやかって会いにいけるプログラムにしよう(謎)

そして何故か C で書いた。
これでも元ゲームプログラマーC++ をメインに使っていたのだが、最近はお仕事が Java やら Ruby やらが多くて
C を書く機会はほんとになくなっている。

まあ、たまにはリハビリだ。
make も何も要らない C のソース一個で完結だ。

// nanagogo.c - octal permission number to string expression converter
// 
// Copyright (c) 2016 Takel Hinomoto
// This file is provided under the MIT license.
// 
// To compile: $ cc nanagogo.c -o nngg
// To execute: $ ./nngg 755
//         or: $ mv nngg ~/bin; nngg 755
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

static const char* stringExpressionTable[] =
{
	"---",
	"--x",
	"-w-",
	"-wx",
	"r--",
	"r-x",
	"rw-",
	"rwx",
};

int main(int argc, const char** argv)
{
	if (argc < 2)
	{
		fprintf(stderr, "missing argument.\n");
		return -1;
	}
	
	const char* permissionNumber = argv[1];
	errno = 0;
	char* pEndCh = NULL;
	
	unsigned long value = strtoul(permissionNumber, &pEndCh, 8);
	if ((errno != 0) || (*pEndCh != '\0'))
	{
		fprintf(stderr, "permission value must be an octal number.\n");
		return -1;
	}
	
	if (value > 0777)
	{
		fprintf(stderr, "specified octal permission value too big.\n");
		return -1;
	}
	
	int others = (int)(value & 7);
	int group = (int)((value >> 3) & 7);
	int owner = (int)((value >> 6) & 7);
	
	fprintf(stdout, "%s%s%s\n", stringExpressionTable[owner], stringExpressionTable[group], stringExpressionTable[others]);
	
	return 0;
}

ていうかものすごい車輪の再発明な可能性があるが調べてない。

7gogo にあやかって久しぶりに C のプログラムを書いた

ファイルのパーミッションの八進数が苦手である。
7が全部許可な事はわかる。
rwx の順番なのもわかる。
が、そこから 1 bit でもずれると『そもそも read は下の桁だっけ一番上の桁だっけ?』となる。


変換スクリプトを書こうと思った。
パーミッションといえば 755 とかよく出てくるから 7gogo.jp にあやかって会いにいけるプログラムにしよう(謎)

そして何故か C で書いた。
これでも元ゲームプログラマーC++ をメインに使っていたのだが、最近はお仕事が Java やら Ruby やらが多くて
C を書く機会はほんとになくなっている。

まあ、たまにはリハビリだ。
make も何も要らない C のソース一個で完結だ。

// nanagogo.c - octal permission number to string expression converter
// 
// Copyright (c) 2016 Takel Hinomoto
// This file is provided under the MIT license.
// 
// To compile: $ cc nanagogo.c -o nngg
// To execute: $ ./nngg 755
//         or: $ mv nngg ~/bin; nngg 755
#include <stdio.h>
#include <errno.h>

static const char* stringExpressionTable[] =
{
	"---",
	"--x",
	"-w-",
	"-wx",
	"r--",
	"r-x",
	"rw-",
	"rwx",
};

int main(int argc, const char** argv)
{
	if (argc < 2)
	{
		fprintf(stderr, "missing argument.\n");
		return -1;
	}
	
	const char* permissionNumber = argv[1];
	errno = 0;
	char* pEndCh = NULL;
	unsigned long value = strtoul(permissionNumber, &pEndCh, 8);
	
	if ((errno != 0) || (*pEndCh != '\0'))
	{
		fprintf(stderr, "permission value must be octal number.\n");
		return -1;
	}
	
	if (value > 0777)
	{
		fprintf(stderr, "octal permission value too big.\n");
		return -1;
	}
	
	int others = (int)(value & 7);
	int group = (int)((value >> 3) & 7);
	int owner = (int)((value >> 6) & 7);
	
	fprintf(stdout, "%s%s%s\n", stringExpressionTable[owner], stringExpressionTable[group], stringExpressionTable[others]);
	
	return 0;
}

ていうかものすごい車輪の再発明な可能性があるが調べてない。

FreeBSD を使ってみる

最近主要な Linuxディストリビューションがみんな systemd になっちゃって
どうにも使い心地が悪くて逃避先を求めて FreeBSD を試し始めています。
昔持て余してた PC-98FreeBSD(98) を入れようとして頑張ってた以来なので
すごく久しぶり。


そしてインストール中のファイルシステムを選ぶところで
選択肢から選ぶ事すらできずにテキストとして入力しなければいけないあたりで
そのぶっきらぼうさにちょっと笑う


zfs は開発が止まってるんじゃないか的な事がウェブ上にかかれていて
まだ挑戦すべきじゃないと思いとりあえず ufs で試してみる。


とりあえず最近の FreeBSD では pkg/port のお作法として /usr/local 以下に
パッケージ類は入れようねとなっている事などを把握。


システムのセキュリティアップデートは
# freebsd-update fetch
# freebsd-update install
これでいいらしい事を把握


ドキュメント類にはカーネルを再構築、再構築って書いてあるけど
今の GENERIC カーネルはそれなりに特殊な用途のオプション以外は
ほぼほぼ全部入りっぽい事を把握


など。

beaconで何ができるかな?

beaconで何ができるかって言ってはじめに思いつくのはテレビとかエアコンのリモコンでしょう!
いつもどこかに行ってしまうあいつらの距離に応じてアラームがピコーンピコーンピコーンピコンピコンピコン♪と鳴ってくれたら非常に助かるはず!
と思ったのだけど、至近距離の中で細かい距離までは取得できないのかなぁ……。
この用途には距離というか、信号の強弱だけでもダイレクトに取得できたらやくだつと思んだけど?


あとは置き引きセンサーとかあると安心かも。