diff --git a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/share b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/share index e2915ec..5da452c 100755 --- a/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/share +++ b/FunKey/board/funkey/rootfs-overlay/usr/local/sbin/share @@ -49,6 +49,12 @@ mount_share () { # Create the directory structure if required (cd /mnt; mkdir -p "Atari lynx" "Game Boy" "Game Boy Color" "Game Boy Advance" "Game Gear" "Neo Geo Pocket" "NES" "PS1" "Sega Genesis" "Sega Master System" "SNES" "WonderSwan") + + # Check if there is an updte file + if [ -f /mnt/FunKey-*.swu ]; then + warn "found an update file, going into recovery mode" + recovery_mode + fi return 0 } @@ -73,7 +79,7 @@ stop_share () { # Stop sharing the backing store partition echo > $BACKING_STORE_FILE || die 11 "the backing store partition is still mounted on host" - # 3) Mount the backing store partition locally + # Mount the backing store partition locally mount_share info "stopped sharing the backing store partition" diff --git a/FunKey/board/funkey/sw-description b/FunKey/board/funkey/sw-description index 8f72206..a7099c4 100644 --- a/FunKey/board/funkey/sw-description +++ b/FunKey/board/funkey/sw-description @@ -2,13 +2,21 @@ software = { version = "0.6"; - hardware-compatibility = [ "#RE:^Rev\.[A-E]$" ]; + hardware-compatibility = [ "#RE:^Rev\.[D-E]$" ]; images: ( { - filename = "rootfs.ext2.tar.gz"; + filename = "rootfs.ext2.gz"; device = "/dev/mmcblk0p2"; - compression = "zlib"; + type = "raw"; + installed-directly = true; + compressed = "zlib"; } ); + scripts: ( + { + filename = "update_partition"; + type = "shellscript"; + } + ); } diff --git a/FunKey/board/funkey/update_partition b/FunKey/board/funkey/update_partition new file mode 100755 index 0000000..f4b2852 --- /dev/null +++ b/FunKey/board/funkey/update_partition @@ -0,0 +1,77 @@ +#!/bin/sh +# Update partition script + +source /usr/local/lib/utils + +root_part_num=2 +root_part=/dev/mmcblk0p${root_part_num} +root_mount=/tmp/rootfs + +do_preinst() +{ + notif "1/7 Extract update" + exit 0 +} + +do_postinst() +{ + local version + + notif "2/7 Resize root filesystem" + resize2fs ${root_part} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + notif "Cannot resize root filesystem" + exit 1 + fi + notif "3/7 Mount root filesystem" + mkdir -p ${root_mount} + mount -t ext4 ${root_part} ${root_mount} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + notif "Cannot mount root filesystem" + exit 1 + fi + notif "4/7 Create swap" + + # Create an empty 128MB /swap file, change its permissions and format it as swap + dd if=/dev/zero of=${root_mount}/swap bs=1M count=128 >/dev/null 2>&1 && + chmod 0600 ${root_mount}/swap >/dev/null 2>&1 && + mkswap ${root_mount}/swap >/dev/null 2>&1 + if [ $? -ne 0 ]; then + rm ${root_mount}/swap + umount ${root_mount} >/dev/null 2>&1 + notif "Cannot create swap file" + exit 1 + fi + notif "5/7 Unmount root filesystem" + umount ${root_mount} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + notif "Cannot unmount root filesystem" + exit 1 + fi + for file in /mnt/FunKey-*.swu; do + version=$(basename "${file}" .swu | cut -d '-' -f 2) + notif "6/7 Setting rootfs version to ${version}" + sed -i '/^rootfs/d' /etc/sw-versions + notif "7/7 Erase update file" + echo -e "rootfs\t${version}" >> /etc/sw-versions + rm -f "${file}" + done + exit 0 +} + +echo $0 $1 + +case "$1" in +preinst) + notif "call do_preinst" + do_preinst + ;; +postinst) + notif "call do_postinst" + do_postinst + ;; +*) + notif "default" + exit 1 + ;; +esac diff --git a/Makefile b/Makefile index f8b214b..97084ac 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ TERM_RESET := $(shell tput rmso 2>/dev/null) .IGNORE: _Makefile_ -all: update +all: image update @: _Makefile_: @@ -42,10 +42,10 @@ _Makefile_: %/Makefile: @: -buildroot: buildroot/README +buildroot: buildroot/.git @: -buildroot/README: +buildroot/.git: @$(call MESSAGE,"Getting buildroot") @git submodule init @git submodule update @@ -86,9 +86,13 @@ update: fun @rm -rf tmp @mkdir -p tmp @cp FunKey/board/funkey/sw-description tmp/ - @tar -C FunKey/output/images -zcf tmp/rootfs.ext2.tar.gz rootfs.ext2 + @cp FunKey/board/funkey/update_partition tmp/ + @cd FunKey/output/images && \ + rm -f rootfs.ext2.gz && \ + gzip -k rootfs.ext2 &&\ + mv rootfs.ext2.gz ../../../tmp/ @cd tmp && \ - echo sw-description rootfs.ext2.tar.gz | \ + echo sw-description rootfs.ext2.gz update_partition | \ tr " " "\n" | \ cpio -o -H crc --quiet > ../images/FunKey-$(shell cat FunKey/board/funkey/rootfs-overlay/etc/sw-versions | cut -f 2).swu @rm -rf tmp diff --git a/Recovery/board/funkey/rootfs-overlay/etc/init.d/S01update b/Recovery/board/funkey/rootfs-overlay/etc/init.d/S01update new file mode 100755 index 0000000..84336a1 --- /dev/null +++ b/Recovery/board/funkey/rootfs-overlay/etc/init.d/S01update @@ -0,0 +1,24 @@ +#!/bin/sh + +THIS=$(basename $0) + +case "$1" in + start) + for file in /mnt/FunKey-*.swu; do + swupdate -v -i "${file}" + if [ $? -ne 0 ]; then + share start + mkdir -p /run/network + /sbin/ifup -a + exit 1 + fi + done + normal_mode + ;; + stop) + ;; + *) + echo "Usage: $0 {start|stop}" >&2 + exit 1 + ;; +esac