#!/bin/sh # $RedRiver: update_openbsd,v 1.2 2008/08/12 22:07:05 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 [ X"" != X"$SYSMERGE" ]; then if [ ! -e $SYSMERGE ]; then SYSMERGE= fi 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!