diff options
author | Scott Ullrich <sullrich@pfsense.org> | 2008-05-18 23:51:33 +0000 |
---|---|---|
committer | Scott Ullrich <sullrich@pfsense.org> | 2008-05-18 23:51:33 +0000 |
commit | 84aa381e61492ddc4bed24fc6f89361ace0347d7 (patch) | |
tree | 830865867095f34ccb5e48a5bd75c1e72094605c /etc/rc.firmware | |
parent | b0eeb07113e89351fce4172e66e44a021bb3f50c (diff) | |
download | pfsense-84aa381e61492ddc4bed24fc6f89361ace0347d7.zip pfsense-84aa381e61492ddc4bed24fc6f89361ace0347d7.tar.gz |
Restore to 1.2-RELEASE file.
Diffstat (limited to 'etc/rc.firmware')
-rwxr-xr-x | etc/rc.firmware | 310 |
1 files changed, 247 insertions, 63 deletions
diff --git a/etc/rc.firmware b/etc/rc.firmware index 31b42f3..a6e0082 100755 --- a/etc/rc.firmware +++ b/etc/rc.firmware @@ -1,80 +1,264 @@ #!/bin/sh # $Id$ +# /etc/rc.firmware +# part of m0n0wall (http://neon1.net/m0n0wall) +# +# Copyright (C) 2003 Manuel Kasper <mk@neon1.net>. +# All rights reserved. -FMBASEURL=$1 -FMFILENAME=$2 -FETCHFILENAME=$1/$2 +#CFDEVICE=`cat /var/etc/cfdevice` -# wait 5 seconds before beginning -sleep 5 +exec 3>&2 2>>/tmp/firmware_update.log -logger -p daemon.info -i -t AutoUpgrade "Auto Upgrade started" - -HTTP_AUTH="" +export ACTION=$1 +export IMG=$2 +if [ $# -eq 3 ]; then + export CUSTOMIMG=$3 +fi -# if username and password is passed, let fetch utilize. -if [ $# -gt 3 ]; then -HTTP_AUTH="basic:*:$3:$4" +if [ $ACTION != "upgrade" ]; then + /sbin/umount -f /ftmp > /dev/null 2>&1 fi -#echo "Downloading $FMFILENAME from $FMBASEURL ..." | logger -p daemon.info -i -t AutoUpgrade -#/usr/bin/fetch -o /tmp/latest.tgz $FETCHFILENAME | logger -p daemon.info -i -t AutoUpgrade -#echo "Downloading $FMFILENAME.md5 from $FMBASEURL ..." | logger -p daemon.info -i -t AutoUpgrade -#/usr/bin/fetch -o /tmp/latest.tgz.md5 $FETCHFILENAME.md5 | logger -p daemon.info -i -t AutoUpgrade +backup_chflags() { + TOPROCESS="bin lib libexec sbin usr" + for files in $TOPROCESS; do + /usr/sbin/mtree -Pcp /${files} | bzip2 -9 > /tmp/chflags.dist.${files}.bz2 | logger -p daemon.info -i -t UpgradeFlags + done +} -PMD=`/bin/cat /tmp/latest.tgz.md5 | cut -d" " -f4 ` -MD=`/sbin/md5 /tmp/latest.tgz | cut -d" " -f4` +restore_chflags() { + TOPROCESS="bin lib libexec sbin usr" + for files in $TOPROCESS; do + cd / && /usr/bin/bzcat /tmp/chflags.dist.${files}.bz2 | /usr/sbin/mtree -PU -p /${files} | logger -p daemon.info -i -t UpgradeFlags + done +} -PLATFORM=`cat /etc/version` +remove_chflags() { + TOPROCESS="bin lib libexec sbin usr" + for files in $TOPROCESS; do + /bin/chflags -R noschg /${files} + /bin/chmod -R u+rw /${files} + done +} -echo " Package MD5: ${PMD}" | logger -p daemon.info -i -t AutoUpgrade -echo "Downloaded MD5: ${MD}" | logger -p daemon.info -i -t AutoUpgrade +binary_update() { + TGZ=$1 + ERR_F="/tmp/bdiff.log" + rm ${ERR_F} 2>/dev/null + /bin/mkdir /tmp/patched /tmp/patches 2>>${ERR_F} + backup_chflags + remove_chflags + cd /tmp/patches + for i in `/usr/bin/tar tvzf $TGZ | egrep -v "(^d|_md5)" | nawk '{print $9;}'`; + do + FILE=`basename ${i}` + echo "Working on ${i}" + # Untar patch file and md5 files + /usr/bin/tar xzf ${TGZ} ${i} ${i}.old_file_md5 ${i}.new_patch_md5 ${i}.new_file_md5 2>>${ERR_F} -if [ "$PMD" = "" ]; then - echo "Package MD5 is null md5. Require proxy auth?" | logger -p daemon.info -i -t AutoUpgrade - exit 1 -fi + # Apply patch - oldfile newfile patchfile + /usr/local/bin/bspatch /${i} /tmp/patched/${FILE} /tmp/patches/${i} 2>>${ERR_F} -if [ "$MD" = "" ]; then - echo "Downloaded MD5 is null md5. Require proxy auth?" | logger -p daemon.info -i -t AutoUpgrade - exit 1 -fi + OLD_FILE_MD5=`cat /tmp/patches/${i}.old_file_md5 2>/dev/null` + NEW_PATCH_MD5=`cat /tmp/patches/${i}.new_patch_md5 2>/dev/null` + NEW_FILE_MD5=`cat /tmp/patches/${i}.new_file_md5 2>/dev/null` + PATCHED_MD5=`/sbin/md5 -q /tmp/patched/${FILE} 2>/dev/null` -if [ "$PMD" = "$MD" ]; then - echo "MD5's match." | logger -p daemon.info -i -t AutoUpgrade - echo "Beginning pfSense upgrade." | wall - if [ "$PLATFORM" = "net45xx" ]; then - /usr/local/bin/php /etc/rc.conf_mount_rw - fi - if [ "$PLATFORM" = "wrap" ]; then - /usr/local/bin/php /etc/rc.conf_mount_rw - fi - if [ -r "/tmp/custom.tgz" ]; then - sh /etc/rc.firmware pfSenseupgrade /tmp/latest.tgz /tmp/custom.tgz - else - sh /etc/rc.firmware pfSenseupgrade /tmp/latest.tgz - fi - if [ "$PLATFORM" = "wrap" ]; then - /bin/sync - sleep 5 - /usr/local/bin/php /etc/rc.conf_mount_ro - if [ -e /etc/init_bootloader.sh ]; then - sh /etc/init_bootloader.sh - fi - fi - if [ "$PLATFORM" = "net45xx" ]; then - /bin/sync - sleep 5 - /usr/local/bin/php /etc/rc.conf_mount_ro - if [ -e /etc/init_bootloader.sh ]; then - sh /etc/init_bootloader.sh - fi - fi - exit 0 -fi + if [ "$PATCHED_MD5" = "$NEW_PATCH_MD5" ]; then + /usr/bin/install -S /tmp/patched/${FILE} /${i} + else + #echo "${i} file does not match intended final md5." + echo "${i} file does not match intended final md5." >> ${ERR_F} + fi + + /bin/rm /tmp/patched/${FILE} >> ${ERR_F} + /bin/rm /tmp/patches/${i} >> ${ERR_F} + /bin/rm /tmp/patches/${i}.* >> ${ERR_F} + done + /bin/rm -rf /tmp/patched /tmp/patches >> ${ERR_F} + restore_chflags +} + +case $ACTION in +enable) + #/sbin/mount_mfs -s 15360 -T qp120at -b 8192 -f 1024 dummy /ftmp \ + # > /dev/null 2>&1 + ;; +auto) + backup_chflags + remove_chflags + /etc/rc.firmware_auto + restore_chflags + ;; +upgrade) + # wait 5 seconds before beginning + sleep 5 + backup_chflags + remove_chflags + + exec </dev/console >/dev/console 2>/dev/console + + echo + echo "Firmware upgrade in progress..." | logger -p daemon.info -i -t Upgrade + echo "Firmware upgrade in progress..." | wall + + # backup config + mkdir /tmp/configbak + cp -p /conf/* /tmp/configbak + + # unmount /cf + /sbin/umount -f /cf + + # dd image onto card + if [ -r $IMG ]; then + /usr/bin/gunzip -S "" -c $IMG | dd of=/dev/r$CFDEVICE bs=16k > /dev/null 2>&1 + echo "Image installed." + fi + + # mount /cf + /sbin/mount -w -o noatime /cf + + # restore config + cp -p /tmp/configbak/* /conf + + restore_chflags + + rm -f /var/run/firmware.lock + + /bin/sync + sleep 5 + + echo "Done." + + # If /tmp/post_upgrade_command exists after update + # then execute the command. + if [ -f /tmp/post_upgrade_command ]; then + sh /tmp/post_upgrade_command + fi + + # If the archive has unpacked a file called + # /tmp/no_upgrade_reboot_required then do + # not reboot after upgrade. + if [ -f /tmp/no_upgrade_reboot_required ]; then + rm /tmp/no_upgrade_reboot_required + else + rm -f /var/run/config.lock + sh /etc/rc.reboot + fi + ;; +pfSenseupgrade) + # wait 5 seconds before beginning + sleep 5 + + # Sanity check - bail early if there's no firmware file! + if [ ! -r $IMG ]; then + echo "2nd parameter has not been passed or file does not exist. Exiting." | logger -p daemon.info -i -t Upgrade + exit + fi + + backup_chflags + remove_chflags + + #exec </dev/console >/dev/console 2>/dev/console + + echo "Firmware upgrade in progress..." | logger -p daemon.info -i -t Upgrade + + # backup config + /bin/mkdir -p /tmp/configbak + cp -p /conf/* /tmp/configbak 2>/dev/null + # mount /cf + /etc/rc.conf_mount_rw + /sbin/mount -w -o noatime /cf 2>/dev/null + /sbin/mount -w -o noatime / 2>/dev/null + + # tar explode image onto hd + echo "Installing $IMG." | logger -p daemon.info -i -t Upgrade + cd / && /usr/bin/tar xzUPf $IMG | logger -p daemon.info -i -t Upgrade + /usr/bin/find / -name CVS -exec rm -fr {} \; + echo "Image installed $IMG." | logger -p daemon.info -i -t Upgrade + + # process custom image if its passed + if [ $# -eq 3 ]; then + if [ -f $CUSTOMIMG ]; then + echo "Custom image $CUSTOMIMG found." | logger -p daemon.info -i -t Upgrade + echo "Custom image ($CUSTOMIMG) found." + PWD_DIR=`pwd` + cd / && /usr/bin/tar xzPUf $CUSTOMIMG | logger -p daemon.info -i -t Upgrade + cd $PWD_DIR + echo "Custom image $CUSTOMIMG installed." | logger -p daemon.info -i -t Upgrade + fi + fi + + # restore config + cp -p /tmp/configbak/* /conf 2>/dev/null + + # restore /etc symlinks + rm /etc/hosts + ln -s /var/etc/hosts /etc/hosts + + restore_chflags + + # Remove upgrade file + rm -f $IMG + + rm -f /var/run/firmware.lock + + /bin/sync + sleep 5 + + # remount /cf ro + rm -rf /etc/rc.conf + rm -rf /etc/motd + find / -name CVS -type d -exec rm {} \; + rm -rf /usr/savecore/* + /etc/rc.conf_mount_ro + /sbin/umount -f /cf 2>/dev/null + /sbin/mount -r /cf 2>/dev/null + /sbin/umount -f / 2>/dev/null + /sbin/mount -r / 2>/dev/null + if [ -e /etc/init_bootloader.sh ]; then + sh /etc/init_bootloader.sh + fi + /bin/sync + echo "Done." | logger -p daemon.info -i -t Upgrade + + # If /tmp/post_upgrade_command exists after update + # then execute the command. + if [ -f /tmp/post_upgrade_command ]; then + sh /tmp/post_upgrade_command + fi + + # If the archive has unpacked a file called + # /tmp/no_upgrade_reboot_required then do + # not reboot after upgrade. + if [ -f /tmp/no_upgrade_reboot_required ]; then + rm /tmp/no_upgrade_reboot_required + else + rm -f /var/run/config.lock + sh /etc/rc.reboot + fi + ;; +delta_update) + backup_chflags + remove_chflags + binary_update $IMG + restore_chflags + rm -rf /etc/rc.conf + rm -rf /etc/motd + find / -name CVS -type d -exec rm {} \; + rm -rf /usr/savecore/* + /etc/rc.conf_mount_ro + /sbin/umount -f /cf 2>/dev/null + /sbin/mount -r /cf 2>/dev/null + /sbin/umount -f / 2>/dev/null + /sbin/mount -r / 2>/dev/null + if [ -e /etc/init_bootloader.sh ]; then + sh /etc/init_bootloader.sh + fi + + ;; +esac -echo "MD5's do not match. Upgrade aborted." | logger -p daemon.info -i -t AutoUpgrade -rm /tmp/latest* -exit 1 |