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