Annotation of openbsd/update_openbsd/update_openbsd, Revision 1.104
1.1 andrew 1: #!/bin/sh
1.104 ! andrew 2: # $AFresh1: update_openbsd,v 1.103 2017/12/11 02:50:09 andrew Exp $
1.94 andrew 3: #
1.41 andrew 4: # Copyright (c) 2012 Andrew Fresh <andrew@afresh1.com>
5: #
6: # Permission to use, copy, modify, and distribute this software for any
7: # purpose with or without fee is hereby granted, provided that the above
8: # copyright notice and this permission notice appear in all copies.
9: #
10: # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15: # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16: # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: #
1.7 andrew 18:
1.2 andrew 19: installed_sets() {
1.5 andrew 20: local misc=/usr/share/doc/README
1.63 andrew 21: local man=/usr/share/man/man1/intro.1
1.5 andrew 22: local comp=/usr/bin/cc
23: local game=/usr/games/
24: local xbase=/usr/X11R6/
25: local xetc=/etc/X11/xinit/xinitrc
26: local xfont=/usr/X11R6/lib/X11/fonts
27: local xserv=/usr/X11R6/bin/X
28: local xshare=/usr/X11R6/bin/startx
29:
1.75 andrew 30: local _nv=`echo $NEW_VER | sed -e 's/\.//'`
1.5 andrew 31: local _c _d _e
32: echo -n base
1.75 andrew 33: [ $_nv -lt 57 ] && echo -n ' etc'
1.3 andrew 34: for _d in misc man comp game xbase xetc xfont xserv xshare; do
1.75 andrew 35: [ $_d = xetc -a $_nv -ge 57 ] && continue
1.3 andrew 36: eval _e=\$${_d}
37: _c=`ls $_e 2> /dev/null | wc -l`
38: #echo $_c $_d $_e
39: if [ $_c -ne 0 ]; then
1.5 andrew 40: echo -n " $_d"
1.2 andrew 41: fi
42: done
1.19 andrew 43:
1.34 andrew 44: sendmail -d0.1 --badoption </dev/null 2>/dev/null | grep -q SASL
1.94 andrew 45: if [ $? == 0 ]; then
1.19 andrew 46: echo -n ' sendmail-smtp_auth'
47: fi
1.2 andrew 48: }
1.7 andrew 49:
1.39 andrew 50: kernel_file_version() {
51: echo exit | config -e $1 | grep -A1 ^OpenBSD
52: #what $1 | sed -ne 's/[[:blank:]]\{1,\}//p'
53: }
54:
1.16 andrew 55: version_in() {
1.10 andrew 56: local _proto=${FTP%%://*}
1.16 andrew 57: local _file
1.10 andrew 58:
59: if [ X"ftp" == X"${_proto}" ]; then
1.16 andrew 60: local _list=`echo "ls base*.tgz" | ${FTP_CMD} ${FTP}/`
61: _file=`echo ${_list} | awk '/base[0-9][0-9].tgz/ { print $9 }'`
1.15 andrew 62:
1.87 andrew 63: elif [ X"http" == X"${_proto}" -o X"https" == X"${_proto}" ]; then
1.96 andrew 64: _file=`${FTP_CMD} -V -o - ${FTP}/index.txt |
65: sed -ne 's/.*\(base[0-9][0-9].tgz\).*/\1/p'`
1.15 andrew 66:
67: elif [ X"scp" == X"${_proto}" ]; then
68: echo SCP is not yet supported >&2
69: return 2
70:
1.96 andrew 71: else
1.10 andrew 72: echo Unsupported FTP ${FTP} >&2
1.12 andrew 73: return 2
1.15 andrew 74:
1.10 andrew 75: fi
1.16 andrew 76:
77: local _v=${_file##*base}
78: _v=${_v%.tgz*}
79: echo $_v
1.10 andrew 80: }
1.2 andrew 81:
1.98 andrew 82: set_boot_device() {
83: BOOT_DEVICE=$( df -nP /bsd | sed -ne 's! .*/$!!p' )
1.97 andrew 84:
1.98 andrew 85: root_disk=$( echo $BOOT_DEVICE |
1.97 andrew 86: sed -e 's,/dev/\([a-z]*[0-9]\)[a-z].*,\1,' )
87: msdos_partition=$(
88: fdisk $root_disk | grep -q '^*.*FAT32' \
89: && \
90: disklabel $root_disk | sed -ne 's/:.*MSDOS//p' | tr -d ' '
91: )
92:
93: [ "$msdos_partition" ] &&
1.98 andrew 94: BOOT_DEVICE="/dev/$root_disk$msdos_partition"
1.97 andrew 95: }
96:
1.99 andrew 97: boot_device_mounted=""
98: mount_boot_device() {
1.103 andrew 99: [ "$boot_device_mounted" ] && return
1.99 andrew 100:
101: local default_mount=$( df -lnP /bsd | sed -ne 's!/dev/.* !!p' )
102: local boot_mount=$( mount |
103: sed -ne "s!^$BOOT_DEVICE on \([^ ]*\).*!\1!p" )
104:
105: if [ ! "$boot_mount" ]; then
1.101 andrew 106: mount $BOOT_DEVICE /mnt
1.102 andrew 107: boot_device_mounted=1
1.101 andrew 108: KERNEL_ROOT=/mnt
1.99 andrew 109: elif [ "$boot_mount" != "$default_mount" ]; then
1.101 andrew 110: KERNEL_ROOT=$boot_mount/
1.99 andrew 111: else
1.101 andrew 112: KERNEL_ROOT=${default_mount%/}/
1.99 andrew 113: fi
114: }
115:
116: umount_boot_device() {
1.101 andrew 117: [ "$boot_device_mounted" ] && umount $BOOT_DEVICE
1.99 andrew 118: boot_device_mounted=""
119: }
120:
1.104 ! andrew 121: find_boot_kernel() {
! 122: local _k=$( ( \
! 123: echo bsd; \
! 124: [ -e boot.conf ] && sed -E '/^ *(set +image|boot) +/!d ; \
! 125: s///; s/^.*://; s/ .*$//' boot.conf \
! 126: ) | tail -1 )
! 127: _k=$( follow_symlink $_k )
! 128:
! 129: local _d=$( dirname $_k )
! 130: [ "$_d" = "." ] && _d=$PWD
! 131:
! 132: if [ $_d = . -o $_d = $PWD ]; then
! 133: basename $_k
! 134: else
! 135: echo $_k
! 136: fi
! 137: }
! 138:
1.2 andrew 139: set_version() {
140: CUR_VER=`uname -r`
1.3 andrew 141: NEW_VER=`dc -e "$CUR_VER 0.1 + p"`
1.5 andrew 142: FILE_VER=""
143: FTP=""
1.2 andrew 144:
1.5 andrew 145: local _cv=`echo $CUR_VER | sed -e 's/\.//'`
146: local _nv=`echo $NEW_VER | sed -e 's/\.//'`
1.9 andrew 147: local _v
1.5 andrew 148:
1.10 andrew 149: if [ X"No" != X"$FORCE_DIR" -a -d $FORCE_DIR ]; then
1.5 andrew 150: _dir=$FORCE_DIR
151: if [ -e ${_dir}/base${_nv}.tgz ]; then
152: _v=$_nv
153: elif [ -e ${_dir}/base${_cv}.tgz ]; then
154: NEW_VER=$CUR_VER
155: _v=$_cv
156: fi
1.2 andrew 157:
1.5 andrew 158: elif [ -d $CUR_VER ]; then
159: _dir=$CUR_VER
1.2 andrew 160: NEW_VER=$CUR_VER
1.5 andrew 161: if [ -e ${_dir}/base${_cv}.tgz ]; then
162: _v=$_cv
163: fi
1.2 andrew 164:
1.5 andrew 165: elif [ -d $NEW_VER ]; then
166: _dir=$NEW_VER
167: if [ -e ${_dir}/base${_nv}.tgz ]; then
168: _v=$_nv
169: fi
1.2 andrew 170:
171: fi
172:
1.17 andrew 173: if [ X"" != X"${MIRROR}" -a X"" == X"${_v}" ]; then
1.89 andrew 174: if [ X"No" != X"${FORCE_DIR}" ]; then
175: _dir=${FORCE_DIR}
176: elif sysctl kern.version | grep -q -- '-current '; then
177: _dir=snapshots
178: FORCE_DIR=snapshots
179: else
1.5 andrew 180: _dir=${NEW_VER}
181: fi
182: FTP=${MIRROR}/${_dir}/`machine`
1.2 andrew 183:
1.16 andrew 184: _v=`version_in`
1.10 andrew 185:
1.16 andrew 186: if [ X"" == X"${_v}" ]; then
1.10 andrew 187: if [ X"No" != X"$FORCE_DIR" ]; then
188: echo No sets in forced [${FTP}] >&2
1.12 andrew 189: return 2
1.10 andrew 190: fi
191:
192: NEW_VER=$CUR_VER
193: _dir=${NEW_VER}
194: FTP=${MIRROR}/${_dir}/`machine`
195:
1.16 andrew 196: _v=`version_in`
1.9 andrew 197: fi
198:
1.10 andrew 199: if [ X"" == X"${_v}" ]; then
1.16 andrew 200: echo No sets in [${FTP}] >&2
1.94 andrew 201: return 2
1.10 andrew 202: elif [ X"${_cv}" == X"${_v}" ]; then
1.5 andrew 203: NEW_VER=$CUR_VER
1.9 andrew 204: elif [ X"${_nv}" == X"${_v}" ]; then
205: NEW_VER=$NEW_VER
1.2 andrew 206: else
1.10 andrew 207: echo Invalid version [$_v] >&2
1.12 andrew 208: return 2
1.2 andrew 209: fi
210:
1.10 andrew 211: if [ X"No" == X"$FORCE_DIR" ]; then
1.5 andrew 212: _dir=$NEW_VER
1.2 andrew 213: fi
214:
215: fi
216:
1.5 andrew 217: if [ X"" == X"${_v}" ]; then
1.64 andrew 218: if [ X"" == X"${MIRROR}" ]; then
219: echo ERROR: No sets, and no MIRROR, unable to continue. >&2
220: else
221: echo ERROR: Unable to determine FILE_VER, check your MIRROR. >&2
222: fi
1.12 andrew 223: return 1
1.2 andrew 224: fi
225:
1.5 andrew 226: if [ X"" == X"$RELEASEDIR" ]; then
227: RELEASEDIR=`pwd`/$_dir
1.2 andrew 228: fi
1.9 andrew 229:
1.5 andrew 230: FILE_VER=$_v
1.17 andrew 231: if [ X"" != X"${MIRROR}" ]; then
232: FTP=${MIRROR}/${_dir}/`machine`
233: fi
1.39 andrew 234:
1.101 andrew 235: KERNEL_ROOT=""
236: [ -z "$BOOT_DEVICE" ] && set_boot_device
237:
1.104 ! andrew 238: mount_boot_device
! 239: cd $KERNEL_ROOT
! 240: BOOT_KERNEL=$( find_boot_kernel )
! 241: BOOT_KERNEL_VERSION=$( kernel_file_version $BOOT_KERNEL )
! 242: cd $OLDPWD
! 243: umount_boot_device
1.39 andrew 244:
245: BOOTED_KERNEL_VERSION=`sysctl -n kern.version`
246: NEW_KERNEL_VERSION=""
247:
248: # We want to default to what we had
1.104 ! andrew 249: INSTALL_KERNELS="$BOOT_KERNEL"
1.48 andrew 250: # if the boot kernel was our specially named bsd.sp, we install from bsd
251: if [ X"$INSTALL_KERNELS" == X"bsd.sp" ]; then
252: INSTALL_KERNELS="bsd"
253: fi
1.39 andrew 254: # with a second option of an mp kernel if is is a likely candidate
255: if [ X"$INSTALL_KERNELS" != X"bsd.mp" ]; then
256: local _ncpu=$(sysctl -n hw.ncpufound)
257: [ $_ncpu -gt 1 ] && INSTALL_KERNELS="$INSTALL_KERNELS bsd.mp"
258: fi
259: # or just bsd otherwise
260: if [ X"${INSTALL_KERNELS% *}" != X"bsd" ]; then
261: INSTALL_KERNELS="$INSTALL_KERNELS bsd"
262: fi
263: BOOT_KERNELS=$INSTALL_KERNELS
264: INSTALL_KERNELS="$INSTALL_KERNELS bsd.rd"
1.2 andrew 265: }
266:
267: get_sets() {
1.54 andrew 268: echo '==> GETTING SETS'
1.2 andrew 269: if [ X"" == X"$FTP" ]; then
1.5 andrew 270: echo ERROR: No FTP site set! >&2
1.12 andrew 271: return 1
1.2 andrew 272: fi
273:
1.5 andrew 274: mkdir -p ${RELEASEDIR}
275: cd $RELEASEDIR
1.2 andrew 276:
1.5 andrew 277: local _v=$FILE_VER
1.2 andrew 278:
1.39 andrew 279: for _b in $INSTALL_KERNELS; do
1.45 andrew 280: if [ ! -e ./${_b} ]; then
1.54 andrew 281: echo "===> $FTP_CMD ${FTP}/${_b}"
1.3 andrew 282: $FTP_CMD ${FTP}/${_b}
1.70 andrew 283: else
284: echo "===> Have ${_b}"
1.2 andrew 285: fi
1.70 andrew 286: kernel_file_version "${_b}"
1.2 andrew 287: done
288:
1.5 andrew 289: for _s in $INSTALLED_SETS; do
1.71 andrew 290: [ "$_v" -ge "57" -a "$_s" != "${_s%etc}" ] && continue
1.19 andrew 291: local _file=${_s}${_v}.tgz
292: if [ ${_s} == sendmail-smtp_auth ]; then
293: _file=${_s}.gz
294: fi
295:
296: if [ ! -e ./${_file} ]; then
1.54 andrew 297: echo "===> $FTP_CMD ${FTP}/${_file}"
1.19 andrew 298: $FTP_CMD ${FTP}/${_file}
1.5 andrew 299: fi
1.2 andrew 300: done
301:
1.20 andrew 302: local _type
1.56 andrew 303: local _ftp
1.20 andrew 304: for _type in $CHECKSUM_TYPES; do
1.40 andrew 305: [ -e $_type ] && break
1.56 andrew 306: _ftp=`echo "$FTP" | sed -e 's,://[^/]*/,://ftp.openbsd.org/,'`
307: echo "===> $FTP_CMD ${_ftp}/$_type"
308: $FTP_CMD ${_ftp}/$_type
1.20 andrew 309: done
1.17 andrew 310: }
311:
1.23 andrew 312: follow_symlink () {
313: local _file=$1
1.33 andrew 314: # This could go circular, but I dunno how to fix that.
315: if [ -h $_file ]; then
1.77 andrew 316: follow_symlink $( readlink -f $_file )
1.23 andrew 317: else
1.33 andrew 318: echo $_file
1.23 andrew 319: fi
320: }
321:
1.20 andrew 322: check_sum () {
323: local _type=$1
1.54 andrew 324: echo "==> CHECKING $_type SUMS"
1.17 andrew 325: cd $RELEASEDIR
326:
1.20 andrew 327: if [ ! -e $_type ]; then
328: echo $_type File does not exist!
1.17 andrew 329: return 1
330: fi
1.6 andrew 331:
1.57 andrew 332: local _nv=`echo $NEW_VER | sed -e 's/\.//'`
1.61 andrew 333: local _signify=`which signify 2>/dev/null`
1.94 andrew 334: local _keyfile=/etc/signify/openbsd-${_nv}-base.pub
1.59 andrew 335: local _b _s
1.57 andrew 336:
337: (
1.58 andrew 338: for _b in $INSTALL_KERNELS; do echo "($_b)" ; done
339: for _s in $INSTALLED_SETS; do echo "($_s$_nv.tgz)"; done
1.57 andrew 340: ) > index
1.94 andrew 341:
1.59 andrew 342:
343: if [ -n "$_signify" -a "$_type" != "${_type%.sig}" ]; then
344: echo "===> Checking signature";
345: if [ ! -e $_keyfile ]; then
346: echo "key [$_keyfile] does not exist, cannot check $_type" >&2
347: return 2
348: fi
1.67 andrew 349: signify -V -e -p $_keyfile -x $_type -m - | grep -f index | sha256 -c -
1.59 andrew 350: else
1.73 andrew 351: grep -f index $_type | sha256 -c
1.59 andrew 352: fi
1.2 andrew 353:
354: if [ $? -ne 0 ]; then
1.20 andrew 355: echo ERROR: $_type does not match! >&2
1.12 andrew 356: return 1
1.2 andrew 357: fi
358: }
359:
1.17 andrew 360: check_sets() {
1.54 andrew 361: echo '==> CHECKING SETS'
1.17 andrew 362: cd $RELEASEDIR
363:
1.18 andrew 364: local _missing_sets
1.17 andrew 365: local _v=$FILE_VER
366:
1.104 ! andrew 367: mount_boot_device
1.39 andrew 368: for _n in $INSTALL_KERNELS; do
369: local _o=$_n
1.104 ! andrew 370: [ X"bsd" == X"${_o}" -a -e ${KERNEL_ROOT}bsd.sp ] && _o=bsd.sp
! 371: if [ -e ${KERNEL_ROOT}${_o} -a ! -e ./${_n} ]; then
! 372: echo ${_o} does not exist on $BOOT_DEVICE
1.39 andrew 373: _missing_sets=1
1.17 andrew 374: fi
1.39 andrew 375:
1.104 ! andrew 376: if [ X"${BOOT_KERNEL}" == X"${_o}" -a -e ./${_n} ]; then
1.39 andrew 377: NEW_KERNEL_VERSION=`kernel_file_version ./${_n}`
1.17 andrew 378: fi
379: done
1.104 ! andrew 380: umount_boot_device
1.17 andrew 381:
1.39 andrew 382: if [ X"$NEW_KERNEL_VERSION" == X"" ]; then
383: echo Missing replacement for boot kernel $BOOT_KERNEL >&2
384: _missing_sets=1
385: fi
386:
1.17 andrew 387: for _s in $INSTALLED_SETS; do
1.71 andrew 388: [ "$_v" -ge "57" -a "$_s" != "${_s%etc}" ] && continue
1.19 andrew 389: local _file=${_s}${_v}.tgz
390: if [ ${_s} == sendmail-smtp_auth ]; then
391: _file=${_s}.gz
392: fi
393: if [ ! -e ./${_file} ]; then
394: echo ${_file} does not exist
1.18 andrew 395: _missing_sets=1
1.17 andrew 396: fi
397: done
1.18 andrew 398:
399: if [ X"" == X"${_missing_sets}" ]; then
1.85 andrew 400: echo 'All OK'
1.18 andrew 401: fi
1.17 andrew 402:
1.20 andrew 403: local _type
404: for _type in $CHECKSUM_TYPES; do
1.74 andrew 405: [ -n "$NO_SIGNIFY" -a "$_type" != "${_type%.sig}" ] && continue
1.20 andrew 406: if [ -e $_type ]; then
1.59 andrew 407: check_sum $_type && break
1.62 andrew 408: [ -z "$IGNORE_CHECKSUM_ERROR" ] && exit 1
1.20 andrew 409: fi
410: done
1.59 andrew 411:
412: return 0
1.17 andrew 413: }
414:
415:
1.30 andrew 416: install_kernels() {
1.97 andrew 417: local _d=$1
1.99 andrew 418: local default_mount
1.97 andrew 419: local boot_mount
420: local mount_is_msdos
421:
422: if [ ! "$_d" ]; then
1.99 andrew 423: default_mount=$( df -lnP /bsd | sed -ne 's!/dev/.* !!p' )
1.101 andrew 424: mount_boot_device
1.97 andrew 425:
1.101 andrew 426: if [ "$KERNEL_ROOT" != "$default_mount" ]; then
1.99 andrew 427: local _ik="$INSTALL_KERNELS"
1.104 ! andrew 428: INSTALL_KERNELS="$BOOT_KERNEL bsd.rd"
1.97 andrew 429:
1.101 andrew 430: install_kernels $KERNEL_ROOT
1.99 andrew 431:
432: INSTALL_KERNELS="$_ik"
1.97 andrew 433: fi
434:
1.99 andrew 435: umount_boot_device
436:
1.97 andrew 437: install_kernels $default_mount
438: return
439: fi
440:
441: echo "==> INSTALLING KERNEL to $_d"
1.2 andrew 442:
443: if [ X"" == X"$RELEASEDIR" ]; then
1.5 andrew 444: echo ERROR: no source for new kernels! >&2
1.2 andrew 445: exit 1
446: fi
447:
1.100 andrew 448: [ $_d != / ] && mount | grep -q " on ${_d%/} .* msdos" && mount_is_msdos=1
1.97 andrew 449:
1.46 andrew 450: if [ X"$BOOT_KERNEL_VERSION" != X"$NEW_KERNEL_VERSION" ]; then
1.97 andrew 451: echo "===> Backing up $BOOT_KERNEL to ${_d}obsd"
452: if [ $mount_is_msdos ]; then
453: cp $BOOT_KERNEL ${_d}obsd
454: else
455: ln -f $BOOT_KERNEL ${_d}obsd
456: fi
1.46 andrew 457: if [ $? -ne 0 ]; then
458: echo "Error copying old kernel!" >&2
459: exit 1
460: fi
1.2 andrew 461: fi
462:
1.39 andrew 463: cd $RELEASEDIR
1.23 andrew 464:
1.39 andrew 465: for _b in $INSTALL_KERNELS; do
1.97 andrew 466: rm -f ${_d}nbsd
1.39 andrew 467: local _bd=$_b
468: [ X"${_b}" == X"bsd" ] && _bd="bsd.sp"
1.2 andrew 469:
1.39 andrew 470: local _is_boot=""
1.97 andrew 471: [ X"$BOOT_KERNEL" == X"${_d}${_bd}" ] && _is_boot="# boot kernel"
1.94 andrew 472:
1.97 andrew 473: echo "Copying $_b to ${_d}$_bd $_is_boot"
474: cp ${_b} ${_d}nbsd && mv ${_d}nbsd ${_d}${_bd}
1.2 andrew 475: if [ $? -ne 0 ]; then
1.39 andrew 476: echo ERROR: Could not copy new $_bd kernel! >&2
1.2 andrew 477: exit 1
478: fi
1.39 andrew 479: done
480:
481: cd $OLDPWD
1.23 andrew 482:
1.97 andrew 483: if [ ! -h ${_d}bsd ]; then
484: cd ${_d}
1.39 andrew 485: for _b in $BOOT_KERNELS; do
486: [ X"$_b" == X"bsd" ] && _b="bsd.sp"
487: if [ -e $_b ]; then
1.97 andrew 488: if [ "$mount_is_msdos" ]; then
489: echo "===> Moving $_b ${_d}bsd (MSDOS)"
490: mv -f ${_b} bsd
491: else
492: echo "===> symlinking $_b to ${_d}bsd"
493: ln -sf $_b bsd
1.39 andrew 494: fi
495: break
496: fi
497: done
1.97 andrew 498: cd $OLDPWD
1.2 andrew 499: fi
500: }
501:
502: install_sets() {
1.54 andrew 503: echo '==> INSTALLING SETS'
1.2 andrew 504:
505: if [ X"" == X"$RELEASEDIR" ]; then
1.5 andrew 506: echo ERROR: no source for sets! >&2
1.2 andrew 507: exit 1
508: else
509: cd $RELEASEDIR
510: fi
511:
1.5 andrew 512: local _v=$FILE_VER
513:
1.21 andrew 514: local _sets=`ls *${_v}.tgz | grep -v ^base `
515: for _f in ${_sets} base${_v}.tgz; do
1.3 andrew 516: _path=$DESTDIR
517: if [ X"etc${_v}.tgz" == X"$_f" \
518: -o X"xetc${_v}.tgz" == X"$_f" ]; then
1.21 andrew 519: [ X"" != X"$SYSMERGE" ] && continue
1.2 andrew 520: _path=/var/tmp/temproot
521: fi
522:
1.85 andrew 523: echo "Extracting $_f to $_path"
1.65 andrew 524: mkdir -p $_path
525: tar -C $_path -xzphf ${RELEASEDIR}/${_f}
1.2 andrew 526: if [ $? -ne 0 ]; then
1.5 andrew 527: echo ERROR: Could not extract ${_f}! >&2
1.2 andrew 528: exit 1
529: fi
530: done
531:
1.54 andrew 532: echo '===> Extracted all sets.'
1.51 andrew 533: }
1.19 andrew 534:
1.51 andrew 535: install_sendmail_smtp_auth() {
1.19 andrew 536: if [ -e ${RELEASEDIR}/sendmail-smtp_auth.gz ]; then
537: gzcat ${RELEASEDIR}/sendmail-smtp_auth.gz > \
538: ${RELEASEDIR}/sendmail-smtp_auth
539: fi
540: if [ -e ${RELEASEDIR}/sendmail-smtp_auth ]; then
1.21 andrew 541: if ! pkg_info -qe 'cyrus-sasl-*'; then
1.65 andrew 542: pkg_add -i cyrus-sasl
1.21 andrew 543: fi
544:
1.65 andrew 545: install -o root -g smmsp -m 2555 \
1.19 andrew 546: ${RELEASEDIR}/sendmail-smtp_auth \
1.21 andrew 547: /usr/libexec/sendmail/sendmail
1.19 andrew 548:
1.54 andrew 549: echo '===> Installed sendmail with smtp_auth'
1.19 andrew 550: fi
1.2 andrew 551: }
552:
553: update_etc() {
1.54 andrew 554: echo '==> UPDATING ETC'
1.10 andrew 555: if [ ! -e $SYSMERGE ]; then
1.47 andrew 556: echo "ERROR: Can't find sysmerge!" >&2
557: exit 1;
1.10 andrew 558: fi
559:
1.68 andrew 560: local _v=$FILE_VER
561: local _args=""
562:
1.80 andrew 563: if [ ! -e /var/sysmerge/etc.tgz ]; then
1.68 andrew 564: if [ X"" == X"$RELEASEDIR" ]; then
565: echo "ERROR: no source for etc!" >&2
566: exit 1
567: fi
1.2 andrew 568:
1.68 andrew 569: cd $RELEASEDIR
1.5 andrew 570:
1.68 andrew 571: if [ -e etc${_v}.tgz ]; then
572: _args="$_args -s ${RELEASEDIR}/etc${_v}.tgz"
573: fi
574: if [ -e xetc${_v}.tgz ]; then
575: _args="$_args -x ${RELEASEDIR}/xetc${_v}.tgz"
576: fi
1.94 andrew 577: if [ X"" == X"$_args" ]; then
1.68 andrew 578: echo ERROR: No upgrade sets found! >&2
579: exit 1
580: fi
1.47 andrew 581: fi
1.68 andrew 582:
583: echo '==> RUNNING SYSMERGE'
584: $SYSMERGE $_args
1.2 andrew 585:
1.47 andrew 586: cd $OLDPWD
1.2 andrew 587: }
1.14 andrew 588:
1.20 andrew 589:
1.65 andrew 590: if [ $(id -u) != 0 ]; then
591: echo 'ERROR: need root privileges to run this script' >&2
592: exit 1
593: fi
594:
1.14 andrew 595: if [ -e /etc/update_openbsd.conf ]; then
596: . /etc/update_openbsd.conf
597: fi
598:
599: if [ -e ${HOME}/.update_openbsdrc ]; then
600: . ${HOME}/.update_openbsdrc
601: fi
602:
1.90 andrew 603: MIRROR=${MIRROR:=http://fastly.cdn.openbsd.org/pub/OpenBSD}
1.14 andrew 604: FTP_CMD=${FTP_CMD:=ftp -V}
605:
606: DESTDIR=${DESTDIR:=/}
607: SYSMERGE=${SYSMERGE:=/usr/sbin/sysmerge}
608: FORCE_DIR=${FORCE_DIR:=No}
1.79 andrew 609:
1.84 andrew 610: export PKG_PATH TRUSTED_PKG_PATH
611:
1.79 andrew 612: set_version
1.91 andrew 613:
1.95 andrew 614: TRUSTED_PKG_PATH=${TRUSTED_PKG_PATH:=/usr/ports/packages/`machine -a`/all}
615: if [ "$FORCE_DIR" = "No" ]; then
616: PKG_PATH=${PKG_PATH:=${MIRROR}/$NEW_VER/packages/`machine -a`}
617: else
618: PKG_PATH=${PKG_PATH:=${MIRROR}/$FORCE_DIR/packages/`machine -a`}
619: fi
1.14 andrew 620:
621: INSTALLED_SETS=${INSTALLED_SETS:=`installed_sets`}
1.2 andrew 622:
1.59 andrew 623: CHECKSUM_TYPES=${CHECKSUM_TYPES:=SHA256.sig SHA256}
1.20 andrew 624:
1.12 andrew 625: local _error=$?
1.2 andrew 626:
627: echo
628: echo "-= update_openbsd - helper script to update OpenBSD =-"
629: echo "------------------------------------------------------"
630: echo
1.84 andrew 631: echo " SYSMERGE: $SYSMERGE"
1.88 andrew 632: echo " MIRROR: $FTP"
1.84 andrew 633: echo " PKG_PATH: $PKG_PATH"
634: echo "TRUSTED_PKG_PATH: $TRUSTED_PKG_PATH"
635: echo " RELEASEDIR: $RELEASEDIR"
636: echo " DESTDIR: $DESTDIR"
1.98 andrew 637: echo " BOOT_DEVICE: $BOOT_DEVICE"
1.84 andrew 638: echo " BOOT_KERNEL: $BOOT_KERNEL"
639: echo " INSTALL_KERNELS: $INSTALL_KERNELS"
640: echo " INSTALLED_SETS: $INSTALLED_SETS"
1.8 andrew 641: echo
1.84 andrew 642: echo " CUR_VER: $CUR_VER"
643: echo " NEW_VER: $NEW_VER"
644: #echo " FILE_VER: $FILE_VER"
1.2 andrew 645: echo
1.70 andrew 646:
1.104 ! andrew 647: mount_boot_device
1.70 andrew 648: for k in $INSTALL_KERNELS; do
1.104 ! andrew 649: if [ -e $KERNEL_ROOT$k ]; then
! 650: echo "Existing $BOOT_DEVICE:$k"
! 651: kernel_file_version $KERNEL_ROOT$k
1.70 andrew 652: fi
653: done
1.104 ! andrew 654: umount_boot_device
1.12 andrew 655:
656: if [ ${_error} -ne 0 ]; then
657: exit ${_error}
658: fi
1.2 andrew 659:
1.17 andrew 660: if [ X"" != X"${FTP}" ]; then
1.20 andrew 661: get_sets
1.17 andrew 662: fi
663:
664: check_sets || exit
1.39 andrew 665:
1.54 andrew 666: echo "===> Last booted:\n$BOOTED_KERNEL_VERSION"
1.39 andrew 667: if [ X"$BOOT_KERNEL_VERSION" != X"$BOOTED_KERNEL_VERSION" \
668: -a X"$BOOT_KERNEL_VERSION" != X"$NEW_KERNEL_VERSION" ]; then
669: echo "Next boot (unless replaced):\n$BOOT_KERNEL_VERSION"
670: fi
671: if [ -n "$NEW_KERNEL_VERSION" ]; then
1.54 andrew 672: echo "===> New $BOOT_KERNEL:\n$NEW_KERNEL_VERSION";
1.39 andrew 673: else
674: echo "\n!!! WARNING: Will not replace boot kernel $BOOT_KERNEL! !!!\n" >&2
675: echo "ctrl+C to cancel, enter to continue anyway" >&2
1.44 andrew 676: local _temp
677: read _temp
1.53 andrew 678: NEW_KERNEL_VERSION=$BOOT_KERNEL_VERSION
1.44 andrew 679: fi
680:
1.66 andrew 681: if [ X"$NEW_KERNEL_VERSION" != X"$BOOTED_KERNEL_VERSION" ]; then
1.44 andrew 682: echo >&2
1.66 andrew 683: echo "!!! You are upgrading the OpenBSD kernel. !!!" >&2
684: echo "!!! You will be given the opportunity to reboot !!!" >&2
1.94 andrew 685: echo "!!! at the end of the proces but it is safer to !!!" >&2
1.66 andrew 686: echo "!!! have a separate root shell open. !!!" >&2
687: echo "!!! It is needed in order to run /sbin/oreboot. !!!" >&2
1.78 andrew 688: echo "!!! doas MAY NOT WORK after sets are extracted. !!!" >&2
1.44 andrew 689: echo >&2
1.66 andrew 690: echo "enter to continue, ctrl+C to cancel" >&2
1.39 andrew 691: local _temp
692: read _temp
1.2 andrew 693:
1.66 andrew 694: if [ ! -e /sbin/oreboot ]; then
695: cp /sbin/reboot /sbin/oreboot
696: if [ $? -ne 0 ]; then
697: echo "Error copying old reboot command!" >&2
698: exit 1
699: fi
700: echo "/sbin/reboot copied to /sbin/oreboot"
1.50 andrew 701: fi
1.2 andrew 702: fi
703:
1.30 andrew 704: install_kernels
1.21 andrew 705: install_sets
1.2 andrew 706:
1.53 andrew 707: if [ X"$NEW_KERNEL_VERSION" == X"$BOOTED_KERNEL_VERSION" ]; then
1.51 andrew 708: install_sendmail_smtp_auth
709:
1.21 andrew 710: if [ -e /sbin/oreboot ]; then
711: echo Removing /sbin/oreboot
1.69 andrew 712: rm -f /sbin/oreboot
1.21 andrew 713: fi
1.2 andrew 714: update_etc
715:
1.81 andrew 716: OPENUP=$( which openup 2>/dev/null )
1.76 andrew 717: if [ -n "$OPENUP" ]; then
718: echo "==> UPDATING WITH $OPENUP"
719: $OPENUP
720: else
721: echo '==> UPDATING PACKAGES'
1.86 andrew 722: pkg_add -u
1.76 andrew 723: fi
1.72 andrew 724:
725: echo '==> UPDATING FIRMWARE'
726: fw_update
1.2 andrew 727:
728: else
1.83 andrew 729: [ -e /etc/rc.sysmerge ] && grep -q $SYSMERGE /etc/rc.sysmerge ||
1.82 andrew 730: echo "$SYSMERGE -b" >>/etc/rc.sysmerge &&
731: echo "==> RUNNING $SYSMERGE -b ON REBOOT"
732:
1.94 andrew 733: echo Instructions for updating to the new version available from
1.36 andrew 734: if [ X"snapshots" == X"$FORCE_DIR" ]; then
1.30 andrew 735: echo " http://www.openbsd.org/faq/current.html"
736: else
737: echo " http://www.openbsd.org/faq/upgrade${FILE_VER}.html"
738: fi
1.2 andrew 739: fi
740:
1.66 andrew 741: echo Update complete. enter to reboot, ctrl+C to cancel
1.65 andrew 742: read _temp
1.22 andrew 743: if [ -e /sbin/oreboot ]; then
1.66 andrew 744: echo using /sbin/oreboot
1.65 andrew 745: /sbin/oreboot
746: else
747: /sbin/reboot
1.22 andrew 748: fi
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>