Project

General

Profile

Download (17.2 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
 * index.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6
 * Copyright (c) 2004-2016 Rubicon Communications, LLC (Netgate)
7
 * All rights reserved.
8
 *
9
 * originally based on m0n0wall (http://m0n0.ch/wall)
10
 * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>.
11
 * All rights reserved.
12
 *
13
 * Redistribution and use in source and binary forms, with or without
14
 * modification, are permitted provided that the following conditions are met:
15
 *
16
 * 1. Redistributions of source code must retain the above copyright notice,
17
 *    this list of conditions and the following disclaimer.
18
 *
19
 * 2. Redistributions in binary form must reproduce the above copyright
20
 *    notice, this list of conditions and the following disclaimer in
21
 *    the documentation and/or other materials provided with the
22
 *    distribution.
23
 *
24
 * 3. All advertising materials mentioning features or use of this software
25
 *    must display the following acknowledgment:
26
 *    "This product includes software developed by the pfSense Project
27
 *    for use in the pfSense® software distribution. (http://www.pfsense.org/).
28
 *
29
 * 4. The names "pfSense" and "pfSense Project" must not be used to
30
 *    endorse or promote products derived from this software without
31
 *    prior written permission. For written permission, please contact
32
 *    coreteam@pfsense.org.
33
 *
34
 * 5. Products derived from this software may not be called "pfSense"
35
 *    nor may "pfSense" appear in their names without prior written
36
 *    permission of the Electric Sheep Fencing, LLC.
37
 *
38
 * 6. Redistributions of any form whatsoever must retain the following
39
 *    acknowledgment:
40
 *
41
 * "This product includes software developed by the pfSense Project
42
 * for use in the pfSense software distribution (http://www.pfsense.org/).
43
 *
44
 * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
45
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
47
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR
48
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
49
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
50
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
51
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
53
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
55
 * OF THE POSSIBILITY OF SUCH DAMAGE.
56
 */
57

    
58
##|+PRIV
59
##|*IDENT=page-system-login-logout
60
##|*NAME=System: Login / Logout / Dashboard
61
##|*DESCR=Allow access to the 'System: Login / Logout' page and Dashboard.
62
##|*MATCH=index.php*
63
##|-PRIV
64

    
65
// Turn on buffering to speed up rendering
66
ini_set('output_buffering', 'true');
67

    
68
// Start buffering with a cache size of 100000
69
ob_start(null, "1000");
70

    
71
## Load Essential Includes
72
require_once('guiconfig.inc');
73
require_once('functions.inc');
74
require_once('notices.inc');
75
require_once("pkg-utils.inc");
76

    
77
if (isset($_POST['closenotice'])) {
78
	close_notice($_POST['closenotice']);
79
	sleep(1);
80
	exit;
81
}
82

    
83
if (isset($_GET['closenotice'])) {
84
	close_notice($_GET['closenotice']);
85
	sleep(1);
86
}
87

    
88
if ($g['disablecrashreporter'] != true) {
89
	// Check to see if we have a crash report
90
	$x = 0;
91
	if (file_exists("/tmp/PHP_errors.log")) {
92
		$total = `/bin/cat /tmp/PHP_errors.log | /usr/bin/wc -l | /usr/bin/awk '{ print $1 }'`;
93
		if ($total > 0) {
94
			$x++;
95
		}
96
	}
97

    
98
	$crash = glob("/var/crash/*");
99
	$skip_files = array(".", "..", "minfree", "");
100

    
101
	if (is_array($crash)) {
102
		foreach ($crash as $c) {
103
			if (!in_array(basename($c), $skip_files)) {
104
				$x++;
105
			}
106
		}
107

    
108
		if ($x > 0) {
109
			$savemsg = sprintf(gettext("%s has detected a crash report or programming bug."), $g['product_name']) . " ";
110
			if (isAllowedPage("/crash_reporter.php")) {
111
				$savemsg .= sprintf(gettext("Click <a href='crash_reporter.php'>here</a> for more information."));
112
			} else {
113
				$savemsg .= sprintf(gettext("Contact a firewall administrator for more information."));
114
			}
115
			$class = "warning";
116
		}
117
	}
118
}
119

    
120
##build list of php include files
121
$phpincludefiles = array();
122
$directory = "/usr/local/www/widgets/include/";
123
$dirhandle = opendir($directory);
124
$filename = "";
125

    
126
while (false !== ($filename = readdir($dirhandle))) {
127
	if (!stristr($filename, ".inc")) {
128
		continue;
129
	}
130
	$phpincludefiles[] = $filename;
131
}
132

    
133
## Include each widget include file.
134
## These define vars that specify the widget title and title link.
135
foreach ($phpincludefiles as $includename) {
136
	if (file_exists($directory . $includename)) {
137
		include_once($directory . $includename);
138
	}
139
}
140

    
141
##build list of widgets
142
foreach (glob("/usr/local/www/widgets/widgets/*.widget.php") as $file) {
143
	$name = basename($file, '.widget.php');
144
	// Get the widget title that should be in a var defined in the widget's inc file.
145
	$widgettitle = ${$name . '_title'};
146

    
147
	if (empty(trim($widgettitle))) {
148
		// Fall back to constructing a title from the file name of the widget.
149
		$widgettitle = ucwords(str_replace('_', ' ', $name));
150
	}
151

    
152
	$widgets[ $name ] = array('name' => $widgettitle, 'display' => 'none');
153
}
154

    
155
##if no config entry found, initialize config entry
156
if (!is_array($config['widgets'])) {
157
	$config['widgets'] = array();
158
}
159
if (!is_array($user_settings['widgets'])) {
160
	$user_settings['widgets'] = array();
161
}
162

    
163
if ($_POST && $_POST['sequence']) {
164

    
165
	// Start with the user's widget settings.
166
	$widget_settings = $user_settings['widgets'];
167

    
168
	$widget_settings['sequence'] = rtrim($_POST['sequence'], ',');
169

    
170
	foreach ($widgets as $widgetname => $widgetconfig) {
171
		if ($_POST[$widgetname . '-config']) {
172
			$widget_settings[$widgetname . '-config'] = $_POST[$widgetname . '-config'];
173
		}
174
	}
175

    
176
	save_widget_settings($_SESSION['Username'], $widget_settings);
177
	header("Location: /");
178
	exit;
179
}
180

    
181
## Load Functions Files
182
require_once('includes/functions.inc.php');
183

    
184
## Check to see if we have a swap space,
185
## if true, display, if false, hide it ...
186
if (file_exists("/usr/sbin/swapinfo")) {
187
	$swapinfo = `/usr/sbin/swapinfo`;
188
	if (stristr($swapinfo, '%') == true) $showswap=true;
189
}
190

    
191
## User recently restored his config.
192
## If packages are installed lets resync
193
if (file_exists('/conf/needs_package_sync')) {
194
	if ($config['installedpackages'] <> '' && is_array($config['installedpackages']['package'])) {
195
		if ($g['platform'] == $g['product_name'] || $g['platform'] == "nanobsd") {
196
			## If the user has logged into webGUI quickly while the system is booting then do not redirect them to
197
			## the package reinstall page. That is about to be done by the boot script anyway.
198
			## The code in head.inc will put up a notice to the user.
199
			if (!platform_booting()) {
200
				header('Location: pkg_mgr_install.php?mode=reinstallall');
201
				exit;
202
			}
203
		}
204
	} else {
205
		conf_mount_rw();
206
		@unlink('/conf/needs_package_sync');
207
		conf_mount_ro();
208
	}
209
}
210

    
211
## If it is the first time webConfigurator has been
212
## accessed since initial install show this stuff.
213
if (file_exists('/conf/trigger_initial_wizard')) {
214
?>
215
<!DOCTYPE html>
216
<html lang="en">
217
<head>
218
	<link rel="stylesheet" href="/css/pfSense.css" />
219
	<title><?=$g['product_name']?>.localdomain - <?=$g['product_name']?> first time setup</title>
220
	<meta http-equiv="refresh" content="1;url=wizard.php?xml=setup_wizard.xml" />
221
</head>
222
<body id="loading-wizard" class="no-menu">
223
	<div id="jumbotron">
224
		<div class="container">
225
			<div class="col-sm-offset-3 col-sm-6 col-xs-12">
226
				<font color="white">
227
				<p><h3><?=sprintf(gettext("Welcome to %s!\n"), $g['product_name'])?></h3></p>
228
				<p><?=gettext("One moment while the initial setup wizard starts.")?></p>
229
				<p><?=gettext("Embedded platform users: Please be patient, the wizard takes a little longer to run than the normal GUI.")?></p>
230
				<p><?=sprintf(gettext("To bypass the wizard, click on the %s logo on the initial page."), $g['product_name'])?></p>
231
				</font>
232
			</div>
233
		</div>
234
	</div>
235
</body>
236
</html>
237
<?php
238
	exit;
239
}
240

    
241
## Find out whether there's hardware encryption or not
242
unset($hwcrypto);
243
$fd = @fopen("{$g['varlog_path']}/dmesg.boot", "r");
244
if ($fd) {
245
	while (!feof($fd)) {
246
		$dmesgl = fgets($fd);
247
		if (preg_match("/^hifn.: (.*?),/", $dmesgl, $matches)
248
			or preg_match("/.*(VIA Padlock)/", $dmesgl, $matches)
249
			or preg_match("/^safe.: (\w.*)/", $dmesgl, $matches)
250
			or preg_match("/^ubsec.: (.*?),/", $dmesgl, $matches)
251
			or preg_match("/^padlock.: <(.*?)>,/", $dmesgl, $matches)
252
			or preg_match("/^glxsb.: (.*?),/", $dmesgl, $matches)) {
253
			$hwcrypto = $matches[1];
254
			break;
255
		}
256
	}
257
	fclose($fd);
258
	if (!isset($hwcrypto) && get_single_sysctl("dev.aesni.0.%desc")) {
259
		$hwcrypto = get_single_sysctl("dev.aesni.0.%desc");
260
	}
261
}
262

    
263
##build widget saved list information
264
if ($user_settings['widgets']['sequence'] != "") {
265
	$dashboardcolumns = isset($user_settings['webgui']['dashboardcolumns']) ? $user_settings['webgui']['dashboardcolumns'] : 2;
266
	$pconfig['sequence'] = $user_settings['widgets']['sequence'];
267
	$widgetsfromconfig = array();
268

    
269
	foreach (explode(',', $pconfig['sequence']) as $line) {
270
		list($file, $col, $display) = explode(':', $line);
271

    
272
		// be backwards compatible
273
		// If the display column information is missing, we will assign a temporary
274
		// column here. Next time the user saves the dashboard it will fix itself
275
		if ($col == "") {
276
			if ($file == "system_information") {
277
				$col = "col1";
278
			} else {
279
				$col = "col2";
280
			}
281
		}
282

    
283
		// Limit the column to the current dashboard columns.
284
		if (substr($col, 3) > $dashboardcolumns) {
285
			$col = "col" . $dashboardcolumns;
286
		}
287

    
288
		$offset = strpos($file, '-container');
289
		if (false !== $offset) {
290
			$file = substr($file, 0, $offset);
291
		}
292

    
293
		// Get the widget title that should be in a var defined in the widget's inc file.
294
		$widgettitle = ${$file . '_title'};
295

    
296
		if (empty(trim($widgettitle))) {
297
			// Fall back to constructing a title from the file name of the widget.
298
			$widgettitle = ucwords(str_replace('_', ' ', $file));
299
		}
300

    
301
		$widgetsfromconfig[ $file ] = array(
302
			'name' => $widgettitle,
303
			'col' => $col,
304
			'display' => $display,
305
		);
306
	}
307

    
308
	// add widgets that may not be in the saved configuration, in case they are to be displayed later
309
	$widgets = $widgetsfromconfig + $widgets;
310

    
311
	##find custom configurations of a particular widget and load its info to $pconfig
312
	foreach ($widgets as $widgetname => $widgetconfig) {
313
		if ($config['widgets'][$widgetname . '-config']) {
314
			$pconfig[$widgetname . '-config'] = $config['widgets'][$widgetname . '-config'];
315
		}
316
	}
317
}
318

    
319
## Get the configured options for Show/Hide available widgets panel.
320
$dashboard_available_widgets_hidden = !$user_settings['webgui']['dashboardavailablewidgetspanel'];
321

    
322
if ($dashboard_available_widgets_hidden) {
323
	$panel_state = 'out';
324
	$panel_body_state = 'in';
325
} else {
326
	$panel_state = 'in';
327
	$panel_body_state = 'out';
328
}
329

    
330
## Set Page Title and Include Header
331
$pgtitle = array(gettext("Status"), gettext("Dashboard"));
332
include("head.inc");
333

    
334
if ($savemsg) {
335
	print_info_box($savemsg, $class);
336
}
337

    
338
pfSense_handle_custom_code("/usr/local/pkg/dashboard/pre_dashboard");
339

    
340
?>
341

    
342
<div class="panel panel-default collapse <?=$panel_state?>" id="widget-available">
343
	<div class="panel-heading">
344
		<h2 class="panel-title"><?=gettext("Available Widgets"); ?>
345
			<span class="widget-heading-icon">
346
				<a data-toggle="collapse" href="#widget-available_panel-body" id="widgets-available">
347
					<i class="fa fa-plus-circle"></i>
348
				</a>
349
			</span>
350
		</h2>
351
	</div>
352
	<div id="widget-available_panel-body" class="panel-body collapse <?=$panel_body_state?>">
353
		<div class="content">
354
			<div class="row">
355
<?php
356

    
357
// Build the Available Widgets table using a sorted copy of the $widgets array
358
$available = $widgets;
359
uasort($available, function($a, $b){ return strcasecmp($a['name'], $b['name']); });
360

    
361
foreach ($available as $widgetname => $widgetconfig):
362
	if ($widgetconfig['display'] == 'none'):
363
?>
364
		<div class="col-sm-3"><a href="#" id="btnadd-<?=$widgetname?>"><i class="fa fa-plus"></i> <?=$widgetconfig['name']?></a></div>
365
	<?php endif; ?>
366
<?php endforeach; ?>
367
			</div>
368
		</div>
369
	</div>
370
</div>
371

    
372
<div class="hidden" id="widgetSequence">
373
	<form action="/" method="post" id="widgetSequence_form" name="widgetForm">
374
		<input type="hidden" name="sequence" value="" />
375
	</form>
376
</div>
377

    
378
<?php
379
$widgetColumns = array();
380
foreach ($widgets as $widgetname => $widgetconfig) {
381
	if ($widgetconfig['display'] == 'none') {
382
		continue;
383
	}
384

    
385
	if (!file_exists('/usr/local/www/widgets/widgets/'. $widgetname.'.widget.php')) {
386
		continue;
387
	}
388

    
389
	if (!isset($widgetColumns[ $widgetconfig['col'] ])) {
390
		$widgetColumns[ $widgetconfig['col'] ] = array();
391
	}
392

    
393
	$widgetColumns[ $widgetconfig['col'] ][ $widgetname ] = $widgetconfig;
394
}
395
?>
396

    
397
<div class="row">
398
<?php
399
	$columnWidth = (int) (12 / $numColumns);
400

    
401
	for ($currentColumnNumber = 1; $currentColumnNumber <= $numColumns; $currentColumnNumber++) {
402

    
403

    
404
		//if col$currentColumnNumber exists
405
		if (isset($widgetColumns['col'.$currentColumnNumber])) {
406
			echo '<div class="col-md-' . $columnWidth . '" id="widgets-col' . $currentColumnNumber . '">';
407
			$columnWidgets = $widgetColumns['col'.$currentColumnNumber];
408

    
409
			foreach ($columnWidgets as $widgetname => $widgetconfig) {
410
				// Compose the widget title and include the title link if available
411
				$widgetlink = ${$widgetname . '_title_link'};
412

    
413
				if ((strlen($widgetlink) > 0)) {
414
					$wtitle = '<a href="' . $widgetlink . '"> ' . $widgetconfig['name'] . '</a>';
415
				} else {
416
					$wtitle = $widgetconfig['name'];
417
				}
418
				?>
419
					<div class="panel panel-default" id="widget-<?=$widgetname?>">
420
					<div class="panel-heading">
421
						<h2 class="panel-title">
422
							<?=$wtitle?>
423
							<span class="widget-heading-icon">
424
								<a data-toggle="collapse" href="#widget-<?=$widgetname?>_panel-footer" class="config hidden">
425
									<i class="fa fa-wrench"></i>
426
								</a>
427
								<a data-toggle="collapse" href="#widget-<?=$widgetname?>_panel-body">
428
									<!--  actual icon is determined in css based on state of body -->
429
									<i class="fa fa-plus-circle"></i>
430
								</a>
431
								<a data-toggle="close" href="#widget-<?=$widgetname?>">
432
									<i class="fa fa-times-circle"></i>
433
								</a>
434
							</span>
435
						</h2>
436
					</div>
437
					<div id="widget-<?=$widgetname?>_panel-body" class="panel-body collapse<?=($widgetconfig['display'] == 'close' ? '' : ' in')?>">
438
						<?php include_once('/usr/local/www/widgets/widgets/'. $widgetname.'.widget.php'); ?>
439
					</div>
440
				</div>
441
				<?php
442
			}
443
			echo "</div>";
444
		} else {
445
			echo '<div class="col-md-' . $columnWidth . '" id="widgets-col' . $currentColumnNumber . '"></div>';
446
		}
447

    
448
	}
449
?>
450

    
451
</div>
452

    
453
<script type="text/javascript">
454
//<![CDATA[
455

    
456
dirty = false;
457
function updateWidgets(newWidget) {
458
	var sequence = '';
459

    
460
	$('.container .col-md-<?=$columnWidth?>').each(function(idx, col) {
461
		$('.panel', col).each(function(idx, widget) {
462
			var isOpen = $('.panel-body', widget).hasClass('in');
463
			var widget_basename = widget.id.split('-')[1];
464

    
465
			// Only save details for panels that have id's like'widget-*'
466
			// Some widgets create other panels, so ignore any of those.
467
			if ((widget.id.split('-')[0] == 'widget') && (typeof widget_basename !== 'undefined')) {
468
				sequence += widget_basename + ':' + col.id.split('-')[1] + ':' + (isOpen ? 'open' : 'close') + ',';
469
			}
470
		});
471
	});
472

    
473
	if (typeof newWidget !== 'undefined') {
474
		// The system_information widget is always added to column one. Others go in column two
475
		if (newWidget == "system_information") {
476
			sequence += newWidget + ':' + 'col1:open';
477
		} else {
478
		sequence += newWidget + ':' + 'col2:open';
479
		}
480
	}
481

    
482
	$('input[name=sequence]', $('#widgetSequence_form')).val(sequence);
483
}
484

    
485
events.push(function() {
486

    
487
	// Make panels destroyable
488
	$('.container .panel-heading a[data-toggle="close"]').each(function (idx, el) {
489
		$(el).on('click', function(e) {
490
			$(el).parents('.panel').remove();
491
			updateWidgets();
492
			// Submit the form save/display all selected widgets
493
			$('[name=widgetForm]').submit();
494
		})
495
	});
496

    
497
	// Make panels sortable
498
	$('.container .col-md-<?=$columnWidth?>').sortable({
499
		handle: '.panel-heading',
500
		cursor: 'grabbing',
501
		connectWith: '.container .col-md-<?=$columnWidth?>',
502
		update: function(){
503
			dirty = true;
504
			$('#btnstore').removeClass('invisible');
505
		}
506
	});
507

    
508
	// On clicking a widget to install . .
509
	$('[id^=btnadd-]').click(function(event) {
510
		// Add the widget name to the list of displayed widgets
511
		updateWidgets(this.id.replace('btnadd-', ''));
512

    
513
		// Submit the form save/display all selected widgets
514
		$('[name=widgetForm]').submit();
515
	});
516

    
517

    
518
	$('#btnstore').click(function() {
519
		updateWidgets();
520
		dirty = false;
521
		$(this).addClass('invisible');
522
		$('[name=widgetForm]').submit();
523
	});
524

    
525
	// provide a warning message if the user tries to change page before saving
526
	$(window).bind('beforeunload', function(){
527
		if (dirty) {
528
			return ("<?=gettext('One or more widgets have been moved but have not yet been saved')?>");
529
		} else {
530
			return undefined;
531
		}
532
	});
533

    
534
	// Show the fa-save icon in the breadcrumb bar if the user opens or closes a panel (In case he/she wants to save the new state)
535
	// (Sometimes this will cause us to see the icon when we don't need it, but better that than the other way round)
536
	$('.panel').on('hidden.bs.collapse shown.bs.collapse', function (e) {
537
	    if (e.currentTarget.id != 'widget-available') {
538
			$('#btnstore').removeClass("invisible");
539
		}
540
	});
541
});
542
//]]>
543
</script>
544
<?php
545
//build list of javascript include files
546
foreach (glob('widgets/javascript/*.js') as $file) {
547
	echo '<script src="'.$file.'"></script>';
548
}
549

    
550
include("foot.inc");
(65-65/225)