]> git.saurik.com Git - apple/launchd.git/blame - launchd/src/rc.netboot
launchd-258.25.tar.gz
[apple/launchd.git] / launchd / src / rc.netboot
CommitLineData
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
24NETBOOT_MOUNT=/var/netboot
25NETBOOT_SHADOW=${NETBOOT_SHADOW:-NETWORK-}
26
27Failed()
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
35common_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
77local_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
110network_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
138do_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 176do_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
213if [ $# -lt 1 ] ; then
214 exit 0
215fi
216
217command=$1
218
219shift
220
221case "${command}" in
ed34e3c3
A
222 init)
223 do_init $@
e91b9f68
A
224 ;;
225esac
226
227##
228# Exit
229##
230exit 0