Project

General

Profile

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