Project

General

Profile

Download (31.7 KB) Statistics
| Branch: | Tag: | Revision:
1 17623ab5 Bill Marquette
<?php
2
/*
3 cdcea13f Seth Mos
  Copyright (C) 2008 Bill Marquette, Seth Mos
4 02a8dab0 ccesario
  Copyright (C) 2010 Ermal Luçi
5 17623ab5 Bill Marquette
  All rights reserved.
6
7
  Redistribution and use in source and binary forms, with or without
8
  modification, are permitted provided that the following conditions are met:
9
10 c1191d5b Ermal
  1. Redistributions of source code must retain the above copyright notice,
11 17623ab5 Bill Marquette
  this list of conditions and the following disclaimer.
12
13
  2. Redistributions in binary form must reproduce the above copyright
14
  notice, this list of conditions and the following disclaimer in the
15
  documentation and/or other materials provided with the distribution.
16
17
  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18
  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19
  AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20
  AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
  POSSIBILITY OF SUCH DAMAGE.
27
28 523855b0 Scott Ullrich
	pfSense_BUILDER_BINARIES:	/usr/bin/killall	/sbin/route	/usr/local/sbin/apinger
29
	pfSense_MODULE:	routing
30
31 c1191d5b Ermal
 */
32 c5e53ee6 jim-p
require_once("config.inc");
33 17623ab5 Bill Marquette
34 14661668 Phil Davis
/* Returns an array of default values used for apinger.conf */
35
function return_apinger_defaults() {
36
	return array(
37
		"latencylow" => "200",
38
		"latencyhigh" => "500",
39
		"losslow" => "10",
40
		"losshigh" => "20",
41
		"interval" => "1",
42
		"down" => "10");
43
	}
44
45 3d471a14 Ermal
/*
46
 * Creates monitoring configuration file and
47 14661668 Phil Davis
 * adds appropriate static routes.
48 cdcea13f Seth Mos
 */
49
function setup_gateways_monitor() {
50 3d471a14 Ermal
	global $config, $g;
51 ffe76308 Seth Mos
52 3d471a14 Ermal
	$gateways_arr = return_gateways_array();
53
	if (!is_array($gateways_arr)) {
54
		log_error("No gateways to monitor. Apinger will not be run.");
55
		killbypid("{$g['varrun_path']}/apinger.pid");
56
		@unlink("{$g['tmp_path']}/apinger.status");
57
		return;
58
	}
59 cdcea13f Seth Mos
60 14661668 Phil Davis
	$apinger_default = return_apinger_defaults();
61 cdcea13f Seth Mos
	$fd = fopen("{$g['varetc_path']}/apinger.conf", "w");
62
	$apingerconfig = <<<EOD
63
64
# pfSense apinger configuration file. Automatically Generated!
65
66
## User and group the pinger should run as
67 0534d60a Chris Buechler
user "root"
68
group "wheel"
69 cdcea13f Seth Mos
70
## Mailer to use (default: "/usr/lib/sendmail -t")
71
#mailer "/var/qmail/bin/qmail-inject" 
72
73
## Location of the pid-file (default: "/var/run/apinger.pid")
74
pid_file "{$g['varrun_path']}/apinger.pid"
75
76
## Format of timestamp (%s macro) (default: "%b %d %H:%M:%S")
77
#timestamp_format "%Y%m%d%H%M%S"
78
79
status {
80 14661668 Phil Davis
	## File where the status information should be written to
81 298e5e0a Ermal
	file "{$g['tmp_path']}/apinger.status"
82 cdcea13f Seth Mos
	## Interval between file updates
83
	## when 0 or not set, file is written only when SIGUSR1 is received
84 ecb08c6a Ermal
	interval 5s
85 cdcea13f Seth Mos
}
86
87
########################################
88
# RRDTool status gathering configuration
89
# Interval between RRD updates
90
rrd interval 60s;
91
92 14661668 Phil Davis
## These parameters can be overridden in a specific alarm configuration
93 cdcea13f Seth Mos
alarm default { 
94 c832f6bf smos
	command on "/usr/local/sbin/pfSctl -c 'service reload dyndnsall' -c 'service reload ipsecdns' -c 'service reload openvpn' -c 'filter reload' "
95
	command off "/usr/local/sbin/pfSctl -c 'service reload dyndnsall' -c 'service reload ipsecdns' -c 'service reload openvpn' -c 'filter reload' "
96 cdcea13f Seth Mos
	combine 10s
97
}
98
99
## "Down" alarm definition. 
100
## This alarm will be fired when target doesn't respond for 30 seconds.
101
alarm down "down" {
102 14661668 Phil Davis
	time {$apinger_default['down']}s
103 cdcea13f Seth Mos
}
104
105
## "Delay" alarm definition. 
106
## This alarm will be fired when responses are delayed more than 200ms
107
## it will be canceled, when the delay drops below 100ms
108
alarm delay "delay" {
109 14661668 Phil Davis
	delay_low {$apinger_default['latencylow']}ms
110
	delay_high {$apinger_default['latencyhigh']}ms
111 cdcea13f Seth Mos
}
112
113
## "Loss" alarm definition. 
114
## This alarm will be fired when packet loss goes over 20%
115
## it will be canceled, when the loss drops below 10%
116
alarm loss "loss" {
117 14661668 Phil Davis
	percent_low {$apinger_default['losslow']}
118
	percent_high {$apinger_default['losshigh']}
119 cdcea13f Seth Mos
}
120
121
target default {
122
	## How often the probe should be sent	
123 14661668 Phil Davis
	interval {$apinger_default['interval']}s
124 cdcea13f Seth Mos
	
125
	## How many replies should be used to compute average delay 
126
	## for controlling "delay" alarms
127
	avg_delay_samples 10
128
	
129
	## How many probes should be used to compute average loss
130
	avg_loss_samples 50
131
132
	## The delay (in samples) after which loss is computed
133
	## without this delays larger than interval would be treated as loss
134
	avg_loss_delay_samples 20
135
136
	## Names of the alarms that may be generated for the target
137
	alarms "down","delay","loss"
138
139
	## Location of the RRD
140 1bce2729 Seth Mos
	#rrd file "{$g['vardb_path']}/rrd/apinger-%t.rrd"
141 cdcea13f Seth Mos
}
142
143
EOD;
144
145 74c834f1 smos
	$monitor_ips = array();
146 3d471a14 Ermal
	foreach($gateways_arr as $name => $gateway) {
147 33c06ef7 Ermal
		/* Do not monitor if such was requested */
148
		if (isset($gateway['monitor_disable']))
149
			continue;
150 3d471a14 Ermal
		if (empty($gateway['monitor']) || !is_ipaddr($gateway['monitor'])) {
151
			if (is_ipaddr($gateway['gateway']))
152
				$gateway['monitor'] = $gateway['gateway'];
153
			else /* No chance to get an ip to monitor skip target. */
154 f31ab121 Ermal
				continue;
155 3d471a14 Ermal
		}
156 f31ab121 Ermal
157 74c834f1 smos
		/* if the monitor address is already used before, skip */ 
158
		if(in_array($gateway['monitor'], $monitor_ips))
159
			continue;
160
		
161 3d471a14 Ermal
		/* Interface ip is needed since apinger will bind a socket to it. */
162 640b3a9a Seth Mos
		if (is_ipaddrv4($gateway['gateway'])) {
163
			$gwifip = find_interface_ip($gateway['interface'], true);
164
		}
165
		if (is_ipaddrv6($gateway['gateway'])) {
166 81a3b6f5 smos
			/* link locals really need a different src ip */
167
			if(preg_match("/fe80::/i", $gateway['gateway'])) {
168
				$linklocal = explode("%", find_interface_ipv6_ll($gateway['interface'], true));
169
				$gwifip = $linklocal[0];
170
				$ifscope = "%". $linklocal[1];
171
			} else {
172
				$gwifip = find_interface_ipv6($gateway['interface'], true);
173
			}
174 640b3a9a Seth Mos
		}
175 3d471a14 Ermal
		if (!is_ipaddr($gwifip))
176
			continue; //Skip this target
177
178 74c834f1 smos
		$monitor_ips[] = monitor_ips;
179 f44f8eb5 Ermal
		$apingercfg = "target \"{$gateway['monitor']}\" {\n";
180 68f291ff Ermal
		$apingercfg .= "	description \"{$name}\"\n";
181 3d471a14 Ermal
		$apingercfg .= "	srcip \"{$gwifip}\"\n";
182 f7203985 Ermal
		if (!empty($gateway['interval']) && intval($gateway['interval']) > 1)
183
			$apingercfg .= "	interval " . intval($gateway['interval']) . "s\n";
184 3d471a14 Ermal
		$alarms = "";
185 f44f8eb5 Ermal
		$alarmscfg = "";
186 3d471a14 Ermal
		$override = false;
187 02a8dab0 ccesario
		if (!empty($gateway['losslow'])) {
188 68f291ff Ermal
			$alarmscfg .= "alarm loss \"{$name}loss\" {\n";
189 3d471a14 Ermal
			$alarmscfg .= "\tpercent_low {$gateway['losslow']}\n";
190
       			$alarmscfg .= "\tpercent_high {$gateway['losshigh']}\n";
191
			$alarmscfg .= "}\n";
192 68f291ff Ermal
			$alarms .= "\"{$name}loss\"";
193 3d471a14 Ermal
			$override = true;
194
		} else {
195 023920e7 Ermal
			if ($override == true)
196 3d471a14 Ermal
				$alarms .= ",";
197
			$alarms .= "\"loss\"";
198
			$override = true;
199
		}
200
		if (!empty($gateway['latencylow'])) {
201 68f291ff Ermal
			$alarmscfg .= "alarm delay \"{$name}delay\" {\n";
202 3d471a14 Ermal
			$alarmscfg .= "\tdelay_low {$gateway['latencylow']}ms\n";
203
			$alarmscfg .= "\tdelay_high {$gateway['latencyhigh']}ms\n";
204
			$alarmscfg .= "}\n";
205
			if ($override == true)
206
				$alarms .= ",";
207 68f291ff Ermal
			$alarms .= "\"{$name}delay\"";
208 3d471a14 Ermal
			$override = true;
209
		} else {
210
			if ($override == true)
211
				$alarms .= ",";
212
			$alarms .= "\"delay\"";
213
			$override = true;
214
		}
215
		if (!empty($gateway['down'])) {
216 68f291ff Ermal
			$alarmscfg .= "alarm down \"{$name}down\" {\n";
217 3d471a14 Ermal
			$alarmscfg .= "\ttime {$gateway['down']}s\n";
218
			$alarmscfg .= "}\n";
219
			if ($override == true)
220
				$alarms .= ",";
221 68f291ff Ermal
			$alarms .= "\"{$name}down\"";
222 3d471a14 Ermal
			$override = true;
223
		} else {
224
			if ($override == true)
225
				$alarms .= ",";
226
			$alarms .= "\"down\"";
227
			$override = true;
228 cdcea13f Seth Mos
		}
229 3d471a14 Ermal
		if ($override == true)
230
			$apingercfg .= "\talarms override {$alarms};\n";
231
232
		$apingercfg .= "	rrd file \"{$g['vardb_path']}/rrd/{$gateway['name']}-quality.rrd\"\n";
233
		$apingercfg .= "}\n";
234
		$apingercfg .= "\n";
235
		/*
236
		 * If the gateway is the same as the monitor we do not add a
237
		 * route as this will break the routing table.
238
		 * Add static routes for each gateway with their monitor IP
239
		 * not strictly necessary but is a added level of protection.
240
		 */
241
		if (is_ipaddr($gateway['gateway']) && $gateway['monitor'] != $gateway['gateway']) {
242 b8452906 Vinicius Coque
			log_error(sprintf(gettext('Removing static route for monitor %1$s and adding a new route through %2$s'), $gateway['monitor'], $gateway['gateway']));
243 711a20eb jim-p
			if(is_ipaddrv6($gateway['gateway'])) {
244
				$inetfamily = "-inet6";
245
			} else {
246
				$inetfamily = "-inet";
247
			}
248 a3eb01e7 smos
			// mwexec("/sbin/route change {$inetfamily} -host " . escapeshellarg($gateway['monitor']) .
249
			//	" " . escapeshellarg($gateway['gateway']), true);
250 3d471a14 Ermal
		}
251
252 023920e7 Ermal
		$apingerconfig .= $alarmscfg;
253
		$apingerconfig .= $apingercfg;
254 cdcea13f Seth Mos
	}
255
	fwrite($fd, $apingerconfig);
256
	fclose($fd);
257
258 20f26a50 Ermal
	killbypid("{$g['varrun_path']}/apinger.pid");
259
	if (is_dir("{$g['tmp_path']}"))
260
		chmod("{$g['tmp_path']}", 01777);
261 17649c87 Ermal
	if (!is_dir("{$g['vardb_path']}/rrd"))
262 21934843 jim-p
		mkdir("{$g['vardb_path']}/rrd", 0775);
263 17649c87 Ermal
264
	@chown("{$g['vardb_path']}/rrd", "nobody");
265
266 20f26a50 Ermal
	/* start a new apinger process */
267 298e5e0a Ermal
	@unlink("{$g['tmp_path']}/apinger.status");
268 9132ae35 Ermal
	sleep(1);
269 20f26a50 Ermal
	mwexec_bg("/usr/local/sbin/apinger -c {$g['varetc_path']}/apinger.conf");
270 4f060616 Ermal
271 cdcea13f Seth Mos
	return 0;
272
}
273
274
/* return the status of the apinger targets as a array */
275 3d471a14 Ermal
function return_gateways_status($byname = false) {
276 ae9618af Ermal
	global $config, $g;
277 cdcea13f Seth Mos
278
	$apingerstatus = array();
279 d9dda2a5 Ermal
	if (file_exists("{$g['tmp_path']}/apinger.status")) {
280 cdcea13f Seth Mos
		$apingerstatus = file("{$g['tmp_path']}/apinger.status");
281 2328dcc5 Seth Mos
	}
282 cdcea13f Seth Mos
283 67ee1ec5 Ermal Luçi
	$status = array();
284 cdcea13f Seth Mos
	foreach($apingerstatus as $line) {
285 75466131 Ermal
		$info = explode("|", $line);
286 3d471a14 Ermal
		if ($byname == false)
287
			$target = $info[0];
288
		else
289
			$target = $info[2];
290 47c48e28 smos
291 3d471a14 Ermal
		$status[$target]['monitorip'] = $info[0];
292 79b7f498 Ermal
		$status[$target]['srcip'] = $info[1];
293
		$status[$target]['name'] = $info[2];
294
		$status[$target]['lastcheck'] = $info[5] ? date('r', $info[5]) : date('r');
295 603f19f0 smos
		$status[$target]['delay'] = empty($info[6]) ? "0ms" : round($info[6], 1) ."ms" ;
296
		$status[$target]['loss'] = empty($info[7]) ? "0.0%" : round($info[7], 1) . "%";
297 79b7f498 Ermal
		$status[$target]['status'] = trim($info[8]);
298 cdcea13f Seth Mos
	}
299 68f291ff Ermal
300 47c48e28 smos
	/* tack on any gateways that have monitoring disabled
301
	 * or are down, which could cause gateway groups to fail */
302 16106d2e smos
	$gateways_arr = return_gateways_array();
303
	foreach($gateways_arr as $gwitem) {
304
		if(isset($gwitem['monitor_disable'])) {
305
			if(!is_ipaddr($gwitem['monitorip'])) {
306
				$realif = $gwitem['interface'];
307
				$tgtip = get_interface_gateway($realif);
308
				$srcip = find_interface_ip($realif);
309
			} else {
310
				$tgtip = $gwitem['monitorip'];
311
				$srcip = find_interface_ip($realif);
312
			}
313
			if($byname == true)
314
				$target = $gwitem['name'];
315
			else
316
				$target = $tgtip;
317
318 47c48e28 smos
			/* failsafe for down interfaces */
319
			if($target == "") {
320
				$target = $gwitem['name'];
321
				$status[$target]['name'] = $gwitem['name'];
322
				$status[$target]['lastcheck'] = date('r');
323
				$status[$target]['delay'] = "0.0ms";
324
				$status[$target]['loss'] = "100.0%";
325
				$status[$target]['status'] = "down";
326
			} else {
327
				$status[$target]['monitorip'] = $tgtip;
328
				$status[$target]['srcip'] = $srcip;
329
				$status[$target]['name'] = $gwitem['name'];
330
				$status[$target]['lastcheck'] = date('r');
331
				$status[$target]['delay'] = "0.0ms";
332
				$status[$target]['loss'] = "0.0%";
333
				$status[$target]['status'] = "none";
334
			}
335 16106d2e smos
		}
336
	}
337 cdcea13f Seth Mos
	return($status);
338 17623ab5 Bill Marquette
}
339
340 2328dcc5 Seth Mos
/* Return all configured gateways on the system */
341 7bfa645c smos
function return_gateways_array($disabled = false, $localhost = false) {
342 8d3556c2 gnhb
	global $config, $g;
343 7901dff5 Ermal Luçi
344 c66b4242 Seth Mos
	$gateways_arr = array();
345
346 74c834f1 smos
	$found_defaultv4 = 0;
347
	$found_defaultv6 = 0;
348
349 3930a9c0 smos
	$interfaces_v4 = array();
350
	$interfaces_v6 = array();
351
352 01ba0a72 Ermal Lu?i
	$i = 0;
353 3d471a14 Ermal
	/* Process/add all the configured gateways. */
354 ef05ae5f Ermal
	if (is_array($config['gateways']['gateway_item'])) {
355 2328dcc5 Seth Mos
		foreach($config['gateways']['gateway_item'] as $gateway) {
356 74c834f1 smos
			/* skip disabled interfaces */
357
			if(!isset($config['interfaces'][$gateway['interface']]['enable']))
358
				continue;
359 c1d36d26 smos
360 3930a9c0 smos
			$wancfg = $config['interfaces'][$gateway['interface']];
361 c1d36d26 smos
			/* getting this detection right is hard at this point because we still don't
362
			 * store the address family in the gateway item */
363
			if(is_ipaddrv4($gateway['gateway']))
364
				$gateway['ipprotocol'] = "inet";
365
			if(is_ipaddrv6($gateway['gateway']))
366
				$gateway['ipprotocol'] = "inet6";
367
			if((preg_match("/dynamic/i", $gateway['gateway'])) && (!isset($gateway['ipprotocol']))) {
368 e02caf4a smos
				if(is_ipaddrv4($gateway['gateway']))
369
					$gateway['ipprotocol'] = "inet";
370
				if(is_ipaddrv6($gateway['gateway']))
371
					$gateway['ipprotocol'] = "inet6";
372
			}
373
			if((preg_match("/dynamic/i", $gateway['monitor'])) && (!isset($gateway['ipprotocol']))) {
374 c1d36d26 smos
				if(is_ipaddrv4($gateway['monitor']))
375
					$gateway['ipprotocol'] = "inet";
376
				if(is_ipaddrv6($gateway['monitor']))
377
					$gateway['ipprotocol'] = "inet6";
378
			}
379
380 3930a9c0 smos
			/* if the gateway is dynamic and we can find the IPv4, Great! */
381 206d5777 smos
			if((empty($gateway['gateway']) || ($gateway['gateway'] == "dynamic")) && ($gateway['ipprotocol'] == "inet")) {
382 3930a9c0 smos
				/* we know which interfaces is dynamic, this should be made a function */
383
				switch($wancfg['ipaddr']) {
384
					case "dhcp":
385
					case "pppoe":
386
					case "pptp":
387
					case "ppp":
388
						$gateway['ipprotocol'] = "inet";
389
						$gateway['gateway'] = get_interface_gateway($gateway['interface']);
390
						if($gateway['gateway'] == "dynamic") {
391
							$dynstr = $gateway['gateway'];
392
						}
393
						/* no IP address found, set to dynamic */
394
						if(! is_ipaddrv4($gateway['gateway'])) {
395
							$gateway['gateway'] = "{$dynstr}";
396
						}
397
						$gateway['dynamic'] = true;
398
						break;
399 74c834f1 smos
				}
400
			}
401 c1d36d26 smos
402 74c834f1 smos
			/* if the gateway is dynamic6 and we can find the IPv6, Great! */
403 206d5777 smos
			if((empty($gateway['gateway']) || ($gateway['gateway'] == "dynamic")) && ($gateway['ipprotocol'] == "inet6")) {
404 3930a9c0 smos
				/* we know which interfaces is dynamic, this should be made a function, and for v6 too */
405
				switch($wancfg['ipaddrv6']) {
406 c1d36d26 smos
					case "6rd":
407
					case "6to4":
408 3930a9c0 smos
					case "dhcp6":
409
						$gateway['ipprotocol'] = "inet6";
410
						$gateway['gateway'] = get_interface_gateway_v6($gateway['interface']);
411
						if($gateway['gateway'] == "dynamic6") {
412
							$dynstr = $gateway['gateway'];
413
						}
414
						/* no IPv6 address found, set to dynamic6 */
415
						if(! is_ipaddrv6($gateway['gateway'])) {
416
							$gateway['gateway'] = "{$dynstr}";
417
						}
418
						$gateway['dynamic'] = true;
419
						break;
420 7671c940 Seth Mos
				}
421 2328dcc5 Seth Mos
			}
422 c1d36d26 smos
423 33c06ef7 Ermal
			if (isset($gateway['monitor_disable']))
424
				$gateway['monitor_disable'] = true;
425
			else if (empty($gateway['monitor']))
426 2328dcc5 Seth Mos
				$gateway['monitor'] = $gateway['gateway'];
427 3d471a14 Ermal
428 883c53c9 Ermal Lu?i
			$gateway['friendlyiface'] = $gateway['interface'];
429 c1d36d26 smos
430
			/* special treatment for tunnel interfaces */
431
			if($gateway['ipprotocol'] == "inet6") {
432
				switch($wancfg['ipaddrv6']) {
433
					case "6rd":
434
					case "6to4":
435
						$gateway['interface'] = "stf0";
436
						break;
437 fa3e5c05 smos
					default:
438
						$gateway['interface'] = get_real_interface($gateway['interface']);
439
						break;
440 c1d36d26 smos
				}
441
			}
442
			if($gateway['ipprotocol'] == "inet") {
443
				$gateway['interface'] = get_real_interface($gateway['interface']);
444
			}
445 74c834f1 smos
446
			/* entry has a default flag, use it */
447
			if (isset($gateway['defaultgw'])) {
448
				if($gateway['ipprotocol'] == "inet") {
449
					$gateway['defaultgw'] = true;
450
					$found_defaultv4 = 1;
451
				}
452
				if($gateway['ipprotocol'] == "inet6") {
453
					$gateway['defaultgw'] = true;
454
					$found_defaultv6 = 1;
455
				}
456
			}
457 979c816c Ermal
			/* FIXME: Should this be enabled.
458
			 * Some interface like wan might be default but have no info recorded 
459 74c834f1 smos
			 * the config. */
460 3930a9c0 smos
			/* this is a fallback if all else fails and we want to get packets out @smos */
461 74c834f1 smos
			if (!isset($gateway['defaultgw'])) {
462
				if (($gateway['friendlyiface'] == "wan") && ($found_defaultv4 == 0)) {
463
					if (file_exists("{$g['tmp_path']}/{$gateway['interface']}_defaultgw")) {
464
						$gateway['defaultgw'] = true;
465
						$found_defaultv4 = 1;
466
					}
467 a11a839d smos
				}
468 74c834f1 smos
				if (($gateway['friendlyiface'] == "wan") && ($found_defaultv6 == 0)) {
469
					if (file_exists("{$g['tmp_path']}/{$gateway['interface']}_defaultgwv6")) {
470
						$gateway['defaultgw'] = true;
471
						$found_defaultv6 = 1;
472
					}
473 a11a839d smos
				}
474 bb8f919b Ermal
			}
475 3d471a14 Ermal
			/* include the gateway index as the attribute */
476
			$gateway['attribute'] = $i;
477 2328dcc5 Seth Mos
478 3930a9c0 smos
			/* tack a item on the array to keep track of dynamic interfaces */
479
			if($gateway['ipprotocol'] == "inet")
480
				$interfaces_v4[] = $gateway['friendlyiface'];
481
482
			if($gateway['ipprotocol'] == "inet6")
483
				$interfaces_v6[] = $gateway['friendlyiface'];
484
485 2328dcc5 Seth Mos
			$gateways_arr[$gateway['name']] = $gateway;
486 74c834f1 smos
			unset($gateway);
487 2328dcc5 Seth Mos
			$i++;
488
		}
489 c1d36d26 smos
	}
490 883c53c9 Ermal Lu?i
491 ef05ae5f Ermal
	/* Loop through all interfaces with a gateway and add it to a array */
492
	if ($disabled == false)
493
		$iflist = get_configured_interface_with_descr();
494
	else
495
		$iflist = get_configured_interface_with_descr(false, true);
496
497 c3a0d2a5 Seth Mos
	/* Process/add dynamic v4 gateways. */
498 883c53c9 Ermal Lu?i
	foreach($iflist as $ifname => $friendly ) {
499 3d471a14 Ermal
		if(! interface_has_gateway($ifname))
500 883c53c9 Ermal Lu?i
			continue;
501 3d471a14 Ermal
502 86df2846 jim-p
		if (empty($config['interfaces'][$ifname]))
503
			continue;
504
505
		$ifcfg = &$config['interfaces'][$ifname];
506 c3a0d2a5 Seth Mos
		if(!empty($ifcfg['ipaddr']) && is_ipaddrv4($ifcfg['ipaddr']))
507 e62fe748 Ermal
			continue;
508
509 74c834f1 smos
		if(!isset($ifcfg['enable']))
510
			continue;
511 3930a9c0 smos
512
		if(in_array($ifname, $interfaces_v4))
513
			continue;
514 74c834f1 smos
			
515
		$ctype = "";
516
		switch($ifcfg['ipaddr']) {
517
			case "dhcp":
518
			case "pppoe":
519
			case "pptp":
520 b2ff5d17 smos
			case "ppp":
521 74c834f1 smos
				$ctype = strtoupper($ifcfg['ipaddr']);
522
				break;
523 daac437f jim-p
			default:
524
				if (substr($ifcfg['if'], 0, 5) ==  "ovpnc")
525
					$ctype = "VPNv4";
526
				break;
527 74c834f1 smos
		}
528
		$ctype = "_". strtoupper($ctype);
529
530 883c53c9 Ermal Lu?i
		$gateway = array();
531
		$gateway['dynamic'] = false;
532 c3a0d2a5 Seth Mos
		$gateway['ipprotocol'] = "inet";
533 883c53c9 Ermal Lu?i
		$gateway['gateway'] = get_interface_gateway($ifname, $gateway['dynamic']);
534
		$gateway['interface'] = get_real_interface($ifname);
535
		$gateway['friendlyiface'] = $ifname;
536 74c834f1 smos
		$gateway['name'] = "{$friendly}{$ctype}";
537 883c53c9 Ermal Lu?i
		$gateway['attribute'] = "system";
538 2328dcc5 Seth Mos
	
539 74c834f1 smos
		if (($gateway['dynamic'] === "default") && ($found_defaultv4 == 0)) {
540 999111cb Ermal
			$gateway['defaultgw'] = true;
541
			$gateway['dynamic'] = true;
542 74c834f1 smos
			$found_defaultv4 = 1;
543 999111cb Ermal
		}
544 883c53c9 Ermal Lu?i
		/* Loopback dummy for dynamic interfaces without a IP */
545 c3a0d2a5 Seth Mos
		if (!is_ipaddrv4($gateway['gateway']) && $gateway['dynamic'] == true)
546 999111cb Ermal
			$gateway['gateway'] = "dynamic";
547 3439b033 Seth Mos
548 883c53c9 Ermal Lu?i
		/* automatically skip known static and dynamic gateways we have a array entry for */
549
		foreach($gateways_arr as $gateway_item) {
550 c3a0d2a5 Seth Mos
			if ((($ifname == $gateway_item['friendlyiface'] && $friendly == $gateway_item['name'])&& ($gateway['ipprotocol'] == $gateway_item['ipprotocol'])) ||
551
				($ifname == $gateway_item['friendlyiface'] && $gateway_item['dynamic'] == true) && ($gateway['ipprotocol'] == $gateway_item['ipprotocol']))
552 7bed8222 Ermal
					continue 2;
553 883c53c9 Ermal Lu?i
		}
554 c66b4242 Seth Mos
555 c3a0d2a5 Seth Mos
		if (is_ipaddrv4($gateway['gateway']))
556 883c53c9 Ermal Lu?i
			$gateway['monitor'] = $gateway['gateway'];
557 c65e1e0d Ermal
558 74c834f1 smos
		$gateway['descr'] = "Interface {$friendly}{$ctype} Gateway";
559 c3a0d2a5 Seth Mos
		$gateways_arr[$gateway['name']] = $gateway;
560 74c834f1 smos
		unset($gateway);
561 c3a0d2a5 Seth Mos
	}
562
563
	/* Process/add dynamic v6 gateways. */
564
	foreach($iflist as $ifname => $friendly ) {
565 67102344 smos
		if(! interface_has_gatewayv6($ifname))
566 c3a0d2a5 Seth Mos
			continue;
567
568
		if (empty($config['interfaces'][$ifname]))
569
			continue;
570
571
		$ifcfg = &$config['interfaces'][$ifname];
572
		if(!empty($ifcfg['ipaddrv6']) && is_ipaddrv6($ifcfg['ipaddrv6']))
573
			continue;
574 74c834f1 smos
			
575
		if(!isset($ifcfg['enable']))
576
			continue;
577
578 3930a9c0 smos
		if(in_array($ifname, $interfaces_v6))
579
			continue;
580
581 74c834f1 smos
		$ctype = "";
582
		switch($ifcfg['ipaddrv6']) {
583 c0b1bc81 smos
			case "slaac":
584 74c834f1 smos
			case "dhcp6":
585
			case "6to4":
586
			case "6rd":
587
				$ctype = strtoupper($ifcfg['ipaddrv6']);
588
				break;
589 daac437f jim-p
			default:
590
				if (substr($ifcfg['if'], 0, 5) ==  "ovpnc")
591
					$ctype = "VPNv6";
592
				break;
593 74c834f1 smos
		}
594
		$ctype = "_". strtoupper($ctype);
595 c3a0d2a5 Seth Mos
596
		$gateway = array();
597
		$gateway['dynamic'] = false;
598
		$gateway['ipprotocol'] = "inet6";
599
		$gateway['gateway'] = get_interface_gateway_v6($ifname, $gateway['dynamic']);
600 d500e296 smos
		switch($ifcfg['ipaddrv6']) {
601 a11a839d smos
			case "6to4":
602
				$gateway['interface'] = "stf0";
603
				$gateway['dynamic'] = "default";
604
				break;
605 d500e296 smos
			case "6rd":
606 eab2db68 smos
				$gateway['interface'] = "stf0";
607 d500e296 smos
				$gateway['dynamic'] = "default";
608
				break;
609
			default:
610
				$gateway['interface'] = get_real_interface($ifname);
611
				break;
612
		}
613 c3a0d2a5 Seth Mos
		$gateway['friendlyiface'] = $ifname;
614 74c834f1 smos
		$gateway['name'] = "{$friendly}{$ctype}";
615 c3a0d2a5 Seth Mos
		$gateway['attribute'] = "system";
616
	
617 74c834f1 smos
		if (($gateway['dynamic'] === "default")  && ($found_defaultv6 == 0)) {
618 c3a0d2a5 Seth Mos
			$gateway['defaultgw'] = true;
619
			$gateway['dynamic'] = true;
620 74c834f1 smos
			$found_defaultv6 = 1;
621 c3a0d2a5 Seth Mos
		}
622
623
		/* Loopback dummy for dynamic interfaces without a IP */
624
		if (!is_ipaddrv6($gateway['gateway']) && $gateway['dynamic'] == true)
625 791d3ac9 Seth Mos
			$gateway['gateway'] = "dynamic6";
626 c3a0d2a5 Seth Mos
627
		/* automatically skip known static and dynamic gateways we have a array entry for */
628
		foreach($gateways_arr as $gateway_item) {
629
			if ((($ifname == $gateway_item['friendlyiface'] && $friendly == $gateway_item['name']) && ($gateway['ipprotocol'] == $gateway_item['ipprotocol'])) ||
630
				($ifname == $gateway_item['friendlyiface'] && $gateway_item['dynamic'] == true) && ($gateway['ipprotocol'] == $gateway_item['ipprotocol']))
631
					continue 2;
632
		}
633
634
		if (is_ipaddrv6($gateway['gateway']))
635
			$gateway['monitor'] = $gateway['gateway'];
636
637 74c834f1 smos
		$gateway['descr'] = "Interface {$friendly}{$ctype} Gateway";
638 c3a0d2a5 Seth Mos
		$gateways_arr[$gateway['name']] = $gateway;
639 74c834f1 smos
		unset($gateway);
640 c66b4242 Seth Mos
	}
641 6fdea6a2 smos
642
	if($localhost === true) {
643
		/* attach localhost for Null routes */
644
		$gwlo4 = array();
645
		$gwlo4['name'] = "Null4";
646
		$gwlo4['interface'] = "lo0";
647
		$gwlo4['ipprotocol'] = "inet";
648
		$gwlo4['gateway'] = "127.0.0.1";
649
		$gwlo6 = array();
650
		$gwlo6['name'] = "Null6";
651
		$gwlo6['interface'] = "lo0";
652
		$gwlo6['ipprotocol'] = "inet6";
653
		$gwlo6['gateway'] = "::1";
654
		$gateways_arr['Null4'] = $gwlo4;
655
		$gateways_arr['Null6'] = $gwlo6;
656
	}
657 c66b4242 Seth Mos
	return($gateways_arr);
658
}
659
660 fd3515f2 jim-p
function fixup_default_gateway($ipprotocol, $gateways_status, $gateways_arr) {
661
	global $config, $g;
662
	/*
663
	 * NOTE: The code below is meant to replace the default gateway when it goes down.
664
	 *	This facilitates services running on pfSense itself and are not handled by a PBR to continue working.
665
	 */
666
	$upgw = "";
667
	$dfltgwdown = false;
668
	$dfltgwfound = false;
669
	foreach ($gateways_arr as $gwname => $gwsttng) {
670
		if (($gwsttng['ipprotocol'] == $ipprotocol) && isset($gwsttng['defaultgw'])) {
671
			$dfltgwfound = true;
672
			$dfltgwname = $gwname;
673
			if (!isset($gwsttng['monitor_disable']) && stristr($gateways_status[$gwname]['status'], "down"))
674
				$dfltgwdown = true;
675
		}
676
		/* Keep a record of the last up gateway */
677
		/* XXX: Blacklist lan for now since it might cause issues to those who have a gateway set for it */
678
		if (empty($upgw) && ($gwsttng['ipprotocol'] == $ipprotocol) && (isset($gwsttng['monitor_disable']) || !stristr($gateways_status[$gwname]['status'], "down")) && $gwsttng[$gwname]['friendlyiface'] != "lan")
679
			$upgw = $gwname;
680
		if ($dfltgwdown == true && !empty($upgw))
681
			break;
682
	}
683
	if ($dfltgwfound == false) {
684
		$gwname = convert_friendly_interface_to_friendly_descr("wan");
685
		if (!empty($gateways_status[$gwname]) && stristr($gateways_status[$gwname]['status'], "down"))
686
			$dfltgwdown = true;
687
	}
688
	if ($dfltgwdown == true && !empty($upgw)) {
689
		if (preg_match("/dynamic/i", $gateways_arr[$upgw]['gateway']))
690
			$gateways_arr[$upgw]['gateway'] = get_interface_gateway($gateways_arr[$upgw]['friendlyiface']);
691
		if (is_ipaddr($gateways_arr[$upgw]['gateway'])) {
692
			log_error("Default gateway down setting {$upgw} as default!");
693
			if(is_ipaddrv6($gateways_arr[$upgw]['gateway'])) {
694
				$inetfamily = "-inet6";
695
			} else {
696
				$inetfamily = "-inet";
697
			}
698
			mwexec("/sbin/route change {$inetfamily} default {$gateways_arr[$upgw]['gateway']}");
699
		}
700
	} else {
701
		$defaultgw = trim(`/sbin/route -n get -{$ipprotocol} default | /usr/bin/grep gateway | /usr/bin/sed 's/gateway://g'`, " \n");
702
		if(is_ipaddrv6($gateways_arr[$dfltgwname]['gateway'])) {
703
			$inetfamily = "-inet6";
704
		} else {
705
			$inetfamily = "-inet";
706
		}
707
		if ($defaultgw != $gateways_arr[$dfltgwname]['gateway'])
708
			mwexec("/sbin/route change {$inetfamily} default {$gateways_arr[$dfltgwname]['gateway']}");
709
	}
710
}
711
712 3d471a14 Ermal
/*
713
 * Return an array with all gateway groups with name as key
714 fd8eeda5 Seth Mos
 * All gateway groups will be processed before returning the array.
715 3d471a14 Ermal
 */
716 fd8eeda5 Seth Mos
function return_gateway_groups_array() {
717 962625aa Ermal
	global $config, $g;
718 fd8eeda5 Seth Mos
719
	/* fetch the current gateways status */
720 3d471a14 Ermal
	$gateways_status = return_gateways_status(true);
721 fd8eeda5 Seth Mos
	$gateways_arr = return_gateways_array();
722
	$gateway_groups_array = array();
723 ab1112da smos
	$carplist = get_configured_carp_interface_list();
724 fd8eeda5 Seth Mos
725 7af360ce Ermal
	if (isset($config['system']['gw_switch_default'])) {
726 fd3515f2 jim-p
		fixup_default_gateway("inet", $gateways_status, $gateways_arr);
727
		fixup_default_gateway("inet6", $gateways_status, $gateways_arr);
728 ee7f1647 Ermal
	}
729 fd8eeda5 Seth Mos
	if (is_array($config['gateways']['gateway_group'])) {
730
		foreach($config['gateways']['gateway_group'] as $group) {
731
			/* create array with group gateways members seperated by tier */
732
			$tiers = array();
733 3d471a14 Ermal
			$backupplan = array();
734 fd8eeda5 Seth Mos
			foreach($group['item'] as $item) {
735
				$itemsplit = explode("|", $item);
736
				$tier = $itemsplit[1];
737
				$gwname = $itemsplit[0];
738 ab1112da smos
				$vipname = $itemsplit[2];
739
				if(is_ipaddr($carplist[$vipname]))
740
					$gwvip_arr[$group['name']][$gwname] = $vipname;
741 3d471a14 Ermal
742
				/* Do it here rather than reiterating again the group in case no member is up. */
743 d8bf779b Ermal
				$backupplan[$tier][] = $gwname;
744 3d471a14 Ermal
745 fd8eeda5 Seth Mos
				/* check if the gateway is available before adding it to the array */
746 54b78cc1 Ermal
				if (!empty($gateways_status[$gwname])) {
747
					$status = $gateways_status[$gwname];
748 3d471a14 Ermal
					$gwdown = false;
749 9af4b31b Ermal
					if (stristr($status['status'], "down")) {
750 a51493d1 Vinicius Coque
						$msg = sprintf(gettext("MONITOR: %s is down, removing from routing group"), $gwname);
751 3d471a14 Ermal
						$gwdown = true;
752
					} else if (stristr($status['status'], "loss") && strstr($group['trigger'], "loss")) {
753
						/* packet loss */
754 f14bd707 Renato Botelho
						$msg = sprintf(gettext("MONITOR: %s has packet loss, removing from routing group"), $gwname);
755 3d471a14 Ermal
						$gwdown = true;
756
					} else if (stristr($status['status'], "delay") && strstr($group['trigger'] , "latency")) {
757
						/* high latency */
758 f14bd707 Renato Botelho
						$msg = sprintf(gettext("MONITOR: %s has high latency, removing from routing group"), $gwname);
759 3d471a14 Ermal
						$gwdown = true;
760
					}
761
					if ($gwdown == true) {
762 9f1d61d3 Scott Ullrich
						log_error($msg);
763
						notify_via_growl($msg);
764 10c3d4c0 Scott Ullrich
						notify_via_smtp($msg);
765 3d471a14 Ermal
					} else
766 857ce5f3 Seth Mos
						/* Online add member */
767
						$tiers[$tier][] = $gwname;
768 33c06ef7 Ermal
				} else if (isset($gateways_arr[$gwname]['monitor_disable']))
769
					$tiers[$tier][] = $gwname;
770 fd8eeda5 Seth Mos
			}
771
			$tiers_count = count($tiers);
772
			if($tiers_count == 0) {
773
				/* Oh dear, we have no members! Engage Plan B */
774 9132ae35 Ermal
				if (!$g['booting']) {
775 c92ccac7 Vinicius Coque
					$msg = gettext("Gateways status could not be determined, considering all as up/active.");
776 9132ae35 Ermal
					log_error($msg);
777
					notify_via_growl($msg);
778 10c3d4c0 Scott Ullrich
					notify_via_smtp($msg);
779 9132ae35 Ermal
				}
780 3d471a14 Ermal
				$tiers = $backupplan;
781 fd8eeda5 Seth Mos
			}
782 09ae0c17 Seth Mos
			/* sort the tiers array by the tier key */
783
			ksort($tiers);
784 3d471a14 Ermal
785 fd8eeda5 Seth Mos
			/* we do not really foreach the tiers as we stop after the first tier */
786 fe22a89b Ermal
			foreach($tiers as $tier) {
787 fd8eeda5 Seth Mos
				/* process all gateways in this tier */
788 fe22a89b Ermal
				foreach($tier as $member) {
789 fd8eeda5 Seth Mos
					/* determine interface gateway */
790 5f53260a Ermal
					if (isset($gateways_arr[$member])) {
791
						$gateway = $gateways_arr[$member];
792
						$int = $gateway['interface'];
793
						$gatewayip = "";
794
						if(is_ipaddr($gateway['gateway'])) 
795
							$gatewayip = $gateway['gateway'];
796
						else if ($int <> "")
797
							$gatewayip = get_interface_gateway($gateway['friendlyiface']);
798 3d471a14 Ermal
					
799
						if (($int <> "") && is_ipaddr($gatewayip)) {
800
							$groupmember = array();
801
							$groupmember['int']  = $int;
802
							$groupmember['gwip']  = $gatewayip;
803
							$groupmember['weight']  = isset($gateway['weight']) ? $gateway['weight'] : 1;
804 ab1112da smos
							if($gwvip_arr[$group['name']][$gwname] <> "")
805
								$groupmember['vip'] = $gwvip_arr[$group['name']][$gwname];
806 44b054ce smos
							$gateway_groups_array[$group['name']]['ipprotocol'] = $gateway['ipprotocol'];
807 3d471a14 Ermal
							$gateway_groups_array[$group['name']][] = $groupmember;
808
						}
809 fd8eeda5 Seth Mos
					}
810
				}
811
				/* we should have the 1st available tier now, exit stage left */
812 47c48e28 smos
				if(is_array($gateway_groups_array[$group['name']]))
813
					break;
814
				else
815
					log_error("GATEWAYS: We did not find the first tier of the gateway group {$group['name']}! That's odd.");
816 fd8eeda5 Seth Mos
			}
817
		}
818
	}
819 fe22a89b Ermal
	return ($gateway_groups_array);
820 fd8eeda5 Seth Mos
}
821
822 2468ae76 Scott Ullrich
/* Update DHCP WAN Interface ip address in gateway group item */
823
function dhclient_update_gateway_groups_defaultroute($interface = "wan") {
824
	global $config, $g;
825
	foreach($config['gateways']['gateway_item'] as & $gw) {	
826
		if($gw['interface'] == $interface) {
827
			$current_gw = get_interface_gateway($interface);
828
			if($gw['gateway'] <> $current_gw) {
829
				$gw['gateway'] = $current_gw;
830
				$changed = true;
831
			}
832
		}
833
	}
834
	if($changed && $current_gw)
835 addc0439 Renato Botelho
		write_config(sprintf(gettext('Updating gateway group gateway for %1$s - new gateway is %2$s'), $interfac, $current_gw));
836 2468ae76 Scott Ullrich
}
837 fd8eeda5 Seth Mos
838 6dc3a5c2 Ermal Lu?i
function lookup_gateway_ip_by_name($name) {
839 fe22a89b Ermal
840 fbf0d4d3 smos
	$gateways_arr = return_gateways_array(false, true);
841 68f291ff Ermal
        foreach ($gateways_arr as $gname => $gw) {
842
                if ($gw['name'] == $name || $gname == $name)
843 6f77aca5 Ermal
                        return $gw['gateway'];
844
        }
845 66a96e72 Ermal
846
	return false;
847 6dc3a5c2 Ermal Lu?i
}
848
849
function lookup_gateway_monitor_ip_by_name($name) {
850 fe22a89b Ermal
851 fbf0d4d3 smos
        $gateways_arr = return_gateways_array(false, true);
852 fe22a89b Ermal
	if (!empty($gateways_arr[$name])) {
853
		$gateway = $gateways_arr[$name];
854 68f291ff Ermal
		if(!is_ipaddr($gateway['monitor']))
855
			return $gateway['gateway'];
856 6dc3a5c2 Ermal Lu?i
857 9fd19334 gnhb
		return $gateway['monitor'];
858 6dc3a5c2 Ermal Lu?i
        }
859 fe22a89b Ermal
860
        return (false);
861 6dc3a5c2 Ermal Lu?i
}
862
863
function lookup_gateway_interface_by_name($name) {
864
865 fbf0d4d3 smos
        $gateways_arr = return_gateways_array(false, true);
866 fe22a89b Ermal
	if (!empty($gateways_arr[$name])) {
867 1be0e2da smos
		$interfacegw = $gateways_arr[$name]['interface'];
868 fe22a89b Ermal
		return ($interfacegw);
869 6dc3a5c2 Ermal Lu?i
        }
870 fe22a89b Ermal
871
        return (false);
872 6dc3a5c2 Ermal Lu?i
}
873
874 a2532739 Ermal Lu?i
function get_interface_gateway($interface, &$dynamic = false) {
875 5a5413bb Seth Mos
	global $config, $g;
876 6dc3a5c2 Ermal Lu?i
877 5a5413bb Seth Mos
	$gw = NULL;
878 6dc3a5c2 Ermal Lu?i
879 5a5413bb Seth Mos
	$gwcfg = $config['interfaces'][$interface];
880
	if (!empty($gwcfg['gateway']) && is_array($config['gateways']['gateway_item'])) {
881
		foreach($config['gateways']['gateway_item'] as $gateway) {
882
			if(($gateway['name'] == $gwcfg['gateway']) && (is_ipaddrv4($gateway['gateway']))) {
883
				$gw = $gateway['gateway'];
884 66a96e72 Ermal
				break;
885
			}
886 5a5413bb Seth Mos
		}
887 66a96e72 Ermal
	}
888 6dc3a5c2 Ermal Lu?i
889 5a5413bb Seth Mos
	// for dynamic interfaces we handle them through the $interface_router file.
890 2feb85af Seth Mos
	if (!is_ipaddrv4($gw) && !is_ipaddrv4($gwcfg['ipaddr'])) {
891 5a5413bb Seth Mos
		$realif = get_real_interface($interface);
892
		if (file_exists("{$g['tmp_path']}/{$realif}_router")) {
893
				$gw = trim(file_get_contents("{$g['tmp_path']}/{$realif}_router"), " \n");
894
			$dynamic = true;
895
		}
896
		if (file_exists("{$g['tmp_path']}/{$realif}_defaultgw"))
897
			$dynamic = "default";
898 d62b164a gnhb
			
899 5a5413bb Seth Mos
	}
900
901
	/* return gateway */
902
	return ($gw);
903
}
904
905
function get_interface_gateway_v6($interface, &$dynamic = false) {
906
	global $config, $g;
907 6dc3a5c2 Ermal Lu?i
908 5a5413bb Seth Mos
	$gw = NULL;
909
	$gwcfg = $config['interfaces'][$interface];
910 ed5c640d Seth Mos
	if (!empty($gwcfg['gatewayv6']) && is_array($config['gateways']['gateway_item'])) {
911 5a5413bb Seth Mos
		foreach($config['gateways']['gateway_item'] as $gateway) {
912 640b3a9a Seth Mos
			if(($gateway['name'] == $gwcfg['gatewayv6']) && (is_ipaddrv6($gateway['gateway']))) {
913 5a5413bb Seth Mos
				$gw = $gateway['gateway'];
914
				break;
915
			}
916
		}
917
	}
918
919
	// for dynamic interfaces we handle them through the $interface_router file.
920 2feb85af Seth Mos
	if (!is_ipaddrv6($gw) && !is_ipaddrv6($gwcfg['ipaddrv6'])) {
921 5a5413bb Seth Mos
			$realif = get_real_interface($interface);
922
			if (file_exists("{$g['tmp_path']}/{$realif}_routerv6")) {
923
				$gw = trim(file_get_contents("{$g['tmp_path']}/{$realif}_routerv6"), " \n");
924
				$dynamic = true;
925
			}
926
			if (file_exists("{$g['tmp_path']}/{$realif}_defaultgwv6"))
927
				$dynamic = "default";
928
			
929
	}
930
	/* return gateway */
931
	return ($gw);
932 6dc3a5c2 Ermal Lu?i
}
933
934 318189b6 smos
/* Check a IP address against a gateway IP or name
935
 * to verify it's address family */
936
function validate_address_family($ipaddr, $gwname) {
937
	$v4ip = false;
938
	$v6ip = false;
939
	$v4gw = false;
940
	$v6gw = false;
941
942
	if(is_ipaddrv4($ipaddr))
943
		$v4ip = true;
944
	if(is_ipaddrv6($ipaddr))
945
		$v6ip = true;
946
	if(is_ipaddrv4($gwname))
947
		$v4gw = true;
948
	if(is_ipaddrv6($gwname))
949
		$v6gw = true;
950
951
	if($v4ip && $v4gw)
952
		return true;
953
	if($v6ip && $v6gw)
954
		return true;
955
956
	/* still no match, carry on, lookup gateways */
957
	if(is_ipaddrv4(lookup_gateway_ip_by_name($gwname)))
958
		$v4gw = true;
959
	if(is_ipaddrv6(lookup_gateway_ip_by_name($gwname)))
960
		$v6gw = true;
961 96cd928b smos
962
	$gw_array = return_gateways_array();
963
	if(is_array($gw_array[$gwname])) {
964
		switch($gw_array[$gwname]['ipprotocol']) {
965
			case "inet":
966
				$v4gw = true;
967
				break;
968
			case "inet6":
969
				$v6gw = true;
970
				break;
971
		}
972 748ff86f Seth Mos
	}
973 318189b6 smos
974
	if($v4ip && $v4gw)
975
		return true;
976
	if($v6ip && $v6gw)
977
		return true;
978
	
979
	return false;
980
}
981
982 cdb0df65 smos
/* check if a interface is part of a gateway group */
983
function interface_gateway_group_member($interface) {
984
	global $config;
985
	$realif = get_real_interface($interface);
986
	if(is_array($config['gateways']['gateway_group']))
987
		$groups = $config['gateways']['gateway_group'];
988
	else
989
		return false;
990
991
	foreach($groups as $group) {
992
		if(is_array($group['item'])) {
993
			foreach($group['item'] as $item) {
994
				$elements = explode("|", $item);
995
				$gwname = $elements[0];
996 017817c2 smos
				$gwif = get_real_interface(lookup_gateway_interface_by_name($gwname));
997
				if($gwif == $realif)
998
					return true;
999 cdb0df65 smos
			}
1000
		}
1001
	}
1002
	return false;
1003
}
1004 318189b6 smos
1005 c832f6bf smos
?>