forked from freifunk-franken/firmware
840 lines
23 KiB
Bash
Executable File
840 lines
23 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# dir300-flash - Flashes a custom firmware on the DIR-300 WLAN router.
|
|
# Copyright (C) 2008 Alina Friedrichsen <x-alina@gmx.net>
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Special thanks to bittorf wireless ))
|
|
|
|
VERSION='1.0.0'
|
|
|
|
PREFIX='/usr/local'
|
|
FIRMWARE_DIRECTORY="$PREFIX/share/dir300-flash"
|
|
|
|
AP61RAM_URL='http://www.dd-wrt.com/dd-wrtv2/downloads/v24/Atheros%20WiSoc/Airlink%20101%20AR430W/ap61.ram'
|
|
AP61RAM_MD5='4aaec2bff1edffe8c49003ed9363ad8b'
|
|
AP61ROM_URL='http://www.dd-wrt.com/dd-wrtv2/downloads/v24/Atheros%20WiSoc/Airlink%20101%20AR430W/ap61.rom'
|
|
AP61ROM_MD5='eb7817d202c297ae5dc6b6b897632601'
|
|
DIR300REDBOOTROM_URL='http://www.shadowandy.net/wp/wp-content/uploads/dir300redboot.zip'
|
|
DIR300REDBOOTROM_MD5='5fdb24432aa200b508026215d821e126'
|
|
|
|
TFTP_DIRECTORY_FIRST='/tftpboot'
|
|
TFTP_DIRECTORY_SECOND='/srv/tftp'
|
|
TFTP_DIRECTORY_THIRD='/var/lib/tftpboot'
|
|
TFTP_DIRECTORY_FOURTH='/var/tftpboot'
|
|
|
|
INTERFACE='eth0'
|
|
|
|
KERNEL_IMAGE_FIRST='openwrt-atheros-vmlinux.lzma'
|
|
KERNEL_IMAGE_SECOND='bin/openwrt-atheros-vmlinux.lzma'
|
|
ROOTFS_IMAGE_FIRST='openwrt-atheros-root.squashfs'
|
|
ROOTFS_IMAGE_SECOND='bin/openwrt-atheros-root.squashfs'
|
|
|
|
TEMPFILE_COUNT=0
|
|
make_tempfile() {
|
|
local tempfile
|
|
|
|
tempfile 2> /dev/null || {
|
|
while true; do
|
|
tempfile="/tmp/file$$$TEMPFILE_COUNT"
|
|
TEMPFILE_COUNT=$((TEMPFILE_COUNT+1))
|
|
if [ ! -e "$tempfile" ]; then
|
|
> "$tempfile"
|
|
echo "$tempfile"
|
|
return 0
|
|
fi
|
|
done
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
IPROUTE2=ip
|
|
which "$IPROUTE2" > /dev/null || IPROUTE2=
|
|
|
|
NETCAT=netcat
|
|
which "$NETCAT" > /dev/null || NETCAT=nc
|
|
|
|
call_redboot() {
|
|
local host="$1"
|
|
local port="$2"
|
|
local command="$3"
|
|
local wait="$4"
|
|
[ -z "$wait" ] && wait=0
|
|
|
|
local infile="$(make_tempfile)"
|
|
local outfile="$(make_tempfile)"
|
|
local pid
|
|
|
|
if [ -n "$command" ]; then
|
|
echo "$command" > "$infile"
|
|
elif [ "$wait" -gt 0 ]; then
|
|
cat > "$infile"
|
|
else
|
|
> "$infile"
|
|
fi
|
|
tail -f -n +0 -- "$infile" | "$NETCAT" "$host" "$port" > "$outfile" 2> /dev/null &
|
|
pid=$!
|
|
[ -z "$command" -a "$wait" -le 0 ] && cat >> "$infile"
|
|
|
|
if [ "$wait" -le 0 ]; then
|
|
while ! grep -q -e '^RedBoot[>]' -e '^DD[-]WRT[>]' -- "$outfile"; do
|
|
sleep 1
|
|
done
|
|
else
|
|
sleep "$wait"
|
|
fi
|
|
|
|
local pkill_options='-KILL -f'
|
|
[ -x /bin/b_usybox ] && pkill_options='-f -KILL'
|
|
pkill $pkill_options "tail -f -n [+]0 -- $(echo -n "$infile" | tr -c '[0-9A-Za-z]' '.')" > /dev/null 2> /dev/null
|
|
kill -TERM "$pid" > /dev/null 2> /dev/null
|
|
wait "$pid"
|
|
sleep 1
|
|
|
|
(sleep 5; rm -f -- "$infile") > /dev/null 2> /dev/null &
|
|
(sleep 5; rm -f -- "$outfile") > /dev/null 2> /dev/null &
|
|
|
|
cat -- "$outfile"
|
|
echo
|
|
|
|
return 0
|
|
}
|
|
|
|
try_enter_redboot() {
|
|
local host=$1
|
|
local port=$2
|
|
|
|
local pid
|
|
|
|
ping -c 1 -w 1 "$host" > /dev/null 2> /dev/null || {
|
|
return 1
|
|
}
|
|
|
|
sleep 1
|
|
|
|
local outfile="$(make_tempfile)"
|
|
local i=0
|
|
while [ "$i" -lt 4 ]; do
|
|
echo -e '\0377\0364\0377\0375\0006' | call_redboot "$host" "$port" '' 1 > "$outfile"
|
|
if grep -q -e 'RedBoot[>]' -e 'DD[-]WRT[>]' -- "$outfile"; then
|
|
rm -f -- "$outfile"
|
|
break
|
|
fi
|
|
i=$((i+1))
|
|
done
|
|
|
|
rm -f -- "$outfile"
|
|
|
|
[ "$i" -ge 4 ] && return 1
|
|
return 0
|
|
}
|
|
|
|
NETWORKMANAGER_STOPPED=0
|
|
INETD_STARTED=0
|
|
FIRST_IP_ADDED=0
|
|
SECOND_IP_ADDED=0
|
|
|
|
cleanup() {
|
|
if [ -n "$IPROUTE2" ]; then
|
|
if [ "$SECOND_IP_ADDED" -ne 0 ]; then
|
|
echo -n "Delete IP address 192.168.1.2/24 from interface \"$INTERFACE\"..."
|
|
"$IPROUTE2" -- addr del 192.168.1.2/24 dev "$INTERFACE" > /dev/null 2> /dev/null && {
|
|
echo " done"
|
|
} || {
|
|
echo " failed"
|
|
}
|
|
fi
|
|
|
|
if [ "$FIRST_IP_ADDED" -ne 0 -a "$OPTION_FACTORY" -eq 0 ]; then
|
|
echo -n "Delete IP address 192.168.20.80/24 from interface \"$INTERFACE\"..."
|
|
"$IPROUTE2" -- addr del 192.168.20.80/24 dev "$INTERFACE" > /dev/null 2> /dev/null && {
|
|
echo " done"
|
|
} || {
|
|
echo " failed"
|
|
}
|
|
fi
|
|
fi
|
|
|
|
if [ "$INETD_STARTED" -ne 0 ]; then
|
|
echo -n "Stopping the internet superserver inetd..."
|
|
/etc/init.d/openbsd-inetd stop > /dev/null 2> /dev/null && {
|
|
echo " done"
|
|
} || {
|
|
echo " failed"
|
|
}
|
|
fi
|
|
|
|
if [ "$NETWORKMANAGER_STOPPED" -ne 0 ]; then
|
|
echo -n "Starting the NetworkManager..."
|
|
if start -- network-manager > /dev/null 2> /dev/null; then
|
|
echo " done"
|
|
elif service network-manager start > /dev/null 2> /dev/null; then
|
|
echo " done"
|
|
elif invoke-rc.d NetworkManager start > /dev/null 2> /dev/null; then
|
|
echo " done"
|
|
else
|
|
echo " failed"
|
|
fi
|
|
fi
|
|
|
|
rm -f -- "$TFTP_DIRECTORY/ap61.ram.dir300-flash" > /dev/null 2> /dev/null
|
|
rm -f -- "$TFTP_DIRECTORY/ap61.rom.dir300-flash" > /dev/null 2> /dev/null
|
|
rm -f -- "$TFTP_DIRECTORY/openwrt-atheros-vmlinux.lzma.dir300-flash" > /dev/null 2> /dev/null
|
|
rm -f -- "$TFTP_DIRECTORY/openwrt-atheros-root.squashfs.dir300-flash" > /dev/null 2> /dev/null
|
|
rm -f -- "$TFTP_DIRECTORY/dir300redboot.rom.dir300-flash" > /dev/null 2> /dev/null
|
|
}
|
|
|
|
abort() {
|
|
echo "Flashing failed, so doing cleanup and exit."
|
|
cleanup
|
|
exit 1
|
|
}
|
|
|
|
export LC_ALL=C
|
|
|
|
TFTP_DIRECTORY="$TFTP_DIRECTORY_FIRST"
|
|
[ ! -d "$TFTP_DIRECTORY" ] && TFTP_DIRECTORY="$TFTP_DIRECTORY_SECOND"
|
|
[ ! -d "$TFTP_DIRECTORY" ] && TFTP_DIRECTORY="$TFTP_DIRECTORY_THIRD"
|
|
[ ! -d "$TFTP_DIRECTORY" ] && TFTP_DIRECTORY="$TFTP_DIRECTORY_FOURTH"
|
|
[ ! -d "$TFTP_DIRECTORY" ] && TFTP_DIRECTORY=
|
|
|
|
if [ -x /bin/b_usybox ]; then
|
|
if [ -n "$IPROUTE2" ]; then
|
|
if ip addr show dev br-lan > /dev/null 2> /dev/null; then
|
|
INTERFACE=br-lan
|
|
fi
|
|
else
|
|
if ifconfig br-lan > /dev/null 2> /dev/null; then
|
|
INTERFACE=br-lan
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
KERNEL_IMAGE="$KERNEL_IMAGE_FIRST"
|
|
[ ! -f "$KERNEL_IMAGE" ] && KERNEL_IMAGE="$KERNEL_IMAGE_SECOND"
|
|
ROOTFS_IMAGE="$ROOTFS_IMAGE_FIRST"
|
|
[ ! -f "$ROOTFS_IMAGE" ] && ROOTFS_IMAGE="$ROOTFS_IMAGE_SECOND"
|
|
|
|
OPTION_REDBOOT=0
|
|
OPTION_FACTORY=0
|
|
OPTION_DOWNLOAD=0
|
|
if [ "$1" = "--" ]; then
|
|
shift
|
|
elif [ "$1" = "--redboot" ]; then
|
|
OPTION_REDBOOT=1
|
|
shift
|
|
if [ "$1" = "--" ]; then
|
|
shift
|
|
fi
|
|
elif [ "$1" = "--factory" ]; then
|
|
OPTION_FACTORY=1
|
|
shift
|
|
if [ "$1" = "--" ]; then
|
|
shift
|
|
fi
|
|
elif [ "$1" = "--download" ]; then
|
|
OPTION_DOWNLOAD=1
|
|
shift
|
|
if [ "$1" = "--" ]; then
|
|
shift
|
|
fi
|
|
elif [ "${1}" = "--help" ]; then
|
|
echo "Usage: $0 [INTERFACE] [KERNEL_IMAGE] [ROOTFS_IMAGE]"
|
|
echo " or: $0 --redboot [INTERFACE]"
|
|
echo " or: $0 --factory [INTERFACE]"
|
|
echo " or: $0 --download"
|
|
echo "Flashes a custom firmware and/or bootloader on the DIR-300 wireless router."
|
|
echo
|
|
echo " --redboot flashes only the new bootloader and not the firmware"
|
|
echo " --factory flashes the old factory bootloader back"
|
|
echo " --download download only the bootloader images"
|
|
echo " --help display this help and exit"
|
|
echo " --version output version information and exit"
|
|
echo
|
|
echo "With no INTERFACE, or when INTERFACE is empty, use \"$INTERFACE\"."
|
|
echo "If no KERNEL_IMAGE is specified, or when KERNEL_IMAGE is empty,"
|
|
echo "use \"$KERNEL_IMAGE_FIRST\" or \"$KERNEL_IMAGE_SECOND\"."
|
|
echo "And with no ROOTFS_IMAGE, or when ROOTFS_IMAGE is empty,"
|
|
echo "use \"$ROOTFS_IMAGE_FIRST\" or \"$ROOTFS_IMAGE_SECOND\"."
|
|
echo
|
|
echo "The bootloader images will be automatically downloaded from the internet."
|
|
echo "An installed TFTP server looking in the directory \"$TFTP_DIRECTORY_FIRST\","
|
|
echo "\"$TFTP_DIRECTORY_SECOND\", or \"$TFTP_DIRECTORY_THIRD\" is needed."
|
|
echo
|
|
echo "Report bugs to <x-alina@gmx.net>."
|
|
exit 0
|
|
elif [ "$1" = "--version" ]; then
|
|
echo "dir300-flash $VERSION"
|
|
echo "Copyright (C) 2008 Alina Friedrichsen <x-alina@gmx.net>"
|
|
echo "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>"
|
|
echo "This is free software: you are free to change and redistribute it."
|
|
echo "There is NO WARRANTY, to the extent permitted by law."
|
|
echo
|
|
echo "Special thanks to bittorf wireless ))"
|
|
exit 0
|
|
elif [ "$(echo -n "$1" | head -c 1)" = "-" ]; then
|
|
echo "$0: Invalid option" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$1" ]; then
|
|
INTERFACE="$1"
|
|
fi
|
|
|
|
if [ -n "$2" ]; then
|
|
KERNEL_IMAGE="$2"
|
|
fi
|
|
|
|
if [ -n "$3" ]; then
|
|
ROOTFS_IMAGE="$3"
|
|
fi
|
|
|
|
[ ! -d "$FIRMWARE_DIRECTORY" ] && {
|
|
mkdir -m 755 -p -- "$FIRMWARE_DIRECTORY" > /dev/null 2> /dev/null || {
|
|
echo "Error: Cannot create the firmware directory"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
if [ "$OPTION_FACTORY" -eq 0 -o "$OPTION_DOWNLOAD" -ne 0 ]; then
|
|
if [ ! -f "$FIRMWARE_DIRECTORY/ap61.ram" ]; then
|
|
echo -n "Downloading the bootloader RAM image..."
|
|
wget -q -O "$FIRMWARE_DIRECTORY/ap61.ram" -- "$AP61RAM_URL" || {
|
|
rm -f -- "$FIRMWARE_DIRECTORY/ap61.ram"
|
|
echo " failed"
|
|
exit 1
|
|
}
|
|
IMAGE_MD5="$(md5sum "$FIRMWARE_DIRECTORY/ap61.ram" | head -c 32)"
|
|
if [ "$IMAGE_MD5" != "$AP61RAM_MD5" ]; then
|
|
rm -f -- "$FIRMWARE_DIRECTORY/ap61.ram"
|
|
echo " MD5 mismatch"
|
|
exit 1
|
|
fi
|
|
chmod -- 0644 "$FIRMWARE_DIRECTORY/ap61.ram" > /dev/null 2> /dev/null
|
|
echo " done"
|
|
fi
|
|
|
|
if [ ! -f "$FIRMWARE_DIRECTORY/ap61.rom" ]; then
|
|
echo -n "Downloading the bootloader ROM image..."
|
|
wget -q -O "$FIRMWARE_DIRECTORY/ap61.rom" -- "$AP61ROM_URL" || {
|
|
rm -f -- "$FIRMWARE_DIRECTORY/ap61.rom"
|
|
echo " failed"
|
|
exit 1
|
|
}
|
|
IMAGE_MD5="$(md5sum "$FIRMWARE_DIRECTORY/ap61.rom" | head -c 32)"
|
|
if [ "$IMAGE_MD5" != "$AP61ROM_MD5" ]; then
|
|
rm -f -- "$FIRMWARE_DIRECTORY/ap61.rom"
|
|
echo " MD5 mismatch"
|
|
exit 1
|
|
fi
|
|
chmod -- 0644 "$FIRMWARE_DIRECTORY/ap61.rom" > /dev/null 2> /dev/null
|
|
echo " done"
|
|
fi
|
|
fi
|
|
|
|
if [ "$OPTION_FACTORY" -ne 0 -o "$OPTION_DOWNLOAD" -ne 0 ]; then
|
|
if [ ! -f "$FIRMWARE_DIRECTORY/dir300redboot.rom" ]; then
|
|
echo -n "Downloading the factory bootloader ROM image..."
|
|
DOWNLOAD_FILE="$(make_tempfile)"
|
|
wget -q -O "$DOWNLOAD_FILE" -- "$DIR300REDBOOTROM_URL" > /dev/null 2> /dev/null || {
|
|
rm -f -- "$DOWNLOAD_FILE"
|
|
echo " failed"
|
|
exit 1
|
|
}
|
|
IMAGE_MD5="$(md5sum "$DOWNLOAD_FILE" | head -c 32)"
|
|
if [ "$IMAGE_MD5" != "$DIR300REDBOOTROM_MD5" ]; then
|
|
rm -f -- "$DOWNLOAD_FILE"
|
|
echo " MD5 mismatch"
|
|
exit 1
|
|
fi
|
|
unzip -qq -n "$DOWNLOAD_FILE" -d "$FIRMWARE_DIRECTORY" > /dev/null 2> /dev/null || {
|
|
rm -f -- "$DOWNLOAD_FILE"
|
|
echo " failed"
|
|
exit 1
|
|
}
|
|
rm -f -- "$DOWNLOAD_FILE"
|
|
chmod -- 0644 "$FIRMWARE_DIRECTORY/dir300redboot.rom" > /dev/null 2> /dev/null
|
|
echo " done"
|
|
fi
|
|
fi
|
|
|
|
if [ "$OPTION_DOWNLOAD" -ne 0 ]; then
|
|
exit 0
|
|
fi
|
|
|
|
if [ -n "$IPROUTE2" ]; then
|
|
"$IPROUTE2" -- addr show 2> /dev/null | grep -q ' 192[.]168[.]20[.]81[/]' && {
|
|
echo "Error: The IP address 192.168.20.81 is already in use"
|
|
abort
|
|
}
|
|
else
|
|
ifconfig -a 2> /dev/null | grep -q '[:]192[.]168[.]20[.]81 ' && {
|
|
echo "Error: The IP address 192.168.20.81 is already in use"
|
|
abort
|
|
}
|
|
fi
|
|
|
|
if [ "$OPTION_FACTORY" -eq 0 ]; then
|
|
if [ -n "$IPROUTE2" ]; then
|
|
"$IPROUTE2" -- addr show 2> /dev/null | grep -q ' 192[.]168[.]1[.]1[/]' && {
|
|
echo "Error: The IP address 192.168.1.1 is already in use"
|
|
abort
|
|
}
|
|
else
|
|
ifconfig -a 2> /dev/null | grep -q '[:]192[.]168[.]1[.]1 ' && {
|
|
echo "Error: The IP address 192.168.1.1 is already in use"
|
|
abort
|
|
}
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$TFTP_DIRECTORY" ]; then
|
|
if grep -q -F "$TFTP_DIRECTORY_THIRD" -- /etc/inetd.conf > /dev/null 2> /dev/null; then
|
|
echo -n "Creating the TFTP directory \"$TFTP_DIRECTORY_THIRD\"..."
|
|
install -m 755 -d -- "$TFTP_DIRECTORY_THIRD" > /dev/null 2> /dev/null || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
TFTP_DIRECTORY="$TFTP_DIRECTORY_THIRD"
|
|
echo " done"
|
|
elif grep -q -F "$TFTP_DIRECTORY_SECOND" -- /etc/inetd.conf > /dev/null 2> /dev/null; then
|
|
echo -n "Creating the TFTP directory \"$TFTP_DIRECTORY_SECOND\"..."
|
|
install -m 755 -d -- "$TFTP_DIRECTORY_SECOND" > /dev/null 2> /dev/null || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
TFTP_DIRECTORY="$TFTP_DIRECTORY_SECOND"
|
|
echo " done"
|
|
elif grep -q -F "$TFTP_DIRECTORY_FIRST" -- /etc/inetd.conf > /dev/null 2> /dev/null; then
|
|
echo -n "Creating the TFTP directory \"$TFTP_DIRECTORY_FIRST\"..."
|
|
install -m 755 -d -- "$TFTP_DIRECTORY_FIRST" > /dev/null 2> /dev/null || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
TFTP_DIRECTORY="$TFTP_DIRECTORY_FIRST"
|
|
echo " done"
|
|
else
|
|
echo "Error: No TFTP directory found"
|
|
abort
|
|
fi
|
|
fi
|
|
|
|
if pidof NetworkManager > /dev/null 2> /dev/null; then
|
|
echo -n "Stopping the NetworkManager..."
|
|
if stop -- network-manager > /dev/null 2> /dev/null; then
|
|
NETWORKMANAGER_STOPPED=1
|
|
echo " done"
|
|
elif service network-manager stop > /dev/null 2> /dev/null; then
|
|
NETWORKMANAGER_STOPPED=1
|
|
echo " done"
|
|
elif invoke-rc.d NetworkManager stop > /dev/null 2> /dev/null; then
|
|
NETWORKMANAGER_STOPPED=1
|
|
echo " done"
|
|
else
|
|
echo " failed"
|
|
fi
|
|
fi
|
|
|
|
if [ -x /etc/init.d/openbsd-inetd ]; then
|
|
if grep -q '^tftp[ ]' -- /etc/inetd.conf 2> /dev/null; then
|
|
if ! netstat -u -n -l 2> /dev/null | grep -q '[:]69[ ]'; then
|
|
echo "Notice: It seems that an inetd-based TFTP daemon is installed but not running"
|
|
sleep 3
|
|
echo -n "So try to restart the internet superserver inetd..."
|
|
pidof inetd > /dev/null || INETD_STARTED=1
|
|
/etc/init.d/openbsd-inetd restart > /dev/null 2> /dev/null && {
|
|
echo " done"
|
|
} || {
|
|
INETD_STARTED=0
|
|
echo " failed"
|
|
}
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ "$OPTION_FACTORY" -eq 0 ]; then
|
|
if [ -x "/bin/b_usybox" ]; then
|
|
rm -f -- "$TFTP_DIRECTORY/ap61.ram.dir300-flash" > /dev/null 2> /dev/null
|
|
ln -s "$FIRMWARE_DIRECTORY/ap61.ram" "$TFTP_DIRECTORY/ap61.ram.dir300-flash" || {
|
|
echo "Error: Cannot symlink the bootloader RAM image into the TFTP directory"
|
|
abort
|
|
}
|
|
else
|
|
install -m 0644 -- "$FIRMWARE_DIRECTORY/ap61.ram" "$TFTP_DIRECTORY/ap61.ram.dir300-flash" > /dev/null 2> /dev/null || {
|
|
echo "Error: Cannot copy the bootloader RAM image to the TFTP directory"
|
|
abort
|
|
}
|
|
fi
|
|
|
|
if [ -x "/bin/b_usybox" ]; then
|
|
rm -f -- "$TFTP_DIRECTORY/ap61.rom.dir300-flash" > /dev/null 2> /dev/null
|
|
ln -s "$FIRMWARE_DIRECTORY/ap61.rom" "$TFTP_DIRECTORY/ap61.rom.dir300-flash" || {
|
|
echo "Error: Cannot symlink the bootloader ROM image into the TFTP directory"
|
|
abort
|
|
}
|
|
else
|
|
install -m 0644 -- "$FIRMWARE_DIRECTORY/ap61.rom" "$TFTP_DIRECTORY/ap61.rom.dir300-flash" > /dev/null 2> /dev/null || {
|
|
echo "Error: Cannot copy the bootloader ROM image to the TFTP directory"
|
|
abort
|
|
}
|
|
fi
|
|
|
|
if [ "$OPTION_REDBOOT" -eq 0 ]; then
|
|
if [ ! -f "$KERNEL_IMAGE" ]; then
|
|
echo "Error: Kernel image not found"
|
|
abort
|
|
fi
|
|
|
|
if [ -x "/bin/b_usybox" ]; then
|
|
rm -f -- "$TFTP_DIRECTORY/openwrt-atheros-vmlinux.lzma.dir300-flash" > /dev/null 2> /dev/null
|
|
ln -s "$PWD/$KERNEL_IMAGE" "$TFTP_DIRECTORY/openwrt-atheros-vmlinux.lzma.dir300-flash" || {
|
|
echo "Error: Cannot symlink the kernel image into the TFTP directory"
|
|
abort
|
|
}
|
|
else
|
|
install -m 0644 -- "$KERNEL_IMAGE" "$TFTP_DIRECTORY/openwrt-atheros-vmlinux.lzma.dir300-flash" > /dev/null 2> /dev/null || {
|
|
echo "Error: Cannot copy the kernel image to the TFTP directory"
|
|
abort
|
|
}
|
|
fi
|
|
|
|
|
|
if [ ! -f "$ROOTFS_IMAGE" ]; then
|
|
echo "Error: Root filesystem not found"
|
|
abort
|
|
fi
|
|
|
|
if [ -x "/bin/b_usybox" ]; then
|
|
rm -f -- "$TFTP_DIRECTORY/openwrt-atheros-root.squashfs.dir300-flash" > /dev/null 2> /dev/null
|
|
ln -s "$PWD/$ROOTFS_IMAGE" "$TFTP_DIRECTORY/openwrt-atheros-root.squashfs.dir300-flash" || {
|
|
echo "Error: Cannot symlink the root filesystem into the TFTP directory"
|
|
abort
|
|
}
|
|
else
|
|
install -m 0644 -- "$ROOTFS_IMAGE" "$TFTP_DIRECTORY/openwrt-atheros-root.squashfs.dir300-flash" > /dev/null 2> /dev/null || {
|
|
echo "Error: Cannot copy the root filesystem to the TFTP directory"
|
|
abort
|
|
}
|
|
fi
|
|
fi
|
|
else
|
|
if [ -x "/bin/b_usybox" ]; then
|
|
rm -f -- "$TFTP_DIRECTORY/dir300redboot.rom.dir300-flash" > /dev/null 2> /dev/null
|
|
ln -s "$FIRMWARE_DIRECTORY/dir300redboot.rom" "$TFTP_DIRECTORY/dir300redboot.rom.dir300-flash" || {
|
|
echo "Error: Cannot symlink the factory bootloader ROM image into the TFTP directory"
|
|
abort
|
|
}
|
|
else
|
|
install -m 0644 -- "$FIRMWARE_DIRECTORY/dir300redboot.rom" "$TFTP_DIRECTORY/dir300redboot.rom.dir300-flash" > /dev/null 2> /dev/null || {
|
|
echo "Error: Cannot copy the factory bootloader ROM image to the TFTP directory"
|
|
abort
|
|
}
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$IPROUTE2" ]; then
|
|
"$IPROUTE2" -- addr show dev "$INTERFACE" 2> /dev/null | grep -q ' 192[.]168[.]20[.]80[/]24 ' || {
|
|
echo -n "Add IP address 192.168.20.80/24 to interface \"$INTERFACE\"..."
|
|
"$IPROUTE2" -- addr add 192.168.20.80/24 dev "$INTERFACE" > /dev/null 2> /dev/null && {
|
|
FIRST_IP_ADDED=1
|
|
echo " done"
|
|
} || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
}
|
|
|
|
"$IPROUTE2" -- link set "$INTERFACE" up > /dev/null 2> /dev/null
|
|
else
|
|
echo -n "Set IP address on interface \"$INTERFACE\" to 192.168.20.80/24..."
|
|
ifconfig "$INTERFACE" 192.168.20.80 > /dev/null 2> /dev/null && {
|
|
echo " done"
|
|
} || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
|
|
ifconfig "$INTERFACE" up > /dev/null 2> /dev/null
|
|
fi
|
|
|
|
BREAK_WARNING=0
|
|
|
|
echo "Please connect now the WAN port of the DIR-300 wireless router directly to"
|
|
echo "the interface \"$INTERFACE\" and then power the wireless router on."
|
|
sleep 3
|
|
|
|
echo -n "Waiting for the wireless router..."
|
|
while ! try_enter_redboot 192.168.20.81 9000; do
|
|
echo -n "."
|
|
done
|
|
echo " done"
|
|
|
|
echo -n "Testing for the factory bootloader..."
|
|
call_redboot 192.168.20.81 9000 "version" | grep -q '^DD[-]WRT[>]' && {
|
|
echo " no"
|
|
|
|
if [ "$OPTION_REDBOOT" -ne 0 ]; then
|
|
echo "Error: The new bootloader is already installed"
|
|
abort
|
|
fi
|
|
|
|
if [ "$OPTION_FACTORY" -ne 0 ]; then
|
|
echo -n "Uploading the old factory bootloader ROM image..."
|
|
call_redboot 192.168.20.81 9000 "load -r -b %{FREEMEMLO} dir300redboot.rom.dir300-flash" | grep -q 'Raw file loaded 0x' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
if [ "$BREAK_WARNING" -eq 0 ]; then
|
|
BREAK_WARNING=1
|
|
echo "Warning: Do not power off or disconnect as this may break the wireless router!"
|
|
sleep 3
|
|
fi
|
|
|
|
echo -n "Setting back the transitional configuration..."
|
|
(
|
|
echo "fconfig -d"; sleep 1
|
|
echo "false"; sleep 1
|
|
echo "5"; sleep 1
|
|
echo "false"; sleep 1
|
|
echo "192.168.1.2"; sleep 1
|
|
echo "192.168.1.1"; sleep 1
|
|
echo "255.255.255.0"; sleep 1
|
|
echo "192.168.1.2"; sleep 1
|
|
echo "9600"; sleep 1
|
|
echo "9000"; sleep 1
|
|
echo "false"; sleep 1
|
|
echo "false"; sleep 1
|
|
echo "y"
|
|
) | call_redboot 192.168.20.81 9000 | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
echo -n "Flashing the factory bootloader back..."
|
|
(
|
|
echo "fis init"; sleep 1
|
|
echo "y"
|
|
) | call_redboot 192.168.20.81 9000 | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
(
|
|
echo "fis create -l 0x30000 -e 0xbfc00000 RedBoot"; sleep 1
|
|
echo "y"
|
|
) | call_redboot 192.168.20.81 9000 | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
fi
|
|
} || {
|
|
echo " yes"
|
|
|
|
if [ "$OPTION_FACTORY" -ne 0 ]; then
|
|
echo "Error: The factory bootloader is already installed"
|
|
abort
|
|
fi
|
|
|
|
echo -n "Uploading the temporary bootloader RAM image..."
|
|
call_redboot 192.168.20.81 9000 "load ap61.ram.dir300-flash" | grep -q 'Entry point: 0x' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
if [ -n "$IPROUTE2" ]; then
|
|
"$IPROUTE2" -- addr show dev "$INTERFACE" 2> /dev/null | grep -q ' 192[.]168[.]1[.]2[/]24 ' || {
|
|
echo -n "Add IP address 192.168.1.2/24 to interface \"$INTERFACE\"..."
|
|
"$IPROUTE2" -- addr add 192.168.1.2/24 dev "$INTERFACE" > /dev/null 2> /dev/null && {
|
|
SECOND_IP_ADDED=1
|
|
echo " done"
|
|
} || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
}
|
|
fi
|
|
|
|
echo -n "Starting the temporary bootloader..."
|
|
call_redboot 192.168.20.81 9000 "go" 1 > /dev/null
|
|
echo " done"
|
|
|
|
if [ -z "$IPROUTE2" ]; then
|
|
echo -n "Set IP address on interface \"$INTERFACE\" to 192.168.1.2/24..."
|
|
ifconfig "$INTERFACE" 192.168.1.2 > /dev/null 2> /dev/null && {
|
|
echo " done"
|
|
} || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
fi
|
|
|
|
echo -n "Waiting for the temporary bootloader to come up..."
|
|
while ! try_enter_redboot 192.168.1.1 9000; do
|
|
echo -n "."
|
|
sleep 5
|
|
done
|
|
echo " done"
|
|
|
|
echo -n "Uploading the new bootloader ROM image..."
|
|
call_redboot 192.168.1.1 9000 "ip_address -h 192.168.1.2" | grep -q '[:] 192[.]168[.]1[.]2[^0-9]*$' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
call_redboot 192.168.1.1 9000 "load -r -b %{FREEMEMLO} ap61.rom.dir300-flash" | grep -q 'Raw file loaded 0x' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
if [ "$BREAK_WARNING" -eq 0 ]; then
|
|
BREAK_WARNING=1
|
|
echo "Warning: Do not power off or disconnect as this may break the wireless router!"
|
|
sleep 3
|
|
fi
|
|
|
|
echo -n "Setting up bootloader configuration..."
|
|
(
|
|
echo "fconfig -d"; sleep 1
|
|
echo "true"; sleep 1
|
|
echo "fis load -l vmlinux.bin.l7"; sleep 1
|
|
echo "exec"; sleep 1
|
|
echo; sleep 1
|
|
echo "5"; sleep 1
|
|
echo "false"; sleep 1
|
|
echo "192.168.20.80"; sleep 1
|
|
echo "192.168.20.81"; sleep 1
|
|
echo "255.255.255.0"; sleep 1
|
|
echo "192.168.20.80"; sleep 1
|
|
echo "9600"; sleep 1
|
|
echo "9000"; sleep 1
|
|
echo "false"; sleep 1
|
|
echo "false"; sleep 1
|
|
echo "y"
|
|
) | call_redboot 192.168.1.1 9000 | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
echo -n "Flashing the new bootloader..."
|
|
(
|
|
echo "fis init"; sleep 1
|
|
echo "y"
|
|
) | call_redboot 192.168.1.1 9000 | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
(
|
|
echo "fis create -l 0x30000 -e 0xbfc00000 RedBoot"; sleep 1
|
|
echo "y"
|
|
) | call_redboot 192.168.1.1 9000 | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
echo -n "Resetting the wireless router..."
|
|
call_redboot 192.168.1.1 9000 "reset" 1 > /dev/null
|
|
echo " done"
|
|
|
|
if [ "$OPTION_REDBOOT" -eq 0 ]; then
|
|
if [ -z "$IPROUTE2" ]; then
|
|
echo -n "Set IP address on interface \"$INTERFACE\" to 192.168.20.80/24..."
|
|
ifconfig "$INTERFACE" 192.168.20.80 > /dev/null 2> /dev/null && {
|
|
echo " done"
|
|
} || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
fi
|
|
|
|
echo -n "Waiting for the new bootloader..."
|
|
while ! try_enter_redboot 192.168.20.81 9000; do
|
|
echo -n "."
|
|
done
|
|
echo " done"
|
|
fi
|
|
}
|
|
|
|
if [ "$OPTION_FACTORY" -eq 0 -a "$OPTION_REDBOOT" -eq 0 ]; then
|
|
echo -n "Uploading the new kernel image..."
|
|
call_redboot 192.168.20.81 9000 "load -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma.dir300-flash" | grep -q 'Raw file loaded 0x' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
if [ "$BREAK_WARNING" -eq 0 ]; then
|
|
BREAK_WARNING=1
|
|
echo "Warning: Do not power off or disconnect as this may break the wireless router!"
|
|
sleep 3
|
|
fi
|
|
|
|
echo -n "Flashing the new kernel image..."
|
|
(
|
|
echo "fis init"; sleep 1
|
|
echo "y"
|
|
) | call_redboot 192.168.20.81 9000 | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
|
|
call_redboot 192.168.20.81 9000 "fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7" | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
echo -n "Uploading the new root filesystem..."
|
|
call_redboot 192.168.20.81 9000 "load -r -b %{FREEMEMLO} openwrt-atheros-root.squashfs.dir300-flash" | grep -q 'Raw file loaded 0x' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
|
|
echo -n "Flashing the new root filesystem..."
|
|
call_redboot 192.168.20.81 9000 "fis create rootfs" | grep -q ' Program from ' || {
|
|
echo " failed"
|
|
abort
|
|
}
|
|
echo " done"
|
|
fi
|
|
|
|
if [ "$OPTION_REDBOOT" -eq 0 ]; then
|
|
echo -n "Resetting the wireless router..."
|
|
call_redboot 192.168.20.81 9000 "reset" 1 > /dev/null
|
|
echo " done"
|
|
fi
|
|
|
|
cleanup
|
|
|
|
if [ "$OPTION_FACTORY" -eq 0 ]; then
|
|
echo
|
|
echo "Happy Hacking! ;)"
|
|
else
|
|
echo
|
|
echo "Hold the reset button down, while power on the wireless router"
|
|
echo "for around 30 seconds, to get into the recovery mode. In it you"
|
|
echo "can point your web browser to 192.168.20.81 and upload from"
|
|
echo "there the original factory firmware."
|
|
fi
|
|
|
|
exit 0
|