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