Project

General

Profile

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