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

File: [local] / openbsd / update_openbsd / update_openbsd (download)

Revision 1.2, Tue Aug 12 22:07:05 2008 UTC (15 years, 9 months ago) by andrew
Branch: MAIN
Changes since 1.1: +343 -1 lines

Merged everything from the other files into this single file.  Should make things a lot nicer

#!/bin/sh
# $RedRiver: update_openbsd,v 1.1 2008/08/12 18:45:47 andrew Exp $

SYSMERGE=/usr/sbin/sysmerge
MIRROR=ftp://ftp.openbsd.org/pub/OpenBSD
FTP_CMD='ftp -V'
DESTDIR=/

if [ -e /etc/update_openbsd.conf ]; then
    . /etc/update_openbsd.conf
fi

if [ -e ${HOME}/.update_openbsdrc ]; then
    . ${HOME}/.update_openbsdrc
fi

installed_sets() {
    misc=/usr/share/doc/README
    man=/usr/share/man/cat1/intro.0
    comp=/usr/bin/cc
    game=/usr/games/
    xbase=/usr/X11R6/
    xetc=/etc/X11/xinit/xinitrc
    xfont=/usr/X11R6/lib/X11/fonts
    xserv=/usr/X11R6/bin/X
    xshare=/usr/X11R6/bin/startx

    echo base
    echo etc
    for d in misc man comp game xbase xetc xfont xserv xshare; do
        eval e=\$$d
        c=`ls ${e} 2> /dev/null | wc -l`
        #echo $c $d $e
        if [ ${c} -ne 0 ]; then
            echo $d
        fi
    done
}

set_version() {
    CUR_VER=`uname -r`
    NEW_VER=`dc -e "${CUR_VER} 0.1 + p"`

    if [ -d $NEW_VER ]; then
        DIR=$NEW_VER
    fi

    if [ -d $CUR_VER ]; then
        NEW_VER=$CUR_VER
        DIR=$NEW_VER
    fi

    if [ X"" != X"$FORCE_DIR" ]; then
        if [ -d $FORCE_DIR ]; then
            DIR=${FORCE_DIR}

            _cv=`echo $CUR_VER | sed -e 's/\.//'`
            if [ -e $DIR/base${_cv}.tgz ]; then
                NEW_VER=$CUR_VER
            fi
        fi
    fi

    if [ X"" == X"$DIR" ]; then
        FTP=${MIRROR}/${NEW_VER}/`machine`

        #echo "ls\nquit\n" | ftp ${MIRROR} | grep "${NEW_VER}"
        ${FTP_CMD} ${FTP}/MD5 > /dev/null

        if [ -e MD5 ]; then
            rm -f MD5
        else
            NEW_VER=$CUR_VER
        fi

        if [ X"$FORCE_DIR" == X"" ]; then
            DIR=$NEW_VER
        else
            DIR=$FORCE_DIR
        fi

        FTP=${MIRROR}/${DIR}/`machine`
    fi

    if [ X"" != X"${RELEASEDIR}" ]; then
        DIR=${RELEASEDIR}
    fi

    if [ -d $DIR ]; then
       cd $DIR
       RELEASEDIR=`pwd`
    fi

    _v=`echo $NEW_VER | sed -e 's/\.//'`
}

get_sets() {
    if [ X"" == X"$FTP" ]; then
        echo Error, no FTP site is set! >&2
        exit 1
    fi

    if [ X"" == X"$RELEASEDIR" ]; then
        RELEASEDIR=$DIR
    fi

    mkdir -p $RELEASEDIR
    cd ${RELEASEDIR}
    RELEASEDIR=`pwd`

    for _b in /bsd* bsd bsd.mp bsd.rd; do
        if [ -e /${_b} -a ! -e ./${_b} ]; then
            echo ${FTP_CMD} ${FTP}/${_b}
            ${FTP_CMD} ${FTP}/${_b}
        fi
    done

    for _s in `installed_sets`; do
        echo ${FTP_CMD} ${FTP}/${_s}${_v}.tgz
        ${FTP_CMD} ${FTP}/${_s}${_v}.tgz
    done

    echo ${FTP_CMD} ${FTP}/MD5
    ${FTP_CMD} ${FTP}/MD5
    ls bsd* *.tgz > index 
    grep -f index MD5 | md5 -c

    if [ $? -ne 0 ]; then
        echo !!! WARNING: MD5 does not match !!! >&2
        exit 1
    fi
}

install_kernel() {
    if [ X"${USER}" != X"root" -a X"${SUDO}" == X"" ]; then
        echo ${0##*/} must be run as root or SUDO must be set! >&2
        exit 1
    fi

    if [ X"" == X"$RELEASEDIR" ]; then
        echo "ERROR: no source for new kernels!" >&2
        exit 1
    else
        cd $RELEASEDIR
    fi

    if [ ! -e bsd ]; then
        echo "new bsd kernel does not exist!" >&2
        exit 1
    fi

    if [ -e /bsd.mp -a ! -e bsd.mp ]; then
        echo "new bsd.mp kernel does not exist!" >&2
        exit 1
    fi

    if [ ! -e bsd.rd ]; then
        echo "new bsd.rd kernel does not exist!" >&2
        exit 1
    fi


    if [ -e base${_v}.tgz ]; then
        echo Extracting new firmware from base${_v}.tgz
        ${SUDO} tar -C ${DESTDIR} -xzphf base${_v}.tgz "*etc/firmware/*"
    fi

    ${SUDO} rm -f /obsd
    ${SUDO} ln /bsd /obsd
    if [ $? -ne 0 ]; then
        echo "Error copying old kernel!"
        exit 1
    fi

    for b in bsd*; do
        ${SUDO} rm -f /nbsd

        if [ X"$b" == X"bsd" ]; then
            echo Copying bsd to /bsd.sp
            ${SUDO} cp bsd /nbsd && ${SUDO} mv /nbsd /bsd.sp
            if [ $? -ne 0 ]; then
                echo "ERROR: Couldn't copy new SP kernel!" >&2
                exit 1
            fi
        else
            if [ -e /${b} ]; then
                echo Copying ${b} to /
                ${SUDO} cp ${b} /nbsd && ${SUDO} mv /nbsd /${b}
                if [ $? -ne 0 ]; then
                    echo "ERROR: Couldn't copy new ${b} kernel!" >&2
                    exit 1
                fi
            fi
        fi
    done

    if [ ! -h /bsd ]; then
        if [ -e /bsd.mp ]; then
            echo linking /bsd.mp to /bsd
            ${SUDO} ln -sf /bsd.mp /bsd
        else
            echo linking /bsd.sp to /bsd
            ${SUDO} ln -sf /bsd.sp /bsd
        fi
        if [ $? -ne 0 ]; then
            echo "ERROR: Couldn't symlink new kernel!" >&2
            exit 1
        fi
    fi
}

install_sets() {
    if [ X"${USER}" != X"root" -a X"${SUDO}" == X"" ]; then
        echo ${0##*/} must be run as root or SUDO must be set! >&2
        exit 1
    fi

    if [ X"" == X"$RELEASEDIR" ]; then
        echo "ERROR: no source for sets!" >&2
        exit 1
    else
        cd $RELEASEDIR
    fi

    for _f in *${_v}.tgz; do
        _path=${DESTDIR}
        if [ X"etc${_v}.tgz"  == X"${_f}" \
            -o X"xetc${_v}.tgz" == X"${_f}" ]; then
            if [ X"" != X"${SYSMERGE}" ]; then
                continue
            fi
            _path=/var/tmp/temproot
        fi

        echo Extracting ${_f} to $_path
        ${SUDO} mkdir -p $_path
        ${SUDO} tar -C $_path -xzphf ${RELEASEDIR}/${_f}
        if [ $? -ne 0 ]; then
            echo "Error extracting ${_f}!" >&2
            exit 1
        fi
    done

    echo Extracted all sets.
}

update_etc() {
    if [ X"" == X"${SYSMERGE}" ]; then
        if [ -e /var/tmp/temproot ]; then
            MERGEMASTER=`which mergemaster`

            if [ $? != 0 ]; then
                ${SUDO} pkg_add -i mergemaster
                MERGEMASTER=`which mergemaster`
                if [ $? != 0 ]; then
                    echo ERROR: mergemaster not installed! >&2
                    exit 1
                fi
            fi

            echo '### RUNNING MERGEMASTER ###'
            ${SUDO} ${MERGEMASTER} -irv
        else 
            echo "ERROR: no source for etc!" >&2
            exit 1
        fi
    else
        if [ X"" == X"$RELEASEDIR" ]; then
            echo "ERROR: no source for etc!" >&2
            exit 1
        else
            cd $RELEASEDIR
        fi

        _cv=`echo $CUR_VER | sed -e 's/\.//'`
        if [ -e etc${_cv}.tgz ]; then
            _args="${_args} -s etc${_cv}.tgz"
        fi
        if [ -e xetc${_cv}.tgz ]; then
            _args="${_args} -x xetc${_cv}.tgz"
        fi
        if [ X"" == X"$_args" ]; then 
            echo ERROR: No upgrade sets found! >&2
        else
            echo '### RUNNING SYSMERGE ###'
            _args="-a $_args"
            ${SUDO} ${SYSMERGE} $_args
        fi
    fi
}


PKG_PATH=${PKG_PATH:=/usr/ports/packages/`machine`/all/:${MIRROR}/`uname -r`/packages/`machine`/}

if [ ! -e ${SYSMERGE} ]; then
    SYSMERGE=
fi

set_version

echo
echo "-= update_openbsd - helper script to update OpenBSD =-"
echo "------------------------------------------------------"
echo
echo "       DIR: $DIR"
echo "RELEASEDIR: $RELEASEDIR"
echo "   DESTDIR: $DESTDIR"
echo "   CUR_VER: $CUR_VER"
echo "   NEW_VER: $NEW_VER"
echo "      SUDO: $SUDO"
echo "  SYSMERGE: $SYSMERGE"
echo "    MIRROR: $MIRROR"
echo

if [ X"" == X"$RELEASEDIR" ]; then
    echo '### GETTING SETS ###'
    get_sets
fi

if [ X"" != X"$SUDO" ]; then
    echo Please enter your sudo password if prompted.
    echo You may be asked for it again later in the process.
    $SUDO -v
fi

echo '### INSTALLING KERNEL ###'
install_kernel

if [ $CUR_VER == $NEW_VER -o X"" != X"$FORCE_DIR" ]; then
    echo '### INSTALLING SETS ###'
    install_sets

    echo '### UPDATING ETC ###'
    update_etc

    echo '### UPDATING PACKAGES ###'
    $SUDO pkg_add -ui -F update -F updatedepends

else
    echo Instructions for updating to the new version available from 
    echo "  http://www.openbsd.org/faq/upgrade${_v}.html"
fi

echo New kernel installed.  Please reboot!