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