OpenWrtでFonのHeartbeatを送信する
OpenWrtにCoovaChilliを導入してFon互換のアクセスポイントを公開しても、このままではFon Mapsには表示されず、FonのアカウントのステータスもいずれAlienになってしまうでしょう。
chilliコマンドとは別に、定期的にhearbeatをFonのサーバーに対して行う事で、本来のFonルーターと同様の動作を行わせることが出来ます。
元ネタは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の為に別ルーターを起動したり、故障に煩わされる事が無くなります。







ディスカッション
コメント一覧
まだ、コメントがありません