diff --git a/addon/www/rest.cgi b/addon/www/rest.cgi
index 9dcbcfa..0e653c5 100644
--- a/addon/www/rest.cgi
+++ b/addon/www/rest.cgi
@@ -48,13 +48,34 @@ proc process {} {
} elseif {[lindex $path 1] == "get_firmware_info"} {
return [rmupdate::get_firmware_info]
} elseif {[lindex $path 1] == "start_install_firmware"} {
- regexp {^([\d\.]+)$} $data match version
+ regexp {\"version\"\s*:\s*\"([\d\.]+)\"} $data match version
+ regexp {\"reboot\"\s*:\s*(true|false)} $data match reboot
if { [info exists version] && $version != "" } {
- rmupdate::install_firmware_version $version
- return "\"done\""
+ if { ![info exists reboot] } {
+ set reboot "true"
+ }
+ if {$reboot == "true"} {
+ set reboot 1
+ } else {
+ set reboot 0
+ }
+ return "\"[rmupdate::install_firmware_version $version $reboot]\""
} else {
error "Invalid version: ${data}"
}
+ } elseif {[lindex $path 1] == "delete_firmware_image"} {
+ regexp {\"version\"\s*:\s*\"([\d\.]+)\"} $data match version
+ if { [info exists version] && $version != "" } {
+ return "\"[rmupdate::delete_firmware_image $version]\""
+ } else {
+ error "Invalid version: ${data}"
+ }
+ } elseif {[lindex $path 1] == "is_system_upgradeable"} {
+ if {[rmupdate::is_system_upgradeable]} {
+ return "true"
+ } else {
+ return "false"
+ }
} elseif {[lindex $path 1] == "read_install_log"} {
variable content_type "text/html"
return [rmupdate::read_install_log]
diff --git a/resize_image.sh b/resize_image.sh
new file mode 100755
index 0000000..62e89ff
--- /dev/null
+++ b/resize_image.sh
@@ -0,0 +1,64 @@
+#!/bin/bash -e
+
+LOOP_DEV=4
+BOOT_SIZE=$((50*1024*1024))
+ROOT_SIZE=$((1000*1024*1024))
+USR_LOCAL_SIZE=$((2*1024*1024))
+
+
+if [[ $EUID -ne 0 ]]; then
+ echo "This script must be run as root." 1>&2
+ exit 1
+fi
+
+image_file="$1"
+new_image_file="$1.resized"
+
+echo "*** Creating new image file and partitions ***"
+dd if=/dev/zero of=$new_image_file bs=1M count=$((((${BOOT_SIZE}+${ROOT_SIZE}+${USR_LOCAL_SIZE})/1024/1024)+1))
+parted --script $new_image_file \
+ mklabel msdos \
+ mkpart primary fat16 512B ${BOOT_SIZE}B \
+ set 1 boot on \
+ mkpart primary ext4 $((512+${BOOT_SIZE}))B $((${BOOT_SIZE}+${ROOT_SIZE}))B \
+ mkpart primary ext4 $((512+${BOOT_SIZE}+${ROOT_SIZE}))B 100%
+
+echo "*** Copying original partitons ***"
+oIFS="$IFS"
+IFS=$'\n'
+for line in $(parted $image_file unit B print | grep primary); do
+ IFS=$oIFS
+ x=($line)
+ num=${x[0]}
+ start=$((${x[1]:0: -1}/512))
+ size=$((${x[3]:0: -1}/512))
+ echo $num - $start - $size
+ seek=0
+ [ "$num" = "1" ] && seek=$start
+ [ "$num" = "2" ] && seek=$(((512+${BOOT_SIZE})/512))
+ [ "$num" = "3" ] && seek=$(((512+${BOOT_SIZE}+${ROOT_SIZE})/512))
+ dd if=$image_file of=$new_image_file bs=512 skip=$start count=$size seek=$seek conv=notrunc
+done
+
+echo "*** Resizing filesystems ***"
+rm /dev/mapper/loop${LOOP_DEV}p 2>/dev/null || true
+kpartx -d /dev/loop${LOOP_DEV} 2>/dev/null || true
+losetup -d /dev/loop${LOOP_DEV} 2>/dev/null || true
+
+losetup /dev/loop${LOOP_DEV} $new_image_file
+kpartx -a /dev/loop${LOOP_DEV}
+ln -s /dev/loop${LOOP_DEV} /dev/mapper/loop${LOOP_DEV}p
+
+fsck.vfat -a /dev/mapper/loop${LOOP_DEV}p1
+fatresize --size $BOOT_SIZE /dev/mapper/loop${LOOP_DEV}p1
+fsck.ext4 -f -y /dev/mapper/loop${LOOP_DEV}p2
+resize2fs /dev/mapper/loop${LOOP_DEV}p2
+fsck.ext4 -f -y /dev/mapper/loop${LOOP_DEV}p3
+resize2fs /dev/mapper/loop${LOOP_DEV}p3
+
+rm /dev/mapper/loop${LOOP_DEV}p
+kpartx -d /dev/loop${LOOP_DEV}
+losetup -d /dev/loop${LOOP_DEV}
+
+echo "*** Resized image successfully created ***"
+