summaryrefslogtreecommitdiffstats
path: root/src/etc/rc.carpmaster
blob: d536948b9838ed3b4c61e8b1990d380968bfa771 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/usr/local/bin/php-cgi -f
<?php
/*
 * rc.carpmaster
 *
 * part of pfSense (https://www.pfsense.org)
 * Copyright (c) 2004-2016 Electric Sheep Fencing, LLC
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

require_once("functions.inc");
require_once("config.inc");
require_once("notices.inc");
require_once("openvpn.inc");
require_once("interfaces.inc");

if (isset($_GET['interface'])) {
	$argument = $_GET['interface'];
} else {
	$argument = str_replace("\n", "", $argv[1]);
}
if (!strstr($argument, "@")) {
	log_error("CARP master event triggered from wrong source {$argument}");
	exit;
}

list($vhid, $iface) = explode("@", $argument);

$friendly = convert_real_interface_to_friendly_interface_name($iface);
$friendly_descr = convert_friendly_interface_to_friendly_descr($friendly);
$vips = link_interface_to_vips($friendly, '', $vhid);
if (!is_array($vips)) {
	log_error("CARP master event triggered from wrong source {$argument} - no associated VIPs");
	exit;
}
foreach ($vips as $vip) {
	$notificationmsg = sprintf('HA cluster member "(%1$s@%2$s): (%3$s)" has resumed CARP state "MASTER" for vhid %4$s',
	    $vip['subnet'], $iface, $friendly_descr, $vhid);

	notify_via_smtp($notificationmsg);
	notify_via_growl($notificationmsg);
	log_error($notificationmsg);
}

/* Start OpenVPN clients running on this VIP, since they should be in the stopped state while the VIP is CARP Backup. */
global $config;
$a_groups = return_gateway_groups_array();
if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-client'])) {
	foreach ($config['openvpn']['openvpn-client'] as $settings) {
		if (substr($settings['interface'], 0, 4) == '_vip') {
			$openvpn_vip = $settings['interface'];
		} else if (is_array($a_groups[$settings['interface']])) {
			// interface is a gateway group, check CARP VIP
			if (substr($a_groups[$settings['interface']][0]['vip'], 0, 4) == '_vip') {
				$openvpn_vip = $a_groups[$settings['interface']][0]['vip'];
			}
		} else {
			// this OpenVPN instance not on a CARP IP
			continue;
		}
		foreach ($vips as $vip) {
			if ($openvpn_vip == "_vip{$vip['uniqid']}") {
				log_error("Starting OpenVPN client instance on {$friendly_descr} because of transition to CARP master.");
				openvpn_restart('client', $settings);
			}
		}
	}
}
if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-server'])) {
	foreach ($config['openvpn']['openvpn-server'] as $settings) {
		if (substr($settings['interface'], 0, 4) == '_vip') {
			$openvpn_vip = $settings['interface'];
		} else if (is_array($a_groups[$settings['interface']])) {
			// interface is a gateway group, check CARP VIP
			if (substr($a_groups[$settings['interface']][0]['vip'], 0, 4) == '_vip') {
				$openvpn_vip = $a_groups[$settings['interface']][0]['vip'];
			}
		} else {
			// this OpenVPN instance not on a CARP IP
			continue;
		}
		foreach ($vips as $vip) {
			if ($openvpn_vip == "_vip{$vip['uniqid']}") {
				log_error("Starting OpenVPN server instance on {$friendly_descr} because of transition to CARP master.");
				openvpn_restart('server', $settings);
			}
		}
	}
}

/* Reconfigure radvd when necessary */
if (isset($config['dhcpdv6']) && is_array($config['dhcpdv6'])) {
	$rafound = false;
	foreach ($config['dhcpdv6'] as $dhcpv6if => $dhcpv6ifconf) {
		foreach ($vips as $vip) {
			if ($dhcpv6ifconf['rainterface'] == "_vip{$vip['uniqid']}") {
				log_error("Starting radvd instance on {$friendly_descr} because of transition to CARP master.");
				$rafound = true;
			}
		}
	}
	if ($rafound) {
		services_radvd_configure();
	}
}

$pluginparams = array();
$pluginparams['type'] = 'carp';
$pluginparams['event'] = 'rc.carpmaster';
$pluginparams['interface'] = $argument;
pkg_call_plugins('plugin_carp', $pluginparams);

?>
OpenPOWER on IntegriCloud