From bc2765ea8668a93fbcb793f27b838cdfa09cb6ad Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Mon, 12 Sep 2016 20:50:52 +0200 Subject: [PATCH 01/10] bring vips down when interface is down, fix carp setup order. --- src/etc/inc/interfaces.inc | 28 +++++++++++++++++++++++++++- src/etc/rc.linkup | 1 + 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index 7b75abd6a..df297cf7c 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1158,6 +1158,18 @@ function interface_reconfigure($interface = 'wan', $reloadall = false) interface_configure($interface, $reloadall); } +function interface_vips_bring_down($intf) +{ + global $config; + if (!empty($config['virtualip']['vip'])) { + foreach ($config['virtualip']['vip'] as $vip) { + if ($vip['interface'] == $intf) { + interface_vip_bring_down($vip); + } + } + } +} + function interface_vip_bring_down($vip) { $vipif = get_real_interface($vip['interface']); @@ -1825,7 +1837,17 @@ function interfaces_carp_setup() mwexec("/sbin/ifconfig pfsync0 -syncdev -syncpeer down", false); } - if (isset($config['virtualip']['vip']) && $config['virtualip']['vip']) { + $has_carp_vips = false; + if (isset($config['virtualip']['vip']) && count($config['virtualip']['vip']) > 0) { + foreach ($config['virtualip']['vip'] as $vip) { + if ($vip['mode'] == 'carp') { + $has_carp_vips = true; + break; + } + } + } + + if ($has_carp_vips) { set_single_sysctl("net.inet.carp.allow", "1"); } else { set_single_sysctl("net.inet.carp.allow", "0"); @@ -1924,6 +1946,10 @@ function interfaces_vips_configure($interface = '') if ($interface <> "" && $vip['interface'] <> $interface) { continue; } + if (!$carp_setuped) { + // interfaces_carp_setup will enable carp when pfsync completes. + set_single_sysctl("net.inet.carp.allow", "0"); + } if ($carp_setuped == false) { $carp_setuped = true; } diff --git a/src/etc/rc.linkup b/src/etc/rc.linkup index 9c7ca07de..354dda46e 100755 --- a/src/etc/rc.linkup +++ b/src/etc/rc.linkup @@ -68,6 +68,7 @@ function handle_argument_group($iface, $argument2) { case "stop": log_error("DEVD Ethernet detached event for {$iface}"); interface_bring_down($iface); + interface_vips_bring_down($iface); break; case "start": log_error("DEVD Ethernet attached event for {$iface}"); From ac8eba7d0f49855fb6538ea551a0fbaf6b5de96c Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Tue, 13 Sep 2016 20:28:30 +0200 Subject: [PATCH 02/10] another test --- src/etc/inc/interfaces.inc | 16 ---------------- src/etc/rc.carpbackup | 6 ------ src/etc/rc.carpmaster | 6 ------ src/etc/rc.linkup | 19 ++++++++++++++++++- 4 files changed, 18 insertions(+), 29 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index df297cf7c..6f0a59874 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1158,18 +1158,6 @@ function interface_reconfigure($interface = 'wan', $reloadall = false) interface_configure($interface, $reloadall); } -function interface_vips_bring_down($intf) -{ - global $config; - if (!empty($config['virtualip']['vip'])) { - foreach ($config['virtualip']['vip'] as $vip) { - if ($vip['interface'] == $intf) { - interface_vip_bring_down($vip); - } - } - } -} - function interface_vip_bring_down($vip) { $vipif = get_real_interface($vip['interface']); @@ -1946,10 +1934,6 @@ function interfaces_vips_configure($interface = '') if ($interface <> "" && $vip['interface'] <> $interface) { continue; } - if (!$carp_setuped) { - // interfaces_carp_setup will enable carp when pfsync completes. - set_single_sysctl("net.inet.carp.allow", "0"); - } if ($carp_setuped == false) { $carp_setuped = true; } diff --git a/src/etc/rc.carpbackup b/src/etc/rc.carpbackup index c77ef4340..5d202ffb9 100755 --- a/src/etc/rc.carpbackup +++ b/src/etc/rc.carpbackup @@ -58,9 +58,3 @@ if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-client' } } -$pluginparams = array(); -$pluginparams['type'] = 'carp'; -$pluginparams['event'] = 'rc.carpbackup'; -$pluginparams['interface'] = $argv[1]; - -?> diff --git a/src/etc/rc.carpmaster b/src/etc/rc.carpmaster index 4988ac0f4..b7d131c1a 100755 --- a/src/etc/rc.carpmaster +++ b/src/etc/rc.carpmaster @@ -66,9 +66,3 @@ if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-server' } } -$pluginparams = array(); -$pluginparams['type'] = 'carp'; -$pluginparams['event'] = 'rc.carpmaster'; -$pluginparams['interface'] = $argv[1]; - -?> diff --git a/src/etc/rc.linkup b/src/etc/rc.linkup index 354dda46e..bdc5e4c2e 100755 --- a/src/etc/rc.linkup +++ b/src/etc/rc.linkup @@ -38,6 +38,23 @@ require_once("system.inc"); require_once("unbound.inc"); require_once("services.inc"); +/** + * signal CARP to go down when there's a ip configured on the provided interface + * interfaces_carp_setup will enable carp when pfsync completes. + */ +function interface_signal_carp($intf) +{ + global $config; + if (!empty($config['virtualip']['vip'])) { + foreach ($config['virtualip']['vip'] as $vip) { + if ($vip['interface'] == $intf && $vip['mode'] == 'carp') { + set_single_sysctl("net.inet.carp.allow", "0"); + } + } + } +} + + function handle_argument_group($iface, $argument2) { global $config; @@ -68,7 +85,7 @@ function handle_argument_group($iface, $argument2) { case "stop": log_error("DEVD Ethernet detached event for {$iface}"); interface_bring_down($iface); - interface_vips_bring_down($iface); + interface_signal_carp($iface); break; case "start": log_error("DEVD Ethernet attached event for {$iface}"); From 87011debbfe66c33897fb11605b72790b5463902 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Wed, 14 Sep 2016 21:21:09 +0200 Subject: [PATCH 03/10] (vips) remove odd logic --- src/etc/inc/interfaces.inc | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index 6f0a59874..67388b7cb 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1916,29 +1916,21 @@ function interfaces_vips_configure($interface = '') $carp_setuped = false; $anyproxyarp = false; foreach ($config['virtualip']['vip'] as $vip) { - switch ($vip['mode']) { - case "proxyarp": - /* nothing it is handled on interface_proxyarp_configure() */ - if ($interface <> "" && $vip['interface'] <> $interface) { - continue; - } - $anyproxyarp = true; - break; - case "ipalias": - if ($interface <> "" && $vip['interface'] <> $interface) { - continue; - } - interface_ipalias_configure($vip); - break; - case "carp": - if ($interface <> "" && $vip['interface'] <> $interface) { - continue; - } - if ($carp_setuped == false) { - $carp_setuped = true; - } - interface_carp_configure($vip); - break; + if ($interface == "" || $vip['interface'] == $interface) { + switch ($vip['mode']) { + case "proxyarp": + $anyproxyarp = true; + break; + case "ipalias": + interface_ipalias_configure($vip); + break; + case "carp": + if ($carp_setuped == false) { + $carp_setuped = true; + } + interface_carp_configure($vip); + break; + } } } if ($carp_setuped == true) { From 5c6a2ef883af08db6db397f2db0ae56b8f195cde Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Wed, 14 Sep 2016 21:23:50 +0200 Subject: [PATCH 04/10] remove duplicate code in interfaces.inc --- src/etc/inc/interfaces.inc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index 67388b7cb..bc21cb90c 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1950,10 +1950,6 @@ function interface_ipalias_configure(&$vip) return; } - if ($vip['interface'] != 'lo0' && !isset($config['interfaces'][$vip['interface']])) { - return; - } - if ($vip['interface'] != 'lo0' && !isset($config['interfaces'][$vip['interface']]['enable'])) { return; } From c782d9e813e2f2b88fbb3b5b886bd64287b3766c Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Wed, 14 Sep 2016 21:30:47 +0200 Subject: [PATCH 05/10] remove unused link_ip_to_carp_interface in interfaces.inc --- src/etc/inc/interfaces.inc | 39 -------------------------------------- 1 file changed, 39 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index bc21cb90c..906e55533 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -4260,45 +4260,6 @@ function guess_interface_from_ip($ipaddress) } - -/****f* interfaces/link_ip_to_carp_interface - * NAME - * link_ip_to_carp_interface - Find where a CARP interface links to. - * INPUTS - * $ip - * RESULT - * $carp_ints - ******/ -function link_ip_to_carp_interface($ip) -{ - global $config; - - if (!is_ipaddr($ip)) { - return; - } - - $carp_ints = ''; - if (isset($config['virtualip']['vip'])) { - $first = 0; - $carp_int = array(); - foreach ($config['virtualip']['vip'] as $vip) { - if ($vip['mode'] == "carp") { - $carp_ip = $vip['subnet']; - $carp_sn = $vip['subnet_bits']; - $carp_nw = gen_subnet($carp_ip, $carp_sn); - if (ip_in_subnet($ip, "{$carp_nw}/{$carp_sn}")) { - $carp_int[] = get_real_interface($vip['interface']); - } - } - } - if (!empty($carp_int)) { - $carp_ints = implode(" ", array_unique($carp_int)); - } - } - - return $carp_ints; -} - function link_interface_to_track6($int, $action = '') { global $config; From 5497ae4e7809656ac7a06a257ae1bd788bdf8211 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Thu, 15 Sep 2016 10:27:38 +0200 Subject: [PATCH 06/10] revert carp to BSD standards --- src/etc/inc/interfaces.inc | 64 ++++---------------------------------- src/etc/inc/system.inc | 4 +-- src/etc/rc.linkup | 18 ----------- 3 files changed, 7 insertions(+), 79 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index 906e55533..ba959530c 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1770,77 +1770,25 @@ function interfaces_carp_setup() echo gettext("Configuring CARP settings..."); mute_kernel_msgs(); } + set_single_sysctl("net.inet.carp.preempt" => "1"); - /* suck in configuration items */ - if (isset($config['hasync'])) { - if (isset($config['hasync']['pfsyncenabled'])) { - $pfsyncenabled = $config['hasync']['pfsyncenabled']; - } - if (isset($config['hasync']['pfsyncinterface'])) { - $pfsyncinterface = $config['hasync']['pfsyncinterface']; - } - if (isset($config['hasync']['pfsyncpeerip'])) { - $pfsyncpeerip = $config['hasync']['pfsyncpeerip']; - } - } else { - unset($pfsyncinterface); - unset($pfsyncenabled); - } - - set_sysctl(array( - "net.inet.carp.preempt" => "1", - "net.inet.carp.log" => "1" - )); - - if (!empty($pfsyncinterface)) { - $carp_sync_int = get_real_interface($pfsyncinterface); - } else { - unset($carp_sync_int); + if (!empty($config['hasync']['pfsyncinterface'])) { + $carp_sync_int = get_real_interface($config['hasync']['pfsyncinterface']); } /* setup pfsync interface */ - if (!empty($carp_sync_int) && isset($pfsyncenabled)) { - if (is_ipaddr($pfsyncpeerip)) { - $syncpeer = "syncpeer {$pfsyncpeerip}"; + if (!empty($carp_sync_int) && isset($config['hasync']['pfsyncenabled'])) { + if (isset($config['hasync']['pfsyncpeerip']) && is_ipaddr($config['hasync']['pfsyncpeerip'])) { + $syncpeer = "syncpeer " . $config['hasync']['pfsyncpeerip']; } else { $syncpeer = "-syncpeer"; } mwexec("/sbin/ifconfig pfsync0 syncdev {$carp_sync_int} {$syncpeer} up", false); - - sleep(1); - - /* XXX: Handle an issue with pfsync(4) and carp(4). In a cluster carp will come up before pfsync(4) has updated and so will cause issues - * for existing sessions. - */ - log_error("waiting for pfsync..."); - $i = 0; - while (intval(trim(`/sbin/ifconfig pfsync0 | /usr/bin/grep 'syncok: 0' | /usr/bin/grep -v grep | /usr/bin/wc -l`)) == 0 && $i < 30) { - $i++; - sleep(1); - } - log_error("pfsync done in $i seconds."); - log_error("Configuring CARP settings finalize..."); } else { mwexec("/sbin/ifconfig pfsync0 -syncdev -syncpeer down", false); } - $has_carp_vips = false; - if (isset($config['virtualip']['vip']) && count($config['virtualip']['vip']) > 0) { - foreach ($config['virtualip']['vip'] as $vip) { - if ($vip['mode'] == 'carp') { - $has_carp_vips = true; - break; - } - } - } - - if ($has_carp_vips) { - set_single_sysctl("net.inet.carp.allow", "1"); - } else { - set_single_sysctl("net.inet.carp.allow", "0"); - } - if (file_exists("/var/run/booting")) { unmute_kernel_msgs(); echo gettext("done.") . "\n"; diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc index 06bccd4ba..814e64874 100644 --- a/src/etc/inc/system.inc +++ b/src/etc/inc/system.inc @@ -118,9 +118,7 @@ function activate_sysctls() "net.enc.in.ipsec_bpf_mask" => "0x0002", "net.enc.in.ipsec_filter_mask" => "0x0002", "net.enc.out.ipsec_bpf_mask" => "0x0001", - "net.enc.out.ipsec_filter_mask" => "0x0001", - 'net.inet.carp.senderr_demotion_factor' => '0', - 'net.pfsync.carp_demotion_factor' => '0', + "net.enc.out.ipsec_filter_mask" => "0x0001" ); if (isset($config['sysctl']['item'])) { diff --git a/src/etc/rc.linkup b/src/etc/rc.linkup index bdc5e4c2e..9c7ca07de 100755 --- a/src/etc/rc.linkup +++ b/src/etc/rc.linkup @@ -38,23 +38,6 @@ require_once("system.inc"); require_once("unbound.inc"); require_once("services.inc"); -/** - * signal CARP to go down when there's a ip configured on the provided interface - * interfaces_carp_setup will enable carp when pfsync completes. - */ -function interface_signal_carp($intf) -{ - global $config; - if (!empty($config['virtualip']['vip'])) { - foreach ($config['virtualip']['vip'] as $vip) { - if ($vip['interface'] == $intf && $vip['mode'] == 'carp') { - set_single_sysctl("net.inet.carp.allow", "0"); - } - } - } -} - - function handle_argument_group($iface, $argument2) { global $config; @@ -85,7 +68,6 @@ function handle_argument_group($iface, $argument2) { case "stop": log_error("DEVD Ethernet detached event for {$iface}"); interface_bring_down($iface); - interface_signal_carp($iface); break; case "start": log_error("DEVD Ethernet attached event for {$iface}"); From 51aec445ec3b0240c20bc69b8badeeb21cbbbe2c Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Thu, 15 Sep 2016 10:33:13 +0200 Subject: [PATCH 07/10] fix typo --- src/etc/inc/interfaces.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index ba959530c..e9d1b2fcf 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1770,7 +1770,7 @@ function interfaces_carp_setup() echo gettext("Configuring CARP settings..."); mute_kernel_msgs(); } - set_single_sysctl("net.inet.carp.preempt" => "1"); + set_single_sysctl("net.inet.carp.preempt", "1"); if (!empty($config['hasync']['pfsyncinterface'])) { $carp_sync_int = get_real_interface($config['hasync']['pfsyncinterface']); From 75e7e0e44d24855c8826c355dd39cbd94fcdcd12 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Thu, 15 Sep 2016 11:15:38 +0200 Subject: [PATCH 08/10] cleanup carp_status.php --- src/etc/inc/interfaces.inc | 5 +++ src/www/carp_status.php | 72 ++++++++++++++++---------------------- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index e9d1b2fcf..e215f3612 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1918,6 +1918,11 @@ function interface_carp_configure(&$vip) return; } + // when CARP is temporary disabled, don't try to configure on any interface-up events + if (get_single_sysctl('net.inet.carp.allow') == '0') { + return; + } + /* NOTE: Maybe its useless nowdays */ $realif = get_real_interface($vip['interface']); if (!does_interface_exist($realif)) { diff --git a/src/www/carp_status.php b/src/www/carp_status.php index 0fffea09d..7b8f09ffd 100644 --- a/src/www/carp_status.php +++ b/src/www/carp_status.php @@ -30,28 +30,6 @@ require_once("guiconfig.inc"); require_once("interfaces.inc"); -function interfaces_carp_set_maintenancemode($carp_maintenancemode) -{ - global $config; - - if (isset($config["virtualip_carp_maintenancemode"]) && $carp_maintenancemode == false) { - unset($config["virtualip_carp_maintenancemode"]); - write_config("Leave CARP maintenance mode"); - } elseif (!isset($config["virtualip_carp_maintenancemode"]) && $carp_maintenancemode == true) { - $config["virtualip_carp_maintenancemode"] = true; - write_config("Enter CARP maintenance mode"); - } - - if (isset($config['virtualip']['vip'])) { - $viparr = &$config['virtualip']['vip']; - foreach ($viparr as $vip) { - if ($vip['mode'] == 'carp') { - interface_carp_configure($vip); - } - } - } -} - // init $config['virtualip']['vip'] if ( !isset($config['virtualip']['vip']) || !is_array($config['virtualip']['vip'])) { $config['virtualip']['vip'] = array(); @@ -59,35 +37,45 @@ if ( !isset($config['virtualip']['vip']) || !is_array($config['virtualip']['vip' $a_vip = &$config['virtualip']['vip']; if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $act = null; if (!empty($_POST['carp_maintenancemode'])) { - interfaces_carp_set_maintenancemode(!isset($config["virtualip_carp_maintenancemode"])); + $act = "maintenance"; + if (isset($config["virtualip_carp_maintenancemode"])) { + unset($config["virtualip_carp_maintenancemode"]); + write_config("Leave CARP maintenance mode"); + } else { + $config["virtualip_carp_maintenancemode"] = true; + write_config("Enter CARP maintenance mode"); + } } elseif (!empty($_POST['disablecarp'])) { if (get_single_sysctl('net.inet.carp.allow') > 0) { - $carp_counter = 0; + $act = "disable"; + $savemsg = gettext("All virtual IPs have been disabled. Please note that disabling does not survive a reboot."); set_single_sysctl('net.inet.carp.allow', '0'); - foreach ($a_vip as $vip) { - switch ($vip['mode']) { - case "carp": - interface_vip_bring_down($vip); - $carp_counter++; - sleep(1); - break; - } - } - $savemsg = sprintf(gettext("%s IPs have been disabled. Please note that disabling does not survive a reboot."), $carp_counter); } else { + $act = "enable"; $savemsg = gettext("CARP has been enabled."); - foreach ($a_vip as $vip) { - switch ($vip['mode']) { - case "carp": - interface_carp_configure($vip); - sleep(1); - break; - } - } interfaces_carp_setup(); set_single_sysctl('net.inet.carp.allow', '1'); } + foreach ($a_vip as $vip) { + if ($vip['mode'] == 'carp') { + switch ($act) { + case 'maintenance': + interface_carp_configure($vip); + break; + case 'disable': + interface_vip_bring_down($vip); + break; + case 'enable': + interface_carp_configure($vip); + break; + default: + break; + } + } + } + } } From 2c25e3e31c15a13c6a6310e422795b68e99fbda8 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Thu, 15 Sep 2016 11:18:44 +0200 Subject: [PATCH 09/10] oops, wrong block... --- src/www/carp_status.php | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/www/carp_status.php b/src/www/carp_status.php index 7b8f09ffd..bba9966fc 100644 --- a/src/www/carp_status.php +++ b/src/www/carp_status.php @@ -58,24 +58,23 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { interfaces_carp_setup(); set_single_sysctl('net.inet.carp.allow', '1'); } - foreach ($a_vip as $vip) { - if ($vip['mode'] == 'carp') { - switch ($act) { - case 'maintenance': - interface_carp_configure($vip); - break; - case 'disable': - interface_vip_bring_down($vip); - break; - case 'enable': - interface_carp_configure($vip); - break; - default: - break; - } + } + foreach ($a_vip as $vip) { + if ($vip['mode'] == 'carp') { + switch ($act) { + case 'maintenance': + interface_carp_configure($vip); + break; + case 'disable': + interface_vip_bring_down($vip); + break; + case 'enable': + interface_carp_configure($vip); + break; + default: + break; } } - } } From dcd0e06867d226ae0db513a0e2d0ec97ef1f2c51 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Thu, 15 Sep 2016 11:29:49 +0200 Subject: [PATCH 10/10] small style changes --- src/opnsense/mvc/app/models/OPNsense/Base/Menu/Menu.xml | 4 +++- src/www/carp_status.php | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/opnsense/mvc/app/models/OPNsense/Base/Menu/Menu.xml b/src/opnsense/mvc/app/models/OPNsense/Base/Menu/Menu.xml index a0b72ea5c..a76963404 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Base/Menu/Menu.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Base/Menu/Menu.xml @@ -164,7 +164,9 @@ - + + + diff --git a/src/www/carp_status.php b/src/www/carp_status.php index bba9966fc..530884632 100644 --- a/src/www/carp_status.php +++ b/src/www/carp_status.php @@ -36,8 +36,8 @@ if ( !isset($config['virtualip']['vip']) || !is_array($config['virtualip']['vip' } $a_vip = &$config['virtualip']['vip']; +$act = null; if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $act = null; if (!empty($_POST['carp_maintenancemode'])) { $act = "maintenance"; if (isset($config["virtualip_carp_maintenancemode"])) { @@ -76,6 +76,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } } } + header(url_safe('Location: carp_status.php?savemsg=%s', array($savemsg))); + exit; +} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') { + if (!empty($_GET['savemsg'])) { + $savemsg = htmlspecialchars($_GET['savemsg']); + } } $carpcount = 0;