platform-upgrade 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #!/bin/bash
  2. # https://github.com/calmh/smartos-platform-upgrade
  3. # Copyright (c) 2012-2016 Jakob Borg & Contributors
  4. # Distributed under the MIT License
  5. # us-east.manta.joyent.com currently uses a wildcard certificate based on the
  6. # Thawte Primary Root CA.
  7. # SHA-1=91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81
  8. # SHA-256=8D:72:2F:81:A9:C1:13:C0:79:1D:F1:36:A2:96:6D:B2:6C:95:0A:97:1D:B4:6B:41:99:F4:EA:54:B7:8B:FB:9F
  9. cert_file=$(mktemp)
  10. function cleanup {
  11. rm "$cert_file"
  12. }
  13. trap cleanup EXIT
  14. cat >"$cert_file" <<EOF
  15. -----BEGIN CERTIFICATE-----
  16. MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
  17. qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
  18. Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
  19. MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
  20. BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
  21. NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
  22. LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
  23. A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
  24. IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
  25. SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
  26. W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
  27. 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
  28. 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
  29. Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
  30. NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
  31. MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
  32. r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
  33. DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
  34. YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
  35. xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
  36. /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
  37. LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
  38. jVaMaA==
  39. -----END CERTIFICATE-----
  40. EOF
  41. function _curl {
  42. curl -s --cacert "$cert_file" $@
  43. }
  44. host=https://us-east.manta.joyent.com
  45. latest_path=$(_curl "$host/Joyent_Dev/public/SmartOS/latest")
  46. version="${latest_path##*/}"
  47. platform_file="platform-$version.tgz"
  48. platform_dir="platform-$version"
  49. platform_url="$host$latest_path/$platform_file"
  50. md5sums_url="$host$latest_path/md5sums.txt"
  51. force="false"
  52. while getopts :f option; do
  53. case "$option" in
  54. f)
  55. force="true"
  56. ;;
  57. \?)
  58. echo "Invalid option: -$OPTARG" >&2
  59. exit -1
  60. ;;
  61. esac
  62. done
  63. shift $((OPTIND-1))
  64. IFS=_ read brand kernel < <(uname -v)
  65. if [[ $kernel == $version ]]; then
  66. echo "Already on latest version ($kernel)."
  67. $force || exit -1
  68. fi
  69. tmp=$(mktemp -d)
  70. cd "$tmp" || exit -1
  71. echo -n "Downloading latest platform ($platform_file)..."
  72. if ! _curl -o "$platform_file" "$platform_url" ; then
  73. echo " failed"
  74. exit -1
  75. else
  76. echo " OK"
  77. fi
  78. echo -n "Verifying checksum..."
  79. _curl "$md5sums_url" \
  80. | grep "$platform_file" \
  81. | awk '{print $1}' > expected.md5
  82. openssl md5 "$platform_file" | awk '{print $2}' > actual.md5
  83. if ! cmp -s actual.md5 expected.md5 ; then
  84. echo " failed"
  85. exit -1
  86. else
  87. echo " OK"
  88. fi
  89. echo -n "Extracting latest platform..."
  90. if ! gtar zxf "$platform_file" ; then
  91. echo " failed"
  92. exit -1
  93. else
  94. echo " OK"
  95. fi
  96. echo -n "Marking release version..."
  97. if ! echo $version > $platform_dir/VERSION ; then
  98. echo " failed"
  99. exit -1
  100. else
  101. echo " OK"
  102. fi
  103. echo -n "Checking current boot device..."
  104. if [[ -z $1 ]] ; then
  105. removables=($(diskinfo | awk '/^USB/ { print $2 }'))
  106. echo -n " detected ${removables[@]}"
  107. if [[ ${#removables[@]} -gt 1 ]]; then
  108. echo
  109. echo "Error: more than one removable device detected."
  110. diskinfo | awk 'NR == 1 || /^USB/ { print }'
  111. echo "Specify correct device on the command line."
  112. exit -1
  113. fi
  114. usb="/dev/dsk/${removables[0]}p1"
  115. else
  116. usb="$1"
  117. echo -n " using $usb"
  118. fi
  119. umount "$usb" 2>/dev/null
  120. mkdir usb
  121. if ! mount -F pcfs -o foldcase "$usb" "$tmp/usb" ; then
  122. echo ", mount failed"
  123. exit -1
  124. else
  125. echo -n ", mounted"
  126. fi
  127. if [[ ! -d usb/platform ]] ; then
  128. echo ", missing platform dir"
  129. exit -1
  130. else
  131. echo ", OK"
  132. fi
  133. echo -n "Updating platform on boot device..."
  134. if ! rsync -a "$platform_dir/" usb/platform.new/ ; then
  135. echo " failed"
  136. exit -1
  137. else
  138. echo " OK"
  139. fi
  140. echo -n "Remounting boot device..."
  141. umount "$usb" 2>/dev/null
  142. if ! mount -F pcfs -o foldcase "$usb" "$tmp/usb" ; then
  143. echo " failed"
  144. exit -1
  145. else
  146. echo " OK"
  147. fi
  148. echo -n "Verifying kernel checksum on boot device..."
  149. openssl dgst -sha1 "$platform_dir"/i86pc/kernel/amd64/unix | cut -d ' ' -f 2 > kernel.expected
  150. openssl dgst -sha1 usb/platform.new/i86pc/kernel/amd64/unix | cut -d ' ' -f 2 > kernel.actual
  151. if ! cmp -s kernel.actual kernel.expected ; then
  152. echo " failed"
  153. exit -1
  154. else
  155. echo " OK"
  156. fi
  157. echo -n "Verifying boot_archive checksum on boot device..."
  158. openssl dgst -sha1 usb/platform.new/i86pc/amd64/boot_archive | cut -d ' ' -f 2 > boot_archive.actual
  159. if ! cmp -s boot_archive.actual usb/platform.new/i86pc/amd64/boot_archive.hash ; then
  160. echo " failed"
  161. exit -1
  162. else
  163. echo " OK"
  164. fi
  165. echo -n "Activating new platform on $usb..."
  166. rm -rf usb/old
  167. mkdir usb/old
  168. if ! ( mv usb/platform usb/old && mv usb/platform.new usb/platform ) ; then
  169. echo " failed"
  170. exit -1
  171. else
  172. echo " OK"
  173. fi
  174. echo
  175. echo "Boot device upgraded. To do:"
  176. echo
  177. echo " 1) Sanity check the contents of $tmp/usb"
  178. echo " 2) umount $usb"
  179. echo " 3) reboot"