#!/bin/bash # Select the official site or any of the mirrors by commenting out the correct line # MIRROR=https://download.joyent.com/pub/iso/ MIRROR=http://smartos.nym.se/ TMP=$(mktemp -d) cd "$TMP" || exit -1 echo -n "Checking current boot device..." if [[ -z $1 ]] ; then USB=$(rmformat | grep Logical | awk '{print $4}' | sed 's/rdsk/dsk/;s/p0$/p1/') echo -n " detected $USB" else USB="$1" echo -n " using $USB" fi umount "$USB" 2>/dev/null mkdir usb if ! mount -F pcfs -o foldcase "$USB" "$TMP/usb" ; then echo ", mount failed" exit -1 else echo -n ", mounted" fi if [[ ! -d usb/platform ]] ; then echo ", missing platform dir" exit -1 else echo ", OK" fi echo -n "Downloading latest platform ($MIRROR)..." if ! curl -sk -o platform-latest.tgz "$MIRROR/platform-latest.tgz" ; then echo " failed" exit -1 else echo " OK" fi echo -n "Verifying checksum..." curl -sk "$MIRROR/md5sums.txt" \ | grep platform-latest.tgz \ | awk '{print $1}' > expected.md5 openssl md5 platform-latest.tgz | awk '{print $2}' > actual.md5 if ! cmp -s actual.md5 expected.md5 ; then echo " failed" exit -1 else echo " OK" fi echo -n "Extracting latest platform..." if ! gtar zxf platform-latest.tgz ; then echo " failed" exit -1 else echo " OK" fi echo -n "Updating platform on boot device..." if ! rsync -a platform-20*/ usb/platform.new/ ; then echo " failed" exit -1 else echo " OK" fi echo -n "Remounting boot device..." umount "$USB" 2>/dev/null if ! mount -F pcfs -o foldcase "$USB" "$TMP/usb" ; then echo " failed" exit -1 else echo " OK" fi echo -n "Verifying kernel checksum on boot device..." openssl dgst -sha1 platform-20*/i86pc/kernel/amd64/unix | cut -d ' ' -f 2 > kernel.expected openssl dgst -sha1 usb/platform.new/i86pc/kernel/amd64/unix | cut -d ' ' -f 2 > kernel.actual if ! cmp -s kernel.actual kernel.expected ; then echo " failed" exit -1 else echo " OK" fi echo -n "Verifying boot_archive checksum on boot device..." openssl dgst -sha1 usb/platform.new/i86pc/amd64/boot_archive | cut -d ' ' -f 2 > boot_archive.actual if ! cmp -s boot_archive.actual usb/platform.new/i86pc/amd64/boot_archive.hash ; then echo " failed" exit -1 else echo " OK" fi echo -n "Activating new platform on $USB..." rm -rf usb/old mkdir usb/old if ! ( mv usb/platform usb/old && mv usb/platform.new usb/platform ) ; then echo " failed" exit -1 else echo " OK" fi echo echo "Boot device upgraded. To do:" echo echo " 1) Sanity check the contents of $TMP/usb" echo " 2) umount $USB" echo " 3) reboot"