]>
Commit | Line | Data |
---|---|---|
e91b9f68 A |
1 | #!/bin/sh |
2 | ## | |
3 | # Copyright 2002 Apple Computer, Inc. | |
4 | # | |
5 | # This script configures NetBoot | |
6 | ## | |
7 | ||
8 | . /etc/rc.common | |
9 | ||
10 | # | |
11 | # Define: NETBOOT_SHADOW | |
12 | # Purpose: | |
13 | # To change the behavior of the system when choosing a netboot shadow | |
14 | # to use. | |
15 | # Values: | |
16 | # -NETWORK- Try to use the network for the shadow file, if | |
17 | # that fails, use the local drive | |
18 | # -NETWORK_ONLY- Only use the network, fail if not available | |
19 | # -LOCAL- Use the local drive for the shadow file, if that | |
20 | # fails, use the network | |
21 | # -LOCAL_ONLY- Only use the local drive for the shadow, fail if | |
22 | # not available | |
23 | ||
24 | NETBOOT_MOUNT=/var/netboot | |
25 | NETBOOT_SHADOW=${NETBOOT_SHADOW:-NETWORK-} | |
26 | ||
27 | Failed() | |
28 | { | |
29 | echo rc.netboot: $1 | |
ef398931 A |
30 | echo rc.netboot: $1 > /dev/console |
31 | sleep 5 | |
e91b9f68 A |
32 | exit 1 |
33 | } | |
34 | ||
35 | common_start() | |
36 | { | |
37 | netboot_dir=$1 | |
38 | netboot_shadow=$2 | |
39 | if [ "${netboot_dir}" = "" ] ; then | |
40 | Failed "netboot_dir is empty" | |
41 | fi | |
42 | if [ "${netboot_shadow}" = "" ] ; then | |
43 | Failed "netboot_shadow is empty" | |
44 | fi | |
45 | netboot_shadow="${netboot_dir}/${netboot_shadow}" | |
46 | if ! mkdir -p "${netboot_dir}" ; then | |
47 | Failed "create ${netboot_dir} failed" | |
48 | fi | |
49 | chmod 700 "${netboot_dir}" | |
50 | mount -u -o ro / | |
51 | root_device=$(mount | sed -n 's:/dev/\(.*\) on / .*:\1:p') | |
52 | case "${root_device}" in | |
53 | vn*) | |
54 | if ! touch "${netboot_shadow}" ; then | |
55 | Failed "create ${netboot_shadow} failed" | |
56 | fi | |
57 | chmod 600 "${netboot_shadow}" | |
58 | if ! /usr/libexec/vndevice shadow "/dev/r${root_device}" "${netboot_shadow}" ; then | |
59 | Failed "vndevice shadow failed" | |
60 | fi | |
61 | ;; | |
62 | "") | |
63 | Failed "root device unknown" | |
64 | ;; | |
65 | *) | |
66 | if ! touch "${netboot_shadow}" ; then | |
67 | Failed "failed to create shadow ${netboot_shadow}" | |
68 | fi | |
69 | chmod 600 "${netboot_shadow}" | |
70 | if ! /usr/bin/nbdst -recycle "${root_device}" "${netboot_shadow}" ; then | |
71 | Failed "nbdst failed" | |
72 | fi | |
73 | ;; | |
74 | esac | |
75 | } | |
76 | ||
77 | local_mount() | |
78 | { | |
ef398931 A |
79 | tries=0 |
80 | limit=11 | |
81 | while [ $tries -lt $limit ]; do | |
82 | tries=$(( tries + 1 )) | |
83 | volinfo=`autodiskmount -F 2>/dev/null` | |
84 | if [ $? -ne 0 ]; then | |
85 | if [ $tries -lt $limit ]; then | |
86 | echo "Waiting for local drives..." | |
87 | echo "Waiting for local drives (retry ${tries}/$(( limit - 1 )))..." > /dev/console | |
88 | sleep 5 | |
89 | else | |
90 | echo "autodiskmount -F found no local drives" | |
91 | return 1 | |
92 | fi | |
93 | else | |
94 | tries=$limit | |
95 | fi | |
96 | done | |
e91b9f68 A |
97 | set ${volinfo} |
98 | devname=$1 | |
99 | fstype=$2 | |
100 | ||
101 | mount -t "${fstype}" -o nosuid,nodev "/dev/${devname}" "${NETBOOT_MOUNT}" 2>&1 | |
102 | if [ $? -ne 0 ]; then | |
103 | echo "mount of ${devname} failed" | |
104 | return 1 | |
105 | fi | |
106 | common_start "${NETBOOT_MOUNT}/.com.apple.NetBootX" shadowfile | |
107 | return 0 | |
108 | } | |
109 | ||
110 | network_mount() | |
111 | { | |
112 | mount_from=$(ipconfig netbootoption shadow_mount_path 2>&1) | |
113 | if [ $? -ne 0 ]; then | |
114 | echo "no network shadow mount path available" | |
115 | return 1 | |
116 | fi | |
117 | shadow_path=$(ipconfig netbootoption shadow_file_path 2>&1) | |
118 | if [ $? -ne 0 ]; then | |
119 | echo "no network shadow file path available" | |
120 | return 1 | |
121 | fi | |
122 | case "${mount_from}" in | |
123 | afp:*) fstype=afp;; | |
124 | nfs:*) fstype=nfs;; | |
125 | *) echo "unknown network filesystem mount from ${mount_from}" | |
126 | return 1 | |
127 | ;; | |
128 | esac | |
129 | mount -t "${fstype}" "${mount_from}" "${NETBOOT_MOUNT}" | |
130 | if [ $? -ne 0 ]; then | |
131 | echo "mount -t ${fstype} ${mount_from} ${NETBOOT_MOUNT} failed" | |
132 | return 1 | |
133 | fi | |
134 | common_start "${NETBOOT_MOUNT}" "${shadow_path}" | |
135 | return 0 | |
136 | } | |
137 | ||
138 | do_start() | |
139 | { | |
140 | case "${NETBOOT_SHADOW}" in | |
141 | -LOCAL_ONLY-) | |
142 | err=$(local_mount) | |
143 | if [ $? -ne 0 ]; then | |
144 | Failed "${err}" | |
145 | fi | |
146 | ;; | |
147 | -LOCAL-) | |
148 | err=$(local_mount) | |
149 | if [ $? -ne 0 ]; then | |
150 | err=$(network_mount) | |
151 | if [ $? -ne 0 ]; then | |
152 | Failed "Could not find a local or network drive" | |
153 | fi | |
154 | fi | |
155 | ;; | |
156 | -NETWORK_ONLY-) | |
157 | err=$(network_mount) | |
158 | if [ $? -ne 0 ]; then | |
159 | Failed "${err}" | |
160 | fi | |
161 | ;; | |
162 | ||
163 | *) | |
164 | err=$(network_mount) | |
165 | if [ $? -ne 0 ]; then | |
166 | err=$(local_mount) | |
167 | if [ $? -ne 0 ]; then | |
168 | Failed "Could not find a network or local drive" | |
169 | fi | |
170 | fi | |
171 | ;; | |
172 | esac | |
173 | ||
174 | } | |
175 | ||
ed34e3c3 | 176 | do_init() |
e91b9f68 | 177 | { |
ed34e3c3 A |
178 | # attach the shadow file to the root disk image |
179 | do_start | |
e91b9f68 | 180 | |
ed34e3c3 A |
181 | # make sure the root filesystem is clean |
182 | fsck -p || fsck -fy || Failed "Could not clean root filesystem" | |
e91b9f68 | 183 | |
ed34e3c3 A |
184 | # make it writable |
185 | mount -uw / | |
e91b9f68 | 186 | |
ed34e3c3 A |
187 | # adjust /private/var/vm to point to the writable area (if not diskless) |
188 | swapdir=/private/var/vm | |
189 | mounted_from=$(mount | sed -n 's:\(.*\) on .*/var/netboot.*:\1:p') | |
e91b9f68 A |
190 | case "${mounted_from}" in |
191 | /dev/*) | |
192 | netboot_dir="${NETBOOT_MOUNT}/.com.apple.NetBootX" | |
193 | if [ -d "${netboot_dir}" ]; then | |
e91b9f68 A |
194 | rm -rf "${swapdir}" |
195 | ln -s "${netboot_dir}" "${swapdir}" | |
196 | fi | |
197 | ;; | |
198 | *) | |
199 | ;; | |
200 | esac | |
ed34e3c3 A |
201 | |
202 | # set the ComputerName based on what the NetBoot server told us it was | |
203 | machine_name=$(ipconfig netbootoption machine_name 2>&1) | |
204 | if [ $? -ne 0 ]; then | |
205 | echo "no machine name option available" | |
206 | else | |
207 | echo "Setting ComputerName to ${machine_name}" | |
208 | scutil --set ComputerName "${machine_name}" | |
209 | fi | |
e91b9f68 A |
210 | } |
211 | ||
ed34e3c3 | 212 | |
e91b9f68 A |
213 | if [ $# -lt 1 ] ; then |
214 | exit 0 | |
215 | fi | |
216 | ||
217 | command=$1 | |
218 | ||
219 | shift | |
220 | ||
221 | case "${command}" in | |
ed34e3c3 A |
222 | init) |
223 | do_init $@ | |
e91b9f68 A |
224 | ;; |
225 | esac | |
226 | ||
227 | ## | |
228 | # Exit | |
229 | ## | |
230 | exit 0 |