Project

General

Profile

Download (9.53 KB) Statistics
| Branch: | Tag: | Revision:
1 25682561 Scott Ullrich
<?php
2
/* $Id$ */
3
/*
4
	system_firmware_auto.php
5 1cecfbf7 Scott Ullrich
	Copyright (C) 2008 Scott Ullrich <sullrich@gmail.com>
6 da55e467 Scott Ullrich
	Copyright (C) 2005 Scott Ullrich
7 5c59c339 Scott Ullrich
8 da55e467 Scott Ullrich
        Based originally on system_firmware.php
9
        (C)2003-2004 Manuel Kasper
10 25682561 Scott Ullrich
	All rights reserved.
11
12
	Redistribution and use in source and binary forms, with or without
13
	modification, are permitted provided that the following conditions are met:
14
15
	1. Redistributions of source code must retain the above copyright notice,
16
	   this list of conditions and the following disclaimer.
17
18
	2. Redistributions in binary form must reproduce the above copyright
19
	   notice, this list of conditions and the following disclaimer in the
20
	   documentation and/or other materials provided with the distribution.
21
22
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
23
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
24
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
26
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
	POSSIBILITY OF SUCH DAMAGE.
32
*/
33 1d333258 Scott Ullrich
/*
34
	pfSense_BUILDER_BINARIES:	/usr/bin/tar	/usr/bin/nohup	/bin/cat	/sbin/sha256
35
	pfSense_MODULE:	firmware
36
*/
37 25682561 Scott Ullrich
38 6b07c15a Matthew Grooms
##|+PRIV
39
##|*IDENT=page-system-firmware-checkforupdate
40
##|*NAME=System: Firmware: Check For Update page
41
##|*DESCR=Allow access to the 'System: Firmware: Check For Update' page.
42
##|*MATCH=system_firmware_auto.php*
43
##|-PRIV
44
45 da55e467 Scott Ullrich
require("guiconfig.inc");
46 4e6593de jim-p
require_once("pfsense-utils.inc");
47 da55e467 Scott Ullrich
48
$curcfg = $config['system']['firmware'];
49 9b7d7aa9 Scott Ullrich
50 ef794b01 Scott Ullrich
if(isset($curcfg['alturl']['enable']))
51 da55e467 Scott Ullrich
	$updater_url = "{$config['system']['firmware']['alturl']['firmwareurl']}";
52 ef794b01 Scott Ullrich
else
53
	$updater_url = $g['update_url'];
54
	
55 499fea07 Carlos Eduardo Ramos
$pgtitle = array(gettext("Diagnostics"),gettext("Firmware"),gettext("Auto Update"));
56 52380979 Scott Ullrich
include("head.inc");
57
58 25682561 Scott Ullrich
?>
59
60 da55e467 Scott Ullrich
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
61
<link href="gui.css" rel="stylesheet" type="text/css">
62
</head>
63
64 25682561 Scott Ullrich
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
65 da55e467 Scott Ullrich
66 25682561 Scott Ullrich
<?php include("fbegin.inc"); ?>
67
68
<form action="system_firmware_auto.php" method="post">
69 da55e467 Scott Ullrich
<table width="100%" border="0" cellpadding="6" cellspacing="0">
70
	<tr>
71
		<td>
72 4820d297 Scott Ullrich
<?php
73
	$tab_array = array();
74 499fea07 Carlos Eduardo Ramos
	$tab_array[0] = array(gettext("Manual Update"), false, "system_firmware.php");
75
	$tab_array[1] = array(gettext("Auto Update"), true, "system_firmware_check.php");
76
	$tab_array[2] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
77 4820d297 Scott Ullrich
	display_top_tabs($tab_array);
78
?>
79 da55e467 Scott Ullrich
		</td>
80
	</tr>
81 25682561 Scott Ullrich
	<tr>
82 da55e467 Scott Ullrich
	  <td class="tabcont">
83
	      <table width="100%" border="0" cellpadding="6" cellspacing="0">
84
			  <tr>
85
			    <td class="tabcont">
86
					<table width="100%" border="0" cellpadding="6" cellspacing="0">
87
						<tr>
88
							<td>
89
								<center>
90
								<table height='15' width='420' border='0' colspacing='0' cellpadding='0' cellspacing='0'>
91
92
								<tr>
93
									<td background="./themes/the_wall/images/misc/bar_left.gif" height='15' width='5'>
94
									</td>
95
									<td>
96
									<table id="progholder" name="progholder" height='15' width='410' border='0' colspacing='0' cellpadding='0' cellspacing='0'>
97
										<td background="./themes/the_wall/images/misc/bar_gray.gif" valign="top" align="left">
98
											<img src='./themes/the_wall/images/misc/bar_blue.gif' width='0' height='15' name='progressbar' id='progressbar'>
99
										</td>
100
									</table>
101
								</td>
102
								<td background="./themes/the_wall/images/misc/bar_right.gif" height='15' width='5'>
103
								</td>
104
							</tr>
105
						</table>
106
						<br>
107
						<!-- status box -->
108 499fea07 Carlos Eduardo Ramos
						<textarea cols="60" rows="1" name="status" id="status" wrap="hard"><?=gettext("Beginning firmware upgrade"); ?>.</textarea>
109 da55e467 Scott Ullrich
						<!-- command output box -->
110
						<textarea cols="60" rows="25" name="output" id="output" wrap="hard"></textarea>
111
					</center>
112
					</td>
113
				</tr>
114 25682561 Scott Ullrich
	      </table>
115 da55e467 Scott Ullrich
		</table>
116 25682561 Scott Ullrich
	  </td>
117
	</tr>
118 1c0e3b99 Scott Ullrich
</table>
119 25682561 Scott Ullrich
</form>
120
<?php include("fend.inc"); ?>
121
</body>
122
</html>
123
124
<?php
125
126 89f0ac4c Renato Botelho
update_status(gettext("Downloading current version information") . "...");
127 414053da jim-p
$nanosize = "";
128
if ($g['platform'] == "nanobsd") {
129 0d7715eb Renato Botelho
	if (file_exists("/etc/nano_use_vga.txt"))
130
		$nanosize = "-nanobsd-vga-";
131
	else
132
		$nanosize = "-nanobsd-";
133
134
	$nanosize .= strtolower(trim(file_get_contents("/etc/nanosize.txt")));
135 414053da jim-p
}
136
137
download_file_with_progress_bar("{$updater_url}/version{$nanosize}", "/tmp/{$g['product_name']}_version");
138 773c99bc Ermal
$latest_version = str_replace("\n", "", @file_get_contents("/tmp/{$g['product_name']}_version"));
139
if(!$latest_version) {
140 89f0ac4c Renato Botelho
	update_output_window(gettext("Unable to check for updates."));
141 773c99bc Ermal
	require("fend.inc");
142
	exit;
143
} else {
144 4e6593de jim-p
	$current_installed_buildtime = trim(file_get_contents("/etc/version.buildtime"));
145
	$current_installed_version = trim(file_get_contents("/etc/version"));
146
	$latest_version = trim(@file_get_contents("/tmp/{$g['product_name']}_version"));
147 773c99bc Ermal
	$latest_version_pfsense = strtotime($latest_version);
148
	if(!$latest_version) {
149 89f0ac4c Renato Botelho
		update_output_window(gettext("Unable to check for updates."));
150 773c99bc Ermal
		require("fend.inc");
151
		exit;
152
	} else {
153 4e6593de jim-p
		if (pfs_version_compare($current_installed_buildtime, $current_installed_version, $latest_version) == -1) {
154 89f0ac4c Renato Botelho
			update_status(gettext("Downloading updates") . "...");
155 773c99bc Ermal
			conf_mount_rw();
156 087d875c jim-p
			if ($g['platform'] == "nanobsd") {
157
				$update_filename = "latest{$nanosize}.img.gz";
158
			} else {
159
				$update_filename = "latest.tgz";
160
			}
161
			$status = download_file_with_progress_bar("{$updater_url}/{$update_filename}", "{$g['upload_path']}/latest.tgz", "read_body_firmware");	
162
			$status = download_file_with_progress_bar("{$updater_url}/{$update_filename}.sha256", "{$g['upload_path']}/latest.tgz.sha256");
163 773c99bc Ermal
			conf_mount_ro();
164 b7596b80 Carlos Eduardo Ramos
			update_output_window("{$g['product_name']} " . gettext("download complete."));
165 773c99bc Ermal
		} else {
166 89f0ac4c Renato Botelho
			update_output_window(gettext("You are on the latest version."));
167 773c99bc Ermal
			require("fend.inc");
168
			exit;
169
		}
170
	}
171 da55e467 Scott Ullrich
}
172
173
/* launch external upgrade helper */
174 61ffe8b8 Renato Botelho
$external_upgrade_helper_text = "/etc/rc.firmware ";
175
176
if($g['platform'] == "nanobsd")
177
	$external_upgrade_helper_text .= "pfSenseNanoBSDupgrade ";
178
else
179
	$external_upgrade_helper_text .= "pfSenseupgrade ";
180
181 4e6593de jim-p
$external_upgrade_helper_text .= "{$g['upload_path']}/latest.tgz";
182 da55e467 Scott Ullrich
183 1d333258 Scott Ullrich
$downloaded_latest_tgz_sha256 = str_replace("\n", "", `/sbin/sha256 -q {$g['upload_path']}/latest.tgz`);
184
$upgrade_latest_tgz_sha256 = str_replace("\n", "", `/bin/cat {$g['upload_path']}/latest.tgz.sha256 | awk '{ print $4 }'`);
185 da55e467 Scott Ullrich
186 563f5b51 Scott Ullrich
$sigchk = 0;
187
188
if(!isset($curcfg['alturl']['enable']))
189 0ba45a79 Renato Botelho
	$sigchk = verify_digital_signature("{$g['upload_path']}/latest.tgz");
190 563f5b51 Scott Ullrich
191 4b798102 Ermal
$exitstatus = 0;
192
if ($sigchk == 1) {
193 89f0ac4c Renato Botelho
	$sig_warning = gettext("The digital signature on this image is invalid.");
194 4b798102 Ermal
	$exitstatus = 1;
195
} else if ($sigchk == 2) {
196 89f0ac4c Renato Botelho
	$sig_warning = gettext("This image is not digitally signed.");
197 4b798102 Ermal
	if (!isset($config['system']['firmware']['allowinvalidsig']))
198
		$exitstatus = 1;
199
} else if (($sigchk >= 3)) {
200 89f0ac4c Renato Botelho
	$sig_warning = gettext("There has been an error verifying the signature on this image.");
201 4b798102 Ermal
	$exitstatus = 1;
202
}
203
204
if ($exitstatus) {
205
        update_status($sig_warning);
206 89f0ac4c Renato Botelho
        update_output_window(gettext("Update cannot continue"));
207 a0116247 Ermal
	require("fend.inc");
208
        exit;
209 4b798102 Ermal
} else if ($sigchk == 2)
210 89f0ac4c Renato Botelho
        update_output_window("\n" . gettext("Image has no signature but the system configured to allow unsigned images.") . "\n");
211 563f5b51 Scott Ullrich
212 0ba45a79 Renato Botelho
if (!verify_gzip_file("{$g['upload_path']}/latest.tgz")) {
213 89f0ac4c Renato Botelho
	update_status(gettext("The image file is corrupt."));
214
	update_output_window(gettext("Update cannot continue"));
215 0ba45a79 Renato Botelho
	if (file_exists("{$g['upload_path']}/latest.tgz")) {
216
		conf_mount_rw();
217 7dde365c Renato Botelho
		unlink("{$g['upload_path']}/latest.tgz");
218 0ba45a79 Renato Botelho
		conf_mount_ro();
219
	}
220 563f5b51 Scott Ullrich
	require("fend.inc");
221
	exit;
222
}
223
224 da55e467 Scott Ullrich
if($downloaded_latest_tgz_sha256 <> $upgrade_latest_tgz_sha256) {
225 89f0ac4c Renato Botelho
	update_status(gettext("Downloading complete but sha256 does not match."));
226
	update_output_window(gettext("Auto upgrade aborted.") . "  \n\n" . gettext("Downloaded SHA256") . ": " . $downloaded_latest_tgz_sha256 . "\n\n" . gettext("Needed SHA256") . ": " . $upgrade_latest_tgz_sha256);
227 d40b3c36 Colin Smith
} else {
228 89f0ac4c Renato Botelho
	update_output_window($g['product_name'] . " " . gettext("is now upgrading.") . "\\n\\n" . gettext("The firewall will reboot once the operation is completed."));
229 da55e467 Scott Ullrich
	echo "\n<script language=\"JavaScript\">document.progressbar.style.visibility='hidden';\n</script>";
230 ecae7e91 sullrich
	mwexec_bg("/usr/bin/nohup {$external_upgrade_helper_text}");
231 d40b3c36 Colin Smith
}
232 cdb0117c Scott Ullrich
233 da55e467 Scott Ullrich
/*
234
	Helper functions
235
*/
236 d40b3c36 Colin Smith
237 9140757d Bill Marquette
function read_body_firmware($ch, $string) {
238 4e6593de jim-p
	global $fout, $file_size, $downloaded, $counter, $version, $latest_version, $current_installed_version;
239 da55e467 Scott Ullrich
	$length = strlen($string);
240
	$downloaded += intval($length);
241
	$downloadProgress = round(100 * (1 - $downloaded / $file_size), 0);
242
	$downloadProgress = 100 - $downloadProgress;
243
	$a = $file_size;
244
	$b = $downloaded;
245
	$c = $downloadProgress;
246 89f0ac4c Renato Botelho
	$text  = "  " . gettext("Auto Update Download Status") . "\\n";
247 5924fa0f Scott Ullrich
	$text .= "----------------------------------------------------\\n";
248 4e6593de jim-p
	$text .= "  " . gettext("Current Version") . " : {$current_installed_version}\\n";
249 89f0ac4c Renato Botelho
	$text .= "  " . gettext("Latest Version") . "  : {$latest_version}\\n";
250
	$text .= "  " . gettext("File size") . "       : {$a}\\n";
251
	$text .= "  " . gettext("Downloaded") . "      : {$b}\\n";
252
	$text .= "  " . gettext("Percent") . "         : {$c}%\\n";
253 5924fa0f Scott Ullrich
	$text .= "----------------------------------------------------\\n";
254 da55e467 Scott Ullrich
	$counter++;
255
	if($counter > 150) {
256
		update_output_window($text);
257
		update_progress_bar($downloadProgress);
258
		$counter = 0;
259
	}
260
	fwrite($fout, $string);
261
	return $length;
262 ebe916cf Colin Smith
}
263 853167d2 Colin Smith
264 773c99bc Ermal
?>