create_diskimage 1.9 KB

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