| 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 40000
 
- max=70000
 
- usage="usage: coraid-update {update file} {AoE device}"
 
- if test "$#" != 2; then
 
- 	echo "$usage" 1>&2
 
- 	exit 1
 
- fi
 
- update="$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/partitions
 
- t="`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
 
- 	}
 
- fi
 
- if test ! -r "$update"; then
 
- 	echo "coraid-update Error: \"$update\" is not readable" 1>&2
 
- 	exit 1
 
- fi
 
- # send it over and complain on error
 
- if ! 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 1
 
- fi
 
 
  |