[BACK]Return to update_openbsd CVS log [TXT][DIR] Up to [local] / openbsd / update_openbsd

Annotation of openbsd/update_openbsd/update_openbsd, Revision 1.102

1.1       andrew      1: #!/bin/sh
1.102   ! andrew      2: # $AFresh1: update_openbsd,v 1.101 2017/12/11 02:34:10 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.101     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.2       andrew    121: set_version() {
                    122:     CUR_VER=`uname -r`
1.3       andrew    123:     NEW_VER=`dc -e "$CUR_VER 0.1 + p"`
1.5       andrew    124:     FILE_VER=""
                    125:     FTP=""
1.2       andrew    126:
1.5       andrew    127:     local _cv=`echo $CUR_VER | sed -e 's/\.//'`
                    128:     local _nv=`echo $NEW_VER | sed -e 's/\.//'`
1.9       andrew    129:     local _v
1.5       andrew    130:
1.10      andrew    131:     if [ X"No" != X"$FORCE_DIR" -a -d $FORCE_DIR ]; then
1.5       andrew    132:         _dir=$FORCE_DIR
                    133:         if [ -e ${_dir}/base${_nv}.tgz ]; then
                    134:             _v=$_nv
                    135:         elif [ -e ${_dir}/base${_cv}.tgz ]; then
                    136:             NEW_VER=$CUR_VER
                    137:             _v=$_cv
                    138:         fi
1.2       andrew    139:
1.5       andrew    140:     elif [ -d $CUR_VER ]; then
                    141:         _dir=$CUR_VER
1.2       andrew    142:         NEW_VER=$CUR_VER
1.5       andrew    143:         if [ -e ${_dir}/base${_cv}.tgz ]; then
                    144:             _v=$_cv
                    145:         fi
1.2       andrew    146:
1.5       andrew    147:     elif [ -d $NEW_VER ]; then
                    148:         _dir=$NEW_VER
                    149:         if [ -e ${_dir}/base${_nv}.tgz ]; then
                    150:             _v=$_nv
                    151:         fi
1.2       andrew    152:
                    153:     fi
                    154:
1.17      andrew    155:     if [ X"" != X"${MIRROR}" -a X"" == X"${_v}" ]; then
1.89      andrew    156:         if [ X"No" != X"${FORCE_DIR}" ]; then
                    157:             _dir=${FORCE_DIR}
                    158:         elif sysctl kern.version | grep -q -- '-current '; then
                    159:             _dir=snapshots
                    160:             FORCE_DIR=snapshots
                    161:         else
1.5       andrew    162:             _dir=${NEW_VER}
                    163:         fi
                    164:         FTP=${MIRROR}/${_dir}/`machine`
1.2       andrew    165:
1.16      andrew    166:         _v=`version_in`
1.10      andrew    167:
1.16      andrew    168:         if [ X"" == X"${_v}" ]; then
1.10      andrew    169:             if [ X"No" != X"$FORCE_DIR" ]; then
                    170:                 echo No sets in forced [${FTP}] >&2
1.12      andrew    171:                 return 2
1.10      andrew    172:             fi
                    173:
                    174:             NEW_VER=$CUR_VER
                    175:             _dir=${NEW_VER}
                    176:             FTP=${MIRROR}/${_dir}/`machine`
                    177:
1.16      andrew    178:             _v=`version_in`
1.9       andrew    179:         fi
                    180:
1.10      andrew    181:         if [ X"" == X"${_v}" ]; then
1.16      andrew    182:             echo No sets in [${FTP}] >&2
1.94      andrew    183:             return 2
1.10      andrew    184:         elif [ X"${_cv}" == X"${_v}" ]; then
1.5       andrew    185:             NEW_VER=$CUR_VER
1.9       andrew    186:         elif [ X"${_nv}" == X"${_v}" ]; then
                    187:             NEW_VER=$NEW_VER
1.2       andrew    188:         else
1.10      andrew    189:             echo Invalid version [$_v] >&2
1.12      andrew    190:             return 2
1.2       andrew    191:         fi
                    192:
1.10      andrew    193:         if [ X"No" == X"$FORCE_DIR" ]; then
1.5       andrew    194:             _dir=$NEW_VER
1.2       andrew    195:         fi
                    196:
                    197:     fi
                    198:
1.5       andrew    199:     if [ X"" == X"${_v}" ]; then
1.64      andrew    200:         if [ X"" == X"${MIRROR}" ]; then
                    201:             echo ERROR: No sets, and no MIRROR, unable to continue. >&2
                    202:         else
                    203:             echo ERROR: Unable to determine FILE_VER, check your MIRROR. >&2
                    204:         fi
1.12      andrew    205:         return 1
1.2       andrew    206:     fi
                    207:
1.5       andrew    208:     if [ X"" == X"$RELEASEDIR" ]; then
                    209:         RELEASEDIR=`pwd`/$_dir
1.2       andrew    210:     fi
1.9       andrew    211:
1.5       andrew    212:     FILE_VER=$_v
1.17      andrew    213:     if [ X"" != X"${MIRROR}" ]; then
                    214:         FTP=${MIRROR}/${_dir}/`machine`
                    215:     fi
1.39      andrew    216:
1.101     andrew    217:     KERNEL_ROOT=""
                    218:     [ -z "$BOOT_DEVICE" ] && set_boot_device
                    219:
1.39      andrew    220:     BOOT_KERNEL=`( \
                    221:         echo bsd; \
                    222:         [ -e /boot.conf ] && sed -E '/^ *(set +image|boot) +/!d ; \
                    223:             s///; s/^.*://; s/ .*$//' /boot.conf \
                    224:     ) | tail -1`
1.42      andrew    225:     BOOT_KERNEL=`follow_symlink /$BOOT_KERNEL`
1.39      andrew    226:     BOOT_KERNEL="/${BOOT_KERNEL#/}"
                    227:
                    228:     BOOT_KERNEL_VERSION=`kernel_file_version $BOOT_KERNEL`
                    229:
                    230:     BOOTED_KERNEL_VERSION=`sysctl -n kern.version`
                    231:     NEW_KERNEL_VERSION=""
                    232:
                    233:     # We want to default to what we had
                    234:     INSTALL_KERNELS="${BOOT_KERNEL#/}"
1.48      andrew    235:     # if the boot kernel was our specially named bsd.sp, we install from bsd
                    236:     if [ X"$INSTALL_KERNELS" == X"bsd.sp" ]; then
                    237:         INSTALL_KERNELS="bsd"
                    238:     fi
1.39      andrew    239:     # with a second option of an mp kernel if is is a likely candidate
                    240:     if [ X"$INSTALL_KERNELS" != X"bsd.mp" ]; then
                    241:         local _ncpu=$(sysctl -n hw.ncpufound)
                    242:         [ $_ncpu -gt 1 ] && INSTALL_KERNELS="$INSTALL_KERNELS bsd.mp"
                    243:     fi
                    244:     # or just bsd otherwise
                    245:     if [ X"${INSTALL_KERNELS% *}" != X"bsd" ]; then
                    246:         INSTALL_KERNELS="$INSTALL_KERNELS bsd"
                    247:     fi
                    248:     BOOT_KERNELS=$INSTALL_KERNELS
                    249:     INSTALL_KERNELS="$INSTALL_KERNELS bsd.rd"
1.2       andrew    250: }
                    251:
                    252: get_sets() {
1.54      andrew    253:     echo '==> GETTING SETS'
1.2       andrew    254:     if [ X"" == X"$FTP" ]; then
1.5       andrew    255:         echo ERROR: No FTP site set! >&2
1.12      andrew    256:         return 1
1.2       andrew    257:     fi
                    258:
1.5       andrew    259:     mkdir -p ${RELEASEDIR}
                    260:     cd $RELEASEDIR
1.2       andrew    261:
1.5       andrew    262:     local _v=$FILE_VER
1.2       andrew    263:
1.39      andrew    264:     for _b in $INSTALL_KERNELS; do
1.45      andrew    265:         if [ ! -e ./${_b} ]; then
1.54      andrew    266:             echo "===> $FTP_CMD ${FTP}/${_b}"
1.3       andrew    267:             $FTP_CMD ${FTP}/${_b}
1.70      andrew    268:         else
                    269:             echo "===> Have ${_b}"
1.2       andrew    270:         fi
1.70      andrew    271:         kernel_file_version "${_b}"
1.2       andrew    272:     done
                    273:
1.5       andrew    274:     for _s in $INSTALLED_SETS; do
1.71      andrew    275:         [ "$_v" -ge "57" -a "$_s" != "${_s%etc}" ] && continue
1.19      andrew    276:         local _file=${_s}${_v}.tgz
                    277:         if [ ${_s} == sendmail-smtp_auth ]; then
                    278:             _file=${_s}.gz
                    279:         fi
                    280:
                    281:         if [ ! -e ./${_file} ]; then
1.54      andrew    282:             echo "===> $FTP_CMD ${FTP}/${_file}"
1.19      andrew    283:             $FTP_CMD ${FTP}/${_file}
1.5       andrew    284:         fi
1.2       andrew    285:     done
                    286:
1.20      andrew    287:     local _type
1.56      andrew    288:     local _ftp
1.20      andrew    289:     for _type in $CHECKSUM_TYPES; do
1.40      andrew    290:         [ -e $_type ] && break
1.56      andrew    291:         _ftp=`echo "$FTP" | sed -e 's,://[^/]*/,://ftp.openbsd.org/,'`
                    292:         echo "===> $FTP_CMD ${_ftp}/$_type"
                    293:         $FTP_CMD ${_ftp}/$_type
1.20      andrew    294:     done
1.17      andrew    295: }
                    296:
1.23      andrew    297: follow_symlink () {
                    298:     local _file=$1
1.33      andrew    299:     # This could go circular, but I dunno how to fix that.
                    300:     if [ -h $_file ]; then
1.77      andrew    301:         follow_symlink $( readlink -f $_file )
1.23      andrew    302:     else
1.33      andrew    303:         echo $_file
1.23      andrew    304:     fi
                    305: }
                    306:
1.20      andrew    307: check_sum () {
                    308:     local _type=$1
1.54      andrew    309:     echo "==> CHECKING $_type SUMS"
1.17      andrew    310:     cd $RELEASEDIR
                    311:
1.20      andrew    312:     if [ ! -e $_type ]; then
                    313:         echo $_type File does not exist!
1.17      andrew    314:         return 1
                    315:     fi
1.6       andrew    316:
1.57      andrew    317:     local _nv=`echo $NEW_VER | sed -e 's/\.//'`
1.61      andrew    318:     local _signify=`which signify 2>/dev/null`
1.94      andrew    319:     local _keyfile=/etc/signify/openbsd-${_nv}-base.pub
1.59      andrew    320:     local _b _s
1.57      andrew    321:
                    322:     (
1.58      andrew    323:         for _b in $INSTALL_KERNELS; do echo "($_b)"        ; done
                    324:         for _s in $INSTALLED_SETS;  do echo "($_s$_nv.tgz)"; done
1.57      andrew    325:     ) > index
1.94      andrew    326:
1.59      andrew    327:
                    328:     if [ -n "$_signify" -a "$_type" != "${_type%.sig}" ]; then
                    329:         echo "===> Checking signature";
                    330:         if [ ! -e $_keyfile ]; then
                    331:             echo "key [$_keyfile] does not exist, cannot check $_type" >&2
                    332:             return 2
                    333:         fi
1.67      andrew    334:         signify -V -e -p $_keyfile -x $_type -m - | grep -f index | sha256 -c -
1.59      andrew    335:     else
1.73      andrew    336:        grep -f index $_type | sha256 -c
1.59      andrew    337:     fi
1.2       andrew    338:
                    339:     if [ $? -ne 0 ]; then
1.20      andrew    340:         echo ERROR: $_type does not match! >&2
1.12      andrew    341:         return 1
1.2       andrew    342:     fi
                    343: }
                    344:
1.17      andrew    345: check_sets() {
1.54      andrew    346:     echo '==> CHECKING SETS'
1.17      andrew    347:     cd $RELEASEDIR
                    348:
1.18      andrew    349:     local _missing_sets
1.17      andrew    350:     local _v=$FILE_VER
                    351:
1.39      andrew    352:     for _n in $INSTALL_KERNELS; do
                    353:         local _o=$_n
                    354:         [ X"bsd" == X"${_o}" -a -e /bsd.sp ] && _o=bsd.sp
                    355:         if [ -e /${_o} -a ! -e ./${_n} ]; then
                    356:             echo ${_o} does not exist
                    357:             _missing_sets=1
1.17      andrew    358:         fi
1.39      andrew    359:
                    360:         if [ X"${BOOT_KERNEL}" == X"/${_o}" -a -e ./${_n} ]; then
                    361:             NEW_KERNEL_VERSION=`kernel_file_version ./${_n}`
1.17      andrew    362:         fi
                    363:     done
                    364:
1.39      andrew    365:     if [ X"$NEW_KERNEL_VERSION" == X"" ]; then
                    366:         echo Missing replacement for boot kernel $BOOT_KERNEL >&2
                    367:         _missing_sets=1
                    368:     fi
                    369:
1.17      andrew    370:     for _s in $INSTALLED_SETS; do
1.71      andrew    371:         [ "$_v" -ge "57" -a "$_s" != "${_s%etc}" ] && continue
1.19      andrew    372:         local _file=${_s}${_v}.tgz
                    373:         if [ ${_s} == sendmail-smtp_auth ]; then
                    374:             _file=${_s}.gz
                    375:         fi
                    376:         if [ ! -e ./${_file} ]; then
                    377:             echo ${_file} does not exist
1.18      andrew    378:             _missing_sets=1
1.17      andrew    379:         fi
                    380:     done
1.18      andrew    381:
                    382:     if [ X"" == X"${_missing_sets}" ]; then
1.85      andrew    383:         echo 'All OK'
1.18      andrew    384:     fi
1.17      andrew    385:
1.20      andrew    386:     local _type
                    387:     for _type in $CHECKSUM_TYPES; do
1.74      andrew    388:        [ -n "$NO_SIGNIFY" -a "$_type" != "${_type%.sig}" ] && continue
1.20      andrew    389:         if [ -e $_type ]; then
1.59      andrew    390:             check_sum $_type && break
1.62      andrew    391:             [ -z "$IGNORE_CHECKSUM_ERROR" ] && exit 1
1.20      andrew    392:         fi
                    393:     done
1.59      andrew    394:
                    395:     return 0
1.17      andrew    396: }
                    397:
                    398:
1.30      andrew    399: install_kernels() {
1.97      andrew    400:     local _d=$1
1.99      andrew    401:     local default_mount
1.97      andrew    402:     local boot_mount
                    403:     local mount_is_msdos
                    404:
                    405:     if [ ! "$_d" ]; then
1.99      andrew    406:         default_mount=$( df -lnP /bsd | sed -ne 's!/dev/.* !!p' )
1.101     andrew    407:         mount_boot_device
1.97      andrew    408:
1.101     andrew    409:        if [ "$KERNEL_ROOT" != "$default_mount" ]; then
1.99      andrew    410:                local _ik="$INSTALL_KERNELS"
                    411:                INSTALL_KERNELS="${BOOT_KERNEL#/} bsd.rd"
1.97      andrew    412:
1.101     andrew    413:                install_kernels $KERNEL_ROOT
1.99      andrew    414:
                    415:                INSTALL_KERNELS="$_ik"
1.97      andrew    416:        fi
                    417:
1.99      andrew    418:         umount_boot_device
                    419:
1.97      andrew    420:         install_kernels $default_mount
                    421:         return
                    422:     fi
                    423:
                    424:     echo "==> INSTALLING KERNEL to $_d"
1.2       andrew    425:
                    426:     if [ X"" == X"$RELEASEDIR" ]; then
1.5       andrew    427:         echo ERROR: no source for new kernels! >&2
1.2       andrew    428:         exit 1
                    429:     fi
                    430:
1.100     andrew    431:     [ $_d != / ] && mount | grep -q " on ${_d%/} .* msdos" && mount_is_msdos=1
1.97      andrew    432:
1.46      andrew    433:     if [ X"$BOOT_KERNEL_VERSION" != X"$NEW_KERNEL_VERSION" ]; then
1.97      andrew    434:         echo "===> Backing up $BOOT_KERNEL to ${_d}obsd"
                    435:         if [ $mount_is_msdos ]; then
                    436:             cp $BOOT_KERNEL ${_d}obsd
                    437:         else
                    438:             ln -f $BOOT_KERNEL ${_d}obsd
                    439:         fi
1.46      andrew    440:         if [ $? -ne 0 ]; then
                    441:             echo "Error copying old kernel!" >&2
                    442:             exit 1
                    443:         fi
1.2       andrew    444:     fi
                    445:
1.39      andrew    446:     cd $RELEASEDIR
1.23      andrew    447:
1.39      andrew    448:     for _b in $INSTALL_KERNELS; do
1.97      andrew    449:         rm -f ${_d}nbsd
1.39      andrew    450:         local _bd=$_b
                    451:         [ X"${_b}" == X"bsd" ] && _bd="bsd.sp"
1.2       andrew    452:
1.39      andrew    453:         local _is_boot=""
1.97      andrew    454:         [ X"$BOOT_KERNEL" == X"${_d}${_bd}" ] && _is_boot="# boot kernel"
1.94      andrew    455:
1.97      andrew    456:         echo "Copying $_b to ${_d}$_bd $_is_boot"
                    457:         cp ${_b} ${_d}nbsd && mv ${_d}nbsd ${_d}${_bd}
1.2       andrew    458:         if [ $? -ne 0 ]; then
1.39      andrew    459:             echo ERROR: Could not copy new $_bd kernel! >&2
1.2       andrew    460:             exit 1
                    461:         fi
1.39      andrew    462:     done
                    463:
                    464:     cd $OLDPWD
1.23      andrew    465:
1.97      andrew    466:     if [ ! -h ${_d}bsd ]; then
                    467:         cd ${_d}
1.39      andrew    468:         for _b in $BOOT_KERNELS; do
                    469:             [ X"$_b" == X"bsd" ] && _b="bsd.sp"
                    470:             if [ -e $_b ]; then
1.97      andrew    471:                 if [ "$mount_is_msdos" ]; then
                    472:                     echo "===> Moving $_b ${_d}bsd (MSDOS)"
                    473:                     mv -f ${_b} bsd
                    474:                 else
                    475:                     echo "===> symlinking $_b to ${_d}bsd"
                    476:                     ln -sf $_b bsd
1.39      andrew    477:                 fi
                    478:                 break
                    479:             fi
                    480:         done
1.97      andrew    481:         cd $OLDPWD
1.2       andrew    482:     fi
                    483: }
                    484:
                    485: install_sets() {
1.54      andrew    486:     echo '==> INSTALLING SETS'
1.2       andrew    487:
                    488:     if [ X"" == X"$RELEASEDIR" ]; then
1.5       andrew    489:         echo ERROR: no source for sets! >&2
1.2       andrew    490:         exit 1
                    491:     else
                    492:         cd $RELEASEDIR
                    493:     fi
                    494:
1.5       andrew    495:     local _v=$FILE_VER
                    496:
1.21      andrew    497:     local _sets=`ls *${_v}.tgz | grep -v ^base `
                    498:     for _f in ${_sets} base${_v}.tgz; do
1.3       andrew    499:         _path=$DESTDIR
                    500:         if [ X"etc${_v}.tgz"  == X"$_f" \
                    501:             -o X"xetc${_v}.tgz" == X"$_f" ]; then
1.21      andrew    502:             [ X"" != X"$SYSMERGE" ] && continue
1.2       andrew    503:             _path=/var/tmp/temproot
                    504:         fi
                    505:
1.85      andrew    506:         echo "Extracting $_f to $_path"
1.65      andrew    507:         mkdir -p $_path
                    508:         tar -C $_path -xzphf ${RELEASEDIR}/${_f}
1.2       andrew    509:         if [ $? -ne 0 ]; then
1.5       andrew    510:             echo ERROR: Could not extract ${_f}! >&2
1.2       andrew    511:             exit 1
                    512:         fi
                    513:     done
                    514:
1.54      andrew    515:     echo '===> Extracted all sets.'
1.51      andrew    516: }
1.19      andrew    517:
1.51      andrew    518: install_sendmail_smtp_auth() {
1.19      andrew    519:     if [ -e ${RELEASEDIR}/sendmail-smtp_auth.gz ]; then
                    520:         gzcat ${RELEASEDIR}/sendmail-smtp_auth.gz > \
                    521:             ${RELEASEDIR}/sendmail-smtp_auth
                    522:     fi
                    523:     if [ -e ${RELEASEDIR}/sendmail-smtp_auth ]; then
1.21      andrew    524:         if ! pkg_info -qe 'cyrus-sasl-*'; then
1.65      andrew    525:             pkg_add -i cyrus-sasl
1.21      andrew    526:         fi
                    527:
1.65      andrew    528:         install -o root -g smmsp -m 2555 \
1.19      andrew    529:             ${RELEASEDIR}/sendmail-smtp_auth \
1.21      andrew    530:             /usr/libexec/sendmail/sendmail
1.19      andrew    531:
1.54      andrew    532:         echo '===> Installed sendmail with smtp_auth'
1.19      andrew    533:     fi
1.2       andrew    534: }
                    535:
                    536: update_etc() {
1.54      andrew    537:     echo '==> UPDATING ETC'
1.10      andrew    538:     if [ ! -e $SYSMERGE ]; then
1.47      andrew    539:         echo "ERROR: Can't find sysmerge!" >&2
                    540:         exit 1;
1.10      andrew    541:     fi
                    542:
1.68      andrew    543:     local _v=$FILE_VER
                    544:     local _args=""
                    545:
1.80      andrew    546:     if [ ! -e /var/sysmerge/etc.tgz ]; then
1.68      andrew    547:         if [ X"" == X"$RELEASEDIR" ]; then
                    548:             echo "ERROR: no source for etc!" >&2
                    549:             exit 1
                    550:         fi
1.2       andrew    551:
1.68      andrew    552:         cd $RELEASEDIR
1.5       andrew    553:
1.68      andrew    554:         if [ -e etc${_v}.tgz ]; then
                    555:             _args="$_args -s ${RELEASEDIR}/etc${_v}.tgz"
                    556:         fi
                    557:         if [ -e xetc${_v}.tgz ]; then
                    558:             _args="$_args -x ${RELEASEDIR}/xetc${_v}.tgz"
                    559:         fi
1.94      andrew    560:         if [ X"" == X"$_args" ]; then
1.68      andrew    561:             echo ERROR: No upgrade sets found! >&2
                    562:             exit 1
                    563:         fi
1.47      andrew    564:     fi
1.68      andrew    565:
                    566:     echo '==> RUNNING SYSMERGE'
                    567:     $SYSMERGE $_args
1.2       andrew    568:
1.47      andrew    569:     cd $OLDPWD
1.2       andrew    570: }
1.14      andrew    571:
1.20      andrew    572:
1.65      andrew    573: if [ $(id -u) != 0 ]; then
                    574:     echo 'ERROR: need root privileges to run this script' >&2
                    575:     exit 1
                    576: fi
                    577:
1.14      andrew    578: if [ -e /etc/update_openbsd.conf ]; then
                    579:     . /etc/update_openbsd.conf
                    580: fi
                    581:
                    582: if [ -e ${HOME}/.update_openbsdrc ]; then
                    583:     . ${HOME}/.update_openbsdrc
                    584: fi
                    585:
1.90      andrew    586: MIRROR=${MIRROR:=http://fastly.cdn.openbsd.org/pub/OpenBSD}
1.14      andrew    587: FTP_CMD=${FTP_CMD:=ftp -V}
                    588:
                    589: DESTDIR=${DESTDIR:=/}
                    590: SYSMERGE=${SYSMERGE:=/usr/sbin/sysmerge}
                    591: FORCE_DIR=${FORCE_DIR:=No}
1.79      andrew    592:
1.84      andrew    593: export PKG_PATH TRUSTED_PKG_PATH
                    594:
1.79      andrew    595: set_version
1.91      andrew    596:
1.95      andrew    597: TRUSTED_PKG_PATH=${TRUSTED_PKG_PATH:=/usr/ports/packages/`machine -a`/all}
                    598: if [ "$FORCE_DIR" = "No" ]; then
                    599:        PKG_PATH=${PKG_PATH:=${MIRROR}/$NEW_VER/packages/`machine -a`}
                    600: else
                    601:        PKG_PATH=${PKG_PATH:=${MIRROR}/$FORCE_DIR/packages/`machine -a`}
                    602: fi
1.14      andrew    603:
                    604: INSTALLED_SETS=${INSTALLED_SETS:=`installed_sets`}
1.2       andrew    605:
1.59      andrew    606: CHECKSUM_TYPES=${CHECKSUM_TYPES:=SHA256.sig SHA256}
1.20      andrew    607:
1.12      andrew    608: local _error=$?
1.2       andrew    609:
                    610: echo
                    611: echo "-= update_openbsd - helper script to update OpenBSD =-"
                    612: echo "------------------------------------------------------"
                    613: echo
1.84      andrew    614: echo "        SYSMERGE: $SYSMERGE"
1.88      andrew    615: echo "          MIRROR: $FTP"
1.84      andrew    616: echo "        PKG_PATH: $PKG_PATH"
                    617: echo "TRUSTED_PKG_PATH: $TRUSTED_PKG_PATH"
                    618: echo "      RELEASEDIR: $RELEASEDIR"
                    619: echo "         DESTDIR: $DESTDIR"
1.98      andrew    620: echo "     BOOT_DEVICE: $BOOT_DEVICE"
1.84      andrew    621: echo "     BOOT_KERNEL: $BOOT_KERNEL"
                    622: echo " INSTALL_KERNELS: $INSTALL_KERNELS"
                    623: echo "  INSTALLED_SETS: $INSTALLED_SETS"
1.8       andrew    624: echo
1.84      andrew    625: echo "         CUR_VER: $CUR_VER"
                    626: echo "         NEW_VER: $NEW_VER"
                    627: #echo "        FILE_VER: $FILE_VER"
1.2       andrew    628: echo
1.70      andrew    629:
                    630: for k in $INSTALL_KERNELS; do
                    631:     if [ -e "/$k" ]; then
                    632:         echo "Existing $k"
                    633:         kernel_file_version "/$k"
                    634:     fi
                    635: done
1.12      andrew    636:
                    637: if [ ${_error} -ne 0 ]; then
                    638:        exit ${_error}
                    639: fi
1.2       andrew    640:
1.17      andrew    641: if [ X"" != X"${FTP}" ]; then
1.20      andrew    642:     get_sets
1.17      andrew    643: fi
                    644:
                    645: check_sets || exit
1.39      andrew    646:
1.54      andrew    647: echo "===> Last booted:\n$BOOTED_KERNEL_VERSION"
1.39      andrew    648: if [ X"$BOOT_KERNEL_VERSION" != X"$BOOTED_KERNEL_VERSION" \
                    649:   -a X"$BOOT_KERNEL_VERSION" != X"$NEW_KERNEL_VERSION" ]; then
                    650:     echo "Next boot (unless replaced):\n$BOOT_KERNEL_VERSION"
                    651: fi
                    652: if [ -n "$NEW_KERNEL_VERSION" ]; then
1.54      andrew    653:     echo "===> New $BOOT_KERNEL:\n$NEW_KERNEL_VERSION";
1.39      andrew    654: else
                    655:     echo "\n!!! WARNING: Will not replace boot kernel $BOOT_KERNEL! !!!\n" >&2
                    656:     echo "ctrl+C to cancel, enter to continue anyway" >&2
1.44      andrew    657:     local _temp
                    658:     read _temp
1.53      andrew    659:     NEW_KERNEL_VERSION=$BOOT_KERNEL_VERSION
1.44      andrew    660: fi
                    661:
1.66      andrew    662: if [ X"$NEW_KERNEL_VERSION" != X"$BOOTED_KERNEL_VERSION" ]; then
1.44      andrew    663:     echo >&2
1.66      andrew    664:     echo "!!!  You are upgrading the OpenBSD kernel.        !!!" >&2
                    665:     echo "!!!  You will be given the opportunity to reboot  !!!" >&2
1.94      andrew    666:     echo "!!!  at the end of the proces but it is safer to  !!!" >&2
1.66      andrew    667:     echo "!!!  have a separate root shell open.             !!!" >&2
                    668:     echo "!!!  It is needed in order to run /sbin/oreboot.  !!!" >&2
1.78      andrew    669:     echo "!!!  doas MAY NOT WORK after sets are extracted.  !!!" >&2
1.44      andrew    670:     echo >&2
1.66      andrew    671:     echo "enter to continue, ctrl+C to cancel" >&2
1.39      andrew    672:     local _temp
                    673:     read _temp
1.2       andrew    674:
1.66      andrew    675:     if [ ! -e /sbin/oreboot ]; then
                    676:         cp /sbin/reboot /sbin/oreboot
                    677:         if [ $? -ne 0 ]; then
                    678:             echo "Error copying old reboot command!" >&2
                    679:             exit 1
                    680:         fi
                    681:         echo "/sbin/reboot copied to /sbin/oreboot"
1.50      andrew    682:     fi
1.2       andrew    683: fi
                    684:
1.30      andrew    685: install_kernels
1.21      andrew    686: install_sets
1.2       andrew    687:
1.53      andrew    688: if [ X"$NEW_KERNEL_VERSION" == X"$BOOTED_KERNEL_VERSION" ]; then
1.51      andrew    689:     install_sendmail_smtp_auth
                    690:
1.21      andrew    691:     if [ -e /sbin/oreboot ]; then
                    692:         echo Removing /sbin/oreboot
1.69      andrew    693:         rm -f /sbin/oreboot
1.21      andrew    694:     fi
1.2       andrew    695:     update_etc
                    696:
1.81      andrew    697:     OPENUP=$( which openup 2>/dev/null )
1.76      andrew    698:     if [ -n "$OPENUP" ]; then
                    699:         echo "==> UPDATING WITH $OPENUP"
                    700:         $OPENUP
                    701:     else
                    702:         echo '==> UPDATING PACKAGES'
1.86      andrew    703:         pkg_add -u
1.76      andrew    704:     fi
1.72      andrew    705:
                    706:     echo '==> UPDATING FIRMWARE'
                    707:     fw_update
1.2       andrew    708:
                    709: else
1.83      andrew    710:     [ -e /etc/rc.sysmerge ] && grep -q $SYSMERGE /etc/rc.sysmerge ||
1.82      andrew    711:         echo "$SYSMERGE -b" >>/etc/rc.sysmerge &&
                    712:         echo "==> RUNNING $SYSMERGE -b ON REBOOT"
                    713:
1.94      andrew    714:     echo Instructions for updating to the new version available from
1.36      andrew    715:     if [ X"snapshots" == X"$FORCE_DIR" ]; then
1.30      andrew    716:         echo "  http://www.openbsd.org/faq/current.html"
                    717:     else
                    718:         echo "  http://www.openbsd.org/faq/upgrade${FILE_VER}.html"
                    719:     fi
1.2       andrew    720: fi
                    721:
1.66      andrew    722: echo Update complete. enter to reboot, ctrl+C to cancel
1.65      andrew    723: read _temp
1.22      andrew    724: if [ -e /sbin/oreboot ]; then
1.66      andrew    725:     echo using /sbin/oreboot
1.65      andrew    726:     /sbin/oreboot
                    727: else
                    728:     /sbin/reboot
1.22      andrew    729: fi

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>