LaFonera Software Heartbeat-dev

From DD-WRT Wiki

Jump to: navigation, search

Contents

[edit] The LaFonera Heartbeat Script

This work is based on the work of freddy (http://fon.freddy.eu.org), futejia (http://futejia.blogspot.com), krikkit (http://www.krikkit.net) and wildblue (www.wildblue.de)


[edit] Installation

Paste this into the Additional Cron Jobs box on the Admin > Management page then click Apply Settings.

*/5	*	*	*	*	root /tmp/simthefon/simthefon cron >/tmp/simthefon/simthefon.log


Paste this into the Commands box on the Admin > Commands page then click Save Startup.

#!/bin/sh
mkdir /tmp/simthefon

cat > "/tmp/simthefon/heartbeat" <<- EOT
#!/bin/sh
sleep 30
cd /tmp/simthefon
/usr/bin/wget http://www.wildblue.de/fonera/heartbeat/key
/usr/bin/wget http://www.wildblue.de/fonera/heartbeat/simthefon
/usr/bin/wget http://www.wildblue.de/fonera/heartbeat/known_hosts
cat /tmp/simthefon/known_hosts >> /tmp/root/.ssh/known_hosts
chmod a+x /tmp/simthefon/simthefon
( /tmp/simthefon/simthefon cron >/tmp/simthefon/simthefon.log & ) &
EOT


cat > "/tmp/cron.d/heartbeat" <<- EOT
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/tmp/root

*/5 * * * * root /tmp/simthefon/simthefon cron >/tmp/simthefon/simthefon.log
EOT

chmod a+x /tmp/simthefon/heartbeat
/tmp/simthefon/heartbeat

stopservice cron && startservice cron

[edit] Code Reference

[edit] known_hosts file

download.fon.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA0zJFtj5NtrVsj8+qG0dtPE8WpHHDpTXp5+d3vvtSS7Hx7vYHyrfN/8PBVrrYOgl4dySY65sGtq34EU04VN4a7xQHSKJBunDUSQ/2Xz+eyo53LCVeFy1zNRCmB6jrFlJQvl5yviLvXmMtOGxG8Z1dfu4qavfGtBxwtwxKPKuiyhs=


[edit] http://wildblue.de/fonera/heartbeat/simthefon

#!/bin/sh
##########################################
#             simthefon.sh               #
#                                        #
#  simulate an active LaFonera with an   #
# alternative firmware on maps.fon.com   #
#                                        #
#         First version made by          #
#    fon.freddy.eu.org@freddy.eu.org     #
#       http://fon.freddy.eu.org/        #
#                                        #
#          modified by futejia           #
#        futejia.blog@gmail.com          #
#      http://futejia.blogspot.com/      #
#                                        #
# updated to work on dd-wrt (2007-02-02) #
#     http://www.krikkit.net/contact     #
#                                        #
#      made it working (2007-02-05)      #
#         MailTo ben@wildblue.de         #
#                                        #
#  A step by step guide is available at  #
# www.wildblue.de/fonera/heartbeat/howto #
#                                        #
##########################################
#  version 2.0.0 (modified for DD-WRT)   #
#  version 2.0.1 (autodetection MAC)     #
#  version 2.0.2 (added cron mode)       #
#  version 2.0.3 (changed MAC-retrival)  #
#  version 2.0.4 (changed update freq.)  #
##########################################
echo "***********************************************************"
echo "* simthefon - heartbeat script for the LaFonera           *"
echo "* This script makes your LaFonera active on maps.fon.com  *"
echo "*                                                         *"
echo "* Version 2.0.4                                           *"
echo "* This Version made by ben@wildblue.de                    *"
echo "***********************************************************"

WLMAC="$(nvram get ath0_hwaddr )" #the WLAN mac-adress
MAC="$(nvram get et0macaddr)" #the WAN mac-adress
FONREV=2
FIRMWARE=0.7.1
FONKEY=/tmp/simthefon/key #the path to the fon-public-key
DEVICE="fonera"
CHILLVER="1.0"
THCLVER="1.0"

echo
echo "Your WLAN MAC is:    " $WLMAC
echo "Your Ethernet MAC is:" $MAC
echo

echo "* starting ..."
echo "mode='start' wlmac='$WLMAC' mac='$MAC' fonrev='$FONREV' firmware='$FIRMWARE' chillver='$CHILLVER' thclver='$THCLVER' device='$DEVICE'" | dbclient -T -p 1937 -i $FONKEY openwrt@download.fon.com > startscript

exec_every_mode () {
  echo "* making connection to fon"
  echo "mode='cron' wlmac='$WLMAC' mac='$MAC' fonrev='$FONREV' firmware='$FIRMWARE'" | dbclient -T -p 1937 -i $FONKEY  openwrt@download.fon.com > newscript
  if cat newscript | grep http > /dev/null 2>&1
  then
    echo "* downloading a new version"
    DWL_DATE=$(date +%Y%m%d-%H%M)
    FON_FILE=$DWL_DATE.fon
    wget -q -O $FON_FILE $(cat newscript | grep http | awk '{print $2}')
    rm newscript
    #begin untar package
    dd if=$FON_FILE of=VERSION_FILE bs=1 count=4 > /dev/null 2>&1
    VERSION=$(cat VERSION_FILE)
    rm VERSION_FILE
    dd if=$FON_FILE of=OFFSET_FILE bs=1 count=3 skip=4 > /dev/null 2>&1
    OFFSET=$(expr $(cat OFFSET_FILE))
    rm OFFSET_FILE
    dd if=$FON_FILE of=SIGNATURE_FILE bs=1 count=$OFFSET skip=7 > /dev/null 2>&1 
    rm SIGNATURE_FILE
    TO_SKIP=$(expr $OFFSET + 7)
    dd if=$FON_FILE of=tar_file bs=1 skip=$TO_SKIP > /dev/null 2>&1
    tar zx -f ./tar_file
    rm ./tar_file
    UPGRADE_FILE=$(cat upgrade | grep tar | awk '{print $3}')
    rm -f ./upgrade
    rm -f hotfix
    mkdir fon-firmware > /dev/null 2>&1
    tar xzf $UPGRADE_FILE -C fon-firmware/
    rm $UPGRADE_FILE
    #end untar package
    
    #begin get new versions
    FONREV=$(cat fon-firmware/etc/fon_revision)
    FIRMWARE=$(cat fon-firmware/etc/fon_version)
    echo "* Version is now $FIRMWARE, Revision is now $FONREV"
    #end get new versions
  else
    echo "* Can't find a new version";
  fi
}

exec_cron_mode () {
  echo "* Cron Mode - repeating must be done with a cronjob!"
  echo

  exec_every_mode

  exit
}

exec_standard_mode () {
  while true; do
    echo "* Standard mode - Repeating is done with a sleep command!"
    echo

    exec_every_mode

    RANDOM_S=$((0x$(head -c2 /dev/urandom | hexdump | awk '$2 > 0 {print $2}') % 1800))
    TIMTS=$(echo "`expr 1800 + $RANDOM_S`")

    echo "* going to sleep for $TIMTS seconds"
    sleep $TIMTS
  done;
  exit
}

case "$1" in
    cron)
      exec_cron_mode
      ;;
    *)
      exec_standard_mode
      exit
esac


[edit] The Fon Key

http://www.wildblue.de/fonera/heartbeat/key

or

http://fon.freddy.eu.org/heartbeat/fonkey


[edit] Alternative Hotspot Script

Warning: The script may cause router to hang after a few days usage. I'm not sure why yet... But the web control panel will show no date / time info, and telnet commands will return "sh - cannot fork". Power cycling the router will solve the problem. I'm trying to figure out a fix or if it's just my router causing problems.


This is a modified version of freddy's thinclient script that uses cron to run and only downloads two files to the Fonera. To install, firstly create a cronjob for the heartbeat by adding the following to the Additional Cron Jobs box on the Admin > Management tab. Ensure you copy and paste, as the spaces between *'s must be tabs and you can't effiectively add these yourself on the web page (tabs don't work).

24,54	*	*	*	*	root /tmp/thinclient cron > /dev/null 2>&1 &

Click Apply Settings to save the cron job.

Now just copy and paste the following in to the commands box on the Administration > Commands tab in the web control panel, click Save Startup and reboot the router. If you think it will take longer for an internet connection to be established by the Fonera, just increase the sleep time (in seconds) that is currently set to 10 minutes (600 seconds).

#!/bin/sh

# wait until net connection established 
sleep 600

# get heartbeat files
cd /tmp
wget http://www.inaudible.co.uk/perm/fonera/thinclient
wget http://fon.freddy.eu.org/heartbeat/fonkey
chmod 755 /tmp/thinclient

The script will download from my personal web server a modified version of Freddy's original thinclient script ( http://fon.freddy.eu.org/heartbeat/thinclient ) using additional information from wildblue's simthefon script to make it work with the La Fonera, and also downloads freddy's original fonkey file from freddy's webserver.

Changes include "/jffs" changed to "/tmp", FONREV and FIRMWARE changed to the La Fonera's, DEVICE="fonera" added with extra device variables in exec_start_mode, and "| logger" replaced by "> /dev/null 2>&1 &" to stop logging.


[edit] http://www.inaudible.co.uk/perm/fonera/thinclient

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

THINCLIENTPATH="/tmp" # path of this file
ROOTHOME="/tmp/root" # root's home dir
SSHPATH="/usr/bin/ssh" # path to ssh
KEY="/tmp/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)"
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 "/tmp/crontab" ] || touch /tmp/crontab
	[ `grep -c thinclient /tmp/crontab` = "0" ] && echo "24,54 * 	*	*	*	root $THINCLIENTPATH/thinclient cron > /dev/null 2>&1 &" >> /tmp/crontab
	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_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
		;;
	check)
		exec_check_thinclient
		;;
	*)
		echo "Usage: `basename $0` {cron|start|check}"
		exit
esac

[edit] Help developing the code

If you want to help developing the original dd-wrt LaFonera Heartbeat code just contact me (ben@wildblue.de) and/or make updates here and contact me.