Annotation of openbsd/update_openbsd/update_openbsd, Revision 1.5
1.1 andrew 1: #!/bin/sh
1.5 ! andrew 2: # $RedRiver: update_openbsd,v 1.4 2008/08/12 22:44:19 andrew Exp $
1.2 andrew 3:
4: SYSMERGE=/usr/sbin/sysmerge
5: MIRROR=ftp://ftp.openbsd.org/pub/OpenBSD
6: FTP_CMD='ftp -V'
7:
8: if [ -e /etc/update_openbsd.conf ]; then
9: . /etc/update_openbsd.conf
10: fi
11:
12: if [ -e ${HOME}/.update_openbsdrc ]; then
13: . ${HOME}/.update_openbsdrc
14: fi
15:
16: installed_sets() {
1.5 ! andrew 17: local misc=/usr/share/doc/README
! 18: local man=/usr/share/man/cat1/intro.0
! 19: local comp=/usr/bin/cc
! 20: local game=/usr/games/
! 21: local xbase=/usr/X11R6/
! 22: local xetc=/etc/X11/xinit/xinitrc
! 23: local xfont=/usr/X11R6/lib/X11/fonts
! 24: local xserv=/usr/X11R6/bin/X
! 25: local xshare=/usr/X11R6/bin/startx
! 26:
! 27: local _c _d _e
! 28: echo -n base
! 29: echo -n ' etc'
1.3 andrew 30: for _d in misc man comp game xbase xetc xfont xserv xshare; do
31: eval _e=\$${_d}
32: _c=`ls $_e 2> /dev/null | wc -l`
33: #echo $_c $_d $_e
34: if [ $_c -ne 0 ]; then
1.5 ! andrew 35: echo -n " $_d"
1.2 andrew 36: fi
37: done
38: }
39:
40: set_version() {
41: CUR_VER=`uname -r`
1.3 andrew 42: NEW_VER=`dc -e "$CUR_VER 0.1 + p"`
1.5 ! andrew 43: FILE_VER=""
! 44: FTP=""
1.2 andrew 45:
1.5 ! andrew 46: local _cv=`echo $CUR_VER | sed -e 's/\.//'`
! 47: local _nv=`echo $NEW_VER | sed -e 's/\.//'`
! 48: local _v=""
! 49:
! 50: if [ X"" != X"$FORCE_DIR" -a -d $FORCE_DIR ]; then
! 51: _dir=$FORCE_DIR
! 52: if [ -e ${_dir}/base${_nv}.tgz ]; then
! 53: _v=$_nv
! 54: elif [ -e ${_dir}/base${_cv}.tgz ]; then
! 55: NEW_VER=$CUR_VER
! 56: _v=$_cv
! 57: fi
1.2 andrew 58:
1.5 ! andrew 59: elif [ -d $CUR_VER ]; then
! 60: _dir=$CUR_VER
1.2 andrew 61: NEW_VER=$CUR_VER
1.5 ! andrew 62: if [ -e ${_dir}/base${_cv}.tgz ]; then
! 63: _v=$_cv
! 64: fi
1.2 andrew 65:
1.5 ! andrew 66: elif [ -d $NEW_VER ]; then
! 67: _dir=$NEW_VER
! 68: if [ -e ${_dir}/base${_nv}.tgz ]; then
! 69: _v=$_nv
! 70: fi
1.2 andrew 71:
72: fi
73:
1.5 ! andrew 74: if [ X"" == X"${_v}" ]; then
! 75: if [ X"" == X"${FORCE_DIR}" ]; then
! 76: _dir=${NEW_VER}
! 77: else
! 78: _dir=${FORCE_DIR}
! 79: fi
! 80: FTP=${MIRROR}/${_dir}/`machine`
1.2 andrew 81:
1.5 ! andrew 82: local _file=`echo "ls base${_cv}.tgz" | ${FTP_CMD} ${FTP}/ | awk '{ print $9 }'`
1.2 andrew 83:
1.5 ! andrew 84: if [ X"base${_cv}.tgz" == X"${_file}" ]; then
! 85: NEW_VER=$CUR_VER
! 86: _v=$_cv
1.2 andrew 87: else
1.5 ! andrew 88: _v=$_nv
1.2 andrew 89: fi
90:
1.5 ! andrew 91: if [ X"" == X"$FORCE_DIR" ]; then
! 92: _dir=$NEW_VER
1.2 andrew 93: fi
94:
95: fi
96:
1.5 ! andrew 97: if [ X"" == X"${_v}" ]; then
! 98: echo ERROR: Unable to determine file version! >&2
! 99: exit 1
1.2 andrew 100: fi
101:
1.5 ! andrew 102: if [ X"" == X"$RELEASEDIR" ]; then
! 103: RELEASEDIR=`pwd`/$_dir
1.2 andrew 104: fi
1.5 ! andrew 105: FILE_VER=$_v
! 106: FTP=${MIRROR}/${_dir}/`machine`
1.2 andrew 107: }
108:
109: get_sets() {
1.5 ! andrew 110: echo '### GETTING SETS ###'
1.2 andrew 111: if [ X"" == X"$FTP" ]; then
1.5 ! andrew 112: echo ERROR: No FTP site set! >&2
1.2 andrew 113: exit 1
114: fi
115:
1.5 ! andrew 116: mkdir -p ${RELEASEDIR}
! 117: cd $RELEASEDIR
1.2 andrew 118:
1.5 ! andrew 119: local _v=$FILE_VER
1.2 andrew 120:
1.5 ! andrew 121: for _b in `echo /bsd* bsd bsd.mp bsd.rd | sort -u`; do
1.2 andrew 122: if [ -e /${_b} -a ! -e ./${_b} ]; then
1.3 andrew 123: echo $FTP_CMD ${FTP}/${_b}
124: $FTP_CMD ${FTP}/${_b}
1.2 andrew 125: fi
126: done
127:
1.5 ! andrew 128: for _s in $INSTALLED_SETS; do
! 129: if [ ! -e ./${_s}${_v}.tgz ]; then
! 130: echo $FTP_CMD ${FTP}/${_s}${_v}.tgz
! 131: $FTP_CMD ${FTP}/${_s}${_v}.tgz
! 132: fi
1.2 andrew 133: done
134:
1.3 andrew 135: echo $FTP_CMD ${FTP}/MD5
136: $FTP_CMD ${FTP}/MD5
1.2 andrew 137: ls bsd* *.tgz > index
138: grep -f index MD5 | md5 -c
139:
140: if [ $? -ne 0 ]; then
1.5 ! andrew 141: echo ERROR: MD5 does not match! >&2
1.2 andrew 142: exit 1
143: fi
144: }
145:
146: install_kernel() {
1.5 ! andrew 147: echo '### INSTALLING KERNEL ###'
1.3 andrew 148: if [ X"$USER" != X"root" -a X"$SUDO" == X"" ]; then
1.2 andrew 149: echo ${0##*/} must be run as root or SUDO must be set! >&2
150: exit 1
151: fi
152:
153: if [ X"" == X"$RELEASEDIR" ]; then
1.5 ! andrew 154: echo ERROR: no source for new kernels! >&2
1.2 andrew 155: exit 1
156: else
157: cd $RELEASEDIR
158: fi
159:
160: if [ ! -e bsd ]; then
1.5 ! andrew 161: echo ERROR: new bsd kernel does not exist! >&2
1.2 andrew 162: exit 1
163: fi
164:
165: if [ -e /bsd.mp -a ! -e bsd.mp ]; then
1.5 ! andrew 166: echo ERROR: new bsd.mp kernel does not exist! >&2
1.2 andrew 167: exit 1
168: fi
169:
170: if [ ! -e bsd.rd ]; then
1.5 ! andrew 171: echo ERROR: new bsd.rd kernel does not exist! >&2
1.2 andrew 172: exit 1
173: fi
174:
1.5 ! andrew 175: local _v=$FILE_VER
1.2 andrew 176: if [ -e base${_v}.tgz ]; then
177: echo Extracting new firmware from base${_v}.tgz
1.3 andrew 178: $SUDO tar -C $DESTDIR -xzphf base${_v}.tgz "*etc/firmware/*"
1.2 andrew 179: fi
180:
1.3 andrew 181: $SUDO rm -f /obsd
182: $SUDO ln /bsd /obsd
1.2 andrew 183: if [ $? -ne 0 ]; then
184: echo "Error copying old kernel!"
185: exit 1
186: fi
187:
1.3 andrew 188: for _b in bsd*; do
189: $SUDO rm -f /nbsd
1.2 andrew 190:
1.5 ! andrew 191: if [ X"${_b}" == X"bsd" ]; then
1.2 andrew 192: echo Copying bsd to /bsd.sp
1.3 andrew 193: $SUDO cp bsd /nbsd && $SUDO mv /nbsd /bsd.sp
1.2 andrew 194: if [ $? -ne 0 ]; then
1.5 ! andrew 195: echo ERROR: Could not copy new SP kernel! >&2
1.2 andrew 196: exit 1
197: fi
198: else
1.3 andrew 199: if [ -e /$_b ]; then
200: echo Copying $_b to /
201: $SUDO cp ${_b} /nbsd && $SUDO mv /nbsd /${_b}
1.2 andrew 202: if [ $? -ne 0 ]; then
1.5 ! andrew 203: echo ERROR: Could not copy new $_b kernel! >&2
1.2 andrew 204: exit 1
205: fi
206: fi
207: fi
208: done
209:
210: if [ ! -h /bsd ]; then
211: if [ -e /bsd.mp ]; then
212: echo linking /bsd.mp to /bsd
1.3 andrew 213: $SUDO ln -sf /bsd.mp /bsd
1.2 andrew 214: else
215: echo linking /bsd.sp to /bsd
1.3 andrew 216: $SUDO ln -sf /bsd.sp /bsd
1.2 andrew 217: fi
218: if [ $? -ne 0 ]; then
1.5 ! andrew 219: echo ERROR: Could not symlink new kernel! >&2
1.2 andrew 220: exit 1
221: fi
222: fi
223: }
224:
225: install_sets() {
1.5 ! andrew 226: echo '### INSTALLING SETS ###'
1.3 andrew 227: if [ X"$USER" != X"root" -a X"$SUDO" == X"" ]; then
1.2 andrew 228: echo ${0##*/} must be run as root or SUDO must be set! >&2
229: exit 1
230: fi
231:
232: if [ X"" == X"$RELEASEDIR" ]; then
1.5 ! andrew 233: echo ERROR: no source for sets! >&2
1.2 andrew 234: exit 1
235: else
236: cd $RELEASEDIR
237: fi
238:
1.5 ! andrew 239: local _v=$FILE_VER
! 240:
1.2 andrew 241: for _f in *${_v}.tgz; do
1.3 andrew 242: _path=$DESTDIR
243: if [ X"etc${_v}.tgz" == X"$_f" \
244: -o X"xetc${_v}.tgz" == X"$_f" ]; then
245: if [ X"" != X"$SYSMERGE" ]; then
1.2 andrew 246: continue
247: fi
248: _path=/var/tmp/temproot
249: fi
250:
1.3 andrew 251: echo Extracting $_f to $_path
252: $SUDO mkdir -p $_path
253: $SUDO tar -C $_path -xzphf ${RELEASEDIR}/${_f}
1.2 andrew 254: if [ $? -ne 0 ]; then
1.5 ! andrew 255: echo ERROR: Could not extract ${_f}! >&2
1.2 andrew 256: exit 1
257: fi
258: done
259:
260: echo Extracted all sets.
261: }
262:
263: update_etc() {
1.5 ! andrew 264: echo '### UPDATING ETC ###'
1.3 andrew 265: if [ X"" == X"$SYSMERGE" ]; then
1.2 andrew 266: if [ -e /var/tmp/temproot ]; then
267: MERGEMASTER=`which mergemaster`
268:
269: if [ $? != 0 ]; then
1.3 andrew 270: $SUDO pkg_add -i mergemaster
1.5 ! andrew 271:
1.2 andrew 272: MERGEMASTER=`which mergemaster`
273: if [ $? != 0 ]; then
274: echo ERROR: mergemaster not installed! >&2
275: exit 1
276: fi
277: fi
278:
279: echo '### RUNNING MERGEMASTER ###'
1.3 andrew 280: $SUDO $MERGEMASTER -irv
1.2 andrew 281: else
282: echo "ERROR: no source for etc!" >&2
283: exit 1
284: fi
285: else
286: if [ X"" == X"$RELEASEDIR" ]; then
287: echo "ERROR: no source for etc!" >&2
288: exit 1
289: else
290: cd $RELEASEDIR
291: fi
292:
1.5 ! andrew 293: local _v=$FILE_VER
! 294: if [ -e etc${_v}.tgz ]; then
! 295: _args="$_args -s etc${_v}.tgz"
1.2 andrew 296: fi
1.5 ! andrew 297: if [ -e xetc${_v}.tgz ]; then
! 298: _args="$_args -x xetc${_v}.tgz"
1.2 andrew 299: fi
300: if [ X"" == X"$_args" ]; then
301: echo ERROR: No upgrade sets found! >&2
302: else
303: echo '### RUNNING SYSMERGE ###'
304: _args="-a $_args"
1.3 andrew 305: $SUDO $SYSMERGE $_args
1.2 andrew 306: fi
307: fi
308: }
309:
1.4 andrew 310: DESTDIR=${DESTDIR:=/}
1.2 andrew 311: PKG_PATH=${PKG_PATH:=/usr/ports/packages/`machine`/all/:${MIRROR}/`uname -r`/packages/`machine`/}
1.5 ! andrew 312: INSTALLED_SETS=${INSTALLED_SETS:=`installed_sets`}
1.2 andrew 313:
1.3 andrew 314: if [ X"" != X"$SYSMERGE" ]; then
315: if [ ! -e $SYSMERGE ]; then
316: SYSMERGE=
317: fi
1.2 andrew 318: fi
319:
320: set_version
321:
322: echo
323: echo "-= update_openbsd - helper script to update OpenBSD =-"
324: echo "------------------------------------------------------"
325: echo
326: echo "RELEASEDIR: $RELEASEDIR"
327: echo " DESTDIR: $DESTDIR"
328: echo " CUR_VER: $CUR_VER"
329: echo " NEW_VER: $NEW_VER"
1.5 ! andrew 330: #echo " FILE_VER: $FILE_VER"
1.2 andrew 331: echo " SUDO: $SUDO"
332: echo " SYSMERGE: $SYSMERGE"
333: echo " MIRROR: $MIRROR"
1.5 ! andrew 334: echo " SETS: $INSTALLED_SETS"
1.2 andrew 335: echo
336:
1.5 ! andrew 337: get_sets
1.2 andrew 338:
339: if [ X"" != X"$SUDO" ]; then
340: echo Please enter your sudo password if prompted.
341: echo You may be asked for it again later in the process.
342: $SUDO -v
343: fi
344:
345: install_kernel
346:
1.5 ! andrew 347: if [ $CUR_VER == $NEW_VER ]; then
1.2 andrew 348: install_sets
349: update_etc
350:
351: echo '### UPDATING PACKAGES ###'
352: $SUDO pkg_add -ui -F update -F updatedepends
353:
354: else
355: echo Instructions for updating to the new version available from
356: echo " http://www.openbsd.org/faq/upgrade${_v}.html"
357: fi
358:
359: echo New kernel installed. Please reboot!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>