Project

General

Profile

Download (24.5 KB) Statistics
| Branch: | Tag: | Revision:
1 04ad7c7c Scott Ullrich
<?php
2 5b237745 Scott Ullrich
/*
3 aaec5634 Renato Botelho
 * system.php
4 191cb31d Stephen Beaver
 *
5 aaec5634 Renato Botelho
 * part of pfSense (https://www.pfsense.org)
6 2a2396a6 Renato Botelho
 * Copyright (c) 2004-2016 Rubicon Communications, LLC (Netgate)
7 aaec5634 Renato Botelho
 * All rights reserved.
8 54c605d4 Stephen Beaver
 *
9 aaec5634 Renato Botelho
 * originally based on m0n0wall (http://m0n0.ch/wall)
10
 * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>.
11
 * All rights reserved.
12 54c605d4 Stephen Beaver
 *
13 aaec5634 Renato Botelho
 * Redistribution and use in source and binary forms, with or without
14
 * modification, are permitted provided that the following conditions are met:
15 54c605d4 Stephen Beaver
 *
16 aaec5634 Renato Botelho
 * 1. Redistributions of source code must retain the above copyright notice,
17
 *    this list of conditions and the following disclaimer.
18 54c605d4 Stephen Beaver
 *
19 aaec5634 Renato Botelho
 * 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 54c605d4 Stephen Beaver
 *
24 aaec5634 Renato Botelho
 * 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 54c605d4 Stephen Beaver
 *
29 aaec5634 Renato Botelho
 * 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 54c605d4 Stephen Beaver
 *
34 aaec5634 Renato Botelho
 * 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 54c605d4 Stephen Beaver
 *
38 aaec5634 Renato Botelho
 * 6. Redistributions of any form whatsoever must retain the following
39
 *    acknowledgment:
40 54c605d4 Stephen Beaver
 *
41 aaec5634 Renato Botelho
 * "This product includes software developed by the pfSense Project
42
 * for use in the pfSense software distribution (http://www.pfsense.org/).
43 54c605d4 Stephen Beaver
 *
44 aaec5634 Renato Botelho
 * 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 54c605d4 Stephen Beaver
 */
57 5b237745 Scott Ullrich
58 6b07c15a Matthew Grooms
##|+PRIV
59
##|*IDENT=page-system-generalsetup
60 5230f468 jim-p
##|*NAME=System: General Setup
61 6b07c15a Matthew Grooms
##|*DESCR=Allow access to the 'System: General Setup' page.
62
##|*MATCH=system.php*
63
##|-PRIV
64
65 aceaf18c Phil Davis
require_once("guiconfig.inc");
66 7a927e67 Scott Ullrich
require_once("functions.inc");
67
require_once("filter.inc");
68
require_once("shaper.inc");
69 60ff91f1 Renato Botelho
require_once("system.inc");
70 5b237745 Scott Ullrich
71
$pconfig['hostname'] = $config['system']['hostname'];
72
$pconfig['domain'] = $config['system']['domain'];
73 d88f26df Phil Davis
$pconfig['dnsserver'] = $config['system']['dnsserver'];
74 0d8a219e Scott Ullrich
75 d623f2da Seth Mos
$arr_gateways = return_gateways_array();
76
77 c72c71f9 Phil Davis
// set default columns to two if unset
78 8f65151c Phil Davis
if (!isset($config['system']['webgui']['dashboardcolumns'])) {
79 477db933 Jared Dillard
	$config['system']['webgui']['dashboardcolumns'] = 2;
80
}
81
82 7b492a56 Phil Davis
// set default language if unset
83
if (!isset($config['system']['language'])) {
84 d258e30d jim-p
	$config['system']['language'] = $g['language'];
85 7b492a56 Phil Davis
}
86
87 d88f26df Phil Davis
$dnsgw_counter = 1;
88
89
while (isset($config["system"]["dns{$dnsgw_counter}gw"])) {
90
	$pconfig_dnsgw_counter = $dnsgw_counter - 1;
91
	$pconfig["dnsgw{$pconfig_dnsgw_counter}"] = $config["system"]["dns{$dnsgw_counter}gw"];
92
	$dnsgw_counter++;
93
}
94 e180a6e3 Scott Ullrich
95 5b237745 Scott Ullrich
$pconfig['dnsallowoverride'] = isset($config['system']['dnsallowoverride']);
96
$pconfig['timezone'] = $config['system']['timezone'];
97
$pconfig['timeservers'] = $config['system']['timeservers'];
98 3e139f90 Vinicius Coque
$pconfig['language'] = $config['system']['language'];
99 a5995a8e Stephen Beaver
$pconfig['webguicss'] = $config['system']['webgui']['webguicss'];
100 1605d940 Steve Beaver
$pconfig['logincss'] = $config['system']['webgui']['logincss'];
101 3d29d2eb Jared Dillard
$pconfig['webguifixedmenu'] = $config['system']['webgui']['webguifixedmenu'];
102 477db933 Jared Dillard
$pconfig['dashboardcolumns'] = $config['system']['webgui']['dashboardcolumns'];
103 3666d731 Phil Davis
$pconfig['interfacessort'] = isset($config['system']['webgui']['interfacessort']);
104 24f15b3a NOYB
$pconfig['webguileftcolumnhyper'] = isset($config['system']['webgui']['webguileftcolumnhyper']);
105 c05363c8 NOYB
$pconfig['dashboardavailablewidgetspanel'] = isset($config['system']['webgui']['dashboardavailablewidgetspanel']);
106
$pconfig['systemlogsfilterpanel'] = isset($config['system']['webgui']['systemlogsfilterpanel']);
107
$pconfig['systemlogsmanagelogpanel'] = isset($config['system']['webgui']['systemlogsmanagelogpanel']);
108 b1b8784a NOYB
$pconfig['statusmonitoringsettingspanel'] = isset($config['system']['webgui']['statusmonitoringsettingspanel']);
109 0f6e77fd Phil Davis
$pconfig['webguihostnamemenu'] = $config['system']['webgui']['webguihostnamemenu'];
110 8ca95ed8 jim-p
$pconfig['dnslocalhost'] = isset($config['system']['dnslocalhost']);
111 5e024279 Steve Beaver
//$pconfig['dashboardperiod'] = isset($config['widgets']['period']) ? $config['widgets']['period']:"10";
112 506fe755 Steve Beaver
$pconfig['loginshowhost'] = isset($config['system']['webgui']['loginshowhost']);
113 05a13eba derelict-pf
$pconfig['requirestatefilter'] = isset($config['system']['webgui']['requirestatefilter']);
114 8ca95ed8 jim-p
115 2ee8dea1 Phil Davis
if (!$pconfig['timezone']) {
116 ecaca752 Renato Botelho
	if (isset($g['default_timezone']) && !empty($g['default_timezone'])) {
117
		$pconfig['timezone'] = $g['default_timezone'];
118
	} else {
119
		$pconfig['timezone'] = "Etc/UTC";
120
	}
121 2ee8dea1 Phil Davis
}
122 ecaca752 Renato Botelho
123 2ee8dea1 Phil Davis
if (!$pconfig['timeservers']) {
124 5b237745 Scott Ullrich
	$pconfig['timeservers'] = "pool.ntp.org";
125 2ee8dea1 Phil Davis
}
126 04ad7c7c Scott Ullrich
127 79eaddf4 Renato Botelho
$changedesc = gettext("System") . ": ";
128 62d01225 Bill Marquette
$changecount = 0;
129 417c6042 Bill Marquette
130 5b237745 Scott Ullrich
function is_timezone($elt) {
131
	return !preg_match("/\/$/", $elt);
132
}
133
134 2ee8dea1 Phil Davis
if ($pconfig['timezone'] <> $_POST['timezone']) {
135 744306c6 jim-p
	filter_pflog_start(true);
136 aa1ab1da Scott Ullrich
}
137
138 60ff91f1 Renato Botelho
$timezonelist = system_get_timezone_list();
139 c9911976 Renato Botelho
$timezonedesc = $timezonelist;
140
141
/*
142
 * Etc/GMT entries work the opposite way to what people expect.
143
 * Ref: https://github.com/eggert/tz/blob/master/etcetera and Redmine issue 7089
144
 * Add explanatory text to entries like:
145
 * Etc/GMT+1 and Etc/GMT-1
146
 * but not:
147
 * Etc/GMT or Etc/GMT+0
148
 */
149
foreach ($timezonedesc as $idx => $desc) {
150
	if (substr($desc, 0, 7) != "Etc/GMT" || substr($desc, 8, 1) == "0") {
151
		continue;
152
	}
153
154
	$direction = substr($desc, 7, 1);
155
156
	switch ($direction) {
157
	case '-':
158 49683e45 Phil Davis
		$direction_str = gettext('AHEAD of');
159 c9911976 Renato Botelho
		break;
160
	case '+':
161
		$direction_str = gettext('BEHIND');
162
		break;
163
	default:
164
		continue;
165
	}
166
167
	$hr_offset = substr($desc, 8);
168 49683e45 Phil Davis
	$timezonedesc[$idx] = $desc . " " .
169
	    sprintf(ngettext('(%1$s hour %2$s GMT)', '(%1$s hours %2$s GMT)', $hr_offset), $hr_offset, $direction_str);
170 c9911976 Renato Botelho
}
171 5b237745 Scott Ullrich
172 77446beb Matthew Grooms
$multiwan = false;
173 7922db8a Seth Mos
$interfaces = get_configured_interface_list();
174 2ee8dea1 Phil Davis
foreach ($interfaces as $interface) {
175
	if (interface_has_gateway($interface)) {
176 77446beb Matthew Grooms
		$multiwan = true;
177 7922db8a Seth Mos
	}
178
}
179 77446beb Matthew Grooms
180 5b237745 Scott Ullrich
if ($_POST) {
181
182 c668c964 Scott Ullrich
	$changecount++;
183 1180e4f0 Sjon Hortensius
184 5b237745 Scott Ullrich
	unset($input_errors);
185
	$pconfig = $_POST;
186
187
	/* input validation */
188 cfbfd941 smos
	$reqdfields = explode(" ", "hostname domain");
189 2ee8dea1 Phil Davis
	$reqdfieldsn = array(gettext("Hostname"), gettext("Domain"));
190 04ad7c7c Scott Ullrich
191 1e9b4611 Renato Botelho
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
192 04ad7c7c Scott Ullrich
193 5e024279 Steve Beaver
//	if ($_POST['dashboardperiod']) {
194
//		$config['widgets']['period'] = $_POST['dashboardperiod'];
195
//	}
196 c1f9ca7a Stephen Beaver
197 a5995a8e Stephen Beaver
	if ($_POST['webguicss']) {
198
		$config['system']['webgui']['webguicss'] = $_POST['webguicss'];
199
	} else {
200
		unset($config['system']['webgui']['webguicss']);
201
	}
202 8f65151c Phil Davis
203 1605d940 Steve Beaver
204
	if ($_POST['logincss']) {
205
		$config['system']['webgui']['logincss'] = $_POST['logincss'];
206
	} else {
207
		unset($config['system']['webgui']['logincss']);
208
	}
209
210 506fe755 Steve Beaver
	$config['system']['webgui']['loginshowhost'] = $_POST['loginshowhost'] ? true:false;
211
212 ddb84143 Stephen Beaver
	if ($_POST['webguifixedmenu']) {
213
		$config['system']['webgui']['webguifixedmenu'] = $_POST['webguifixedmenu'];
214
	} else {
215
		unset($config['system']['webgui']['webguifixedmenu']);
216
	}
217 477db933 Jared Dillard
218 cb0222b0 Christopher Fazendin
	if ($_POST['webguihostnamemenu']) {
219
		$config['system']['webgui']['webguihostnamemenu'] = $_POST['webguihostnamemenu'];
220
	} else {
221
		unset($config['system']['webgui']['webguihostnamemenu']);
222
	}
223
224 477db933 Jared Dillard
	if ($_POST['dashboardcolumns']) {
225
		$config['system']['webgui']['dashboardcolumns'] = $_POST['dashboardcolumns'];
226
	} else {
227
		unset($config['system']['webgui']['dashboardcolumns']);
228 8f65151c Phil Davis
	}
229
230 05a13eba derelict-pf
	$config['system']['webgui']['requirestatefilter'] = $_POST['requirestatefilter'] ? true : false;
231
232 2d86ee95 Phil Davis
	if ($_POST['hostname']) {
233
		if (!is_hostname($_POST['hostname'])) {
234
			$input_errors[] = gettext("The hostname can only contain the characters A-Z, 0-9 and '-'. It may not start or end with '-'.");
235
		} else {
236
			if (!is_unqualified_hostname($_POST['hostname'])) {
237
				$input_errors[] = gettext("A valid hostname is specified, but the domain name part should be omitted");
238
			}
239
		}
240 5b237745 Scott Ullrich
	}
241
	if ($_POST['domain'] && !is_domain($_POST['domain'])) {
242 7465d12c Carlos Eduardo Ramos
		$input_errors[] = gettext("The domain may only contain the characters a-z, 0-9, '-' and '.'.");
243 5b237745 Scott Ullrich
	}
244 d623f2da Seth Mos
245 58b07c57 NewEraCracker
	$dnslist = $ignore_posted_dnsgw = array();
246 df4471e2 Phil Davis
247 d88f26df Phil Davis
	$dnscounter = 0;
248
	$dnsname = "dns{$dnscounter}";
249
250
	while (isset($_POST[$dnsname])) {
251
		$dnsgwname = "dnsgw{$dnscounter}";
252 a936104b Stephen Beaver
		$dnslist[] = $_POST[$dnsname];
253
254 d623f2da Seth Mos
		if (($_POST[$dnsname] && !is_ipaddr($_POST[$dnsname]))) {
255 d88f26df Phil Davis
			$input_errors[] = sprintf(gettext("A valid IP address must be specified for DNS server %s."), $dnscounter+1);
256 52acb1ff Phil Davis
		} else {
257 2ee8dea1 Phil Davis
			if (($_POST[$dnsgwname] <> "") && ($_POST[$dnsgwname] <> "none")) {
258 52acb1ff Phil Davis
				// A real gateway has been selected.
259
				if (is_ipaddr($_POST[$dnsname])) {
260 2ee8dea1 Phil Davis
					if ((is_ipaddrv4($_POST[$dnsname])) && (validate_address_family($_POST[$dnsname], $_POST[$dnsgwname]) === false)) {
261 1bab4a10 NOYB
						$input_errors[] = sprintf(gettext('The IPv6 gateway "%1$s" can not be specified for IPv4 DNS server "%2$s".'), $_POST[$dnsgwname], $_POST[$dnsname]);
262 52acb1ff Phil Davis
					}
263 2ee8dea1 Phil Davis
					if ((is_ipaddrv6($_POST[$dnsname])) && (validate_address_family($_POST[$dnsname], $_POST[$dnsgwname]) === false)) {
264 1bab4a10 NOYB
						$input_errors[] = sprintf(gettext('The IPv4 gateway "%1$s" can not be specified for IPv6 DNS server "%2$s".'), $_POST[$dnsgwname], $_POST[$dnsname]);
265 52acb1ff Phil Davis
					}
266
				} else {
267 df4471e2 Phil Davis
					// The user selected a gateway but did not provide a DNS address. Be nice and set the gateway back to "none".
268
					$ignore_posted_dnsgw[$dnsgwname] = true;
269 52acb1ff Phil Davis
				}
270 13ea7caa smos
			}
271 d623f2da Seth Mos
		}
272 d88f26df Phil Davis
		$dnscounter++;
273
		$dnsname = "dns{$dnscounter}";
274 5b237745 Scott Ullrich
	}
275 d623f2da Seth Mos
276 c25e42c8 Mark Furneaux
	if (count(array_filter($dnslist)) != count(array_unique(array_filter($dnslist)))) {
277 f700dc99 Chris Buechler
		$input_errors[] = gettext('Each configured DNS server must have a unique IP address. Remove the duplicated IP.');
278
	}
279
280 d88f26df Phil Davis
	$dnscounter = 0;
281
	$dnsname = "dns{$dnscounter}";
282
283 985fc0fb Ermal Lu?i
	$direct_networks_list = explode(" ", filter_get_direct_networks_list());
284 d88f26df Phil Davis
	while (isset($_POST[$dnsname])) {
285
		$dnsgwname = "dnsgw{$dnscounter}";
286
		if ($_POST[$dnsgwname] && ($_POST[$dnsgwname] <> "none")) {
287 29069aed Phil Davis
			foreach ($direct_networks_list as $direct_network) {
288 d88f26df Phil Davis
				if (ip_in_subnet($_POST[$dnsname], $direct_network)) {
289
					$input_errors[] = sprintf(gettext("A gateway can not be assigned to DNS '%s' server which is on a directly connected network."), $_POST[$dnsname]);
290 c98d28e1 Seth Mos
				}
291
			}
292
		}
293 d88f26df Phil Davis
		$dnscounter++;
294
		$dnsname = "dns{$dnscounter}";
295 c98d28e1 Seth Mos
	}
296
297 8adb814b David P Hilton
	# it's easy to have a little too much whitespace in the field, clean it up for the user before processing.
298
	$_POST['timeservers'] = preg_replace('/[[:blank:]]+/', ' ', $_POST['timeservers']);
299
	$_POST['timeservers'] = trim($_POST['timeservers']);
300 5b237745 Scott Ullrich
	foreach (explode(' ', $_POST['timeservers']) as $ts) {
301
		if (!is_domain($ts)) {
302 7465d12c Carlos Eduardo Ramos
			$input_errors[] = gettext("A NTP Time Server name may only contain the characters a-z, 0-9, '-' and '.'.");
303 5b237745 Scott Ullrich
		}
304
	}
305
306 d88f26df Phil Davis
	if ($input_errors) {
307
		// Put the user-entered list back into place so it will be redisplayed for correction.
308
		$pconfig['dnsserver'] = $dnslist;
309
	} else {
310 f1a34790 N0YB
		update_if_changed("hostname", $config['system']['hostname'], $_POST['hostname']);
311
		update_if_changed("domain", $config['system']['domain'], $_POST['domain']);
312 9eab73da Bill Marquette
		update_if_changed("timezone", $config['system']['timezone'], $_POST['timezone']);
313
		update_if_changed("NTP servers", $config['system']['timeservers'], strtolower($_POST['timeservers']));
314 04ad7c7c Scott Ullrich
315 2ee8dea1 Phil Davis
		if ($_POST['language'] && $_POST['language'] != $config['system']['language']) {
316 3e139f90 Vinicius Coque
			$config['system']['language'] = $_POST['language'];
317 ceecd29b Renato Botelho
			set_language();
318 3e139f90 Vinicius Coque
		}
319
320 3666d731 Phil Davis
		unset($config['system']['webgui']['interfacessort']);
321
		$config['system']['webgui']['interfacessort'] = $_POST['interfacessort'] ? true : false;
322
323 24f15b3a NOYB
		unset($config['system']['webgui']['webguileftcolumnhyper']);
324
		$config['system']['webgui']['webguileftcolumnhyper'] = $_POST['webguileftcolumnhyper'] ? true : false;
325
326 c05363c8 NOYB
		unset($config['system']['webgui']['dashboardavailablewidgetspanel']);
327
		$config['system']['webgui']['dashboardavailablewidgetspanel'] = $_POST['dashboardavailablewidgetspanel'] ? true : false;
328
329
		unset($config['system']['webgui']['systemlogsfilterpanel']);
330
		$config['system']['webgui']['systemlogsfilterpanel'] = $_POST['systemlogsfilterpanel'] ? true : false;
331
332
		unset($config['system']['webgui']['systemlogsmanagelogpanel']);
333
		$config['system']['webgui']['systemlogsmanagelogpanel'] = $_POST['systemlogsmanagelogpanel'] ? true : false;
334
335 b1b8784a NOYB
		unset($config['system']['webgui']['statusmonitoringsettingspanel']);
336
		$config['system']['webgui']['statusmonitoringsettingspanel'] = $_POST['statusmonitoringsettingspanel'] ? true : false;
337
338 4fbf63aa Bill Marquette
		/* XXX - billm: these still need updating after figuring out how to check if they actually changed */
339 52acb1ff Phil Davis
		$olddnsservers = $config['system']['dnsserver'];
340 5b237745 Scott Ullrich
		unset($config['system']['dnsserver']);
341 d88f26df Phil Davis
342
		$dnscounter = 0;
343
		$dnsname = "dns{$dnscounter}";
344
345
		while (isset($_POST[$dnsname])) {
346
			if ($_POST[$dnsname]) {
347
				$config['system']['dnsserver'][] = $_POST[$dnsname];
348
			}
349
			$dnscounter++;
350
			$dnsname = "dns{$dnscounter}";
351 2ee8dea1 Phil Davis
		}
352 04ad7c7c Scott Ullrich
353 d88f26df Phil Davis
		// Remember the new list for display also.
354
		$pconfig['dnsserver'] = $config['system']['dnsserver'];
355
356 07bd3f83 Scott Ullrich
		$olddnsallowoverride = $config['system']['dnsallowoverride'];
357 20b90e0a Scott Ullrich
358 0d8a219e Scott Ullrich
		unset($config['system']['dnsallowoverride']);
359 5b237745 Scott Ullrich
		$config['system']['dnsallowoverride'] = $_POST['dnsallowoverride'] ? true : false;
360 e180a6e3 Scott Ullrich
361 2ee8dea1 Phil Davis
		if ($_POST['dnslocalhost'] == "yes") {
362 8ca95ed8 jim-p
			$config['system']['dnslocalhost'] = true;
363 2ee8dea1 Phil Davis
		} else {
364 8ca95ed8 jim-p
			unset($config['system']['dnslocalhost']);
365 2ee8dea1 Phil Davis
		}
366 8ca95ed8 jim-p
367 e180a6e3 Scott Ullrich
		/* which interface should the dns servers resolve through? */
368 d88f26df Phil Davis
		$dnscounter = 0;
369
		// The $_POST array key of the DNS IP (starts from 0)
370
		$dnsname = "dns{$dnscounter}";
371 df4471e2 Phil Davis
		$outdnscounter = 0;
372 d88f26df Phil Davis
		while (isset($_POST[$dnsname])) {
373
			// The $_POST array key of the corresponding gateway (starts from 0)
374
			$dnsgwname = "dnsgw{$dnscounter}";
375
			// The numbering of DNS GW entries in the config starts from 1
376
			$dnsgwconfigcounter = $dnscounter + 1;
377
			// So this is the array key of the DNS GW entry in $config['system']
378
			$dnsgwconfigname = "dns{$dnsgwconfigcounter}gw";
379
380
			$olddnsgwname = $config['system'][$dnsgwconfigname];
381 df4471e2 Phil Davis
382 2ee8dea1 Phil Davis
			if ($ignore_posted_dnsgw[$dnsgwname]) {
383 df4471e2 Phil Davis
				$thisdnsgwname = "none";
384 2ee8dea1 Phil Davis
			} else {
385 df4471e2 Phil Davis
				$thisdnsgwname = $pconfig[$dnsgwname];
386 2ee8dea1 Phil Davis
			}
387 df4471e2 Phil Davis
388
			// "Blank" out the settings for this index, then we set them below using the "outdnscounter" index.
389 d88f26df Phil Davis
			$config['system'][$dnsgwconfigname] = "none";
390 df4471e2 Phil Davis
			$pconfig[$dnsgwname] = "none";
391
			$pconfig[$dnsname] = "";
392
393
			if ($_POST[$dnsname]) {
394
				// Only the non-blank DNS servers were put into the config above.
395
				// So we similarly only add the corresponding gateways sequentially to the config (and to pconfig), as we find non-blank DNS servers.
396
				// This keeps the DNS server IP and corresponding gateway "lined up" when the user blanks out a DNS server IP in the middle of the list.
397 d88f26df Phil Davis
398
				// The $pconfig array key of the DNS IP (starts from 0)
399
				$outdnsname = "dns{$outdnscounter}";
400
				// The $pconfig array key of the corresponding gateway (starts from 0)
401
				$outdnsgwname = "dnsgw{$outdnscounter}";
402
				// The numbering of DNS GW entries in the config starts from 1
403
				$outdnsgwconfigcounter = $outdnscounter + 1;
404
				// So this is the array key of the output DNS GW entry in $config['system']
405
				$outdnsgwconfigname = "dns{$outdnsgwconfigcounter}gw";
406
407 df4471e2 Phil Davis
				$pconfig[$outdnsname] = $_POST[$dnsname];
408 2ee8dea1 Phil Davis
				if ($_POST[$dnsgwname]) {
409 d88f26df Phil Davis
					$config['system'][$outdnsgwconfigname] = $thisdnsgwname;
410 df4471e2 Phil Davis
					$pconfig[$outdnsgwname] = $thisdnsgwname;
411
				} else {
412
					// Note: when no DNS GW name is chosen, the entry is set to "none", so actually this case never happens.
413 d88f26df Phil Davis
					unset($config['system'][$outdnsgwconfigname]);
414 df4471e2 Phil Davis
					$pconfig[$outdnsgwname] = "";
415
				}
416 d88f26df Phil Davis
				$outdnscounter++;
417 d623f2da Seth Mos
			}
418 d88f26df Phil Davis
			if (($olddnsgwname != "") && ($olddnsgwname != "none") && (($olddnsgwname != $thisdnsgwname) || ($olddnsservers[$dnscounter] != $_POST[$dnsname]))) {
419 52acb1ff Phil Davis
				// A previous DNS GW name was specified. It has now gone or changed, or the DNS server address has changed.
420
				// Remove the route. Later calls will add the correct new route if needed.
421 d88f26df Phil Davis
				if (is_ipaddrv4($olddnsservers[$dnscounter])) {
422 52acb1ff Phil Davis
					mwexec("/sbin/route delete " . escapeshellarg($olddnsservers[$dnscounter-1]));
423 d88f26df Phil Davis
				} else if (is_ipaddrv6($olddnsservers[$dnscounter])) {
424 312c32c9 Renato Botelho
					mwexec("/sbin/route delete -inet6 " . escapeshellarg($olddnsservers[$dnscounter-1]));
425 2ee8dea1 Phil Davis
				}
426 52acb1ff Phil Davis
			}
427 d88f26df Phil Davis
428
			$dnscounter++;
429
			// The $_POST array key of the DNS IP (starts from 0)
430
			$dnsname = "dns{$dnscounter}";
431 d623f2da Seth Mos
		}
432 04ad7c7c Scott Ullrich
433 2ee8dea1 Phil Davis
		if ($changecount > 0) {
434 62d01225 Bill Marquette
			write_config($changedesc);
435 2ee8dea1 Phil Davis
		}
436 04ad7c7c Scott Ullrich
437 5b237745 Scott Ullrich
		$retval = 0;
438 3cfdba5f Scott Ullrich
		$retval = system_hostname_configure();
439
		$retval |= system_hosts_generate();
440
		$retval |= system_resolvconf_generate();
441 2ee8dea1 Phil Davis
		if (isset($config['dnsmasq']['enable'])) {
442 1e2c8821 Warren Baker
			$retval |= services_dnsmasq_configure();
443 2ee8dea1 Phil Davis
		} elseif (isset($config['unbound']['enable'])) {
444 1e2c8821 Warren Baker
			$retval |= services_unbound_configure();
445 2ee8dea1 Phil Davis
		}
446 3cfdba5f Scott Ullrich
		$retval |= system_timezone_configure();
447
		$retval |= system_ntp_configure();
448
449 2ee8dea1 Phil Davis
		if ($olddnsallowoverride != $config['system']['dnsallowoverride']) {
450 b8292903 Ermal
			$retval |= send_event("service reload dns");
451 2ee8dea1 Phil Davis
		}
452 3cfdba5f Scott Ullrich
453 e7d967d8 Scott Ullrich
		// Reload the filter - plugins might need to be run.
454 0027de0a Ermal Lu?i
		$retval |= filter_configure();
455 1180e4f0 Sjon Hortensius
456 5b237745 Scott Ullrich
		$savemsg = get_std_save_message($retval);
457
	}
458 df4471e2 Phil Davis
459
	unset($ignore_posted_dnsgw);
460 5b237745 Scott Ullrich
}
461 4df96eff Scott Ullrich
462 2ee8dea1 Phil Davis
$pgtitle = array(gettext("System"), gettext("General Setup"));
463 4df96eff Scott Ullrich
include("head.inc");
464
465 8f65151c Phil Davis
if ($input_errors) {
466 41ea4cf3 Sjon Hortensius
	print_input_errors($input_errors);
467 8f65151c Phil Davis
}
468 ddb84143 Stephen Beaver
469 8f65151c Phil Davis
if ($savemsg) {
470 1f70d78c NewEraCracker
	print_info_box($savemsg, 'success');
471 8f65151c Phil Davis
}
472 5b237745 Scott Ullrich
?>
473 41ea4cf3 Sjon Hortensius
<div id="container">
474 b40bcb23 Sjon Hortensius
<?php
475 1180e4f0 Sjon Hortensius
476 b40bcb23 Sjon Hortensius
$form = new Form;
477 a32c0623 Sjon Hortensius
$section = new Form_Section('System');
478
$section->addInput(new Form_Input(
479 a97531c5 Sjon Hortensius
	'hostname',
480 51685157 Phil Davis
	'*Hostname',
481 a32c0623 Sjon Hortensius
	'text',
482
	$pconfig['hostname'],
483
	['placeholder' => 'pfSense']
484
))->setHelp('Name of the firewall host, without domain part');
485 c1f9ca7a Stephen Beaver
486 a32c0623 Sjon Hortensius
$section->addInput(new Form_Input(
487 a97531c5 Sjon Hortensius
	'domain',
488 51685157 Phil Davis
	'*Domain',
489 a32c0623 Sjon Hortensius
	'text',
490
	$pconfig['domain'],
491
	['placeholder' => 'mycorp.com, home, office, private, etc.']
492 83477771 stilez
))->setHelp('Do not use \'.local\' as the final part of the domain (TLD), The \'.local\' domain is %1$swidely used%2$s by '.
493 514233ee stilez
	'mDNS (including Avahi and Apple OS X\'s Bonjour/Rendezvous/Airprint/Airplay), and some Windows systems and networked devices. ' .
494 83477771 stilez
	'These will not network correctly if the router uses \'.local\'. Alternatives such as \'.local.lan\' or \'.mylocal\' are safe.',
495 640d1b64 Steve Beaver
	 ['<a target="_blank" href="https://www.unbound.net/pipermail/unbound-users/2011-March/001735.html">',
496
	 '</a>']);
497 c1f9ca7a Stephen Beaver
498 b40bcb23 Sjon Hortensius
$form->add($section);
499
500 70dc5cd6 Phil Davis
$section = new Form_Section('DNS Server Settings');
501 b40bcb23 Sjon Hortensius
502 d88f26df Phil Davis
if (!is_array($pconfig['dnsserver'])) {
503
	$pconfig['dnsserver'] = array();
504
}
505
506
$dnsserver_count = count($pconfig['dnsserver']);
507
$dnsserver_num = 0;
508
$dnsserver_help = gettext("Address") . '<br/>' . gettext("Enter IP addresses to be used by the system for DNS resolution.") . " " .
509
	gettext("These are also used for the DHCP service, DNS Forwarder and DNS Resolver when it has DNS Query Forwarding enabled.");
510
$dnsgw_help = gettext("Gateway") . '<br/>'. gettext("Optionally select the gateway for each DNS server.") . " " .
511
	gettext("When using multiple WAN connections there should be at least one unique DNS server per gateway.");
512
513
// If there are no DNS servers, make an empty entry for initial display.
514
if ($dnsserver_count == 0) {
515
	$pconfig['dnsserver'][] = '';
516
}
517
518
foreach ($pconfig['dnsserver'] as $dnsserver) {
519 54c605d4 Stephen Beaver
520 d88f26df Phil Davis
	$is_last_dnsserver = ($dnsserver_num == $dnsserver_count - 1);
521
	$group = new Form_Group($dnsserver_num == 0 ? 'DNS Servers':'');
522
	$group->addClass('repeatable');
523 54c605d4 Stephen Beaver
524
	$group->add(new Form_Input(
525 d88f26df Phil Davis
		'dns' . $dnsserver_num,
526 54c605d4 Stephen Beaver
		'DNS Server',
527
		'text',
528 d88f26df Phil Davis
		$dnsserver
529
	))->setHelp(($is_last_dnsserver) ? $dnsserver_help:null);
530 b40bcb23 Sjon Hortensius
531 54c605d4 Stephen Beaver
	if ($multiwan)	{
532 b40bcb23 Sjon Hortensius
		$options = array('none' => 'none');
533
534 8f65151c Phil Davis
		foreach ($arr_gateways as $gwname => $gwitem) {
535
			if ((is_ipaddrv4(lookup_gateway_ip_by_name($pconfig[$dnsgw])) && (is_ipaddrv6($gwitem['gateway'])))) {
536 b40bcb23 Sjon Hortensius
				continue;
537
			}
538 54c605d4 Stephen Beaver
539 8f65151c Phil Davis
			if ((is_ipaddrv6(lookup_gateway_ip_by_name($pconfig[$dnsgw])) && (is_ipaddrv4($gwitem['gateway'])))) {
540 b40bcb23 Sjon Hortensius
				continue;
541
			}
542 1180e4f0 Sjon Hortensius
543 b40bcb23 Sjon Hortensius
			$options[$gwname] = $gwname.' - '.$gwitem['friendlyiface'].' - '.$gwitem['gateway'];
544
		}
545 1180e4f0 Sjon Hortensius
546 a97531c5 Sjon Hortensius
		$group->add(new Form_Select(
547 d88f26df Phil Davis
			'dnsgw' . $dnsserver_num,
548 e4dd8be4 NOYB
			'Gateway',
549 d88f26df Phil Davis
			$pconfig['dnsgw' . $dnsserver_num],
550 a97531c5 Sjon Hortensius
			$options
551 d88f26df Phil Davis
		))->setHelp(($is_last_dnsserver) ? $dnsgw_help:null);;
552 b40bcb23 Sjon Hortensius
	}
553 1180e4f0 Sjon Hortensius
554 d88f26df Phil Davis
	$group->add(new Form_Button(
555
		'deleterow' . $dnsserver_num,
556
		'Delete',
557
		null,
558
		'fa-trash'
559
	))->addClass('btn-warning');
560 54c605d4 Stephen Beaver
561 b40bcb23 Sjon Hortensius
	$section->add($group);
562 d88f26df Phil Davis
	$dnsserver_num++;
563 b40bcb23 Sjon Hortensius
}
564 1180e4f0 Sjon Hortensius
565 d88f26df Phil Davis
$section->addInput(new Form_Button(
566
	'addrow',
567
	'Add DNS Server',
568
	null,
569
	'fa-plus'
570
))->addClass('btn-success addbtn');
571
572 a005a836 Sjon Hortensius
$section->addInput(new Form_Checkbox(
573 a97531c5 Sjon Hortensius
	'dnsallowoverride',
574 70dc5cd6 Phil Davis
	'DNS Server Override',
575 b40bcb23 Sjon Hortensius
	'Allow DNS server list to be overridden by DHCP/PPP on WAN',
576
	$pconfig['dnsallowoverride']
577 e4dd8be4 NOYB
))->setHelp(sprintf(gettext('If this option is set, %s will use DNS servers '.
578 a32c0623 Sjon Hortensius
	'assigned by a DHCP/PPP server on WAN for its own purposes (including '.
579 9e0fab88 doktornotor
	'the DNS Forwarder/DNS Resolver). However, they will not be assigned to DHCP '.
580
	'clients.'), $g['product_name']));
581 b40bcb23 Sjon Hortensius
582 a005a836 Sjon Hortensius
$section->addInput(new Form_Checkbox(
583 a97531c5 Sjon Hortensius
	'dnslocalhost',
584 70dc5cd6 Phil Davis
	'Disable DNS Forwarder',
585 9e0fab88 doktornotor
	'Do not use the DNS Forwarder/DNS Resolver as a DNS server for the firewall',
586 b40bcb23 Sjon Hortensius
	$pconfig['dnslocalhost']
587 e4dd8be4 NOYB
))->setHelp('By default localhost (127.0.0.1) will be used as the first DNS '.
588 a32c0623 Sjon Hortensius
	'server where the DNS Forwarder or DNS Resolver is enabled and set to '.
589 9e0fab88 doktornotor
	'listen on localhost, so system can use the local DNS service to perform '.
590
	'lookups. Checking this box omits localhost from the list of DNS servers in resolv.conf.');
591 b40bcb23 Sjon Hortensius
592
$form->add($section);
593
594 a005a836 Sjon Hortensius
$section = new Form_Section('Localization');
595 c1f9ca7a Stephen Beaver
596 a005a836 Sjon Hortensius
$section->addInput(new Form_Select(
597 a97531c5 Sjon Hortensius
	'timezone',
598 51685157 Phil Davis
	'*Timezone',
599 a32c0623 Sjon Hortensius
	$pconfig['timezone'],
600 c9911976 Renato Botelho
	array_combine($timezonelist, $timezonedesc)
601 50af3592 Phil Davis
))->setHelp('Select the timezone or location within the timezone to be used by this system. '.
602
	'Usually choose a "Continent/City". Only choose a special or "Etc" entry if you understand why you need to use it.');
603 c1f9ca7a Stephen Beaver
604 a005a836 Sjon Hortensius
$section->addInput(new Form_Input(
605 a97531c5 Sjon Hortensius
	'timeservers',
606 a32c0623 Sjon Hortensius
	'Timeservers',
607
	'text',
608
	$pconfig['timeservers']
609
))->setHelp('Use a space to separate multiple hosts (only one required). '.
610 1bab4a10 NOYB
	'Remember to set up at least one DNS server if a host name is entered here!');
611 c1f9ca7a Stephen Beaver
612 a005a836 Sjon Hortensius
$section->addInput(new Form_Select(
613 a97531c5 Sjon Hortensius
	'language',
614 51685157 Phil Davis
	'*Language',
615 a32c0623 Sjon Hortensius
	$pconfig['language'],
616
	get_locale_list()
617
))->setHelp('Choose a language for the webConfigurator');
618 b40bcb23 Sjon Hortensius
619
$form->add($section);
620
621 1176360c k-paulius
$section = new Form_Section('webConfigurator');
622 a5995a8e Stephen Beaver
623 595b074d Phil Davis
gen_webguicss_field($section, $pconfig['webguicss']);
624
gen_webguifixedmenu_field($section, $pconfig['webguifixedmenu']);
625
gen_webguihostnamemenu_field($section, $pconfig['webguihostnamemenu']);
626
gen_dashboardcolumns_field($section, $pconfig['dashboardcolumns']);
627 3666d731 Phil Davis
gen_interfacessort_field($section, $pconfig['interfacessort']);
628 595b074d Phil Davis
gen_associatedpanels_fields(
629
	$section,
630
	$pconfig['dashboardavailablewidgetspanel'],
631
	$pconfig['systemlogsfilterpanel'],
632
	$pconfig['systemlogsmanagelogpanel'],
633
	$pconfig['statusmonitoringsettingspanel']);
634 05a13eba derelict-pf
gen_requirestatefilter_field($section, $pconfig['requirestatefilter']);
635 595b074d Phil Davis
gen_webguileftcolumnhyper_field($section, $pconfig['webguileftcolumnhyper']);
636 24f15b3a NOYB
637 1605d940 Steve Beaver
$section->addInput(new Form_Select(
638
	'logincss',
639
	'Login page color',
640
	$pconfig['logincss'],
641
	["1e3f75;" => gettext("Blue"), "003300" => gettext("Green"), "770101" => gettext("Red"),
642
	 "4b1263" => gettext("Purple"), "424142" => gettext("Gray"), "333333" => gettext("Dark gray"),
643
	 "633215" => gettext("Brown" ), "bf7703" => gettext("Orange")]
644
))->setHelp('Choose a color for the login page');
645
646 506fe755 Steve Beaver
$section->addInput(new Form_Checkbox(
647
	'loginshowhost',
648
	'Login hostname',
649
	'Show hostname on login banner',
650
	$pconfig['loginshowhost']
651
));
652 5e024279 Steve Beaver
/*
653 c1f9ca7a Stephen Beaver
$section->addInput(new Form_Input(
654
	'dashboardperiod',
655
	'Dashboard update period',
656
	'number',
657
	$pconfig['dashboardperiod'],
658 6d203ffc Stephen Beaver
	['min' => '5', 'max' => '600']
659 c1f9ca7a Stephen Beaver
))->setHelp('Time in seconds between dashboard widget updates. Small values cause ' .
660
			'more frequent updates but increase the load on the web server. ' .
661
			'Minimum is 5 seconds, maximum 600 seconds');
662 5e024279 Steve Beaver
*/
663 a5995a8e Stephen Beaver
$form->add($section);
664
665 b40bcb23 Sjon Hortensius
print $form;
666 ee7c0a00 Stephen Beaver
667
$csswarning = sprintf(gettext("%sUser-created themes are unsupported, use at your own risk."), "<br />");
668
669 8c4ef875 NOYB
?>
670
</div>
671 ee7c0a00 Stephen Beaver
672 e296b399 Colin Fleming
<script type="text/javascript">
673 ee7c0a00 Stephen Beaver
//<![CDATA[
674
events.push(function() {
675
676
	function setThemeWarning() {
677
		if ($('#webguicss').val().startsWith("pfSense")) {
678
			$('#csstxt').html("").addClass("text-default");
679
		} else {
680
			$('#csstxt').html("<?=$csswarning?>").addClass("text-danger");
681
		}
682
	}
683
684
	$('#webguicss').change(function() {
685
		setThemeWarning();
686
	});
687
688
	setThemeWarning();
689 d88f26df Phil Davis
690
	// Suppress "Delete row" button if there are fewer than two rows
691
	checkLastRow();
692 ee7c0a00 Stephen Beaver
});
693
//]]>
694
</script>
695
696 8c4ef875 NOYB
<?php
697 60ff91f1 Renato Botelho
include("foot.inc");
698 8c4ef875 NOYB
?>