#!/bin/ash
#
# install_fw:
# This script performs the fw installation for the RLM.
# Usage: install_fw <dest_partition> <install_type> <force option>
#        <dest_partition> = partition in which fw is going to be installed
#                           can be "primary" or "backup"
#        <install_type>   = eth (for ethernet based update) or sp (via ONTAP) 
#        <force option>   = -f to force flash burn, none otherwise
# 
# Kiran Kamity, 09/20/2004
#
# Return Values:
#     101 = Invalid arguments
#     102 = Error Flashing u-boot
#     103 = Error Flashing linux
#     104 = Error Flashing JFFS2
#     105 = Metadata info not present in new package
#     106 = Metadata Info not present in primary
#     107 = Metadata Info not present in backup
#     108 = Missing u-boot.bin in new package
#     109 = Missing vmlinux.UBoot in new package
#     110 = Error Flashing JFFS2 image
#     111 = Missing jffs2_rootfs.img in new package
#     113 = u-boot Checksum Failure
#     114 = Linux Checksum Failure
#     115 = ROOTFS File Checksum Failure
#     116 = Missing jffs2.img in new package
#     117 = Error Flashing JFFS2 logs image
#     118 = File couldn't be copied. Possible mount problems
#     119 = Corrupt primary detected. 
#     120 = Miscellaneous Error
#

FW_SETENV=/usr/local/bin/fw_setenv
FW_PRINTENV=/usr/local/bin/fw_printenv

ETH_FW_PACKAGE_DIR=/tmp/fud_eth/RLM_FW
SP_FW_PACKAGE_DIR=/tmp/ORFTP/fud_sp

PRIMARY=/etc/rlm_install/primary
BACKUP=/etc/rlm_install/backup

UBOOT_VERSION_STRING=u-boot_version=
UBOOT_CHECKSUM_STRING=u-boot_checksum=
LINUX_VERSION_STRING=linux_version=
LINUX_CHECKSUM_STRING=linux_checksum=

PRIMARY_ROOTFS=/mnt/jffs2_rootfs_primary;
BACKUP_ROOTFS=/mnt/jffs2_rootfs_backup;
JFFS2_LOGS_MOUNT=/mnt/logs;

# Remount_Rootfs():
# Remounts the primary and backup root-filesystems after install.
# 
# No arguments
#
Remount_Rootfs() {
    echo "Remounting primary rootfs";
    mount -o remount,rw -t jffs2 $PRIMARY_ROOTFS_PARTITION $PRIMARY_ROOTFS
    
    echo "Remounting backup rootfs";
    mount -o remount,rw -t jffs2 $BACKUP_ROOTFS_PARTITION $BACKUP_ROOTFS

    echo "Remounting JFFS2 logs";
    mount -o remount,rw -t jffs2 $JFFS2_LOGS_BLOCK_PARTITION $JFFS2_LOGS_MOUNT
}

# Umount_all():
# Unmounts the primary, backup and logs root-filesystems.
# 
# No arguments
#
Umount_all() {
    echo "Unmounting primary rootfs";
    umount -f $PRIMARY_ROOTFS
    
    echo "Unmounting backup rootfs";
    umount -f $BACKUP_ROOTFS

    echo "Unmounting JFFS2 logs";
    umount -f $JFFS2_LOGS_MOUNT;
}

# Mount_all():
# Mounts the primary, backup and logs root-filesystems.
# 
# No arguments
#
Mount_all() {
    echo "Mounting primary rootfs";
    mount -t jffs2 $PRIMARY_ROOTFS_BLOCK_PARTITION $PRIMARY_ROOTFS
    
    echo "Mounting backup rootfs";
    mount -t jffs2 $BACKUP_ROOTFS_BLOCK_PARTITION $BACKUP_ROOTFS

    echo "Mounting JFFS2 logs";
    mount -t jffs2 $JFFS2_LOGS_BLOCK_PARTITION $JFFS2_LOGS_MOUNT
}

# Force_Burn():
# $1 = u-boot source location
# $2 = u-boot dest location
# $3 = linux source location
# $4 = linux dest location
# $5 = Root FS image source location
# $6 = Root FS image dest location
#

Force_Burn() {
    eraseall $2;
    dd if=$1 of=$2 bs=8192;
    if ! [ $? = 0 ] ; then
	echo "ERROR Flashing u-boot";
	exit 102;
    fi
    
    eraseall $4;
    dd if=$3 of=$4 bs=8192;
    if ! [ $? = 0 ] ; then
	echo "ERROR Flashing Linux";
	exit 103;
    fi

    eraseall $6;
    dd if=$5 of=$6 bs=8192;
    if ! [ $? = 0 ] ; then
	echo "ERROR Flashing JFFS2 image";
	exit 110;
    fi
}    

# Burn_fw():
# $1 = Source package
# $2 = Destination 
# $3 = u-boot source location
# $4 = u-boot dest location
# $5 = linux source location
# $6 = linux dest location
# $7 = Root FS source location
# $8 = Root FS dest location
#

Burn_fw() {

#    echo "Burn_fw $1 $2 $3 $4 $5 $6 $7 $8";
date;
    Burn_uboot $1 $2 $3 $4;
date;
    Burn_linux $1 $2 $5 $6;
date;
    Burn_jffs2_rootfs $1 $2 $7 $8;
date;

}

#
# Burn_uboot():
# Routine that burns uboot into the dest partition if necessary
# 
# Args:
#     $1 = Source package
#     $2 = Destination
#     $3 = u-boot source
#     $4 = u-boot dest
#
Burn_uboot() {

echo "Installing Boot Loader..."

# Check if u-boot has changed, dd it if necessary, verify checksums
    UBOOT_NEW=`grep $UBOOT_VERSION_STRING $1/Metadata | sed -e "s/$UBOOT_VERSION_STRING//g"`;
    UBOOT_CURR=`grep $UBOOT_VERSION_STRING $2/Metadata | sed -e "s/\$UBOOT_VERSION_STRING//g"`;
    
#echo $UBOOT_NEW;
#echo $UBOOT_CURR;
    
    if [ "$UBOOT_NEW" = "$UBOOT_CURR" ] ; then
	echo "u-boot version unchanged.";
    else
	echo "Flashing u-boot version..." $UBOOT_NEW;

	if [ "$2" = "$PRIMARY" ] ; then
	    if ! [ -f $3 ] ; then
		echo "ERROR: Missing u-boot.bin in $NEW_PACKAGE/u-boot";
		exit 108;
	    fi
	fi

	eraseall $4 > /dev/null 2>&1;
	dd if=$3 of=$4 bs=8192 > /dev/null 2>&1;

	if [ $? = 0 ] ; then
	    echo "Flashing u-boot complete, verifying checksum..."
# Verifying u-boot checksum
      	    UBOOT_CHECKSUM_CURR=`grep $UBOOT_CHECKSUM_STRING $1/Metadata | sed -e "s/\$UBOOT_CHECKSUM_STRING//g"`;
	    echo $UBOOT_CHECKSUM_CURR $4;
	    UBOOT_CHECKSUM_NEW=`md5sum $4`;
	    echo $UBOOT_CHECKSUM_NEW;
	    
	    if ! [ "$UBOOT_CHECKSUM_CURR $4" = "$UBOOT_CHECKSUM_NEW" ] ; then
		echo "u-boot Checksum Failure";
		exit 113;
	    else
		echo "u-boot Checksum Verified";
	    fi
	    
	else 
	    echo "ERROR Flashing u-boot";
	    exit 102;
	fi
    fi
}

#
# Burn_linux():
# Burns linux into the dest partition if necessary
# 
# Args:
#     $1 = Source package
#     $2 = Destination
#     $3 = linux source
#     $4 = linux dest
#
Burn_linux() {

echo "Installing OS..."

# echo "Burn_linux $1 $2 $3 $4";

# Check if linux has changed, dd it if necessary, verify checksums
    LINUX_NEW=`grep $LINUX_VERSION_STRING $1/Metadata | sed -e "s/$LINUX_VERSION_STRING//g"`;
    LINUX_CURR=`grep $LINUX_VERSION_STRING $2/Metadata | sed -e "s/\$LINUX_VERSION_STRING//g"`;
    
#    echo $LINUX_NEW;
#    echo $LINUX_CURR;
    
    if [ "$LINUX_NEW" = "$LINUX_CURR" ] ; then
	echo "linux version unchanged.";
    else
	echo "Flashing linux version" $LINUX_NEW;
	
	if [ "$2" = "$PRIMARY" ] ; then
	    if ! [ -f $3 ] ; then
		echo "ERROR: Missing vmlinux.UBoot in $NEW_PACKAGE/linux";
		exit 109;
	    fi
	fi

	eraseall $4 > /dev/null 2>&1;
	dd if=$3 of=$4 bs=8192 > /dev/null 2>&1;
	
	if [ $? = 0 ] ; then
	    echo "Flashing linux complete, verifying checksum..."
# Verifying linux checksum
      	    LINUX_CHECKSUM_CURR=`grep $LINUX_CHECKSUM_STRING $1/Metadata | sed -e "s/\$LINUX_CHECKSUM_STRING//g"`;
	    echo $LINUX_CHECKSUM_CURR $4;
	    LINUX_CHECKSUM_NEW=`md5sum $4`;
	    echo $LINUX_CHECKSUM_NEW;

	    if ! [ "$LINUX_CHECKSUM_CURR $4" = "$LINUX_CHECKSUM_NEW" ] ; then
		echo "Linux Checksum Failure";
		exit 114;
	    else
		echo "Linux Checksum Verified";
	    fi
	else 
	    echo "ERROR Flashing linux";
	    exit 103;
	fi
    fi
    
}

#
# Burn_jffs2_rootfs():
# Burns the JFFS2 root FS files into the dest partition
# 
# Args:
#     $1 = Source package
#     $2 = Destination
#     $3 = Root FS source location
#     $4 = Root FS dest location
#

Burn_jffs2_rootfs() {

    echo "Installing Applications...";
    
# echo "Burn_jffs2_rootfs $1 $2 $3 $4";
# And run post-install script
    
    if [ "$2" = "$PRIMARY" ] ; then
	Differential_file_update $PRIMARY_REGFILES_ADD $PRIMARY_SYMLINKS_ADD \
	    $PRIMARY_REGFILES_DEL $PRIMARY_SYMLINKS_DEL $3 $4 \
	    $NEW_PACKAGE/install/checksum.regfiles;
	
	chmod 755 $PRIMARY_POST_INSTALL_SCRIPT;
	if ! [ $? = 0 ] ; then
	    echo "Unable to change permissions for $PRIMARY_POST_INSTALL_SCRIPT";
	    exit 120;
	fi
	
	$PRIMARY_POST_INSTALL_SCRIPT $4;
	if ! [ $? = 0 ] ; then
	    echo "Error executing $PRIMARY_POST_INSTALL_SCRIPT";
	    exit 120;
	fi

    elif [ "$2" = "$BACKUP" ] ; then
	Differential_file_update $BACKUP_REGFILES_ADD $BACKUP_SYMLINKS_ADD \
	    $BACKUP_REGFILES_DEL $BACKUP_SYMLINKS_DEL $3 $4 \
	    $PRIMARY/checksum.regfiles;

	chmod 755 $BACKUP_POST_INSTALL_SCRIPT;
	if ! [ $? = 0 ] ; then
	    echo "Unable to change permissions for $BACKUP_POST_INSTALL_SCRIPT";
	    exit 120;
	fi

	$BACKUP_POST_INSTALL_SCRIPT $4;
	if ! [ $? = 0 ] ; then
	    echo "Error executing $BACKUP_POST_INSTALL_SCRIPT";
	    exit 120;
	fi
    fi

# cp all metadata information
    echo "Installing New Metadata..."
    rm -f $2/*;
    cp -f $1/* $2/;
    cd $1; for file in *; do
	FILE_CHECKSUM_ORIG=`md5sum $file`;
	FILE_CHECKSUM_CURR=`cd $2; md5sum $file`;
	cd $1;
#	echo $FILE_CHECKSUM_CURR;
#	echo $FILE_CHECKSUM_ORIG;
	if ! [ "$FILE_CHECKSUM_CURR" = "$FILE_CHECKSUM_ORIG" ] ; then
	    echo "File $2/$file Checksum Failure";
	    exit 115;
	fi
    done;
    echo "Metadata installed, Checksums Verified.";
}

#
# Differential_file_update():
# Updates the JFFS2 root FS files with the correct set of files
# 
# Args:
#     $1 = Regular files added/changed
#     $2 = Symlinks added/changed
#     $3 = Regular files removed
#     $4 = Symlinks removed
#     $5 = Root FS source location
#     $6 = Root FS dest location
#     $7 = checksum.regfiles for the files to be installed
#
Differential_file_update() {

# List all differences files
    for i in $1 $2 $3 $4; do
	if [ -f $i ] ; then
            echo $i;
	    echo `cat $i`;
	fi
    done

# rm all deleted files and symlinks
    if [ -f $3 ] ; then
	for fileName in `cat $3`; do
	    rm -f $6$fileName;
	done
    fi
    if [ -f $4 ] ; then
	for fileName in `cat $4`; do
	    rm -f $6$fileName;
	done
    fi

# cp all new and changed files and symlinks, verify checksums
    if [ -f $1 ] ; then
	for fileName in `cat $1`; do

# Is this file a config file, if so copy it to JFFS2 logs.(only for primary)

	    CONFIG_FILE=`echo $fileName | grep "/mnt/logs"`;
	    if [ "$CONFIG_FILE" = "$fileName" ] ; then
		if [ "$1" = "$PRIMARY_REGFILES_ADD" ] ; then
		    NEWDIR=`echo $fileName | sed -e "s/\(.*\)\/\(.*\)/\1/"`;
		    mkdir -p $NEWDIR;
		    rm -f $fileName;
		    cp -dpf $5$fileName $fileName;
		    if ! [ $? = 0 ] ; then
			echo "File $fileName couldn't be copied";
			exit 118;
		    fi
		    
		    FILE_CHECKSUM_CURR=`md5sum $fileName | sed -e "s/\(.*\) \(.*\)/\1/"`;
		    FILE_CHECKSUM_ORIG=`grep " $fileName$" $7`;
		    
		    if ! [ "$FILE_CHECKSUM_CURR $fileName" = "$FILE_CHECKSUM_ORIG" ] ; then
			echo $FILE_CHECKSUM_CURR $fileName;
			echo $FILE_CHECKSUM_ORIG;
			echo "File $fileName Checksum Failure";
			exit 115;
		    fi
		fi
	    else
		NEWDIR=`echo $6$fileName | sed -e "s/\(.*\)\/\(.*\)/\1/"`;
		mkdir -p $NEWDIR;
		rm -f $6$fileName;
		cp -dpf $5$fileName $6$fileName;
		if ! [ $? = 0 ] ; then
		    echo "File $fileName couldn't be copied";
		    exit 118;
		fi

		FILE_CHECKSUM_CURR=`md5sum $6$fileName | sed -e "s/\(.*\) \(.*\)/\1/"`;
		FILE_CHECKSUM_ORIG=`grep " $fileName$" $7`;

		if ! [ "$FILE_CHECKSUM_CURR $fileName" = "$FILE_CHECKSUM_ORIG" ] ; then
		    echo $FILE_CHECKSUM_CURR $fileName;
		    echo $FILE_CHECKSUM_ORIG;
		    echo "File $fileName Checksum Failure";
		    exit 115;
		fi
	    fi
	done
    fi

    if [ -f $2 ] ; then
	COUNT=0;
	for fileName in `cat $2`; do
	    if [ $(($COUNT%2)) -eq 0 ] ; then
		FILENAME=$fileName;
	    else
		rm -f $6$FILENAME;
		ln -sf $fileName $6$FILENAME;
	    fi
	    COUNT=$(($COUNT + 1));
	done
    fi
}

# Verify command line arguments
if [ $# -lt 2 -o $# -gt 3 ] ; then
	echo "Usage: install_fw <dest_partition> <install_type> <force option>";
	exit 101;
fi
if [ $2 = "eth" ] ; then
    NEW_PACKAGE=$ETH_FW_PACKAGE_DIR
    DIFFS_DIR=$ETH_FW_PACKAGE_DIR/differences
    PRIMARY_POST_INSTALL_SCRIPT=$ETH_FW_PACKAGE_DIR/install/post-install-script
    BACKUP_POST_INSTALL_SCRIPT=$PRIMARY_ROOTFS/install/post-install-script

    PRIMARY_REGFILES_ADD=$DIFFS_DIR/add.regfiles.primary
    PRIMARY_REGFILES_DEL=$DIFFS_DIR/del.regfiles.primary
    PRIMARY_SYMLINKS_ADD=$DIFFS_DIR/add.symlinks.primary
    PRIMARY_SYMLINKS_DEL=$DIFFS_DIR/del.symlinks.primary

    BACKUP_REGFILES_ADD=$DIFFS_DIR/add.regfiles.backup
    BACKUP_REGFILES_DEL=$DIFFS_DIR/del.regfiles.backup
    BACKUP_SYMLINKS_ADD=$DIFFS_DIR/add.symlinks.backup
    BACKUP_SYMLINKS_DEL=$DIFFS_DIR/del.symlinks.backup

elif [ $2 = "sp" ] ; then
    NEW_PACKAGE=$SP_FW_PACKAGE_DIR
    DIFFS_DIR=$SP_FW_PACKAGE_DIR/differences
    PRIMARY_POST_INSTALL_SCRIPT=$SP_FW_PACKAGE_DIR/install/post-install-script
    BACKUP_POST_INSTALL_SCRIPT=$PRIMARY_ROOTFS/install/post-install-script

    PRIMARY_REGFILES_ADD=$DIFFS_DIR/add.regfiles.primary
    PRIMARY_REGFILES_DEL=$DIFFS_DIR/del.regfiles.primary
    PRIMARY_SYMLINKS_ADD=$DIFFS_DIR/add.symlinks.primary
    PRIMARY_SYMLINKS_DEL=$DIFFS_DIR/del.symlinks.primary

    BACKUP_REGFILES_ADD=$DIFFS_DIR/add.regfiles.backup
    BACKUP_REGFILES_DEL=$DIFFS_DIR/del.regfiles.backup
    BACKUP_SYMLINKS_ADD=$DIFFS_DIR/add.symlinks.backup
    BACKUP_SYMLINKS_DEL=$DIFFS_DIR/del.symlinks.backup

else 
    echo "Usage: install_fw <dest_partition> <install_type> <force option>";
    exit 101;
fi

# Set up the env vars depending on which image we booted - primary or backup
if [ -f /var/run/backup_fw ]; then
    PRIMARY_UBOOT_PARTITION=/dev/mtd/4
    BACKUP_UBOOT_PARTITION=/dev/mtd/9
    PRIMARY_LINUX_PARTITION=/dev/mtd/3
    BACKUP_LINUX_PARTITION=/dev/mtd/8
	PRIMARY_ROOTFS_PARTITION=/dev/mtd/2
    PRIMARY_ROOTFS_BLOCK_PARTITION=/dev/mtdblock/2
	BACKUP_ROOTFS_PARTITION=/dev/mtd/7
    BACKUP_ROOTFS_BLOCK_PARTITION=/dev/mtdblock/7
    JFFS2_LOGS_PARTITION=/dev/mtd/1
    JFFS2_LOGS_BLOCK_PARTITION=/dev/mtdblock/1

else
    PRIMARY_UBOOT_PARTITION=/dev/mtd/9
    BACKUP_UBOOT_PARTITION=/dev/mtd/4
    PRIMARY_LINUX_PARTITION=/dev/mtd/8
    BACKUP_LINUX_PARTITION=/dev/mtd/3
	PRIMARY_ROOTFS_PARTITION=/dev/mtd/7
    PRIMARY_ROOTFS_BLOCK_PARTITION=/dev/mtdblock/7
	BACKUP_ROOTFS_PARTITION=/dev/mtd/2
    BACKUP_ROOTFS_BLOCK_PARTITION=/dev/mtdblock/2
    JFFS2_LOGS_PARTITION=/dev/mtd/6
    JFFS2_LOGS_BLOCK_PARTITION=/dev/mtdblock/6
fi

# Start the install process
if [ $1 = "primary" ] ; then
    
    installing_primary=`$FW_PRINTENV | grep INSTALLING_PRIMARY | sed -e "s/INSTALLING_PRIMARY=//g"`;
    
    if [ "$3" = "-f" -o "$3" = "-F" -o "$installing_primary" -eq "1" ] ; then

	echo "Starting forced update of primary...";
	if ! [ -f $NEW_PACKAGE/u-boot/u-boot.bin ] ; then
	    echo "ERROR: Missing u-boot.bin in $NEW_PACKAGE/u-boot";
	    exit 108;
	elif ! [ -f $NEW_PACKAGE/linux/vmlinux.UBoot ] ; then
	    echo "ERROR: Missing vmlinux.UBoot in $NEW_PACKAGE/linux";
	    exit 109;
	elif ! [ -f $NEW_PACKAGE/root-fs-image/jffs2_rootfs.img ] ; then
	    echo "ERROR: Missing jffs2_rootfs.img in $NEW_PACKAGE/root-fs-image";
	    exit 111;
	fi
	if [ "$3" = "-F" ] ; then
	if ! [ -f $NEW_PACKAGE/root-fs-image/jffs2.img ] ; then
	    echo "ERROR: Missing jffs2.img in $NEW_PACKAGE/root-fs-image";
	    exit 116;
	fi
	fi

	$FW_SETENV INSTALLING_PRIMARY 1 > /dev/null 2>&1; 
	
	if [ "$3" = "-F" ] ; then
		cp /mnt/logs/etc/passwd /tmp/passwd.tmp;
	fi
	Umount_all;

	Force_Burn $NEW_PACKAGE/u-boot/u-boot.bin $PRIMARY_UBOOT_PARTITION \
	    $NEW_PACKAGE/linux/vmlinux.UBoot $PRIMARY_LINUX_PARTITION \
	    $NEW_PACKAGE/root-fs-image/jffs2_rootfs.img $PRIMARY_ROOTFS_PARTITION;

	if [ "$3" = "-F" ] ; then
	eraseall $JFFS2_LOGS_PARTITION;
	dd if=$NEW_PACKAGE/root-fs-image/jffs2.img of=$JFFS2_LOGS_PARTITION bs=8192;
	if ! [ $? = 0 ] ; then
	    echo "ERROR Flashing JFFS2 logs image";
	    exit 117;
	fi
	fi

	Mount_all;

	if [ "$3" = "-F" ]; then
		killall seld;
		/usr/local/bin/seld;
		cp /tmp/passwd.tmp /mnt/logs/etc/passwd;
		rm /tmp/passwd.tmp;
	fi
		
	$FW_SETENV INSTALLING_PRIMARY 0 > /dev/null 2>&1;
	
	exit;
    fi
    
    if ! [ -f $NEW_PACKAGE/install/Metadata -a \
	-f $NEW_PACKAGE/install/checksum.regfiles -a \
	-f $NEW_PACKAGE/install/info.symlinks -a \
	-f $NEW_PACKAGE/install/post-install-script ] ; then
	
	echo "ERROR: No metadata information in $NEW_PACKAGE/install";
	exit 105;
	
    elif ! [ -f $PRIMARY/Metadata -a \
	-f $PRIMARY/checksum.regfiles -a \
	-f $PRIMARY/info.symlinks -a \
	-f $PRIMARY/post-install-script ] ; then
	
	echo "ERROR: No Metadata Information in $PRIMARY";
	exit 106;

    else
	$FW_SETENV INSTALLING_PRIMARY 1 > /dev/null 2>&1; 

	Burn_fw $NEW_PACKAGE/install $PRIMARY \
	    $NEW_PACKAGE/u-boot/u-boot.bin $PRIMARY_UBOOT_PARTITION \
	    $NEW_PACKAGE/linux/vmlinux.UBoot $PRIMARY_LINUX_PARTITION \
	    $NEW_PACKAGE/root-fs $PRIMARY_ROOTFS;
	
	Remount_Rootfs;

	$FW_SETENV INSTALLING_PRIMARY 0 > /dev/null 2>&1;
    fi

elif [ $1 = "backup" ] ; then

    installing_primary=`$FW_PRINTENV | grep INSTALLING_PRIMARY | sed -e "s/INSTALLING_PRIMARY=//g"`;
    installing_backup=`$FW_PRINTENV | grep INSTALLING_BACKUP | sed -e "s/INSTALLING_BACKUP=//g"`;
    
    if [ "$installing_primary" -eq "1" ] ; then
	echo "Primary might be corrupt. Previous unsuccessful install detected.";
	echo "Cant install backup when INSTALL_PRIMARY=1. Exiting..."
	exit;
    fi
    
    if [ "$3" = "-f" -o "$3" = "-F" -o "$installing_backup" -eq "1" ] ; then

	echo "Starting forced update of backup...";

	$FW_SETENV INSTALLING_BACKUP 1 > /dev/null 2>&1;

	Umount_all;

	Force_Burn $PRIMARY_UBOOT_PARTITION $BACKUP_UBOOT_PARTITION \
	    $PRIMARY_LINUX_PARTITION $BACKUP_LINUX_PARTITION \
	    $PRIMARY_ROOTFS_PARTITION $BACKUP_ROOTFS_PARTITION;

	Mount_all;

	$FW_SETENV INSTALLING_BACKUP 0 > /dev/null 2>&1;

	exit;
    fi

    if ! [ -f $PRIMARY/Metadata -a \
	-f $PRIMARY/checksum.regfiles -a \
	-f $PRIMARY/info.symlinks -a \
	-f $PRIMARY/post-install-script ] ; then

	echo "ERROR: No metadata information in $PRIMARY";
	exit 106;

    elif ! [ -f $BACKUP/Metadata -a \
	-f $BACKUP/checksum.regfiles -a \
	-f $BACKUP/info.symlinks -a \
	-f $BACKUP/post-install-script ] ; then
	
	echo "ERROR: No Metadata Information in $BACKUP";
	exit 107;

    else
	$FW_SETENV INSTALLING_BACKUP 1 > /dev/null 2>&1;

	Burn_fw $PRIMARY $BACKUP \
	    $PRIMARY_UBOOT_PARTITION $BACKUP_UBOOT_PARTITION \
	    $PRIMARY_LINUX_PARTITION $BACKUP_LINUX_PARTITION \
	    $PRIMARY_ROOTFS $BACKUP_ROOTFS;

	Remount_Rootfs;

	$FW_SETENV INSTALLING_BACKUP 0 > /dev/null 2>&1;
    fi
else 
    echo "Usage: install_fw <dest_partition> <install_type> <force option>";
    exit 101;
fi

exit;
