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