create_diskimage 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. autoload -Uz log_debug log_error log_info log_status log_group log_output log_warning
  2. local -r _usage="Usage: %B${0}%b <source> <volume name> <output_name>
  3. Create macOS disk image <volume name> <output_name> with contents of <source>"
  4. if (( ! # )) {
  5. log_error 'Called without arguments.'
  6. log_output ${_usage}
  7. return 2
  8. }
  9. local source=${1}
  10. local volume_name=${2}
  11. local output_name=${3}
  12. log_group "Create macOS disk image"
  13. trap "safe_hdiutil detach /Volumes/${output_name}; rm temp.dmg; log_group; return 2" ERR
  14. safe_hdiutil() {
  15. local _status=0
  16. local -r -a _backoff=(2 5 10 15 30)
  17. for i ({1..5}) {
  18. hdiutil ${@} && _status=0 || _status=1
  19. if (( _status )) {
  20. log_warning "Unable to run 'hdiutil ${@}' (attempt #${i}). Retrying."
  21. sleep ${_backoff[${i}]}
  22. } else {
  23. break
  24. }
  25. }
  26. if (( _status )) {
  27. log_error "Unable to run 'hdiutil ${@}'. Aborting"
  28. log_group
  29. return 2
  30. }
  31. }
  32. safe_hdiutil create \
  33. -volname "${volume_name}" \
  34. -srcfolder ${source} \
  35. -ov \
  36. -fs APFS \
  37. -format UDRW \
  38. temp.dmg
  39. safe_hdiutil attach \
  40. -noverify \
  41. -readwrite \
  42. -mountpoint /Volumes/${output_name} \
  43. temp.dmg
  44. log_info "Waiting 2 seconds to ensure mounted volume is available..."
  45. sleep 2
  46. log_status "Done"
  47. log_info "Setting up disk volume..."
  48. log_status "Volume icon"
  49. SetFile -c icnC /Volumes/${output_name}/.VolumeIcon.icns
  50. log_status "Icon positions"
  51. osascript package.applescript ${output_name}
  52. log_status "File permissions"
  53. chmod -Rf go-w /Volumes/${output_name}
  54. SetFile -a C /Volumes/${output_name}
  55. rm -rf -- /Volumes/${output_name}/.fseventsd(N)
  56. log_info "Converting disk image..."
  57. safe_hdiutil detach /Volumes/${output_name}
  58. safe_hdiutil convert \
  59. -format ULMO \
  60. -ov \
  61. -o ${output_name}.dmg temp.dmg
  62. rm temp.dmg
  63. trap '' ERR
  64. log_group
  65. return 0