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