summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/inc/interfaces.inc35
-rwxr-xr-xusr/local/www/xmlrpc.php18
2 files changed, 49 insertions, 4 deletions
diff --git a/etc/inc/interfaces.inc b/etc/inc/interfaces.inc
index 22a88a8..ee171af 100644
--- a/etc/inc/interfaces.inc
+++ b/etc/inc/interfaces.inc
@@ -84,6 +84,41 @@ function does_interface_exist($interface) {
return false;
}
+/*
+ * does_vip_exist($vip): return true or false if a vip is
+ * configured.
+ */
+function does_vip_exist($vip) {
+ global $config;
+
+ if(!$vip)
+ return false;
+
+ $realif = get_real_interface($vip['interface']);
+ $ints = get_interface_arr(true);
+ if (in_array($realif, $ints))
+ return true;
+ else
+ return false;
+
+ switch ($vip['type']) {
+ case "carp":
+ case "carpdev":
+ case "ipalias":
+ $ifacedata = pfSense_getall_interface_addresses($realif);
+ foreach ($ifacedata as $vipips) {
+ if ($vipips == "{$vip['subnet']}/{$vip['subnet_bits']}")
+ return true;
+ }
+ break;
+ case "proxyarp":
+ /* XXX: Implement this */
+ break;
+ }
+
+ return false;
+}
+
function interface_netgraph_needed($interface = "wan") {
global $config;
diff --git a/usr/local/www/xmlrpc.php b/usr/local/www/xmlrpc.php
index f3211df..2fbf5e3 100755
--- a/usr/local/www/xmlrpc.php
+++ b/usr/local/www/xmlrpc.php
@@ -166,7 +166,9 @@ function restore_config_section_xmlrpc($raw_params) {
foreach ($config['virtualip']['vip'] as $vipindex => $vip) {
if ($vip['mode'] == "carp")
$oldvips[$vip['vhid']] = "{$vip['password']}{$vip['advskew']}{$vip['subnet']}{$vip['subnet_bits']}{$vip['advbase']}";
- else if ((($vip['mode'] == 'ipalias') || ($vip['mode'] == 'proxyarp')) && substr($vip['interface'], 0, 3) != "vip")
+ else if ($vip['mode'] == "ipalias" && substr($vip['interface'], 0, 3) == "vip")
+ $oldvips[$vip['subnet']] = "{$vip['interface']}{$vip['subnet']}{$vip['subnet_bits']}";
+ else if (($vip['mode'] == "ipalias" || $vip['mode'] == 'proxyarp') && substr($vip['interface'], 0, 3) != "vip")
$vipbackup[] = $vip;
}
}
@@ -197,14 +199,22 @@ function restore_config_section_xmlrpc($raw_params) {
$carp_setuped = false;
$anyproxyarp = false;
foreach ($config['virtualip']['vip'] as $vip) {
- if (isset($oldvips[$vip['vhid']])) {
+ if ($vip['mode'] == "carp" && isset($oldvips[$vip['vhid']])) {
if ($oldvips[$vip['vhid']] == "{$vip['password']}{$vip['advskew']}{$vip['subnet']}{$vip['subnet_bits']}{$vip['advbase']}") {
- if (does_interface_exist("vip{$vip['vhid']}")) {
+ if (does_vip_exist($vip)) {
unset($oldvips[$vip['vhid']]);
continue; // Skip reconfiguring this vips since nothing has changed.
}
}
unset($oldvips[$vip['vhid']]);
+ } else if ($vip['mode'] == "ipalias" && substr($vip['interface'], 0, 3) == "vip" && isset($oldvips[$vip['subnet']])) {
+ if ($oldvips[$vip['subnet']] = "{$vip['interface']}{$vip['subnet']}{$vip['subnet_bits']}") {
+ if (does_vip_exist($vip)) {
+ unset($oldvips[$vip['subnet']]);
+ continue; // Skip reconfiguring this vips since nothing has changed.
+ }
+ }
+ unset($oldvips[$vip['subnet']]);
}
switch ($vip['mode']) {
@@ -226,7 +236,7 @@ function restore_config_section_xmlrpc($raw_params) {
}
/* Cleanup remaining old carps */
foreach ($oldvips as $oldvipif => $oldvippar) {
- if (does_interface_exist("vip{$oldvipif}"))
+ if (!is_ipaddr($oldvipif) && does_interface_exist("vip{$oldvipif}"))
pfSense_interface_destroy("vip{$oldvipif}");
}
if ($carp_setuped == true)
OpenPOWER on IntegriCloud