Annotation of openbsd/update_openbsd/update_openbsd, Revision 1.6
1.1 andrew 1: #!/bin/sh
1.6 ! andrew 2: # $RedRiver: update_openbsd,v 1.5 2008/10/11 22:12:33 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.6 ! andrew 135: if [ ! -e MD5 ]; then
! 136: echo $FTP_CMD ${FTP}/MD5
! 137: $FTP_CMD ${FTP}/MD5
! 138: fi
! 139:
1.2 andrew 140: ls bsd* *.tgz > index
141: grep -f index MD5 | md5 -c
142:
143: if [ $? -ne 0 ]; then
1.5 andrew 144: echo ERROR: MD5 does not match! >&2
1.2 andrew 145: exit 1
146: fi
147: }
148:
149: install_kernel() {
1.5 andrew 150: echo '### INSTALLING KERNEL ###'
1.3 andrew 151: if [ X"$USER" != X"root" -a X"$SUDO" == X"" ]; then
1.2 andrew 152: echo ${0##*/} must be run as root or SUDO must be set! >&2
153: exit 1
154: fi
155:
156: if [ X"" == X"$RELEASEDIR" ]; then
1.5 andrew 157: echo ERROR: no source for new kernels! >&2
1.2 andrew 158: exit 1
159: else
160: cd $RELEASEDIR
161: fi
162:
163: if [ ! -e bsd ]; then
1.5 andrew 164: echo ERROR: new bsd kernel does not exist! >&2
1.2 andrew 165: exit 1
166: fi
167:
168: if [ -e /bsd.mp -a ! -e bsd.mp ]; then
1.5 andrew 169: echo ERROR: new bsd.mp kernel does not exist! >&2
1.2 andrew 170: exit 1
171: fi
172:
173: if [ ! -e bsd.rd ]; then
1.5 andrew 174: echo ERROR: new bsd.rd kernel does not exist! >&2
1.2 andrew 175: exit 1
176: fi
177:
1.5 andrew 178: local _v=$FILE_VER
1.2 andrew 179: if [ -e base${_v}.tgz ]; then
180: echo Extracting new firmware from base${_v}.tgz
1.3 andrew 181: $SUDO tar -C $DESTDIR -xzphf base${_v}.tgz "*etc/firmware/*"
1.2 andrew 182: fi
183:
1.3 andrew 184: $SUDO rm -f /obsd
185: $SUDO ln /bsd /obsd
1.2 andrew 186: if [ $? -ne 0 ]; then
187: echo "Error copying old kernel!"
188: exit 1
189: fi
190:
1.3 andrew 191: for _b in bsd*; do
192: $SUDO rm -f /nbsd
1.2 andrew 193:
1.5 andrew 194: if [ X"${_b}" == X"bsd" ]; then
1.2 andrew 195: echo Copying bsd to /bsd.sp
1.3 andrew 196: $SUDO cp bsd /nbsd && $SUDO mv /nbsd /bsd.sp
1.2 andrew 197: if [ $? -ne 0 ]; then
1.5 andrew 198: echo ERROR: Could not copy new SP kernel! >&2
1.2 andrew 199: exit 1
200: fi
201: else
1.3 andrew 202: if [ -e /$_b ]; then
203: echo Copying $_b to /
204: $SUDO cp ${_b} /nbsd && $SUDO mv /nbsd /${_b}
1.2 andrew 205: if [ $? -ne 0 ]; then
1.5 andrew 206: echo ERROR: Could not copy new $_b kernel! >&2
1.2 andrew 207: exit 1
208: fi
209: fi
210: fi
211: done
212:
213: if [ ! -h /bsd ]; then
214: if [ -e /bsd.mp ]; then
215: echo linking /bsd.mp to /bsd
1.3 andrew 216: $SUDO ln -sf /bsd.mp /bsd
1.2 andrew 217: else
218: echo linking /bsd.sp to /bsd
1.3 andrew 219: $SUDO ln -sf /bsd.sp /bsd
1.2 andrew 220: fi
221: if [ $? -ne 0 ]; then
1.5 andrew 222: echo ERROR: Could not symlink new kernel! >&2
1.2 andrew 223: exit 1
224: fi
225: fi
226: }
227:
228: install_sets() {
1.5 andrew 229: echo '### INSTALLING SETS ###'
1.3 andrew 230: if [ X"$USER" != X"root" -a X"$SUDO" == X"" ]; then
1.2 andrew 231: echo ${0##*/} must be run as root or SUDO must be set! >&2
232: exit 1
233: fi
234:
235: if [ X"" == X"$RELEASEDIR" ]; then
1.5 andrew 236: echo ERROR: no source for sets! >&2
1.2 andrew 237: exit 1
238: else
239: cd $RELEASEDIR
240: fi
241:
1.5 andrew 242: local _v=$FILE_VER
243:
1.2 andrew 244: for _f in *${_v}.tgz; do
1.3 andrew 245: _path=$DESTDIR
246: if [ X"etc${_v}.tgz" == X"$_f" \
247: -o X"xetc${_v}.tgz" == X"$_f" ]; then
248: if [ X"" != X"$SYSMERGE" ]; then
1.2 andrew 249: continue
250: fi
251: _path=/var/tmp/temproot
252: fi
253:
1.3 andrew 254: echo Extracting $_f to $_path
255: $SUDO mkdir -p $_path
256: $SUDO tar -C $_path -xzphf ${RELEASEDIR}/${_f}
1.2 andrew 257: if [ $? -ne 0 ]; then
1.5 andrew 258: echo ERROR: Could not extract ${_f}! >&2
1.2 andrew 259: exit 1
260: fi
261: done
262:
263: echo Extracted all sets.
264: }
265:
266: update_etc() {
1.5 andrew 267: echo '### UPDATING ETC ###'
1.3 andrew 268: if [ X"" == X"$SYSMERGE" ]; then
1.2 andrew 269: if [ -e /var/tmp/temproot ]; then
270: MERGEMASTER=`which mergemaster`
271:
272: if [ $? != 0 ]; then
1.3 andrew 273: $SUDO pkg_add -i mergemaster
1.5 andrew 274:
1.2 andrew 275: MERGEMASTER=`which mergemaster`
276: if [ $? != 0 ]; then
277: echo ERROR: mergemaster not installed! >&2
278: exit 1
279: fi
280: fi
281:
282: echo '### RUNNING MERGEMASTER ###'
1.3 andrew 283: $SUDO $MERGEMASTER -irv
1.2 andrew 284: else
285: echo "ERROR: no source for etc!" >&2
286: exit 1
287: fi
288: else
289: if [ X"" == X"$RELEASEDIR" ]; then
290: echo "ERROR: no source for etc!" >&2
291: exit 1
292: else
293: cd $RELEASEDIR
294: fi
295:
1.5 andrew 296: local _v=$FILE_VER
297: if [ -e etc${_v}.tgz ]; then
298: _args="$_args -s etc${_v}.tgz"
1.2 andrew 299: fi
1.5 andrew 300: if [ -e xetc${_v}.tgz ]; then
301: _args="$_args -x xetc${_v}.tgz"
1.2 andrew 302: fi
303: if [ X"" == X"$_args" ]; then
304: echo ERROR: No upgrade sets found! >&2
305: else
306: echo '### RUNNING SYSMERGE ###'
307: _args="-a $_args"
1.3 andrew 308: $SUDO $SYSMERGE $_args
1.2 andrew 309: fi
310: fi
311: }
312:
1.4 andrew 313: DESTDIR=${DESTDIR:=/}
1.2 andrew 314: PKG_PATH=${PKG_PATH:=/usr/ports/packages/`machine`/all/:${MIRROR}/`uname -r`/packages/`machine`/}
1.5 andrew 315: INSTALLED_SETS=${INSTALLED_SETS:=`installed_sets`}
1.2 andrew 316:
1.3 andrew 317: if [ X"" != X"$SYSMERGE" ]; then
318: if [ ! -e $SYSMERGE ]; then
319: SYSMERGE=
320: fi
1.2 andrew 321: fi
322:
323: set_version
324:
325: echo
326: echo "-= update_openbsd - helper script to update OpenBSD =-"
327: echo "------------------------------------------------------"
328: echo
329: echo "RELEASEDIR: $RELEASEDIR"
330: echo " DESTDIR: $DESTDIR"
331: echo " CUR_VER: $CUR_VER"
332: echo " NEW_VER: $NEW_VER"
1.5 andrew 333: #echo " FILE_VER: $FILE_VER"
1.2 andrew 334: echo " SUDO: $SUDO"
335: echo " SYSMERGE: $SYSMERGE"
336: echo " MIRROR: $MIRROR"
1.5 andrew 337: echo " SETS: $INSTALLED_SETS"
1.2 andrew 338: echo
339:
1.5 andrew 340: get_sets
1.2 andrew 341:
342: if [ X"" != X"$SUDO" ]; then
343: echo Please enter your sudo password if prompted.
344: echo You may be asked for it again later in the process.
345: $SUDO -v
346: fi
347:
348: install_kernel
349:
1.5 andrew 350: if [ $CUR_VER == $NEW_VER ]; then
1.2 andrew 351: install_sets
352: update_etc
353:
354: echo '### UPDATING PACKAGES ###'
355: $SUDO pkg_add -ui -F update -F updatedepends
356:
357: else
358: echo Instructions for updating to the new version available from
359: echo " http://www.openbsd.org/faq/upgrade${_v}.html"
360: fi
361:
362: echo New kernel installed. Please reboot!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>