Annotation of openbsd/update_openbsd/update_openbsd, Revision 1.13
1.1 andrew 1: #!/bin/sh
1.13 ! andrew 2: # $RedRiver: update_openbsd,v 1.12 2008/11/12 06:07:42 andrew Exp $
1.2 andrew 3:
4: if [ -e /etc/update_openbsd.conf ]; then
5: . /etc/update_openbsd.conf
6: fi
7:
8: if [ -e ${HOME}/.update_openbsdrc ]; then
9: . ${HOME}/.update_openbsdrc
10: fi
11:
1.7 andrew 12: MIRROR=${MIRROR:=ftp://ftp.openbsd.org/pub/OpenBSD}
13: FTP_CMD=${FTP_CMD:=ftp -V}
14: PKG_PATH=${PKG_PATH:=/usr/ports/packages/`machine`/all/:${MIRROR}/`uname -r`/packages/`machine`/}
15:
16: DESTDIR=${DESTDIR:=/}
17: SYSMERGE=${SYSMERGE:=/usr/sbin/sysmerge}
1.10 andrew 18: FORCE_DIR=${FORCE_DIR:=No}
1.7 andrew 19:
1.2 andrew 20: installed_sets() {
1.5 andrew 21: local misc=/usr/share/doc/README
22: local man=/usr/share/man/cat1/intro.0
23: local comp=/usr/bin/cc
24: local game=/usr/games/
25: local xbase=/usr/X11R6/
26: local xetc=/etc/X11/xinit/xinitrc
27: local xfont=/usr/X11R6/lib/X11/fonts
28: local xserv=/usr/X11R6/bin/X
29: local xshare=/usr/X11R6/bin/startx
30:
31: local _c _d _e
32: echo -n base
33: echo -n ' etc'
1.3 andrew 34: for _d in misc man comp game xbase xetc xfont xserv xshare; do
35: eval _e=\$${_d}
36: _c=`ls $_e 2> /dev/null | wc -l`
37: #echo $_c $_d $_e
38: if [ $_c -ne 0 ]; then
1.5 andrew 39: echo -n " $_d"
1.2 andrew 40: fi
41: done
42: }
1.7 andrew 43: INSTALLED_SETS=${INSTALLED_SETS:=`installed_sets`}
44:
1.10 andrew 45: sets_exist () {
46: local _proto=${FTP%%://*}
47:
48: if [ X"ftp" == X"${_proto}" ]; then
49: echo "ls base*.tgz" | ${FTP_CMD} ${FTP}/ | awk '{ print $9 }'
50: elif [ X"http" == X"${_proto}" ]; then
51: ${FTP_CMD} -V -o - ${FTP}/ | grep '"base[0-9][0-9].tgz' | sed -e 's/.*\(base..\.tgz\).*/\1/'
52: else
53: echo Unsupported FTP ${FTP} >&2
1.12 andrew 54: return 2
1.10 andrew 55: fi
56: }
1.2 andrew 57:
58: set_version() {
59: CUR_VER=`uname -r`
1.3 andrew 60: NEW_VER=`dc -e "$CUR_VER 0.1 + p"`
1.5 andrew 61: FILE_VER=""
62: FTP=""
1.2 andrew 63:
1.5 andrew 64: local _cv=`echo $CUR_VER | sed -e 's/\.//'`
65: local _nv=`echo $NEW_VER | sed -e 's/\.//'`
1.9 andrew 66: local _v
1.5 andrew 67:
1.10 andrew 68: if [ X"No" != X"$FORCE_DIR" -a -d $FORCE_DIR ]; then
1.5 andrew 69: _dir=$FORCE_DIR
70: if [ -e ${_dir}/base${_nv}.tgz ]; then
71: _v=$_nv
72: elif [ -e ${_dir}/base${_cv}.tgz ]; then
73: NEW_VER=$CUR_VER
74: _v=$_cv
75: fi
1.2 andrew 76:
1.5 andrew 77: elif [ -d $CUR_VER ]; then
78: _dir=$CUR_VER
1.2 andrew 79: NEW_VER=$CUR_VER
1.5 andrew 80: if [ -e ${_dir}/base${_cv}.tgz ]; then
81: _v=$_cv
82: fi
1.2 andrew 83:
1.5 andrew 84: elif [ -d $NEW_VER ]; then
85: _dir=$NEW_VER
86: if [ -e ${_dir}/base${_nv}.tgz ]; then
87: _v=$_nv
88: fi
1.2 andrew 89:
90: fi
91:
1.5 andrew 92: if [ X"" == X"${_v}" ]; then
1.10 andrew 93: if [ X"No" == X"${FORCE_DIR}" ]; then
1.5 andrew 94: _dir=${NEW_VER}
95: else
96: _dir=${FORCE_DIR}
97: fi
98: FTP=${MIRROR}/${_dir}/`machine`
1.2 andrew 99:
1.10 andrew 100: _file=`sets_exist`
101:
102: if [ X"" == X"${_file}" ]; then
103: if [ X"No" != X"$FORCE_DIR" ]; then
104: echo No sets in forced [${FTP}] >&2
1.12 andrew 105: return 2
1.10 andrew 106: fi
107:
108: NEW_VER=$CUR_VER
109: _dir=${NEW_VER}
110: FTP=${MIRROR}/${_dir}/`machine`
111:
112: _file=`sets_exist`
113: if [ X"" == X"${_file}" ]; then
114: echo No sets in [${FTP}] >&2
1.12 andrew 115: return 2
1.10 andrew 116: fi
1.9 andrew 117: fi
118:
1.10 andrew 119: _v=${_file##*base}
120: _v=${_v%.tgz*}
1.2 andrew 121:
1.10 andrew 122: if [ X"" == X"${_v}" ]; then
123: echo No version in file [$_file] >&2
1.12 andrew 124: return 2
1.10 andrew 125: elif [ X"${_cv}" == X"${_v}" ]; then
1.5 andrew 126: NEW_VER=$CUR_VER
1.9 andrew 127: elif [ X"${_nv}" == X"${_v}" ]; then
128: NEW_VER=$NEW_VER
1.2 andrew 129: else
1.10 andrew 130: echo Invalid version [$_v] >&2
1.12 andrew 131: return 2
1.2 andrew 132: fi
133:
1.10 andrew 134: if [ X"No" == X"$FORCE_DIR" ]; then
1.5 andrew 135: _dir=$NEW_VER
1.2 andrew 136: fi
137:
138: fi
139:
1.5 andrew 140: if [ X"" == X"${_v}" ]; then
141: echo ERROR: Unable to determine file version! >&2
1.12 andrew 142: return 1
1.2 andrew 143: fi
144:
1.5 andrew 145: if [ X"" == X"$RELEASEDIR" ]; then
146: RELEASEDIR=`pwd`/$_dir
1.2 andrew 147: fi
1.9 andrew 148:
1.5 andrew 149: FILE_VER=$_v
150: FTP=${MIRROR}/${_dir}/`machine`
1.2 andrew 151: }
152:
153: get_sets() {
1.5 andrew 154: echo '### GETTING SETS ###'
1.2 andrew 155: if [ X"" == X"$FTP" ]; then
1.5 andrew 156: echo ERROR: No FTP site set! >&2
1.12 andrew 157: return 1
1.2 andrew 158: fi
159:
1.5 andrew 160: mkdir -p ${RELEASEDIR}
161: cd $RELEASEDIR
1.2 andrew 162:
1.5 andrew 163: local _v=$FILE_VER
1.2 andrew 164:
1.5 andrew 165: for _b in `echo /bsd* bsd bsd.mp bsd.rd | sort -u`; do
1.2 andrew 166: if [ -e /${_b} -a ! -e ./${_b} ]; then
1.3 andrew 167: echo $FTP_CMD ${FTP}/${_b}
168: $FTP_CMD ${FTP}/${_b}
1.2 andrew 169: fi
170: done
171:
1.5 andrew 172: for _s in $INSTALLED_SETS; do
173: if [ ! -e ./${_s}${_v}.tgz ]; then
174: echo $FTP_CMD ${FTP}/${_s}${_v}.tgz
175: $FTP_CMD ${FTP}/${_s}${_v}.tgz
176: fi
1.2 andrew 177: done
178:
1.6 andrew 179: if [ ! -e MD5 ]; then
180: echo $FTP_CMD ${FTP}/MD5
181: $FTP_CMD ${FTP}/MD5
182: fi
183:
1.11 andrew 184: ls bsd* *.tgz | sed -e 's/\(.*\)/(\1)/' > index
1.2 andrew 185: grep -f index MD5 | md5 -c
186:
187: if [ $? -ne 0 ]; then
1.5 andrew 188: echo ERROR: MD5 does not match! >&2
1.12 andrew 189: return 1
1.2 andrew 190: fi
191: }
192:
193: install_kernel() {
1.5 andrew 194: echo '### INSTALLING KERNEL ###'
1.3 andrew 195: if [ X"$USER" != X"root" -a X"$SUDO" == X"" ]; then
1.2 andrew 196: echo ${0##*/} must be run as root or SUDO must be set! >&2
197: exit 1
198: fi
199:
200: if [ X"" == X"$RELEASEDIR" ]; then
1.5 andrew 201: echo ERROR: no source for new kernels! >&2
1.2 andrew 202: exit 1
203: else
204: cd $RELEASEDIR
205: fi
206:
207: if [ ! -e bsd ]; then
1.5 andrew 208: echo ERROR: new bsd kernel does not exist! >&2
1.2 andrew 209: exit 1
210: fi
211:
212: if [ -e /bsd.mp -a ! -e bsd.mp ]; then
1.5 andrew 213: echo ERROR: new bsd.mp kernel does not exist! >&2
1.2 andrew 214: exit 1
215: fi
216:
217: if [ ! -e bsd.rd ]; then
1.5 andrew 218: echo ERROR: new bsd.rd kernel does not exist! >&2
1.2 andrew 219: exit 1
220: fi
221:
1.5 andrew 222: local _v=$FILE_VER
1.2 andrew 223: if [ -e base${_v}.tgz ]; then
1.13 ! andrew 224: echo Extracting new firmware and ifconfig from base${_v}.tgz
! 225: $SUDO tar -C $DESTDIR -xzphf base${_v}.tgz \
! 226: ./etc/firmware ./sbin/ifconfig
1.2 andrew 227: fi
228:
1.3 andrew 229: $SUDO rm -f /obsd
230: $SUDO ln /bsd /obsd
1.2 andrew 231: if [ $? -ne 0 ]; then
232: echo "Error copying old kernel!"
233: exit 1
234: fi
235:
1.3 andrew 236: for _b in bsd*; do
237: $SUDO rm -f /nbsd
1.2 andrew 238:
1.5 andrew 239: if [ X"${_b}" == X"bsd" ]; then
1.2 andrew 240: echo Copying bsd to /bsd.sp
1.3 andrew 241: $SUDO cp bsd /nbsd && $SUDO mv /nbsd /bsd.sp
1.2 andrew 242: if [ $? -ne 0 ]; then
1.5 andrew 243: echo ERROR: Could not copy new SP kernel! >&2
1.2 andrew 244: exit 1
245: fi
246: else
1.3 andrew 247: if [ -e /$_b ]; then
248: echo Copying $_b to /
249: $SUDO cp ${_b} /nbsd && $SUDO mv /nbsd /${_b}
1.2 andrew 250: if [ $? -ne 0 ]; then
1.5 andrew 251: echo ERROR: Could not copy new $_b kernel! >&2
1.2 andrew 252: exit 1
253: fi
254: fi
255: fi
256: done
257:
258: if [ ! -h /bsd ]; then
259: if [ -e /bsd.mp ]; then
260: echo linking /bsd.mp to /bsd
1.3 andrew 261: $SUDO ln -sf /bsd.mp /bsd
1.2 andrew 262: else
263: echo linking /bsd.sp to /bsd
1.3 andrew 264: $SUDO ln -sf /bsd.sp /bsd
1.2 andrew 265: fi
266: if [ $? -ne 0 ]; then
1.5 andrew 267: echo ERROR: Could not symlink new kernel! >&2
1.2 andrew 268: exit 1
269: fi
270: fi
271: }
272:
273: install_sets() {
1.5 andrew 274: echo '### INSTALLING SETS ###'
1.3 andrew 275: if [ X"$USER" != X"root" -a X"$SUDO" == X"" ]; then
1.2 andrew 276: echo ${0##*/} must be run as root or SUDO must be set! >&2
277: exit 1
278: fi
279:
280: if [ X"" == X"$RELEASEDIR" ]; then
1.5 andrew 281: echo ERROR: no source for sets! >&2
1.2 andrew 282: exit 1
283: else
284: cd $RELEASEDIR
285: fi
286:
1.5 andrew 287: local _v=$FILE_VER
288:
1.2 andrew 289: for _f in *${_v}.tgz; do
1.3 andrew 290: _path=$DESTDIR
291: if [ X"etc${_v}.tgz" == X"$_f" \
292: -o X"xetc${_v}.tgz" == X"$_f" ]; then
293: if [ X"" != X"$SYSMERGE" ]; then
1.2 andrew 294: continue
295: fi
296: _path=/var/tmp/temproot
297: fi
298:
1.3 andrew 299: echo Extracting $_f to $_path
300: $SUDO mkdir -p $_path
301: $SUDO tar -C $_path -xzphf ${RELEASEDIR}/${_f}
1.2 andrew 302: if [ $? -ne 0 ]; then
1.5 andrew 303: echo ERROR: Could not extract ${_f}! >&2
1.2 andrew 304: exit 1
305: fi
306: done
307:
308: echo Extracted all sets.
309: }
310:
311: update_etc() {
1.5 andrew 312: echo '### UPDATING ETC ###'
1.10 andrew 313: if [ ! -e $SYSMERGE ]; then
314: SYSMERGE=
315: fi
316:
1.3 andrew 317: if [ X"" == X"$SYSMERGE" ]; then
1.2 andrew 318: if [ -e /var/tmp/temproot ]; then
319: MERGEMASTER=`which mergemaster`
320:
321: if [ $? != 0 ]; then
1.3 andrew 322: $SUDO pkg_add -i mergemaster
1.5 andrew 323:
1.2 andrew 324: MERGEMASTER=`which mergemaster`
325: if [ $? != 0 ]; then
326: echo ERROR: mergemaster not installed! >&2
327: exit 1
328: fi
329: fi
330:
331: echo '### RUNNING MERGEMASTER ###'
1.3 andrew 332: $SUDO $MERGEMASTER -irv
1.2 andrew 333: else
334: echo "ERROR: no source for etc!" >&2
335: exit 1
336: fi
337: else
338: if [ X"" == X"$RELEASEDIR" ]; then
339: echo "ERROR: no source for etc!" >&2
340: exit 1
341: else
342: cd $RELEASEDIR
343: fi
344:
1.5 andrew 345: local _v=$FILE_VER
346: if [ -e etc${_v}.tgz ]; then
347: _args="$_args -s etc${_v}.tgz"
1.2 andrew 348: fi
1.5 andrew 349: if [ -e xetc${_v}.tgz ]; then
350: _args="$_args -x xetc${_v}.tgz"
1.2 andrew 351: fi
352: if [ X"" == X"$_args" ]; then
353: echo ERROR: No upgrade sets found! >&2
354: else
355: echo '### RUNNING SYSMERGE ###'
356: _args="-a $_args"
1.3 andrew 357: $SUDO $SYSMERGE $_args
1.2 andrew 358: fi
359: fi
360: }
361:
362: set_version
1.12 andrew 363: local _error=$?
1.2 andrew 364:
365: echo
366: echo "-= update_openbsd - helper script to update OpenBSD =-"
367: echo "------------------------------------------------------"
368: echo
1.8 andrew 369: echo " SUDO: $SUDO"
370: echo " SYSMERGE: $SYSMERGE"
371: echo " MIRROR: $MIRROR"
372: echo " RELEASEDIR: $RELEASEDIR"
373: echo " DESTDIR: $DESTDIR"
374: echo "INSTALLED_SETS: $INSTALLED_SETS"
375: echo
376: echo " CUR_VER: $CUR_VER"
377: echo " NEW_VER: $NEW_VER"
378: #echo " FILE_VER: $FILE_VER"
1.2 andrew 379: echo
1.12 andrew 380:
381: if [ ${_error} -ne 0 ]; then
382: exit ${_error}
383: fi
1.2 andrew 384:
1.5 andrew 385: get_sets
1.2 andrew 386:
387: if [ X"" != X"$SUDO" ]; then
388: echo Please enter your sudo password if prompted.
389: echo You may be asked for it again later in the process.
390: $SUDO -v
391: fi
392:
393: install_kernel
394:
1.5 andrew 395: if [ $CUR_VER == $NEW_VER ]; then
1.2 andrew 396: install_sets
397: update_etc
398:
399: echo '### UPDATING PACKAGES ###'
400: $SUDO pkg_add -ui -F update -F updatedepends
401:
402: else
403: echo Instructions for updating to the new version available from
404: echo " http://www.openbsd.org/faq/upgrade${_v}.html"
405: fi
406:
407: echo New kernel installed. Please reboot!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>