| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | #! /bin/sh# usage: coraid-update {update file} {AoE target}# coraid-update depends upon sysfs mounted on /sys# The destination must be,#   1) an AoE target ready for I/O, and#   2) not too big to be an update target## Later, when CORAID appliances mark update targets with special ATA# device identify content or special target content, a prompt should# be added after the check of the target's size if the identifying# content is not detected.# # The update file must either, #   1) be an SR tarc file that looks OK to the local tar, or#   2) any file not ending in ".tarc".# size of update LUN in /proc/partitions is 40000max=70000usage="usage: coraid-update {update file} {AoE device}"if test "$#" != 2; then	echo "$usage" 1>&2	exit 1fiupdate="$1"ulb="$2"# if it's an update target, it should be in `aoe-stat`aoe-stat | awk -vt="`basename $ulb`" 'BEGIN{fail=1}$1==t{fail=0}END{exit fail}' || {	exec 1>&2	echo "coraid-update Error: \"$ulb\" is not an AoE target"	echo "$usage"	exit 1}# it should have a size no larger than $max in /proc/partitionst="`echo $ulb | sed 's!^/dev/!!'`"awk -vt="$t" '$NF==t{print $3}' /proc/partitions |awk -vhi=$max -vdev="$ulb" 'BEGIN{	err = "could not get size of " dev} {	err = "none"	if ($1 > hi) {		err = dev " is too large to be an update target"		exit	}} END{	if (err != "none") {		print "Error coraid-update: " err > "/dev/stderr"		exit 1	}	exit 0}' || exit 1# this test should be removed when it is performed on the appliance# # For a 2734080-byte tarc file, an incomplete file of 2727450 bytes passes# this test, but one of 2727400 does not.  So this test isn't fullproof.# if test "`echo \"$update\" | grep '\.tarc$'`"; then	tar tf "$update" > /dev/null 2>&1 || {		exec 1>&2		echo "coraid-update Error: \"$update\" does not appear to be a valid tarc file"		exit 1	}fiif test ! -r "$update"; then	echo "coraid-update Error: \"$update\" is not readable" 1>&2	exit 1fi# send it over and complain on errorif ! dd if="$update" of="$ulb" 2> /dev/null || ! sync; then	exec 1>&2	echo "coraid-update Error: could not successfully write \"$update\" to \"$ulb\""	exit 1fi
 |