Project

General

Profile

Download (16.7 KB) Statistics
| Branch: | Tag: | Revision:
1 17623ab5 Bill Marquette
<?php
2
/*
3 cdcea13f Seth Mos
  Copyright (C) 2008 Bill Marquette, Seth Mos
4 c1191d5b Ermal
  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 17623ab5 Bill Marquette
33 3d471a14 Ermal
/*
34
 * Creates monitoring configuration file and
35
 * adds apropriate static routes.
36 cdcea13f Seth Mos
 */
37
function setup_gateways_monitor() {
38 3d471a14 Ermal
	global $config, $g;
39 ffe76308 Seth Mos
40 3d471a14 Ermal
	$gateways_arr = return_gateways_array();
41
	if (!is_array($gateways_arr)) {
42
		log_error("No gateways to monitor. Apinger will not be run.");
43
		killbypid("{$g['varrun_path']}/apinger.pid");
44
		@unlink("{$g['tmp_path']}/apinger.status");
45
		return;
46
	}
47 cdcea13f Seth Mos
48 3d471a14 Ermal
	/* Default settings. Probably should move to globals.inc? */
49 023920e7 Ermal
	$a_settings = array();
50
	$a_settings['latencylow'] = "200";
51
	$a_settings['latencyhigh'] = "500";
52
	$a_settings['losslow'] = "10";
53
	$a_settings['losshigh'] = "20";
54 37c98ef9 Seth Mos
55 cdcea13f Seth Mos
	$fd = fopen("{$g['varetc_path']}/apinger.conf", "w");
56
	$apingerconfig = <<<EOD
57
58
# pfSense apinger configuration file. Automatically Generated!
59
60
## User and group the pinger should run as
61 0534d60a Chris Buechler
user "root"
62
group "wheel"
63 cdcea13f Seth Mos
64
## Mailer to use (default: "/usr/lib/sendmail -t")
65
#mailer "/var/qmail/bin/qmail-inject" 
66
67
## Location of the pid-file (default: "/var/run/apinger.pid")
68
pid_file "{$g['varrun_path']}/apinger.pid"
69
70
## Format of timestamp (%s macro) (default: "%b %d %H:%M:%S")
71
#timestamp_format "%Y%m%d%H%M%S"
72
73
status {
74
	## File where the status information whould be written to
75 298e5e0a Ermal
	file "{$g['tmp_path']}/apinger.status"
76 cdcea13f Seth Mos
	## Interval between file updates
77
	## when 0 or not set, file is written only when SIGUSR1 is received
78 ecb08c6a Ermal
	interval 5s
79 cdcea13f Seth Mos
}
80
81
########################################
82
# RRDTool status gathering configuration
83
# Interval between RRD updates
84
rrd interval 60s;
85
86
## These parameters can be overriden in a specific alarm configuration
87
alarm default { 
88 0ae6daf8 Ermal
	command on "/usr/local/sbin/pfSctl -c 'filter reload'"
89
	command off "/usr/local/sbin/pfSctl -c 'filter reload'"
90 cdcea13f Seth Mos
	combine 10s
91
}
92
93
## "Down" alarm definition. 
94
## This alarm will be fired when target doesn't respond for 30 seconds.
95
alarm down "down" {
96
	time 10s
97
}
98
99
## "Delay" alarm definition. 
100
## This alarm will be fired when responses are delayed more than 200ms
101
## it will be canceled, when the delay drops below 100ms
102
alarm delay "delay" {
103 37c98ef9 Seth Mos
	delay_low {$a_settings['latencylow']}ms
104
	delay_high {$a_settings['latencyhigh']}ms
105 cdcea13f Seth Mos
}
106
107
## "Loss" alarm definition. 
108
## This alarm will be fired when packet loss goes over 20%
109
## it will be canceled, when the loss drops below 10%
110
alarm loss "loss" {
111 37c98ef9 Seth Mos
	percent_low {$a_settings['losslow']}
112
	percent_high {$a_settings['losshigh']}
113 cdcea13f Seth Mos
}
114
115
target default {
116
	## How often the probe should be sent	
117
	interval 1s
118
	
119
	## How many replies should be used to compute average delay 
120
	## for controlling "delay" alarms
121
	avg_delay_samples 10
122
	
123
	## How many probes should be used to compute average loss
124
	avg_loss_samples 50
125
126
	## The delay (in samples) after which loss is computed
127
	## without this delays larger than interval would be treated as loss
128
	avg_loss_delay_samples 20
129
130
	## Names of the alarms that may be generated for the target
131
	alarms "down","delay","loss"
132
133
	## Location of the RRD
134 1bce2729 Seth Mos
	#rrd file "{$g['vardb_path']}/rrd/apinger-%t.rrd"
135 cdcea13f Seth Mos
}
136
137
EOD;
138
139 3d471a14 Ermal
	foreach($gateways_arr as $name => $gateway) {
140
		if (empty($gateway['monitor']) || !is_ipaddr($gateway['monitor'])) {
141
			if (is_ipaddr($gateway['gateway']))
142
				$gateway['monitor'] = $gateway['gateway'];
143
			else /* No chance to get an ip to monitor skip target. */
144 f31ab121 Ermal
				continue;
145 3d471a14 Ermal
		}
146 f31ab121 Ermal
147 3d471a14 Ermal
		/* Interface ip is needed since apinger will bind a socket to it. */
148 01f1b601 Ermal
		$gwifip = find_interface_ip($gateway['interface'], true);
149 3d471a14 Ermal
		if (!is_ipaddr($gwifip))
150
			continue; //Skip this target
151
152 f44f8eb5 Ermal
		$apingercfg = "target \"{$gateway['monitor']}\" {\n";
153 68f291ff Ermal
		$apingercfg .= "	description \"{$name}\"\n";
154 3d471a14 Ermal
		$apingercfg .= "	srcip \"{$gwifip}\"\n";
155
		$alarms = "";
156 f44f8eb5 Ermal
		$alarmscfg = "";
157 3d471a14 Ermal
		$override = false;
158
		if (!empty($gateway['lowloss'])) {
159 68f291ff Ermal
			$alarmscfg .= "alarm loss \"{$name}loss\" {\n";
160 3d471a14 Ermal
			$alarmscfg .= "\tpercent_low {$gateway['losslow']}\n";
161
       			$alarmscfg .= "\tpercent_high {$gateway['losshigh']}\n";
162
			$alarmscfg .= "}\n";
163 68f291ff Ermal
			$alarms .= "\"{$name}loss\"";
164 3d471a14 Ermal
			$override = true;
165
		} else {
166 023920e7 Ermal
			if ($override == true)
167 3d471a14 Ermal
				$alarms .= ",";
168
			$alarms .= "\"loss\"";
169
			$override = true;
170
		}
171
		if (!empty($gateway['latencylow'])) {
172 68f291ff Ermal
			$alarmscfg .= "alarm delay \"{$name}delay\" {\n";
173 3d471a14 Ermal
			$alarmscfg .= "\tdelay_low {$gateway['latencylow']}ms\n";
174
			$alarmscfg .= "\tdelay_high {$gateway['latencyhigh']}ms\n";
175
			$alarmscfg .= "}\n";
176
			if ($override == true)
177
				$alarms .= ",";
178 68f291ff Ermal
			$alarms .= "\"{$name}delay\"";
179 3d471a14 Ermal
			$override = true;
180
		} else {
181
			if ($override == true)
182
				$alarms .= ",";
183
			$alarms .= "\"delay\"";
184
			$override = true;
185
		}
186
		if (!empty($gateway['down'])) {
187 68f291ff Ermal
			$alarmscfg .= "alarm down \"{$name}down\" {\n";
188 3d471a14 Ermal
			$alarmscfg .= "\ttime {$gateway['down']}s\n";
189
			$alarmscfg .= "}\n";
190
			if ($override == true)
191
				$alarms .= ",";
192 68f291ff Ermal
			$alarms .= "\"{$name}down\"";
193 3d471a14 Ermal
			$override = true;
194
		} else {
195
			if ($override == true)
196
				$alarms .= ",";
197
			$alarms .= "\"down\"";
198
			$override = true;
199 cdcea13f Seth Mos
		}
200 3d471a14 Ermal
		if ($override == true)
201
			$apingercfg .= "\talarms override {$alarms};\n";
202
203
		$apingercfg .= "	rrd file \"{$g['vardb_path']}/rrd/{$gateway['name']}-quality.rrd\"\n";
204
		$apingercfg .= "}\n";
205
		$apingercfg .= "\n";
206
		/*
207
		 * If the gateway is the same as the monitor we do not add a
208
		 * route as this will break the routing table.
209
		 * Add static routes for each gateway with their monitor IP
210
		 * not strictly necessary but is a added level of protection.
211
		 */
212
		if (is_ipaddr($gateway['gateway']) && $gateway['monitor'] != $gateway['gateway']) {
213
			log_error("Removing static route for monitor {$gateway['monitor']} and adding a new route through {$gateway['gateway']}");
214
			mwexec("/sbin/route delete -host " . escapeshellarg($gateway['monitor']), true);
215
			mwexec("/sbin/route add -host " . escapeshellarg($gateway['monitor']) .
216 435a418f Ermal
				" " . escapeshellarg($gateway['gateway']), true);
217 3d471a14 Ermal
		}
218
219 023920e7 Ermal
		$apingerconfig .= $alarmscfg;
220
		$apingerconfig .= $apingercfg;
221 cdcea13f Seth Mos
	}
222
	fwrite($fd, $apingerconfig);
223
	fclose($fd);
224
225 20f26a50 Ermal
	killbypid("{$g['varrun_path']}/apinger.pid");
226
	if (is_dir("{$g['tmp_path']}"))
227
		chmod("{$g['tmp_path']}", 01777);
228 17649c87 Ermal
	if (!is_dir("{$g['vardb_path']}/rrd"))
229 21934843 jim-p
		mkdir("{$g['vardb_path']}/rrd", 0775);
230 17649c87 Ermal
231
	@chown("{$g['vardb_path']}/rrd", "nobody");
232
233 20f26a50 Ermal
	/* start a new apinger process */
234 298e5e0a Ermal
	@unlink("{$g['tmp_path']}/apinger.status");
235 20f26a50 Ermal
	mwexec_bg("/usr/local/sbin/apinger -c {$g['varetc_path']}/apinger.conf");
236 4f060616 Ermal
237 cdcea13f Seth Mos
	return 0;
238
}
239
240
/* return the status of the apinger targets as a array */
241 3d471a14 Ermal
function return_gateways_status($byname = false) {
242 ae9618af Ermal
	global $config, $g;
243 cdcea13f Seth Mos
244
	$apingerstatus = array();
245 d9dda2a5 Ermal
	if (file_exists("{$g['tmp_path']}/apinger.status")) {
246 cdcea13f Seth Mos
		$apingerstatus = file("{$g['tmp_path']}/apinger.status");
247 2328dcc5 Seth Mos
	}
248 cdcea13f Seth Mos
249 67ee1ec5 Ermal Luçi
	$status = array();
250 cdcea13f Seth Mos
	foreach($apingerstatus as $line) {
251 75466131 Ermal
		$info = explode("|", $line);
252 3d471a14 Ermal
		if ($byname == false)
253
			$target = $info[0];
254
		else
255
			$target = $info[2];
256
		$status[$target]['monitorip'] = $info[0];
257 79b7f498 Ermal
		$status[$target]['srcip'] = $info[1];
258
		$status[$target]['name'] = $info[2];
259
		$status[$target]['lastcheck'] = $info[5] ? date('r', $info[5]) : date('r');
260
		$status[$target]['delay'] = empty($info[6]) ? 0 : $info[6];
261
		$status[$target]['loss'] = empty($info[7]) ? "0.0%" : $info[7] . "";
262
		$status[$target]['status'] = trim($info[8]);
263 cdcea13f Seth Mos
	}
264 68f291ff Ermal
265 cdcea13f Seth Mos
	return($status);
266 17623ab5 Bill Marquette
}
267
268 2328dcc5 Seth Mos
/* Return all configured gateways on the system */
269 c795339e Ermal Lu?i
function return_gateways_array($disabled = false) {
270 8d3556c2 gnhb
	global $config, $g;
271 7901dff5 Ermal Luçi
272 c66b4242 Seth Mos
	$gateways_arr = array();
273
274 01ba0a72 Ermal Lu?i
	$i = 0;
275 3d471a14 Ermal
	/* Process/add all the configured gateways. */
276 ef05ae5f Ermal
	if (is_array($config['gateways']['gateway_item'])) {
277 2328dcc5 Seth Mos
		foreach($config['gateways']['gateway_item'] as $gateway) {
278 78ae2b14 Ermal
			if(empty($gateway['gateway']) || $gateway['gateway'] == "dynamic") {
279 2328dcc5 Seth Mos
				$gateway['gateway'] = get_interface_gateway($gateway['interface']);
280
				/* no IP address found, set to dynamic */
281 3d471a14 Ermal
				if(! is_ipaddr($gateway['gateway']))
282 2328dcc5 Seth Mos
					$gateway['gateway'] = "dynamic";
283 a2532739 Ermal Lu?i
				$gateway['dynamic'] = true;
284 2328dcc5 Seth Mos
			}
285 3d471a14 Ermal
			if(empty($gateway['monitor']))
286 2328dcc5 Seth Mos
				$gateway['monitor'] = $gateway['gateway'];
287 3d471a14 Ermal
288 883c53c9 Ermal Lu?i
			$gateway['friendlyiface'] = $gateway['interface'];
289 3d471a14 Ermal
			$gateway['interface'] = get_real_interface($gateway['interface']);
290 979c816c Ermal
			/* FIXME: Should this be enabled.
291
			 * Some interface like wan might be default but have no info recorded 
292 bb8f919b Ermal
			 * the config.
293
			if ($gateway['friendlyiface'] == "wan" && !isset($gateway['defaultgw'])) {
294
				if (file_exists("{$g['tmp_path']}/{$gateway['interface']}_defaultgw"))
295
					$gateway['defaultgw'] = true;
296
			}
297 979c816c Ermal
			 */
298 3d471a14 Ermal
			/* include the gateway index as the attribute */
299
			$gateway['attribute'] = $i;
300 2328dcc5 Seth Mos
301
			$gateways_arr[$gateway['name']] = $gateway;
302
			$i++;
303
		}
304 883c53c9 Ermal Lu?i
	} 
305
306 ef05ae5f Ermal
	/* Loop through all interfaces with a gateway and add it to a array */
307
	if ($disabled == false)
308
		$iflist = get_configured_interface_with_descr();
309
	else
310
		$iflist = get_configured_interface_with_descr(false, true);
311
312 3d471a14 Ermal
	/* Process/add dynamic gateways. */
313 883c53c9 Ermal Lu?i
	foreach($iflist as $ifname => $friendly ) {
314 3d471a14 Ermal
		if(! interface_has_gateway($ifname))
315 883c53c9 Ermal Lu?i
			continue;
316 3d471a14 Ermal
317 86df2846 jim-p
		if (empty($config['interfaces'][$ifname]))
318
			continue;
319
320
		$ifcfg = &$config['interfaces'][$ifname];
321 e62fe748 Ermal
		if (!empty($ifcfg['ipaddr']) && is_ipaddr($ifcfg['ipaddr']))
322
			continue;
323
324 883c53c9 Ermal Lu?i
		$gateway = array();
325
		$gateway['dynamic'] = false;
326
		$gateway['gateway'] = get_interface_gateway($ifname, $gateway['dynamic']);
327
		$gateway['interface'] = get_real_interface($ifname);
328
		$gateway['friendlyiface'] = $ifname;
329 ef05ae5f Ermal
		$gateway['name'] = $friendly;
330 883c53c9 Ermal Lu?i
		$gateway['attribute'] = "system";
331 2328dcc5 Seth Mos
	
332 6adc8e32 gnhb
		if ($gateway['dynamic'] === "default") {
333 999111cb Ermal
			$gateway['defaultgw'] = true;
334
			$gateway['dynamic'] = true;
335
		}
336 883c53c9 Ermal Lu?i
		/* Loopback dummy for dynamic interfaces without a IP */
337 999111cb Ermal
		if (!is_ipaddr($gateway['gateway']) && $gateway['dynamic'] == true)
338
			$gateway['gateway'] = "dynamic";
339 3439b033 Seth Mos
340 883c53c9 Ermal Lu?i
		/* automatically skip known static and dynamic gateways we have a array entry for */
341
		foreach($gateways_arr as $gateway_item) {
342 1ced293c gnhb
			if (($ifname == $gateway_item['friendlyiface'] && $friendly == $gateway_item['name']) ||
343
				($ifname == $gateway_item['friendlyiface'] && $gateway_item['dynamic'] == true))
344 7bed8222 Ermal
					continue 2;
345 883c53c9 Ermal Lu?i
		}
346 c66b4242 Seth Mos
347 e0df9716 gnhb
		if (is_ipaddr($gateway['gateway']))
348 883c53c9 Ermal Lu?i
			$gateway['monitor'] = $gateway['gateway'];
349 c65e1e0d Ermal
350
		$gateway['descr'] = "Interface {$friendly} Dynamic Gateway";
351
		$gateways_arr[$friendly] = $gateway;
352 c66b4242 Seth Mos
	}
353 883c53c9 Ermal Lu?i
354 c66b4242 Seth Mos
	return($gateways_arr);
355
}
356
357 3d471a14 Ermal
/*
358
 * Return an array with all gateway groups with name as key
359 fd8eeda5 Seth Mos
 * All gateway groups will be processed before returning the array.
360 3d471a14 Ermal
 */
361 fd8eeda5 Seth Mos
function return_gateway_groups_array() {
362 962625aa Ermal
	global $config, $g;
363 fd8eeda5 Seth Mos
364
	/* fetch the current gateways status */
365 3d471a14 Ermal
	$gateways_status = return_gateways_status(true);
366 fd8eeda5 Seth Mos
	$gateways_arr = return_gateways_array();
367
	$gateway_groups_array = array();
368
369
	if (is_array($config['gateways']['gateway_group'])) {
370
		foreach($config['gateways']['gateway_group'] as $group) {
371
			/* create array with group gateways members seperated by tier */
372
			$tiers = array();
373 3d471a14 Ermal
			$backupplan = array();
374 fd8eeda5 Seth Mos
			foreach($group['item'] as $item) {
375
				$itemsplit = explode("|", $item);
376
				$tier = $itemsplit[1];
377
				$gwname = $itemsplit[0];
378 3d471a14 Ermal
379
				/* Do it here rather than reiterating again the group in case no member is up. */
380 d8bf779b Ermal
				$backupplan[$tier][] = $gwname;
381 3d471a14 Ermal
382 fd8eeda5 Seth Mos
				/* check if the gateway is available before adding it to the array */
383 54b78cc1 Ermal
				if (!empty($gateways_status[$gwname])) {
384
					$status = $gateways_status[$gwname];
385 3d471a14 Ermal
					$gwdown = false;
386 9af4b31b Ermal
					if (stristr($status['status'], "down")) {
387 3d471a14 Ermal
						$msg = "MONITOR: {$gwname} has high latency, removing from routing group";
388
						$gwdown = true;
389
					} else if (stristr($status['status'], "loss") && strstr($group['trigger'], "loss")) {
390
						/* packet loss */
391
						$msg = "MONITOR: {$gwname} has packet loss, removing from routing group";
392
						$gwdown = true;
393
					} else if (stristr($status['status'], "delay") && strstr($group['trigger'] , "latency")) {
394
						/* high latency */
395
						$msg = "MONITOR: {$gwname} has high latency, removing from routing group";
396
						$gwdown = true;
397
					}
398
					if ($gwdown == true) {
399 9f1d61d3 Scott Ullrich
						log_error($msg);
400
						notify_via_growl($msg);
401 3d471a14 Ermal
					} else
402 857ce5f3 Seth Mos
						/* Online add member */
403
						$tiers[$tier][] = $gwname;
404 fd8eeda5 Seth Mos
				}
405
			}
406
			$tiers_count = count($tiers);
407
			if($tiers_count == 0) {
408
				/* Oh dear, we have no members! Engage Plan B */
409 3d471a14 Ermal
				$msg = "Gateways status could not be determined, considering all as up/active.";
410 9f1d61d3 Scott Ullrich
				log_error($msg);
411
				notify_via_growl($msg);
412 3d471a14 Ermal
				$tiers = $backupplan;
413 fd8eeda5 Seth Mos
			}
414 09ae0c17 Seth Mos
			/* sort the tiers array by the tier key */
415
			ksort($tiers);
416 3d471a14 Ermal
417 fd8eeda5 Seth Mos
			/* we do not really foreach the tiers as we stop after the first tier */
418 fe22a89b Ermal
			foreach($tiers as $tier) {
419 fd8eeda5 Seth Mos
				/* process all gateways in this tier */
420 fe22a89b Ermal
				foreach($tier as $member) {
421 fd8eeda5 Seth Mos
					/* determine interface gateway */
422 5f53260a Ermal
					if (isset($gateways_arr[$member])) {
423
						$gateway = $gateways_arr[$member];
424
						$int = $gateway['interface'];
425
						$gatewayip = "";
426
						if(is_ipaddr($gateway['gateway'])) 
427
							$gatewayip = $gateway['gateway'];
428
						else if ($int <> "")
429
							$gatewayip = get_interface_gateway($gateway['friendlyiface']);
430 3d471a14 Ermal
					
431
						if (($int <> "") && is_ipaddr($gatewayip)) {
432
							$groupmember = array();
433
							$groupmember['int']  = $int;
434
							$groupmember['gwip']  = $gatewayip;
435
							$groupmember['weight']  = isset($gateway['weight']) ? $gateway['weight'] : 1;
436
							$gateway_groups_array[$group['name']][] = $groupmember;
437
						}
438 fd8eeda5 Seth Mos
					}
439
				}
440
				/* we should have the 1st available tier now, exit stage left */
441
				break;
442
			}
443
		}
444
	}
445 fe22a89b Ermal
	return ($gateway_groups_array);
446 fd8eeda5 Seth Mos
}
447
448 2468ae76 Scott Ullrich
/* Update DHCP WAN Interface ip address in gateway group item */
449
function dhclient_update_gateway_groups_defaultroute($interface = "wan") {
450
	global $config, $g;
451
	foreach($config['gateways']['gateway_item'] as & $gw) {	
452
		if($gw['interface'] == $interface) {
453
			$current_gw = get_interface_gateway($interface);
454
			if($gw['gateway'] <> $current_gw) {
455
				$gw['gateway'] = $current_gw;
456
				$changed = true;
457
			}
458
		}
459
	}
460
	if($changed && $current_gw)
461
		write_config("Updating gateway group gateway for $interface - new gateway is $current_gw");
462
}
463 fd8eeda5 Seth Mos
464 6dc3a5c2 Ermal Lu?i
function lookup_gateway_ip_by_name($name) {
465 fe22a89b Ermal
466 66a96e72 Ermal
	$gateways_arr = return_gateways_array();
467 68f291ff Ermal
        foreach ($gateways_arr as $gname => $gw) {
468
                if ($gw['name'] == $name || $gname == $name)
469 6f77aca5 Ermal
                        return $gw['gateway'];
470
        }
471 66a96e72 Ermal
472
	return false;
473 6dc3a5c2 Ermal Lu?i
}
474
475
function lookup_gateway_monitor_ip_by_name($name) {
476 fe22a89b Ermal
477 6dc3a5c2 Ermal Lu?i
        $gateways_arr = return_gateways_array();
478 fe22a89b Ermal
	if (!empty($gateways_arr[$name])) {
479
		$gateway = $gateways_arr[$name];
480 68f291ff Ermal
		if(!is_ipaddr($gateway['monitor']))
481
			return $gateway['gateway'];
482 6dc3a5c2 Ermal Lu?i
483 9fd19334 gnhb
		return $gateway['monitor'];
484 6dc3a5c2 Ermal Lu?i
        }
485 fe22a89b Ermal
486
        return (false);
487 6dc3a5c2 Ermal Lu?i
}
488
489
function lookup_gateway_interface_by_name($name) {
490
491 fe22a89b Ermal
        $gateways_arr = return_gateways_array();
492
	if (!empty($gateways_arr[$name])) {
493
		$interfacegw = $gateway['interface'];
494
		return ($interfacegw);
495 6dc3a5c2 Ermal Lu?i
        }
496 fe22a89b Ermal
497
        return (false);
498 6dc3a5c2 Ermal Lu?i
}
499
500 a2532739 Ermal Lu?i
function get_interface_gateway($interface, &$dynamic = false) {
501 6dc3a5c2 Ermal Lu?i
        global $config, $g;
502
503
        $gw = NULL;
504
505 6727f4ef jim-p
        $gwcfg = $config['interfaces'][$interface];
506 f5d3a5ce Ermal
        if (!empty($gwcfg['gateway']) && is_array($config['gateways']['gateway_item'])) {
507 66a96e72 Ermal
               	foreach($config['gateways']['gateway_item'] as $gateway) {
508
                        if ($gateway['name'] == $gwcfg['gateway']) {
509
                                $gw = $gateway['gateway'];
510
				break;
511
			}
512
                }
513
	}
514 6dc3a5c2 Ermal Lu?i
515
        // for dynamic interfaces we handle them through the $interface_router file.
516 83f9c8ee Ermal Lu?i
        if (!is_ipaddr($gw) && !is_ipaddr($gwcfg['ipaddr'])) {
517 6dc3a5c2 Ermal Lu?i
                $realif = get_real_interface($interface);
518
                if (file_exists("{$g['tmp_path']}/{$realif}_router")) {
519 3d471a14 Ermal
                        $gw = trim(file_get_contents("{$g['tmp_path']}/{$realif}_router"), " \n");
520 d62b164a gnhb
					$dynamic = true;
521 6dc3a5c2 Ermal Lu?i
                }
522 d62b164a gnhb
                if (file_exists("{$g['tmp_path']}/{$realif}_defaultgw"))
523
					$dynamic = "default";
524
			
525
				
526 6dc3a5c2 Ermal Lu?i
        }
527
528
        /* return gateway */
529 fe22a89b Ermal
        return ($gw);
530 6dc3a5c2 Ermal Lu?i
}
531
532 979c816c Ermal
?>