forked from jeelabs/esp-link
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
134 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
#! /bin/bash | ||
# | ||
# Flash an esp8266 over wifi. This communicates with the esphttpd's /flash handlers | ||
# and POSTS the correct binary depending on the parittion that needs to be flashed | ||
# next. | ||
# | ||
# ---------------------------------------------------------------------------- | ||
# "THE BEER-WARE LICENSE" (Revision 42): | ||
# Thorsten von Eicken wrote this file. As long as you retain | ||
# this notice you can do whatever you want with this stuff. If we meet some day, | ||
# and you think this stuff is worth it, you can buy me a beer in return. | ||
# ---------------------------------------------------------------------------- | ||
|
||
show_help() { | ||
cat <<EOT | ||
Usage: ${0##*/} [-options...] hostname user1.bin user2.bin | ||
Flash the esp8266 running esphttpd at <hostname> with either <user1.bin> or <user2.bin> | ||
depending on its current state. Reboot the esp8266 after flashing and wait for it to come | ||
up again. | ||
-v Be verbose | ||
-h show this help | ||
Example: ${0##*/} -v esp8266 firmware/user1.bin firmware/user2.bin | ||
${0##*/} 192.168.4.1 firmware/user1.bin firmware/user2.bin | ||
EOT | ||
} | ||
|
||
if ! which curl >/dev/null; then | ||
echo "ERROR: Cannot find curl: it is required for this script." >&2 | ||
exit 1 | ||
fi | ||
|
||
start=`date +%s` | ||
|
||
# ===== Parse arguments | ||
|
||
verbose= | ||
|
||
while getopts "hvx:" opt; do | ||
case "$opt" in | ||
h) show_help; exit 0 ;; | ||
v) verbose=1 ;; | ||
x) foo="$OPTARG" ;; | ||
'?') show_help >&2; exit 1 ;; | ||
esac | ||
done | ||
|
||
# Shift off the options and optional --. | ||
shift "$((OPTIND-1))" | ||
|
||
# Get the fixed arguments | ||
if [[ $# != 3 ]]; then | ||
show_help >&2 | ||
exit 1 | ||
fi | ||
hostname=$1 | ||
user1=$2 | ||
user2=$3 | ||
|
||
re='[-A-Za-z0-9.]+' | ||
if [[ ! "$hostname" =~ $re ]]; then | ||
echo "ERROR: hostname ${hostname} is not a valid hostname or ip address" >&2 | ||
exit 1 | ||
fi | ||
|
||
if [[ ! -r "$user1" ]]; then | ||
echo "ERROR: cannot read user1 firmware file ($user1)" >&2 | ||
exit 1 | ||
fi | ||
|
||
if [[ ! -r "$user2" ]]; then | ||
echo "ERROR: cannot read user2 firmware file ($user2)" >&2 | ||
exit 1 | ||
fi | ||
|
||
# ===== Retrieve the 'next' firmware required | ||
|
||
fw= | ||
while true; do | ||
[[ -n "$verbose" ]] && echo "Fetching http://$hostname/flash/next" >&2 | ||
v=; [[ -n "$verbose" ]] && v=-v | ||
next=`curl -m 10 $v -s "http://$hostname/flash/next"` | ||
if [[ $? != 0 ]]; then | ||
echo "Error retrieving http://$hostname/flash/next" >&2 | ||
break | ||
fi | ||
case "$next" in | ||
user1.bin) | ||
echo "Flashing user1.bin" >&2 | ||
fw="$user1" | ||
break;; | ||
user2.bin) | ||
echo "Flashing user2.bin" >&2 | ||
fw="$user2" | ||
break;; | ||
*) | ||
echo "Cannot parse result of retrieving http://$hostname/flash/next" >&2 | ||
sleep 2 | ||
;; | ||
esac | ||
done | ||
|
||
res=`curl -s -XPOST --data-binary "@$fw" "http://$hostname/flash/upload"` | ||
if [[ $? != 0 ]]; then | ||
echo "Error flashing $fw" >&2 | ||
exit 1 | ||
fi | ||
|
||
sleep 2 | ||
echo "Rebooting into new firmware" >&2 | ||
curl -m 10 -s "http://$hostname/flash/reboot" | ||
|
||
sleep 2 | ||
echo "Waiting for ESP8266 to come back" | ||
while true; do | ||
[[ -n "$verbose" ]] && echo "Fetching http://$hostname/flash/next" >&2 | ||
next2=`curl -m 10 $v -s "http://$hostname/flash/next"` | ||
[[ -n "$verbose" ]] && echo "got: $next2" | ||
re='user[12]\.bin' | ||
if [[ "$next2" =~ $re ]]; then | ||
if [[ "$next2" != "$next" ]]; then | ||
sec=$(( `date +%s` - $start )) | ||
echo "Success, took $sec seconds" >&2 | ||
exit 0 | ||
else | ||
echo "Flashing seems to have failed and it reverted to the old firmware?" >&2 | ||
exit 1 | ||
fi | ||
fi | ||
sleep 1 | ||
done |