source: hybrid/branches/releng-9.0/nanobsd/tools/image@ 11009

Last change on this file since 11009 was 11009, checked in by rick, 13 years ago

Should be enough warnings to warn user why this many times the password needs
to be typed. Please do mind that Hybrid->Hybrid updates are much faster the
old way.

Related-To: nodefactory:ticket:188

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
File size: 7.0 KB
Line 
1#!/bin/sh
2#
3BASEDIR=`dirname $0`
4. ${BASEDIR}/package-build.inc.sh
5
6NANOBSD="$NANO_SRC/tools/tools/nanobsd/nanobsd.sh"
7
8usage() {
9cat <<EOF
10# Usage $0 <arguments>
11#
12# Wrapper around nanobsd.sh with autodetection of already processed steps to
13# provide some failsafe net, which avoids building world and/or kernel by
14# default.
15#
16# Rick van der Zwet <rick@wirelessleiden.nl>
17#
18# Arguments:
19# build - Build NanoBSD parts which are not build yet
20# build force kernel - Build NanoBSD and force rebuilding the kernel
21# build force world - Build NanoBSD and force rebuilding world
22# edit - Manually edit the image
23# config [for <node>] - Configure image to be used for <node>
24# rebuild - Rebuild NanoBSD (aka force rebuilding all)
25# deploy on <node> [and reboot] - Deploy the image on node and reboot if needed
26# ports update - Update the packages from ports
27# ports force rebuild - Forcefully rebuilding all required packages
28EOF
29}
30
31
32deploy_image() {
33 # Find object directory
34 img=${OBJDIR}/_.disk.image
35
36 if [ ! -r "$img" ]; then
37 p_err Source $img does not exists
38 exit 1
39 fi
40
41 prompt_timeout=5
42 p_warn "Going to DEPLOY $img to $host: (8.X-RELEASE and 9.X-RELEASE) to 9.X RELEASE"
43 $do_reboot && p_warn "AND will REBOOT the $host"
44 p_warn "Please do mind to use your ssh key else you be required to type the root"
45 p_warn "password AT LEAST 5 times"
46
47
48 p_warn "Press CTRL+C in $prompt_timeout seconds to CANCEL"
49 sleep $prompt_timeout
50
51 # Details and alive checkings
52 ssh $host mount || exit 1
53 P=`ssh $HOST df / | grep '1a ' && echo "p2" || echo "p1"` || exit 1
54 echo "# Updating partition $P"
55
56 cat $img | ssh $host sh -x /tools/update$P || exit 1
57
58 # Hack to make sure we update the fstab the right way when converting from
59 # 8.X-RELEASE to 9.X-RELEASE. ad0 naming changed to ada0.
60 if [ "$P" = "p2" ]; then
61 cat <<'EOF' | ssh $HOST sh -x || exit 1
62mount -uwo noatime /dev/ad0s2a
63sed -i "" "s/ada0s1/ada0s2/" /mnt/conf/base/etc/fstab /mnt/etc/fstab
64umount
65EOF
66
67 fi
68
69 if $do_reboot; then
70 ssh $host reboot
71 fi
72}
73
74config_image() {
75 node_name=${1:+"-b -c $1"}
76
77 img=$OBJDIR/_.disk.full
78
79 mnt=`mktemp -d -t $(basename $0)`
80 md=`mdconfig -a -t vnode -f $img`
81
82 # Clean up when done
83 trap "umount $mnt/dev; umount $mnt/cfg; umount $mnt; mdconfig -d -u $md; rm -d $mnt" 0
84 trap "exit 1" 1 2 3 15
85
86 # Root filesystem
87 mount /dev/${md}s1a $mnt || exit 1
88
89 # /dev/null in chroot
90 mount -t devfs devfs ${mnt}/dev || exit 1
91
92 # Config files lives at /cfg location
93 mount /dev/${md}s3 $mnt/cfg || exit 1
94
95 # Try to fetch and store config
96 chroot $mnt /tools/wl-config -d -n -m startup $node_name || exit 1
97}
98
99edit_image() {
100 img=$OBJDIR/_.disk.full
101
102 mnt=`mktemp -d -t $(basename $0)`
103 md=`mdconfig -a -t vnode -f $img`
104
105 # Clean up when done
106 trap "umount $mnt/dev; umount $mnt/cfg; umount $mnt; mdconfig -d -u $md; rm -d $mnt" 0
107 trap "exit 1" 1 2 3 15
108
109 # Root filesystem
110 mount /dev/${md}s1a $mnt || exit 1
111
112 # /dev/null in chroot
113 mount -t devfs devfs ${mnt}/dev || exit 1
114
115 # Config files lives at /cfg location
116 mount /dev/${md}s3 $mnt/cfg || exit 1
117
118 # Nasty hack to set custom prompt
119 prompt='set prompt = "image# "'
120 echo $prompt >> $mnt/root/.cshrc
121
122 p_info "Type exit when done"
123 chroot $mnt
124 p_info "Any changes are made permanent on image $img"
125
126 # Unset prompt again
127 sed -I '' "/^$prompt$/d" $mnt/root/.cshrc
128}
129
130
131build_image() {
132 p_info Forcefully building kernel: $FORCE_KERNEL
133 p_info Forcefully building world : $FORCE_WORLD
134
135 NANOBSD_EXTRA=${NANOBSD_EXTRA:-''}
136
137 if [ ! -r "${NANOBSD}" ]; then
138 p_err ${NANOBSD} does not exists
139 exit 1
140 fi
141
142 if [ ! -x "${NANOBSD}" ]; then
143 NANOBSD="sh ${NANOBSD}"
144 fi
145
146 # Find object directory
147 OBJDIR="/usr/obj/nanobsd.${NANO_NAME}"
148
149 if [ -d "${OBJDIR}" ]; then
150 NANOBSD_FLAGS=""
151
152 # Detect succesfull buildworld
153 tail -10 ${OBJDIR}/_.bw | grep 'World build completed'
154 if [ $? -eq 0 -a ${FORCE_WORLD} = "no" ]; then
155 p_info NO building of world
156 NANOBSD_FLAGS="${NANOBSD_FLAGS} -w"
157 fi
158
159 # Detect succesfull buildkernel
160 tail -10 ${OBJDIR}/_.bk | grep 'Kernel build for .* completed'
161 if [ $? -eq 0 -a ${FORCE_KERNEL} = "no" ]; then
162 p_info NO building of kernel
163 NANOBSD_FLAGS="${NANOBSD_FLAGS} -k"
164 fi
165
166 else
167 p_warn Nothing yet, starting fresh
168 NANOBSD_FLAGS=""
169 fi
170
171 # Provide verbose output by default
172 COMMAND="${NANOBSD} ${NANOBSD_FLAGS} -c ${NANO_CFG_FILE} -v ${NANOBSD_EXTRA}"
173 f_time ${COMMAND}
174 RETVAL=$?
175
176 # Verify on build failures
177 tail -10 ${OBJDIR}/_.bw | grep 'World build completed'
178 if [ $? -eq 1 ]; then
179 p_err Building world FAILED, check ${OBJDIR}/_.bw
180 fi
181 tail -10 ${OBJDIR}/_.bk | grep 'Kernel build for .* completed'
182 if [ $? -eq 1 ]; then
183 p_err Building kernel FAILED, check ${OBJDIR}/_.bk
184 fi
185 if [ $RETVAL -ne 0 ]; then
186 p_err "Errors in building NanoBSD Image ($RETVAL)"
187 fi
188 p_info End time: `date`
189 exit ${RETVAL}
190}
191
192#
193# Argument parsing
194#
195FORCE_KERNEL=${FORCE_KERNEL:-"no"}
196FORCE_WORLD=${FORCE_WORLD:-"no"}
197if [ -z "$1" ]; then
198 usage; exit 1
199elif [ "$1" = "build" ]; then
200 if [ -z "$2" ]; then
201 elif [ "$2" = "force" ]; then
202 if [ "$3" = "kernel" ]; then
203 FORCE_KERNEL="yes"
204 elif [ "$3" = "world" ]; then
205 FORCE_WORLD="yes"
206 else
207 echo "Argument Error - '$3'"; exit 128
208 fi
209 else
210 echo "Argument Error - '$2'"; exit 128
211 fi
212 build_image
213elif [ "$1" = "rebuild" ]; then
214 FORCE_KERNEL="yes"
215 FORCE_WORLD="yes"
216 build_image
217elif [ "$1" = "deploy" -a "$2" = "on" ]; then
218 if [ -z "$3" ]; then
219 echo "Argument Error - '$3'"; exit 128
220 fi
221 host=$3
222 do_reboot=false
223 if [ -n "$4" -o -n "$5" ]; then
224 if [ "$4" = "and" -a "$5" = "reboot" ]; then
225 do_reboot=true
226 else
227 echo "Argument Error - '$4 $5'"; exit 128
228 fi
229 fi
230 deploy_image
231elif [ "$1" = "ports" ]; then
232 if [ "$2" = "update" ]; then
233 # Fetch the latest details and provide listing of packages to be updated
234 portsnap fetch update || exit 1
235
236 # HACK: install our own ports _inside_ the normal ports dir
237 cp -fR $WL_PORTSDIR/* $PORTSDIR || exit 1
238
239 # Make sure portmaster is present to update all ports
240 portmaster --version 1>/dev/null 2>/dev/null || make -C /usr/ports/ports-mgmt/portmaster BATCH=yes install clean || exit 1
241
242 # Update via portmaster
243 portmaster --no-confirm --update-if-newer -y -d -G `echo $PKG_MAKE_ARGS | xargs -n1 echo -m ` $PACKAGE_LIST
244
245 . ${BASEDIR}/package-build.sh
246 elif [ "$2" = "force" -a "$3" = "rebuild" ]; then
247 export FORCE_REBUILD=1
248 . ${BASEDIR}/package-build.sh
249 else
250 shift 1
251 echo "Arguments Error - '$*'"; exit 128
252 fi
253elif [ "$1" = "config" ]; then
254 if [ "$2" = "for" ]; then
255 if [ -n "$3" ]; then
256 node_name=$3
257 else
258 echo "Arguments Error - '$*'"; exit 128
259 fi
260 else
261 echo "Arguments Error - '$*'"; exit 128
262 fi
263 config_image $node_name
264elif [ "$1" = "edit" ]; then
265 edit_image
266else
267 echo "Argument Error - '$1'"; exit 128
268fi
269
Note: See TracBrowser for help on using the repository browser.