OpenWrtでFonのHeartbeatを送信する

2015年4月19日

OpenWrtにCoovaChilliを導入してFon互換のアクセスポイントを公開しても、このままではFon Mapsには表示されず、FonのアカウントのステータスもいずれAlienになってしまうでしょう。

chilliコマンドとは別に、定期的にhearbeatをFonのサーバーに対して行う事で、本来のFonルーターと同様の動作を行わせることが出来ます。

enalbe-ap-on-fon-maps

元ネタはdd-wrtのwikiで公開されているLaFonera Software Heartbeat-Devです。

OpenWrtはOverlyファイルシステムが導入されているため、dd-wrtの様にtmpフォルダにこだわる必要がありません。よって、そこを修正します。また、stopコマンドの追加、cronの書き換え部分の変更なども併せて修正追記しました。修正済みのファイルを以下に提示します。

なお、ファイルは/etc/chilli以下に配置する事としました。

変数のETMACにはFONルーターのMACアドレス、WLMACにはそれに+1したアドレスを設定して下さい。手持ちのFONルーターは大切に保管しておきましょう。

※ 2014.01.08 cron設定部分を修正しました。

#!/bin/sh
#
#version 1.0.6F (modified by pepsi_max2k for la fonera)
#

THINCLIENTPATH="/etc/chilli" # path of this file
ROOTHOME="/root" # root's home dir
SSHPATH="/usr/bin/ssh" # path to ssh
KEY="$THINCLIENTPATH/fonkey" # private key for fetching the info from the FON server
THINCLIENTOUT="/tmp/.thinclient.sh" # output file

THINCLIENTOUTDEFAULT="33" # default size of the output file

THCLVER="1.0"
CHILLVER="1.0-1"
FONREV="5" # /etc/fon_revision
FIRMWARE="0.7.1" # taken from /etc/banner (without Beta)
DEVICE="fonera"

USER="openwrt"
SERVER="download.fon.com"
PORT="1937"
FONSIG="$SERVER ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA0zJFtj5NtrVsj8+qG0dtPE8WpHHDpTXp5+d3vvtSS7Hx7vYHyrfN/8PBVrrYOgl4dySY65sGtq34EU04VN4a7xQHSKJBunDUSQ/2Xz+eyo53LCVeFy1zNRCmB6jrFlJQvl5yviLvXmMtOGxG8Z1dfu4qavfGtBxwtwxKPKuiyhs="

# gather information about this machine
#WLMAC="$(/usr/sbin/nvram get ath0_hwaddr)"
#ETMAC="$(/usr/sbin/nvram get et0macaddr)"
WLMAC="00:18:84:C6:A8:81"
ETMAC="00:18:84:C6:A8:80"
MAC=`echo $WLMAC|tr A-Z a-z`

check_env () {
	[ -d "$ROOTHOME/.ssh" ] || mkdir $ROOTHOME/.ssh
	[ -f "$ROOTHOME/.ssh/known_hosts" ] || touch $ROOTHOME/.ssh/known_hosts
	[ `grep -c $SERVER $ROOTHOME/.ssh/known_hosts` = "0" ] && echo $FONSIG >> $ROOTHOME/.ssh/known_hosts
}

exec_cron_mode () {
	check_env
	sleep "$((0x$(head /dev/urandom |hexdump |awk '$2 > 0 {print $2}'|head -n1) % 60))"
	echo "mode='cron' wlmac='$MAC' mac='$ETMAC' fonrev='$FONREV' firmware='$FIRMWARE'" | $SSHPATH -T ${PORT:+ -p $PORT}${KEY:+ -i $KEY} "${USER}@${SERVER}" > $THINCLIENTOUT
	echo "sent: mode='cron' wlmac='$MAC' mac='$ETMAC' fonrev='$FONREV' firmware='$FIRMWARE'"
	exec_check_thinclient
}

exec_start_mode () {
	sleep 60 # make sure WAN is up and crond is running
	check_env
	[ -f "/etc/crontabs/root" ] || touch /etc/crontabs/root
	[ `grep -c thinclient /etc/crontabs/root` = "0" ] && echo "24,54	*	*	*	*	$THINCLIENTPATH/thinclient cron > /dev/null 2>&1 &" >> /etc/crontabs/root
	echo "mode='start' wlmac='$MAC' mac='$ETMAC' fonrev='$FONREV' firmware='$FIRMWARE' chillver='$CHILLVER' thclver='$THCLVER' device='$DEVICE'" | $SSHPATH -T ${PORT:+ -p $PORT}${KEY:+ -i $KEY} "${USER}@${SERVER}" > $THINCLIENTOUT
	echo "sent: mode='start' wlmac='$MAC' mac='$ETMAC' fonrev='$FONREV' firmware='$FIRMWARE' chillver='$CHILLVER' thclver='$THCLVER' device='$DEVICE'"
	exec_check_thinclient
}

exec_stop_mode () {
	[ -f "/etc/crontabs/root" ] && sed /thinclient/d -i /etc/crontabs/root
}

exec_check_thinclient () {
	if [ -f $THINCLIENTOUT ]
	then
		THINSIZE="$(wc -c < $THINCLIENTOUT)"
		if [ $THINSIZE = "0" ]
		then
			echo "Something is wrong, $THINCLIENTOUT is empty"
		elif [ $THINSIZE != "33" ]
		then
			echo "Something is different in $THINCLIENTOUT:"
			cat $THINCLIENTOUT
		else
			echo "$THINCLIENTOUT is the default one, deleted"
			rm $THINCLIENTOUT
		fi
	else
		echo "Something is wrong, $THINCLIENTOUT does not exist!"
	fi
}

case "$1" in
	cron)
		exec_cron_mode
		;;
	start)
		exec_start_mode
		;;
	stop)
		exec_stop_mode
		;;
	check)
		exec_check_thinclient
		;;
	*)
		echo "Usage: `basename $0` {cron|start|stop|check}"
		exit
esac

fonkeyも同様に/etc/chilli以下に取得します。

wget -O /etc/chilli/fonkey http://www.wildblue.de/fonera/heartbeat/key

./thinclient startを実行するとhearbeatが送信されcronの設定が変更されます。
そして以下のように"Linux fonesfat….."とレスポンスが帰ってくればFonサーバー上の自分のルーターがオンラインになります。

root@OpenWrt:/etc/chilli# ./thinclient start
sent: mode='start' wlmac='xx:xx:xx:xx:xx:81' mac='xx:xx:xx:xx:xx:80' fonrev='5' firmware='0.7.1' chillver='1.0-1' thclver='1.0' device='fonera'
Something is different in /tmp/.thinclient.sh:
Linux fonesfat03 2.6.32-5-amd64 #1 SMP Mon Jan 16 16:22:28 UTC 2012 x86_64

root@OpenWrt:/etc/chilli#

これで、OpenWrtを乗せられるWiFiルーターがあればFonルーターの代替が可能になり、Fonの為に別ルーターを起動したり、故障に煩わされる事が無くなります。

OpenWrtfon,hearbeat

Posted by redchat