├── README.markdown └── autodsnbi.sh /README.markdown: -------------------------------------------------------------------------------- 1 | Create DeployStudio NetBoot sets from the command line. It's just a wrapper script for DeployStudio Assistant, so you need to have that installed. 2 | -------------------------------------------------------------------------------- /autodsnbi.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # History: 4 | # * 1.1: Support for DS 1.6.17 5 | # * 1.0: Initial release 6 | 7 | 8 | ############################################################################### 9 | ### Customize these variables ### 10 | ############################################################################### 11 | 12 | 13 | # Protocol, NFS or HTTP. 14 | declare -r PROTOCOL="NFS" 15 | # Available languages: 16 | # default Use the source system's settings. 17 | # en English 18 | # de German 19 | # fr French 20 | # fr_CA Canadian french 21 | declare -r LANGUAGE="default" 22 | # NTP server. 23 | declare -r NTP_SERVER="time.euro.apple.com" 24 | 25 | 26 | # Server URLs. 27 | declare -r DS_SERVER_URL="https://ds.example.com:60443" 28 | declare -r DS_SERVER_URL2="$DS_SERVER_URL" 29 | # Uncomment to disable version mismatch alerts. 30 | #declare -r DISABLE_VERSION_MISMATCH="-disableversionsmismatchalerts" 31 | 32 | 33 | # User and password for runtime. 34 | declare -r DS_LOGIN="deploystudio" 35 | declare -r DS_PASSWORD="" 36 | # User and password for ARD agent. 37 | declare -r ARD_LOGIN="dsremote" 38 | declare -r ARD_PASSWORD="dsremotepassword" 39 | # Uncomment to display log window by default. 40 | declare -r DISPLAY_LOG_WINDOW="-displaylogs" 41 | # Time in seconds before reboot after workflow completion. 42 | declare -r TIMEOUT="-timeout 30" 43 | # Time before display goes to sleep, in minutes. 44 | declare -r DISPLAYSLEEP="-displaysleep 10" 45 | 46 | 47 | # Uncomment to enable python and ruby. 48 | declare -r ENABLE_PYTHON="-enablepython" 49 | #declare -r ENABLE_RUBY="-enableruby" 50 | # Uncomment to customize network settings. 51 | #declare -r ENABLE_CUSTOM_TCP="-enablecustomtcpstacksettings" 52 | declare -r DISABLE_WIFI="-disablewirelesssupport" 53 | declare -r SMB1ONLY="-smb1only" 54 | # Custom title variables: 55 | # %v OS version 56 | # %b OS build 57 | # %d Build date 58 | declare -r CUSTOM_TITLE="DS %v %b %d" 59 | # Path to background image (absolute path, or relative to source volume). 60 | declare -r CUSTOM_BACKGROUND="System/Library/CoreServices/DefaultDesktop.jpg" 61 | 62 | 63 | ######################################################################## 64 | 65 | 66 | # Exit status constants. 67 | 68 | declare -ri EX_OK=0 69 | declare -ri EX_USAGE=64 70 | declare -ri EX_DATAERR=65 71 | declare -ri EX_NOINPUT=66 72 | declare -ri EX_NOUSER=67 73 | declare -ri EX_NOHOST=68 74 | declare -ri EX_UNAVAILABLE=69 75 | declare -ri EX_SOFTWARE=70 76 | declare -ri EX_OSERR=71 77 | declare -ri EX_OSFILE=72 78 | declare -ri EX_CANTCREAT=73 79 | declare -ri EX_IOERR=74 80 | declare -ri EX_TEMPFAIL=75 81 | declare -ri EX_PROTOCOL=76 82 | declare -ri EX_NOPERM=77 83 | declare -ri EX_CONFIG=78 84 | 85 | 86 | # Cleanup. 87 | 88 | eject_dmg() { 89 | local mountpath="$1" 90 | if [[ -d "$mountpath" ]]; then 91 | if ! hdiutil eject "$mountpath" >/dev/null; then 92 | for tries in {1..10}; do 93 | sleep $tries 94 | if hdiutil eject "$mountpath" -force; then 95 | break 96 | fi 97 | done 98 | fi 99 | fi 100 | } 101 | 102 | declare -a dmgmounts 103 | unmount_dmgs() { 104 | for mountpath in "${dmgmounts[@]}"; do 105 | eject_dmg "$mountpath" 106 | done 107 | unset dmgmounts 108 | } 109 | 110 | trap unmount_dmgs EXIT 111 | 112 | 113 | # Arguments. 114 | 115 | die() { 116 | echo "$2" 1>&2 117 | exit "$1" 118 | } 119 | 120 | if [[ $# -ne 4 ]]; then 121 | die $EX_USAGE "Usage: $(basename "$0") " 122 | fi 123 | src="$1" 124 | nb_id="$2" 125 | nb_name="$3" 126 | dest_dir="$4" 127 | 128 | if [[ ! -d "$dest_dir" ]]; then 129 | die $EX_UNAVAILABLE "$dest_dir does not exist" 130 | fi 131 | if [[ ! -w "$dest_dir" ]]; then 132 | die $EX_CANTCREAT "$dest_dir is not writable" 133 | fi 134 | dest_nbi="$dest_dir/$nb_name.nbi" 135 | if [[ -e "$dest_nbi" ]]; then 136 | die $EX_CANTCREAT "$dest_nbi already exists" 137 | fi 138 | 139 | 140 | # Requirements. 141 | 142 | DSADMIN_PATH="/Applications/Utilities/DeployStudio Admin.app" 143 | DSASST_PATH="$DSADMIN_PATH/Contents/Applications/DeployStudio Assistant.app" 144 | SYS_BUILDER_DIR="$DSASST_PATH/Contents/Resources/sysBuilder" 145 | if [[ -x "$SYS_BUILDER_DIR/sys_builder_rp.sh" ]]; then 146 | SYS_BUILDER_SCRIPT="sys_builder_rp.sh" 147 | SYS_BUILDER_PATH="$SYS_BUILDER_DIR/$SYS_BUILDER_SCRIPT" 148 | else 149 | SYS_BUILDER_SCRIPT="sys_builder.sh" 150 | SYS_BUILDER_PATH="$SYS_BUILDER_DIR/$SYS_BUILDER_SCRIPT" 151 | fi 152 | if [[ ! -x "$SYS_BUILDER_PATH" ]]; then 153 | die $EX_UNAVAILABLE "DeployStudio Assistant not found" 154 | fi 155 | EXPECTED_USAGE="Usage: $SYS_BUILDER_SCRIPT -basesystem -type local -volume [-erasedisk][-loc ][-serverurl ][-serverurl2 ][-disableversionsmismatchalerts][-login ][-password ][-ardlogin ][-ardpassword ][-displaylogs][-timeout =][-displaysleep ][-enableruby][-enablepython][-enablecustomtcpstacksettings][-disablewirelesssupport][-ntp ][-customtitle ][-custombackground ][-smb1only]" 156 | usage=$("$SYS_BUILDER_PATH" | grep Usage:) 157 | if [[ "$usage" != "$EXPECTED_USAGE" ]]; then 158 | die $EX_SOFTWARE "Unexpected usage for sys_builder.sh" 159 | fi 160 | 161 | if [[ $(id -u) -ne 0 ]]; then 162 | die $EX_NOPERM "$(basename "$0") must run as root" 163 | fi 164 | 165 | 166 | # Source. 167 | 168 | if [[ -f "$src" ]]; then 169 | src_vol=$(hdiutil attach -nobrowse -noautoopen -noverify -owners on "$src" | grep Apple_HFS | cut -f3) 170 | dmgmounts+=("$src_vol") 171 | else 172 | src_vol="$src" 173 | fi 174 | 175 | ver_plist="$src_vol/System/Library/CoreServices/SystemVersion.plist" 176 | if [[ ! -f "$ver_plist" ]]; then 177 | die $EX_DATAERR "$src doesn't look like a valid system volume or OS image" 178 | fi 179 | 180 | src_name=$( /usr/libexec/PlistBuddy -c "print :ProductName" "$ver_plist") 181 | src_version=$(/usr/libexec/PlistBuddy -c "print :ProductVersion" "$ver_plist") 182 | src_build=$( /usr/libexec/PlistBuddy -c "print :ProductBuildVersion" "$ver_plist") 183 | echo "Using $src_name $src_version ($src_build) as the source" 184 | 185 | 186 | # Expand variables in title. 187 | 188 | title="$CUSTOM_TITLE" 189 | title="${title/\%v/$src_version}" 190 | title="${title/\%b/$src_build}" 191 | title="${title/\%d/$(date "+%y%m%d")}" 192 | 193 | 194 | # Copy background image. 195 | BKG_PATH="/tmp/_$(uuidgen)_background.jpg" 196 | ( 197 | cd "$src_vol" 198 | cp "$CUSTOM_BACKGROUND" "$BKG_PATH" 199 | ) 200 | 201 | # Build nbi. 202 | 203 | "$SYS_BUILDER_PATH" \ 204 | -basesystem "$src_vol" \ 205 | -type netboot \ 206 | -id "$nb_id" \ 207 | -name "$nb_name" \ 208 | -dest "$dest_dir" \ 209 | -protocol "$PROTOCOL" \ 210 | -loc "$LANGUAGE" \ 211 | -serverurl "$DS_SERVER_URL" \ 212 | -serverurl2 "$DS_SERVER_URL2" \ 213 | $DISABLE_VERSION_MISMATCH \ 214 | -login "$DS_LOGIN" \ 215 | -password "$DS_PASSWORD" \ 216 | -ardlogin "$ARD_LOGIN" \ 217 | -ardpassword "$ARD_PASSWORD" \ 218 | $DISPLAY_LOG_WINDOW \ 219 | $TIMEOUT \ 220 | $DISPLAYSLEEP \ 221 | $ENABLE_PYTHON \ 222 | $ENABLE_RUBY \ 223 | $ENABLE_CUSTOM_TCP \ 224 | $DISABLE_WIFI \ 225 | -ntp "$NTP_SERVER" \ 226 | -customtitle "$title" \ 227 | -custombackground "$BKG_PATH" \ 228 | $SMB1ONLY 229 | retval=$? 230 | rm -f "$BKG_PATH" 231 | 232 | exit $retval 233 | --------------------------------------------------------------------------------