summaryrefslogtreecommitdiffstats
path: root/etc/rc.firmware
blob: 719792e0d6a3cadb64ef3d2f767f31a2b373e3f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/bin/sh

# $Id$
# /etc/rc.firmware
# part of m0n0wall (http://neon1.net/m0n0wall)
#
# Copyright (C) 2003 Manuel Kasper <mk@neon1.net>.
# All rights reserved.

#CFDEVICE=`cat /var/etc/cfdevice`

if [ $1 != "upgrade" ]; then
	/sbin/umount -f /ftmp > /dev/null 2>&1
fi

backup_chflags() {
	/usr/sbin/mtree -Pcp / | bzip2 -9 > /tmp/chflags.dist.bz2 | logger -p daemon.info -i -t UpgradeFlags
}

restore_chflags() {
	cd / && /usr/bin/bzcat /tmp/chflags.dist.bz2 | /usr/sbin/mtree -PU -p / | logger -p daemon.info -i -t UpgradeFlags
}

remove_chflags() {
	/usr/bin/chflags -R noschg /
	/bin/chmod -R u+rw /
}

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}

	   # Apply patch - oldfile newfile patchfile
	   /usr/local/bin/bspatch /${i} /tmp/patched/${FILE} /tmp/patches/${i} 2>>${ERR_F}

	   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 [ "$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 $1 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

	# backup config
	mkdir /tmp/configbak
	cp -p /conf/* /tmp/configbak

	# unmount /cf
	/sbin/umount -f /cf

	# dd image onto card
	if [ -r $2 ]; then
		/usr/bin/gunzip -S "" -c $2 | 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

	# remount /cf ro
	/sbin/umount -f /cf
	/sbin/mount -r /cf

	echo "Done."
	sh /etc/rc.reboot
	;;
pfSenseupgrade)
	# wait 5 seconds before beginning
	sleep 5
	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
	/sbin/mount -w -o noatime /cf 2>/dev/null

	# tar explode image onto hd
	if [ -r $2 ]; then
		echo "Installing $2." | logger -p daemon.info -i -t Upgrade
		/usr/bin/tar xzPf $2 -U -C / | logger -p daemon.info -i -t Upgrade
		/usr/bin/find / -name CVS -exec rm {} \;
		echo "Image installed $2." | logger -p daemon.info -i -t Upgrade
	else
		echo "2nd paramater has not been passed; skipping." | logger -p daemon.info -i -t Upgrade
	fi

        # process custom image if its passed
        if [ -r $3 ]; then
            echo "Custom image $3 found." | logger -p daemon.info -i -t Upgrade
            /usr/bin/tar xzPf $3 -U -C / | logger -p daemon.info -i -t Upgrade
            echo "Custom image $3 installed." | logger -p daemon.info -i -t Upgrade
        fi

	# restore config
	cp -p /tmp/configbak/* /conf 2>/dev/null

	# restore /etc symlinks
	rm /etc/hosts
	ln -s /var/etc/hosts /etc/hosts

	# we dont use freebsd's rc, we have our own.
	rm -rf /etc/rc.subr
	rm -rf /etc/rc.d

	restore_chflags

	# remount /cf ro
	/sbin/umount -f /cf 2>/dev/null
	/sbin/mount -r /cf 2>/dev/null
	
	echo "Done." | logger -p daemon.info -i -t Upgrade
	sh /etc/rc.reboot
	;;
delta_update)
	backup_chflags
	remove_chflags
	binary_update $2
	restore_chflags
	;;
esac
OpenPOWER on IntegriCloud