procd: remove procd-nand package
authorMatthias Schiffer <mschiffer@universe-factory.net>
Fri, 21 Apr 2017 18:37:58 +0000 (20:37 +0200)
committerMatthias Schiffer <mschiffer@universe-factory.net>
Mon, 29 May 2017 21:50:32 +0000 (23:50 +0200)
We always want to support staged upgrades now, so it's better to include
upgraded into the main package. /lib/upgrade/nand.sh is moved to
base-files.

The procd-nand-firstboot package is removed for now, it may return later
as a separate package.

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
package/base-files/Makefile
package/base-files/files/lib/upgrade/nand.sh [new file with mode: 0644]
package/system/procd/Makefile
package/system/procd/files/nand-preinit.sh [deleted file]
package/system/procd/files/nand.sh [deleted file]

index 512fa66ca73bb8181510473e2cce63f2faa61d34..912449c85a9763df0328067979a39538ec1906e6 100644 (file)
@@ -18,7 +18,9 @@ PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_BUILD_DEPENDS:=usign/host
 PKG_LICENSE:=GPL-2.0
 
-PKG_CONFIG_DEPENDS := CONFIG_SIGNED_PACKAGES CONFIG_TARGET_INIT_PATH CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE
+PKG_CONFIG_DEPENDS := \
+       CONFIG_SIGNED_PACKAGES CONFIG_TARGET_INIT_PATH CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE \
+       CONFIG_NAND_SUPPORT
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -30,7 +32,7 @@ endif
 define Package/base-files
   SECTION:=base
   CATEGORY:=Base system
-  DEPENDS:=+netifd +libc +procd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:lede-keyring +fstools +fwtool
+  DEPENDS:=+netifd +libc +procd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:lede-keyring +NAND_SUPPORT:ubi-utils +fstools +fwtool
   TITLE:=Base filesystem for Lede
   URL:=http://openwrt.org/
   VERSION:=$(PKG_RELEASE)-$(REVISION)
@@ -105,9 +107,16 @@ ifdef CONFIG_SIGNED_PACKAGES
   endef
 endif
 
+ifeq ($(CONFIG_NAND_SUPPORT),)
+  define Package/base-files/nand-support
+       rm -f $(1)/lib/upgrade/nand.sh
+  endef
+endif
+
 define Package/base-files/install
        $(CP) ./files/* $(1)/
        $(Package/base-files/install-key)
+       $(Package/base-files/nand-support)
        if [ -d $(GENERIC_PLATFORM_DIR)/base-files/. ]; then \
                $(CP) $(GENERIC_PLATFORM_DIR)/base-files/* $(1)/; \
        fi
diff --git a/package/base-files/files/lib/upgrade/nand.sh b/package/base-files/files/lib/upgrade/nand.sh
new file mode 100644 (file)
index 0000000..9c831df
--- /dev/null
@@ -0,0 +1,376 @@
+#!/bin/sh
+# Copyright (C) 2014 OpenWrt.org
+#
+
+. /lib/functions.sh
+
+# 'kernel' partition on NAND contains the kernel
+CI_KERNPART="${CI_KERNPART:-kernel}"
+
+# 'ubi' partition on NAND contains UBI
+CI_UBIPART="${CI_UBIPART:-ubi}"
+
+ubi_mknod() {
+       local dir="$1"
+       local dev="/dev/$(basename $dir)"
+
+       [ -e "$dev" ] && return 0
+
+       local devid="$(cat $dir/dev)"
+       local major="${devid%%:*}"
+       local minor="${devid##*:}"
+       mknod "$dev" c $major $minor
+}
+
+nand_find_volume() {
+       local ubidevdir ubivoldir
+       ubidevdir="/sys/devices/virtual/ubi/$1"
+       [ ! -d "$ubidevdir" ] && return 1
+       for ubivoldir in $ubidevdir/${1}_*; do
+               [ ! -d "$ubivoldir" ] && continue
+               if [ "$( cat $ubivoldir/name )" = "$2" ]; then
+                       basename $ubivoldir
+                       ubi_mknod "$ubivoldir"
+                       return 0
+               fi
+       done
+}
+
+nand_find_ubi() {
+       local ubidevdir ubidev mtdnum
+       mtdnum="$( find_mtd_index $1 )"
+       [ ! "$mtdnum" ] && return 1
+       for ubidevdir in /sys/devices/virtual/ubi/ubi*; do
+               [ ! -d "$ubidevdir" ] && continue
+               cmtdnum="$( cat $ubidevdir/mtd_num )"
+               [ ! "$mtdnum" ] && continue
+               if [ "$mtdnum" = "$cmtdnum" ]; then
+                       ubidev=$( basename $ubidevdir )
+                       ubi_mknod "$ubidevdir"
+                       echo $ubidev
+                       return 0
+               fi
+       done
+}
+
+nand_get_magic_long() {
+       dd if="$1" skip=$2 bs=4 count=1 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
+}
+
+get_magic_long_tar() {
+       ( tar xf $1 $2 -O | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2> /dev/null
+}
+
+identify_magic() {
+       local magic=$1
+       case "$magic" in
+               "55424923")
+                       echo "ubi"
+                       ;;
+               "31181006")
+                       echo "ubifs"
+                       ;;
+               "68737173")
+                       echo "squashfs"
+                       ;;
+               "d00dfeed")
+                       echo "fit"
+                       ;;
+               "4349"*)
+                       echo "combined"
+                       ;;
+               *)
+                       echo "unknown $magic"
+                       ;;
+       esac
+}
+
+
+identify() {
+       identify_magic $(nand_get_magic_long "$1" "${2:-0}")
+}
+
+identify_tar() {
+       identify_magic $(get_magic_long_tar "$1" "$2")
+}
+
+nand_restore_config() {
+       sync
+       local ubidev=$( nand_find_ubi $CI_UBIPART )
+       local ubivol="$( nand_find_volume $ubidev rootfs_data )"
+       [ ! "$ubivol" ] &&
+               ubivol="$( nand_find_volume $ubidev rootfs )"
+       mkdir /tmp/new_root
+       if ! mount -t ubifs /dev/$ubivol /tmp/new_root; then
+               echo "mounting ubifs $ubivol failed"
+               rmdir /tmp/new_root
+               return 1
+       fi
+       mv "$1" "/tmp/new_root/sysupgrade.tgz"
+       umount /tmp/new_root
+       sync
+       rmdir /tmp/new_root
+}
+
+nand_upgrade_prepare_ubi() {
+       local rootfs_length="$1"
+       local rootfs_type="$2"
+       local has_kernel="${3:-0}"
+       local has_env="${4:-0}"
+
+       local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
+       if [ ! "$mtdnum" ]; then
+               echo "cannot find ubi mtd partition $CI_UBIPART"
+               return 1
+       fi
+
+       local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+       if [ ! "$ubidev" ]; then
+               ubiattach -m "$mtdnum"
+               sync
+               ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+       fi
+
+       if [ ! "$ubidev" ]; then
+               ubiformat /dev/mtd$mtdnum -y
+               ubiattach -m "$mtdnum"
+               sync
+               ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+               [ "$has_env" -gt 0 ] && {
+                       ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB
+                       ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB
+               }
+       fi
+
+       local kern_ubivol="$( nand_find_volume $ubidev kernel )"
+       local root_ubivol="$( nand_find_volume $ubidev rootfs )"
+       local data_ubivol="$( nand_find_volume $ubidev rootfs_data )"
+
+       # remove ubiblock device of rootfs
+       local root_ubiblk="ubiblock${root_ubivol:3}"
+       if [ "$root_ubivol" -a -e "/dev/$root_ubiblk" ]; then
+               echo "removing $root_ubiblk"
+               if ! ubiblock -r /dev/$root_ubivol; then
+                       echo "cannot remove $root_ubiblk"
+                       return 1;
+               fi
+       fi
+
+       # kill volumes
+       [ "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N kernel || true
+       [ "$root_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs || true
+       [ "$data_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs_data || true
+
+       # update kernel
+       if [ "$has_kernel" = "1" ]; then
+               if ! ubimkvol /dev/$ubidev -N kernel -s $kernel_length; then
+                       echo "cannot create kernel volume"
+                       return 1;
+               fi
+       fi
+
+       # update rootfs
+       local root_size_param
+       if [ "$rootfs_type" = "ubifs" ]; then
+               root_size_param="-m"
+       else
+               root_size_param="-s $rootfs_length"
+       fi
+       if ! ubimkvol /dev/$ubidev -N rootfs $root_size_param; then
+               echo "cannot create rootfs volume"
+               return 1;
+       fi
+
+       # create rootfs_data for non-ubifs rootfs
+       if [ "$rootfs_type" != "ubifs" ]; then
+               if ! ubimkvol /dev/$ubidev -N rootfs_data -m; then
+                       echo "cannot initialize rootfs_data volume"
+                       return 1
+               fi
+       fi
+       sync
+       return 0
+}
+
+nand_do_upgrade_success() {
+       local conf_tar="/tmp/sysupgrade.tgz"
+
+       sync
+       [ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
+       echo "sysupgrade successful"
+       umount -a
+       reboot -f
+}
+
+# Flash the UBI image to MTD partition
+nand_upgrade_ubinized() {
+       local ubi_file="$1"
+       local mtdnum="$(find_mtd_index "$CI_UBIPART")"
+
+       [ ! "$mtdnum" ] && {
+               CI_UBIPART="rootfs"
+               mtdnum="$(find_mtd_index "$CI_UBIPART")"
+       }
+
+       if [ ! "$mtdnum" ]; then
+               echo "cannot find mtd device $CI_UBIPART"
+               umount -a
+               reboot -f
+       fi
+
+       local mtddev="/dev/mtd${mtdnum}"
+       ubidetach -p "${mtddev}" || true
+       sync
+       ubiformat "${mtddev}" -y -f "${ubi_file}"
+       ubiattach -p "${mtddev}"
+       nand_do_upgrade_success
+}
+
+# Write the UBIFS image to UBI volume
+nand_upgrade_ubifs() {
+       local rootfs_length=`(cat $1 | wc -c) 2> /dev/null`
+
+       nand_upgrade_prepare_ubi "$rootfs_length" "ubifs" "0" "0"
+
+       local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+       local root_ubivol="$(nand_find_volume $ubidev rootfs)"
+       ubiupdatevol /dev/$root_ubivol -s $rootfs_length $1
+
+       nand_do_upgrade_success
+}
+
+nand_board_name() {
+       if type 'platform_nand_board_name' >/dev/null 2>/dev/null; then
+               platform_nand_board_name
+               return
+       fi
+
+       cat /tmp/sysinfo/board_name
+}
+
+nand_upgrade_tar() {
+       local tar_file="$1"
+       local board_name="$(nand_board_name)"
+       local kernel_mtd="$(find_mtd_index $CI_KERNPART)"
+
+       local kernel_length=`(tar xf $tar_file sysupgrade-$board_name/kernel -O | wc -c) 2> /dev/null`
+       local rootfs_length=`(tar xf $tar_file sysupgrade-$board_name/root -O | wc -c) 2> /dev/null`
+
+       local rootfs_type="$(identify_tar "$tar_file" sysupgrade-$board_name/root)"
+
+       local has_kernel=1
+       local has_env=0
+
+       [ "$kernel_length" != 0 -a -n "$kernel_mtd" ] && {
+               tar xf $tar_file sysupgrade-$board_name/kernel -O | mtd write - $CI_KERNPART
+       }
+       [ "$kernel_length" = 0 -o ! -z "$kernel_mtd" ] && has_kernel=0
+
+       nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "$has_kernel" "$has_env"
+
+       local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+       [ "$has_kernel" = "1" ] && {
+               local kern_ubivol="$(nand_find_volume $ubidev kernel)"
+               tar xf $tar_file sysupgrade-$board_name/kernel -O | \
+                       ubiupdatevol /dev/$kern_ubivol -s $kernel_length -
+       }
+
+       local root_ubivol="$(nand_find_volume $ubidev rootfs)"
+       tar xf $tar_file sysupgrade-$board_name/root -O | \
+               ubiupdatevol /dev/$root_ubivol -s $rootfs_length -
+
+       nand_do_upgrade_success
+}
+
+# Recognize type of passed file and start the upgrade process
+nand_do_upgrade_stage2() {
+       local file_type=$(identify $1)
+
+       if type 'platform_nand_pre_upgrade' >/dev/null 2>/dev/null; then
+               platform_nand_pre_upgrade "$1"
+       fi
+
+       [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART="rootfs"
+
+       case "$file_type" in
+               "ubi")          nand_upgrade_ubinized $1;;
+               "ubifs")        nand_upgrade_ubifs $1;;
+               *)              nand_upgrade_tar $1;;
+       esac
+}
+
+nand_upgrade_stage2() {
+       [ $1 = "nand" ] && {
+               [ -f "$2" ] && {
+                       touch /tmp/sysupgrade
+
+                       killall -9 telnetd
+                       killall -9 dropbear
+                       killall -9 ash
+
+                       kill_remaining TERM
+                       sleep 3
+                       kill_remaining KILL
+
+                       sleep 1
+
+                       if [ -n "$(rootfs_type)" ]; then
+                               v "Switching to ramdisk..."
+                               run_ramfs ". /lib/functions.sh; include /lib/upgrade; nand_do_upgrade_stage2 $2"
+                       else
+                               nand_do_upgrade_stage2 $2
+                       fi
+                       return 0
+               }
+               echo "Nand upgrade failed"
+               exit 1
+       }
+}
+
+nand_upgrade_stage1() {
+       [ -f /tmp/sysupgrade-nand-path ] && {
+               path="$(cat /tmp/sysupgrade-nand-path)"
+               [ "$SAVE_CONFIG" != 1 -a -f "$CONF_TAR" ] &&
+                       rm $CONF_TAR
+
+               ubus call system nandupgrade "{\"prefix\": \"$RAM_ROOT\", \"path\": \"$path\" }"
+               exit 0
+       }
+}
+
+# Check if passed file is a valid one for NAND sysupgrade. Currently it accepts
+# 3 types of files:
+# 1) UBI - should contain an ubinized image, header is checked for the proper
+#    MAGIC
+# 2) UBIFS - should contain UBIFS partition that will replace "rootfs" volume,
+#    header is checked for the proper MAGIC
+# 3) TAR - archive has to include "sysupgrade-BOARD" directory with a non-empty
+#    "CONTROL" file (at this point its content isn't verified)
+#
+# You usually want to call this function in platform_check_image.
+#
+# $(1): board name, used in case of passing TAR file
+# $(2): file to be checked
+nand_do_platform_check() {
+       local board_name="$1"
+       local tar_file="$2"
+       local control_length=`(tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null`
+       local file_type="$(identify $2)"
+
+       [ "$control_length" = 0 -a "$file_type" != "ubi" -a "$file_type" != "ubifs" ] && {
+               echo "Invalid sysupgrade file."
+               return 1
+       }
+
+       return 0
+}
+
+# Start NAND upgrade process
+#
+# $(1): file to be used for upgrade
+nand_do_upgrade() {
+       echo -n $1 > /tmp/sysupgrade-nand-path
+       install_bin /sbin/upgraded
+       ln -s "$RAM_ROOT"/sbin/upgraded /tmp/upgraded
+       nand_upgrade_stage1
+}
index 805583143fa865d9ffb38355f10ad300e222400e..775b9a64e172b250b3ba27e71fbf07aff46ede14 100644 (file)
@@ -22,11 +22,9 @@ PKG_LICENSE_FILES:=
 
 PKG_MAINTAINER:=John Crispin <john@phrozen.org>
 
-PKG_FLAGS:=nonshared
-
 PKG_CONFIG_DEPENDS:= \
        CONFIG_TARGET_INIT_PATH CONFIG_KERNEL_SECCOMP \
-       CONFIG_NAND_SUPPORT CONFIG_PROCD_SHOW_BOOT CONFIG_PROCD_ZRAM_TMPFS \
+       CONFIG_PROCD_SHOW_BOOT CONFIG_PROCD_ZRAM_TMPFS \
        CONFIG_KERNEL_NAMESPACES CONFIG_PACKAGE_procd-ujail CONFIG_PACKAGE_procd-seccomp
 
 include $(INCLUDE_DIR)/package.mk
@@ -42,7 +40,7 @@ TARGET_LDFLAGS += $(if $(CONFIG_USE_GLIBC),-lrt)
 define Package/procd
   SECTION:=base
   CATEGORY:=Base system
-  DEPENDS:=+ubusd +ubus +libjson-script +ubox +USE_GLIBC:librt +libubox +libubus +NAND_SUPPORT:procd-nand
+  DEPENDS:=+ubusd +ubus +libjson-script +ubox +USE_GLIBC:librt +libubox +libubus
   TITLE:=OpenWrt system process manager
 endef
 
@@ -60,20 +58,6 @@ define Package/procd-seccomp
   TITLE:=OpenWrt process seccomp helper + utrace
 endef
 
-define Package/procd-nand
-  SECTION:=utils
-  CATEGORY:=Utilities
-  DEPENDS:=@NAND_SUPPORT +ubi-utils
-  TITLE:=OpenWrt sysupgrade nand helper
-endef
-
-define Package/procd-nand-firstboot
-  SECTION:=utils
-  CATEGORY:=Utilities
-  DEPENDS:=procd-nand
-  TITLE:=OpenWrt firstboot nand helper
-endef
-
 define Package/procd/config
 menu "Configuration"
        depends on PACKAGE_procd
@@ -91,10 +75,6 @@ endmenu
 endef
 
 
-ifeq ($(CONFIG_NAND_SUPPORT),y)
-  CMAKE_OPTIONS += -DBUILD_UPGRADED=1
-endif
-
 ifeq ($(CONFIG_PROCD_SHOW_BOOT),y)
   CMAKE_OPTIONS += -DSHOW_BOOT_ON_CONSOLE=1
 endif
@@ -114,7 +94,7 @@ endif
 define Package/procd/install
        $(INSTALL_DIR) $(1)/sbin $(1)/etc $(1)/lib/functions
 
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{init,procd,askfirst,udevtrigger} $(1)/sbin/
+       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{init,procd,askfirst,udevtrigger,upgraded} $(1)/sbin/
        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libsetlbf.so $(1)/lib
        $(INSTALL_BIN) ./files/reload_config $(1)/sbin/
        $(INSTALL_DATA) ./files/hotplug*.json $(1)/etc/
@@ -133,21 +113,6 @@ define Package/procd-seccomp/install
        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libpreload-trace.so $(1)/lib
 endef
 
-define Package/procd-nand/install
-       $(INSTALL_DIR) $(1)/sbin $(1)/lib/upgrade
-
-       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/upgraded $(1)/sbin/
-       $(INSTALL_DATA) ./files/nand.sh $(1)/lib/upgrade/
-endef
-
-define Package/procd-nand-firstboot/install
-       $(INSTALL_DIR) $(1)/lib/preinit
-
-       $(INSTALL_DATA) ./files/nand-preinit.sh $(1)/lib/preinit/60-nand-firstboot.sh
-endef
-
 $(eval $(call BuildPackage,procd))
 $(eval $(call BuildPackage,procd-ujail))
 $(eval $(call BuildPackage,procd-seccomp))
-$(eval $(call BuildPackage,procd-nand))
-$(eval $(call BuildPackage,procd-nand-firstboot))
diff --git a/package/system/procd/files/nand-preinit.sh b/package/system/procd/files/nand-preinit.sh
deleted file mode 100644 (file)
index cf59624..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-# Copyright (C) 2014 OpenWrt.org
-
-nand_takeover() {
-       . /lib/upgrade/nand.sh
-       mtd=$(find_mtd_index "$CI_UBIPART")
-       esize=$(cat /proc/mtd | grep mtd$mtd |cut -d" " -f 3)
-       [ -z "$esize" ] && return 1
-       esize=$(printf "%d" 0x$esize)
-       for a in `seq 0 64`; do
-               mtd -o $((a * esize)) -l 400 dump /dev/mtd$mtd > /tmp/takeover.hdr
-               MAGIC=$(dd if=/tmp/takeover.hdr bs=1 skip=261 count=5 2> /dev/null)
-               SIZE=$(printf "%d" 0x$(dd if=/tmp/takeover.hdr bs=4 count=1 2> /dev/null | hexdump -v -n 4 -e '1/1 "%02x"'))
-               [ "$MAGIC" = "ustar" ] && {
-                       mtd -o $((a * esize)) -l $((SIZE + 4)) dump /dev/mtd$mtd | dd bs=1 skip=4 of=/tmp/sysupgrade.tar
-                       nand_do_upgrade_stage2 /tmp/sysupgrade.tar
-               }
-       done
-}
-
-boot_hook_add initramfs nand_takeover
diff --git a/package/system/procd/files/nand.sh b/package/system/procd/files/nand.sh
deleted file mode 100644 (file)
index 9c831df..0000000
+++ /dev/null
@@ -1,376 +0,0 @@
-#!/bin/sh
-# Copyright (C) 2014 OpenWrt.org
-#
-
-. /lib/functions.sh
-
-# 'kernel' partition on NAND contains the kernel
-CI_KERNPART="${CI_KERNPART:-kernel}"
-
-# 'ubi' partition on NAND contains UBI
-CI_UBIPART="${CI_UBIPART:-ubi}"
-
-ubi_mknod() {
-       local dir="$1"
-       local dev="/dev/$(basename $dir)"
-
-       [ -e "$dev" ] && return 0
-
-       local devid="$(cat $dir/dev)"
-       local major="${devid%%:*}"
-       local minor="${devid##*:}"
-       mknod "$dev" c $major $minor
-}
-
-nand_find_volume() {
-       local ubidevdir ubivoldir
-       ubidevdir="/sys/devices/virtual/ubi/$1"
-       [ ! -d "$ubidevdir" ] && return 1
-       for ubivoldir in $ubidevdir/${1}_*; do
-               [ ! -d "$ubivoldir" ] && continue
-               if [ "$( cat $ubivoldir/name )" = "$2" ]; then
-                       basename $ubivoldir
-                       ubi_mknod "$ubivoldir"
-                       return 0
-               fi
-       done
-}
-
-nand_find_ubi() {
-       local ubidevdir ubidev mtdnum
-       mtdnum="$( find_mtd_index $1 )"
-       [ ! "$mtdnum" ] && return 1
-       for ubidevdir in /sys/devices/virtual/ubi/ubi*; do
-               [ ! -d "$ubidevdir" ] && continue
-               cmtdnum="$( cat $ubidevdir/mtd_num )"
-               [ ! "$mtdnum" ] && continue
-               if [ "$mtdnum" = "$cmtdnum" ]; then
-                       ubidev=$( basename $ubidevdir )
-                       ubi_mknod "$ubidevdir"
-                       echo $ubidev
-                       return 0
-               fi
-       done
-}
-
-nand_get_magic_long() {
-       dd if="$1" skip=$2 bs=4 count=1 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
-}
-
-get_magic_long_tar() {
-       ( tar xf $1 $2 -O | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2> /dev/null
-}
-
-identify_magic() {
-       local magic=$1
-       case "$magic" in
-               "55424923")
-                       echo "ubi"
-                       ;;
-               "31181006")
-                       echo "ubifs"
-                       ;;
-               "68737173")
-                       echo "squashfs"
-                       ;;
-               "d00dfeed")
-                       echo "fit"
-                       ;;
-               "4349"*)
-                       echo "combined"
-                       ;;
-               *)
-                       echo "unknown $magic"
-                       ;;
-       esac
-}
-
-
-identify() {
-       identify_magic $(nand_get_magic_long "$1" "${2:-0}")
-}
-
-identify_tar() {
-       identify_magic $(get_magic_long_tar "$1" "$2")
-}
-
-nand_restore_config() {
-       sync
-       local ubidev=$( nand_find_ubi $CI_UBIPART )
-       local ubivol="$( nand_find_volume $ubidev rootfs_data )"
-       [ ! "$ubivol" ] &&
-               ubivol="$( nand_find_volume $ubidev rootfs )"
-       mkdir /tmp/new_root
-       if ! mount -t ubifs /dev/$ubivol /tmp/new_root; then
-               echo "mounting ubifs $ubivol failed"
-               rmdir /tmp/new_root
-               return 1
-       fi
-       mv "$1" "/tmp/new_root/sysupgrade.tgz"
-       umount /tmp/new_root
-       sync
-       rmdir /tmp/new_root
-}
-
-nand_upgrade_prepare_ubi() {
-       local rootfs_length="$1"
-       local rootfs_type="$2"
-       local has_kernel="${3:-0}"
-       local has_env="${4:-0}"
-
-       local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
-       if [ ! "$mtdnum" ]; then
-               echo "cannot find ubi mtd partition $CI_UBIPART"
-               return 1
-       fi
-
-       local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
-       if [ ! "$ubidev" ]; then
-               ubiattach -m "$mtdnum"
-               sync
-               ubidev="$( nand_find_ubi "$CI_UBIPART" )"
-       fi
-
-       if [ ! "$ubidev" ]; then
-               ubiformat /dev/mtd$mtdnum -y
-               ubiattach -m "$mtdnum"
-               sync
-               ubidev="$( nand_find_ubi "$CI_UBIPART" )"
-               [ "$has_env" -gt 0 ] && {
-                       ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB
-                       ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB
-               }
-       fi
-
-       local kern_ubivol="$( nand_find_volume $ubidev kernel )"
-       local root_ubivol="$( nand_find_volume $ubidev rootfs )"
-       local data_ubivol="$( nand_find_volume $ubidev rootfs_data )"
-
-       # remove ubiblock device of rootfs
-       local root_ubiblk="ubiblock${root_ubivol:3}"
-       if [ "$root_ubivol" -a -e "/dev/$root_ubiblk" ]; then
-               echo "removing $root_ubiblk"
-               if ! ubiblock -r /dev/$root_ubivol; then
-                       echo "cannot remove $root_ubiblk"
-                       return 1;
-               fi
-       fi
-
-       # kill volumes
-       [ "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N kernel || true
-       [ "$root_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs || true
-       [ "$data_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs_data || true
-
-       # update kernel
-       if [ "$has_kernel" = "1" ]; then
-               if ! ubimkvol /dev/$ubidev -N kernel -s $kernel_length; then
-                       echo "cannot create kernel volume"
-                       return 1;
-               fi
-       fi
-
-       # update rootfs
-       local root_size_param
-       if [ "$rootfs_type" = "ubifs" ]; then
-               root_size_param="-m"
-       else
-               root_size_param="-s $rootfs_length"
-       fi
-       if ! ubimkvol /dev/$ubidev -N rootfs $root_size_param; then
-               echo "cannot create rootfs volume"
-               return 1;
-       fi
-
-       # create rootfs_data for non-ubifs rootfs
-       if [ "$rootfs_type" != "ubifs" ]; then
-               if ! ubimkvol /dev/$ubidev -N rootfs_data -m; then
-                       echo "cannot initialize rootfs_data volume"
-                       return 1
-               fi
-       fi
-       sync
-       return 0
-}
-
-nand_do_upgrade_success() {
-       local conf_tar="/tmp/sysupgrade.tgz"
-
-       sync
-       [ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
-       echo "sysupgrade successful"
-       umount -a
-       reboot -f
-}
-
-# Flash the UBI image to MTD partition
-nand_upgrade_ubinized() {
-       local ubi_file="$1"
-       local mtdnum="$(find_mtd_index "$CI_UBIPART")"
-
-       [ ! "$mtdnum" ] && {
-               CI_UBIPART="rootfs"
-               mtdnum="$(find_mtd_index "$CI_UBIPART")"
-       }
-
-       if [ ! "$mtdnum" ]; then
-               echo "cannot find mtd device $CI_UBIPART"
-               umount -a
-               reboot -f
-       fi
-
-       local mtddev="/dev/mtd${mtdnum}"
-       ubidetach -p "${mtddev}" || true
-       sync
-       ubiformat "${mtddev}" -y -f "${ubi_file}"
-       ubiattach -p "${mtddev}"
-       nand_do_upgrade_success
-}
-
-# Write the UBIFS image to UBI volume
-nand_upgrade_ubifs() {
-       local rootfs_length=`(cat $1 | wc -c) 2> /dev/null`
-
-       nand_upgrade_prepare_ubi "$rootfs_length" "ubifs" "0" "0"
-
-       local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
-       local root_ubivol="$(nand_find_volume $ubidev rootfs)"
-       ubiupdatevol /dev/$root_ubivol -s $rootfs_length $1
-
-       nand_do_upgrade_success
-}
-
-nand_board_name() {
-       if type 'platform_nand_board_name' >/dev/null 2>/dev/null; then
-               platform_nand_board_name
-               return
-       fi
-
-       cat /tmp/sysinfo/board_name
-}
-
-nand_upgrade_tar() {
-       local tar_file="$1"
-       local board_name="$(nand_board_name)"
-       local kernel_mtd="$(find_mtd_index $CI_KERNPART)"
-
-       local kernel_length=`(tar xf $tar_file sysupgrade-$board_name/kernel -O | wc -c) 2> /dev/null`
-       local rootfs_length=`(tar xf $tar_file sysupgrade-$board_name/root -O | wc -c) 2> /dev/null`
-
-       local rootfs_type="$(identify_tar "$tar_file" sysupgrade-$board_name/root)"
-
-       local has_kernel=1
-       local has_env=0
-
-       [ "$kernel_length" != 0 -a -n "$kernel_mtd" ] && {
-               tar xf $tar_file sysupgrade-$board_name/kernel -O | mtd write - $CI_KERNPART
-       }
-       [ "$kernel_length" = 0 -o ! -z "$kernel_mtd" ] && has_kernel=0
-
-       nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "$has_kernel" "$has_env"
-
-       local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
-       [ "$has_kernel" = "1" ] && {
-               local kern_ubivol="$(nand_find_volume $ubidev kernel)"
-               tar xf $tar_file sysupgrade-$board_name/kernel -O | \
-                       ubiupdatevol /dev/$kern_ubivol -s $kernel_length -
-       }
-
-       local root_ubivol="$(nand_find_volume $ubidev rootfs)"
-       tar xf $tar_file sysupgrade-$board_name/root -O | \
-               ubiupdatevol /dev/$root_ubivol -s $rootfs_length -
-
-       nand_do_upgrade_success
-}
-
-# Recognize type of passed file and start the upgrade process
-nand_do_upgrade_stage2() {
-       local file_type=$(identify $1)
-
-       if type 'platform_nand_pre_upgrade' >/dev/null 2>/dev/null; then
-               platform_nand_pre_upgrade "$1"
-       fi
-
-       [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART="rootfs"
-
-       case "$file_type" in
-               "ubi")          nand_upgrade_ubinized $1;;
-               "ubifs")        nand_upgrade_ubifs $1;;
-               *)              nand_upgrade_tar $1;;
-       esac
-}
-
-nand_upgrade_stage2() {
-       [ $1 = "nand" ] && {
-               [ -f "$2" ] && {
-                       touch /tmp/sysupgrade
-
-                       killall -9 telnetd
-                       killall -9 dropbear
-                       killall -9 ash
-
-                       kill_remaining TERM
-                       sleep 3
-                       kill_remaining KILL
-
-                       sleep 1
-
-                       if [ -n "$(rootfs_type)" ]; then
-                               v "Switching to ramdisk..."
-                               run_ramfs ". /lib/functions.sh; include /lib/upgrade; nand_do_upgrade_stage2 $2"
-                       else
-                               nand_do_upgrade_stage2 $2
-                       fi
-                       return 0
-               }
-               echo "Nand upgrade failed"
-               exit 1
-       }
-}
-
-nand_upgrade_stage1() {
-       [ -f /tmp/sysupgrade-nand-path ] && {
-               path="$(cat /tmp/sysupgrade-nand-path)"
-               [ "$SAVE_CONFIG" != 1 -a -f "$CONF_TAR" ] &&
-                       rm $CONF_TAR
-
-               ubus call system nandupgrade "{\"prefix\": \"$RAM_ROOT\", \"path\": \"$path\" }"
-               exit 0
-       }
-}
-
-# Check if passed file is a valid one for NAND sysupgrade. Currently it accepts
-# 3 types of files:
-# 1) UBI - should contain an ubinized image, header is checked for the proper
-#    MAGIC
-# 2) UBIFS - should contain UBIFS partition that will replace "rootfs" volume,
-#    header is checked for the proper MAGIC
-# 3) TAR - archive has to include "sysupgrade-BOARD" directory with a non-empty
-#    "CONTROL" file (at this point its content isn't verified)
-#
-# You usually want to call this function in platform_check_image.
-#
-# $(1): board name, used in case of passing TAR file
-# $(2): file to be checked
-nand_do_platform_check() {
-       local board_name="$1"
-       local tar_file="$2"
-       local control_length=`(tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null`
-       local file_type="$(identify $2)"
-
-       [ "$control_length" = 0 -a "$file_type" != "ubi" -a "$file_type" != "ubifs" ] && {
-               echo "Invalid sysupgrade file."
-               return 1
-       }
-
-       return 0
-}
-
-# Start NAND upgrade process
-#
-# $(1): file to be used for upgrade
-nand_do_upgrade() {
-       echo -n $1 > /tmp/sysupgrade-nand-path
-       install_bin /sbin/upgraded
-       ln -s "$RAM_ROOT"/sbin/upgraded /tmp/upgraded
-       nand_upgrade_stage1
-}