Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. # Start a linked clone of a VM and list available software updates.
  4.  
  5.  
  6. declare -r FUSION_PATH="/Applications/VMware Fusion.app"
  7. declare -r GUEST_USER="swup"
  8. declare -r GUEST_PASSWORD="swup"
  9.  
  10. # Exit status constants.
  11.  
  12. declare -ri EX_OK=0
  13. declare -ri EX_USAGE=64 # The command was used incorrectly.
  14. declare -ri EX_DATAERR=65 # Input data was incorrect in some way.
  15. declare -ri EX_NOINPUT=66 # Input file did not exist or wasn't readable.
  16. declare -ri EX_NOUSER=67 # The user specified did not exist.
  17. declare -ri EX_NOHOST=68 # The host specified did not exist.
  18. declare -ri EX_UNAVAILABLE=69 # A service is unavailable.
  19. declare -ri EX_SOFTWARE=70 # An internal software error has been detected.
  20. declare -ri EX_OSERR=71 # An operating system error has been detected.
  21. declare -ri EX_OSFILE=72 # Some system file is unavailable.
  22. declare -ri EX_CANTCREAT=73 # A specified output file cannot be created.
  23. declare -ri EX_IOERR=74 # An error occurred while doing I/O.
  24. declare -ri EX_TEMPFAIL=75 # Temporary failure.
  25. declare -ri EX_PROTOCOL=76 # Remote protocol failure.
  26. declare -ri EX_NOPERM=77 # Required permission missing.
  27. declare -ri EX_CONFIG=78 # Something was unconfigured or misconfigured.
  28.  
  29. # ANSI escape codes.
  30.  
  31. # Reset.
  32. declare -r ANSI_RESET=$'\x1b[0m'
  33. # Attributes.
  34. declare -r ANSI_BOLD=$'\x1b[1m'
  35. declare -r ANSI_DIM=$'\x1b[2m'
  36. declare -r ANSI_UL=$'\x1b[4m'
  37. declare -r ANSI_BLINK=$'\x1b[5m'
  38. declare -r ANSI_INVERT=$'\x1b[7m'
  39. declare -r ANSI_HIDDEN=$'\x1b[8m'
  40. declare -r ANSI_BOLDOFF=$'\x1b[21m'
  41. declare -r ANSI_DIMOFF=$'\x1b[22m'
  42. declare -r ANSI_ULOFF=$'\x1b[24m'
  43. declare -r ANSI_BLINKOFF=$'\x1b[25m'
  44. declare -r ANSI_INVERTOFF=$'\x1b[27m'
  45. declare -r ANSI_HIDDENOFF=$'\x1b[28m'
  46. # Foreground color.
  47. declare -r ANSI_NOCOLOR=$'\x1b[39m'
  48. declare -r ANSI_BLACK=$'\x1b[30m'
  49. declare -r ANSI_RED=$'\x1b[31m'
  50. declare -r ANSI_GREEN=$'\x1b[32m'
  51. declare -r ANSI_YELLOW=$'\x1b[33m'
  52. declare -r ANSI_BLUE=$'\x1b[34m'
  53. declare -r ANSI_MAGENTA=$'\x1b[35m'
  54. declare -r ANSI_CYAN=$'\x1b[36m'
  55. declare -r ANSI_LTGRAY=$'\x1b[37m'
  56. declare -r ANSI_DKGRAY=$'\x1b[90m'
  57. declare -r ANSI_LTRED=$'\x1b[91m'
  58. declare -r ANSI_LTGREEN=$'\x1b[92m'
  59. declare -r ANSI_LTYELLOW=$'\x1b[93m'
  60. declare -r ANSI_LTBLUE=$'\x1b[94m'
  61. declare -r ANSI_LTMAGENTA=$'\x1b[95m'
  62. declare -r ANSI_LTCYAN=$'\x1b[96m'
  63. declare -r ANSI_WHITE=$'\x1b[97m'
  64. # Background color.
  65. declare -r ANSI_BGNOCOLOR=$'\x1b[49m'
  66. declare -r ANSI_BGBLACK=$'\x1b[40m'
  67. declare -r ANSI_BGRED=$'\x1b[41m'
  68. declare -r ANSI_BGGREEN=$'\x1b[42m'
  69. declare -r ANSI_BGYELLOW=$'\x1b[43m'
  70. declare -r ANSI_BGBLUE=$'\x1b[44m'
  71. declare -r ANSI_BGMAGENTA=$'\x1b[45m'
  72. declare -r ANSI_BGCYAN=$'\x1b[46m'
  73. declare -r ANSI_BGLTGRAY=$'\x1b[47m'
  74. declare -r ANSI_BGDKGRAY=$'\x1b[100m'
  75. declare -r ANSI_BGLTRED=$'\x1b[101m'
  76. declare -r ANSI_BGLTGREEN=$'\x1b[102m'
  77. declare -r ANSI_BGLTYELLOW=$'\x1b[103m'
  78. declare -r ANSI_BGLTBLUE=$'\x1b[104m'
  79. declare -r ANSI_BGLTMAGENTA=$'\x1b[105m'
  80. declare -r ANSI_BGLTCYAN=$'\x1b[106m'
  81. declare -r ANSI_BGWHITE=$'\x1b[107m'
  82.  
  83.  
  84. # Exit with status and an error message.
  85.  
  86. function die() {
  87. local exit_status="$1"
  88. local message="$2"
  89.  
  90. echo "${ANSI_RED}${message}${ANSI_RESET}" 1>&2
  91. exit "$exit_status"
  92. }
  93.  
  94.  
  95. # VMware Fusion support.
  96.  
  97. declare -r VMWARE_PATH="$FUSION_PATH/Contents/Library"
  98. declare -r VMRUN="$VMWARE_PATH/vmrun"
  99. if [[ ! -x "$VMWARE_PATH/vmrun" ]]; then
  100. die $EX_UNAVAILABLE "'$VMWARE_PATH/vmrun' is not available"
  101. fi
  102.  
  103. function vmrun() {
  104. "$VMWARE_PATH/vmrun" -gu "$GUEST_USER" -gp "$GUEST_PASSWORD" "$@"
  105. }
  106.  
  107. function vmrun_root() {
  108. "$VMWARE_PATH/vmrun" -gu "root" -gp "$GUEST_PASSWORD" "$@"
  109. }
  110.  
  111.  
  112. # Create, launch, and destroy VM clones.
  113.  
  114. function create_linked_clone() {
  115. local base_vmx="$1"
  116. local clone_vmx="$2"
  117. local clone_name="$3"
  118.  
  119. # FIXME: Use named snapshots.
  120. vmrun clone "$base_vmx" "$clone_vmx" -cloneName="$clone_name" linked
  121. }
  122.  
  123. function start_vm() {
  124. local vmx="$1"
  125.  
  126. vmrun start "$vmx" nogui
  127. }
  128.  
  129. function wait_for_boot() {
  130. local vmx="$1"
  131. local count=0
  132.  
  133. while ! vmrun listProcessesInGuest "$vmx" | grep -q "Finder"; do
  134. sleep 1
  135. done
  136. }
  137.  
  138. function wait_for_internet() {
  139. local vmx="$1"
  140.  
  141. vmrun_root runScriptInGuest "$vmx" /bin/bash \
  142. "while ! ping -q -c 1 www.google.com &>/dev/null; do sleep 1; done"
  143. }
  144.  
  145. function kill_vm() {
  146. local vmx="$1"
  147. local retval
  148.  
  149. vmrun stop "$vmx" hard
  150. }
  151.  
  152. function delete_clone() {
  153. local base_vmx="$1"
  154. local clone_vmx="$2"
  155. local clone_name="$3"
  156.  
  157. vmrun deleteVM "$clone_vmx"
  158. # FIXME: Use named snapshots.
  159. vmrun deleteSnapshot "$base_vmx" Clone #"$snapshot_name"
  160. }
  161.  
  162.  
  163. # Main.
  164.  
  165. function list_software_updates() {
  166. local vmx="$1"
  167. local d="--------"
  168.  
  169. echo "${ANSI_BLUE}$d$d$d$d$d$d$d$d$d${ANSI_RESET}"
  170.  
  171. vmrun_root runScriptInGuest "$vmx" /bin/bash \
  172. "( /usr/bin/sw_vers; /usr/sbin/softwareupdate -v -l ) &> /tmp/output; sleep 1"
  173. tempfile="${TMPDIR}/output.${RANDOM}${RANDOM}${RANDOM}${RANDOM}"
  174. vmrun_root copyFileFromGuestToHost "$vmx" /tmp/output "$tempfile"
  175. cat "$tempfile"
  176. rm -f "$tempfile"
  177. vmrun_root runProgramInGuest "$vmx" /bin/rm -f /tmp/output
  178.  
  179. echo "${ANSI_BLUE}$d$d$d$d$d$d$d$d$d${ANSI_RESET}"
  180. }
  181.  
  182. function main() {
  183. # Arguments
  184. if [[ $# -ne 1 ]]; then
  185. die $EX_USAGE "Usage: $(basename "$0") base_vm"
  186. fi
  187.  
  188. local base_vmx="$1"
  189. local clone_vmx="${base_vmx%.vmx}_clone.vmx"
  190. local clone_name="swuprun_${RANDOM}${RANDOM}"
  191.  
  192. if [[ ! -f "$base_vmx" ]]; then
  193. die $EX_NOINPUT "'$base_vmx' does not exist or is not a vmx file"
  194. fi
  195. if [[ -e "$clone_vmx" ]]; then
  196. die $EX_CANTCREAT "'$clone_vmx' already exists"
  197. fi
  198.  
  199. # Create a linked clone.
  200. echo "Cloning VM"
  201.  
  202. if ! create_linked_clone "$base_vmx" "$clone_vmx" "$clone_name"; then
  203. die $EX_CANTCREAT "Failed to create linked clone '$clone_vmx'"
  204. fi
  205.  
  206. # Start the cloned VM.
  207. echo "Starting clone"
  208. if ! start_vm "$clone_vmx"; then
  209. die $EX_UNAVAILABLE "Couldn't start VM"
  210. fi
  211.  
  212. # Wait for the cloned VM to boot and our user to log in.
  213. echo "Waiting for clone to boot"
  214. if ! wait_for_boot "$clone_vmx"; then
  215. die $EX_UNAVAILABLE "Failed while waiting for VM to boot"
  216. fi
  217.  
  218. # Wait for internet access.
  219. echo "Waiting for internet"
  220. if ! wait_for_internet "$clone_vmx"; then
  221. die $EX_UNAVAILABLE "Failed while waiting internet access"
  222. fi
  223.  
  224. # Check for software updates.
  225. list_software_updates "$clone_vmx"
  226.  
  227. # Shut down the cloned VM.
  228. echo "Stopping clone"
  229. if ! kill_vm "$clone_vmx"; then
  230. die $EX_UNAVAILABLE "Failed to stop VM"
  231. fi
  232.  
  233. # Remove the linked clone and associated snapshot.
  234. echo "Deleting clone"
  235. if ! delete_clone "$base_vmx" "$clone_vmx" "$clone_name"; then
  236. die $EX_IOERR "Failed to delete VM"
  237. fi
  238. }
  239.  
  240. main "$@"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement