Project

General

Profile

Download (9.35 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/bin/sh
2

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

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

    
12
exec 3>&2 2>>/tmp/firmware_update.log
13

    
14
export ACTION=$1
15
export IMG=$2
16
if [ $# -eq 3 ]; then
17
	export CUSTOMIMG=$3
18
fi
19

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

    
24
backup_chflags() {
25
	TOPROCESS="bin lib libexec sbin usr"
26
	for files in $TOPROCESS; do
27
		/usr/sbin/mtree -Pcp /${files} | bzip2 -9 > /tmp/chflags.dist.${files}.bz2 | logger -p daemon.info -i -t UpgradeFlags
28
	done
29
}
30

    
31
restore_chflags() {
32
	TOPROCESS="bin lib libexec sbin usr"
33
	for files in $TOPROCESS; do
34
		cd / && /usr/bin/bzcat /tmp/chflags.dist.${files}.bz2 | /usr/sbin/mtree -PU -p /${files} | logger -p daemon.info -i -t UpgradeFlags
35
	done
36
}
37

    
38
remove_chflags() {
39
	TOPROCESS="bin lib libexec sbin usr"
40
	for files in $TOPROCESS; do
41
		/bin/chflags -R noschg /${files}
42
		/bin/chmod -R u+rw /${files}
43
	done
44
}
45

    
46
binary_update() {
47
	TGZ=$1
48
	ERR_F="/tmp/bdiff.log"
49
	rm ${ERR_F} 2>/dev/null
50
	/bin/mkdir /tmp/patched /tmp/patches 2>>${ERR_F}
51
	backup_chflags
52
	remove_chflags
53
	cd /tmp/patches
54
	for i in `/usr/bin/tar tvzf $TGZ | egrep -v "(^d|_md5)" | nawk '{print $9;}'`;
55
	 do
56
	   FILE=`basename ${i}`
57
	   echo "Working on ${i}"
58
	   # Untar patch file and md5 files
59
	   /usr/bin/tar xzf ${TGZ} ${i} ${i}.old_file_md5 ${i}.new_patch_md5 ${i}.new_file_md5 2>>${ERR_F}
60

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

    
64
	   OLD_FILE_MD5=`cat /tmp/patches/${i}.old_file_md5 2>/dev/null`
65
	   NEW_PATCH_MD5=`cat /tmp/patches/${i}.new_patch_md5 2>/dev/null`
66
	   NEW_FILE_MD5=`cat /tmp/patches/${i}.new_file_md5 2>/dev/null`
67
	   PATCHED_MD5=`/sbin/md5 -q /tmp/patched/${FILE} 2>/dev/null`
68

    
69
	   if [ "$PATCHED_MD5" = "$NEW_PATCH_MD5" ]; then
70
		/usr/bin/install -S  /tmp/patched/${FILE} /${i}
71
	   else
72
		#echo "${i} file does not match intended final md5."
73
		echo "${i} file does not match intended final md5." >> ${ERR_F}
74
	   fi
75

    
76
	   /bin/rm /tmp/patched/${FILE} >> ${ERR_F}
77
	   /bin/rm /tmp/patches/${i} >> ${ERR_F}
78
	   /bin/rm /tmp/patches/${i}.* >> ${ERR_F}
79
	done
80
	/bin/rm -rf /tmp/patched /tmp/patches >> ${ERR_F}
81
	restore_chflags
82
}
83

    
84
case $ACTION in
85
enable)
86
	#/sbin/mount_mfs -s 15360 -T qp120at -b 8192 -f 1024 dummy /ftmp \
87
	#	> /dev/null 2>&1
88
	;;
89
auto)
90
	touch /var/run/firmware.lock
91
	backup_chflags
92
	remove_chflags
93
	/etc/rc.firmware_auto
94
	restore_chflags
95
	;;
96
upgrade)
97

    
98
	touch /var/run/firmware.lock
99

    
100
	# wait 5 seconds before beginning
101
	sleep 5
102
	backup_chflags
103
	remove_chflags
104

    
105
	exec </dev/console >/dev/console 2>/dev/console
106

    
107
	echo
108
	echo "Firmware upgrade in progress..."  | logger -p daemon.info -i -t Upgrade
109
	echo "Firmware upgrade in progress..." | wall
110

    
111
	# backup config
112
	mkdir /tmp/configbak
113
	cp -p /conf/* /tmp/configbak
114

    
115
	# unmount /cf
116
	/sbin/umount -f /cf
117

    
118
	# dd image onto card
119
	if [ -r $IMG ]; then
120
		/usr/bin/gunzip -S "" -c $IMG | dd of=/dev/r$CFDEVICE bs=16k > /dev/null 2>&1
121
		echo "Image installed."
122
	fi
123

    
124
	# mount /cf
125
	/sbin/mount -w -o noatime /cf
126

    
127
	# restore config
128
	cp -p /tmp/configbak/* /conf
129

    
130
	restore_chflags
131

    
132
	rm -f /var/run/firmware.lock
133

    
134
        /bin/sync
135
        sleep 5
136

    
137
	echo "Done."
138

    
139
	# If /tmp/post_upgrade_command exists after update
140
	# then execute the command.
141
	if [ -f /tmp/post_upgrade_command ]; then
142
		sh /tmp/post_upgrade_command
143
	fi
144

    
145
	# If the archive has unpacked a file called
146
	# /tmp/no_upgrade_reboot_required then do
147
	# not reboot after upgrade.
148
	if [ -f /tmp/no_upgrade_reboot_required ]; then
149
		rm /tmp/no_upgrade_reboot_required
150
	else
151
		rm -f /var/run/config.lock
152
		sh /etc/rc.reboot
153
	fi
154
	;;
155
pfSenseNanoBSDupgrade)
156

    
157
	# Sanity check - bail early if there's no firmware file!
158
	if [ ! -r $IMG ]; then
159
		echo "2nd parameter has not been passed or file does not exist. Exiting." | logger -p daemon.info -i -t Upgrade
160
		exit
161
	fi
162

    
163
	# wait 1 seconds before beginning
164
	sleep 1
165

    
166
	touch /var/run/firmware.lock
167

    
168
	# Do we have a pre-upgrade hook in the update file?
169
	if [ `tar tvzf $IMG | grep /tmp/pre_upgrade_command | wc -l` -gt 0 ]; then 
170
		tar xzvf $IMG -C / ./tmp/pre_upgrade_command
171
		chmod a+rx /tmp/pre_upgrade_command
172
		sh /tmp/pre_upgrade_command
173
	fi
174

    
175
	echo "Firmware upgrade in progress..."  | logger -p daemon.info -i -t Upgrade
176

    
177
	# backup config
178
	/bin/mkdir -p /tmp/configbak
179
	cp -p /conf/* /tmp/configbak 2>/dev/null
180
	# mount /cf
181
	/etc/rc.conf_mount_rw
182
	/sbin/mount -w -o noatime /cf 2>/dev/null
183
	/sbin/mount -w -o noatime /   2>/dev/null
184

    
185
	echo "Installing $IMG." | logger -p daemon.info -i -t Upgrade
186

    
187
	BOOT_DEVICE=`/sbin/mount | /usr/bin/grep root | /usr/bin/cut -d'/' -f4 | /usr/bin/cut -d' ' -f1`
188
	if [ "$BOOT_DEVICE" = "root0" ]; then
189
		TOFLASH="root1"
190
	else
191
		TOFLASH="root0"
192
	fi
193

    
194
	# Remove TOFLASH and get ready for new flash image
195
	dd if=/dev/zero of=/dev/ufs/${TOFLASH} bs=1m count=1 >/dev/null 2>&1
196

    
197
	# Stream gzipped image to dd and explode image to new area
198
	/usr/bin/gunzip -S "" -c $IMG | /bin/dd of=/dev/ufs/${TOFLASH} bs=16k >/dev/null 2>&1
199
	
200
	# Ensure that our new system is sound and bail if it is not and file a notice
201
	/sbin/fsck_ffs -n /dev/ufs/${TOFLASH}
202
	if [ $? != 0 ]; then
203
		/usr/local/bin/php -q -d auto_prepend_file=config.inc <<ENDOFF
204
		<?php
205
			require_once(\"functions.inc\");
206
			require_once(\"/usr/local/pkg/apache_mod_security.inc\");
207
			file_notice("UpgradeFailure", "{$g['product_name']} upgrade has failed.   Your system has been left in a usable state.", "UpgradeFailure", "");
208
		?>
209
ENDOFF
210
		
211
	fi
212

    
213
	/usr/sbin/boot0cfg -s 1 -v /dev/ufs/${TOFLASH}
214

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

    
218
	# Remove upgrade file
219
	rm -f $IMG
220

    
221
	# If /tmp/post_upgrade_command exists after update
222
	# then execute the command.
223
	if [ -f /tmp/post_upgrade_command ]; then
224
		sh /tmp/post_upgrade_command
225
	fi
226

    
227
	# remount /cf ro
228
	rm -rf /etc/rc.conf
229
	rm -rf /etc/motd
230
	find / -name CVS -type d -exec rm {} \;
231
	rm -rf /usr/savecore/*
232
	/etc/rc.conf_mount_ro
233

    
234
	sleep 3
235
	rm -f /var/run/firmware.lock
236
	/bin/sync
237
	sleep 2
238
	echo "Done." | logger -p daemon.info -i -t Upgrade
239

    
240
	# If the archive has unpacked a file called
241
	# /tmp/no_upgrade_reboot_required then do
242
	# not reboot after upgrade.
243
	if [ -f /tmp/no_upgrade_reboot_required ]; then
244
		rm /tmp/no_upgrade_reboot_required
245
	else
246
		rm -f /var/run/config.lock
247
		sh /etc/rc.reboot
248
	fi
249

    
250
	;;
251
pfSenseupgrade)
252
	
253
	# Sanity check - bail early if there's no firmware file!
254
	if [ ! -r $IMG ]; then
255
		echo "2nd parameter has not been passed or file does not exist. Exiting." | logger -p daemon.info -i -t Upgrade
256
		exit
257
	fi
258

    
259
	# wait 1 seconds before beginning
260
	sleep 1
261

    
262
	touch /var/run/firmware.lock
263

    
264
	backup_chflags
265
	remove_chflags
266

    
267
	# Do we have a pre-upgrade hook in the update file?
268
	if [ `tar tvzf $IMG | grep /tmp/pre_upgrade_command | wc -l` -gt 0 ]; then 
269
		tar xzvf $IMG -C / ./tmp/pre_upgrade_command
270
		chmod a+rx /tmp/pre_upgrade_command
271
		sh /tmp/pre_upgrade_command
272
	fi
273

    
274
	#exec </dev/console >/dev/console 2>/dev/console
275

    
276
	echo "Firmware upgrade in progress..."  | logger -p daemon.info -i -t Upgrade
277

    
278
	# backup config
279
	/bin/mkdir -p /tmp/configbak
280
	cp -p /conf/* /tmp/configbak 2>/dev/null
281
	# mount /cf
282
	/etc/rc.conf_mount_rw
283
	/sbin/mount -w -o noatime /cf 2>/dev/null
284
	/sbin/mount -w -o noatime /   2>/dev/null
285

    
286
	# tar explode image onto hd
287
	echo "Installing $IMG." | logger -p daemon.info -i -t Upgrade
288
	cd / && /usr/bin/tar xzUPf $IMG | logger -p daemon.info -i -t Upgrade
289
	/usr/bin/find / -name CVS -exec rm -fr {} \;
290
	echo "Image installed $IMG." | logger -p daemon.info -i -t Upgrade
291

    
292
    # process custom image if its passed
293
    if [ $# -eq 3 ]; then
294
	    if [ -f $CUSTOMIMG ]; then
295
	        echo "Custom image $CUSTOMIMG found." | logger -p daemon.info -i -t Upgrade
296
	        echo "Custom image ($CUSTOMIMG) found."
297
	        PWD_DIR=`pwd`
298
	        cd / && /usr/bin/tar xzPUf $CUSTOMIMG | logger -p daemon.info -i -t Upgrade
299
	        cd $PWD_DIR
300
	        echo "Custom image $CUSTOMIMG installed." | logger -p daemon.info -i -t Upgrade
301
	    fi
302
    fi
303

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

    
307
	# restore /etc symlinks
308
	rm /etc/hosts
309
	ln -s /var/etc/hosts /etc/hosts
310

    
311
	restore_chflags
312

    
313
	# Remove upgrade file
314
	rm -f $IMG
315

    
316
	if [ -e /etc/init_bootloader.sh ]; then
317
		sh /etc/init_bootloader.sh
318
	fi
319

    
320
	# If /tmp/post_upgrade_command exists after update
321
	# then execute the command.
322
	if [ -f /tmp/post_upgrade_command ]; then
323
		sh /tmp/post_upgrade_command
324
	fi
325

    
326
	# remount /cf ro
327
	rm -rf /etc/rc.conf
328
	rm -rf /etc/motd
329
	find / -name CVS -type d -exec rm {} \;
330
	rm -rf /usr/savecore/*
331
	/etc/rc.conf_mount_ro
332
	/sbin/umount -f /cf 2>/dev/null
333
	/sbin/mount -r /cf 2>/dev/null
334
	/sbin/umount -f / 2>/dev/null
335
	/sbin/mount -r / 2>/dev/null
336

    
337
	sleep 3
338
	rm -f /var/run/firmware.lock
339
	/bin/sync
340
	sleep 2
341
	echo "Done." | logger -p daemon.info -i -t Upgrade
342

    
343
	# If the archive has unpacked a file called
344
	# /tmp/no_upgrade_reboot_required then do
345
	# not reboot after upgrade.
346
	if [ -f /tmp/no_upgrade_reboot_required ]; then
347
		rm /tmp/no_upgrade_reboot_required
348
	else
349
		rm -f /var/run/config.lock
350
		sh /etc/rc.reboot
351
	fi
352

    
353
	;;
354
delta_update)
355
	touch /var/run/firmware.lock
356
	backup_chflags
357
	remove_chflags
358
	binary_update $IMG
359
	restore_chflags
360
	rm -rf /etc/rc.conf
361
	rm -rf /etc/motd
362
	find / -name CVS -type d -exec rm {} \;
363
	rm -rf /usr/savecore/*
364
	/etc/rc.conf_mount_ro
365
	/sbin/umount -f /cf 2>/dev/null
366
	/sbin/mount -r /cf 2>/dev/null
367
	/sbin/umount -f / 2>/dev/null
368
	/sbin/mount -r / 2>/dev/null
369
	if [ -e /etc/init_bootloader.sh ]; then
370
		sh /etc/init_bootloader.sh
371
	fi
372

    
373
	;;
374
esac
375

    
376

    
(44-44/87)