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