=================================================================== RCS file: /cvs/openbsd/update_openbsd/update_openbsd,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- openbsd/update_openbsd/update_openbsd 2008/08/12 19:45:47 1.1 +++ openbsd/update_openbsd/update_openbsd 2008/08/12 23:07:05 1.2 @@ -1,2 +1,344 @@ #!/bin/sh -# $RedRiver$ +# $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!