fix: use file lock
This commit is contained in:
@@ -40,17 +40,36 @@ if ($vhid !== $primary_vhid) {
|
|||||||
$ifkey = 'wan';
|
$ifkey = 'wan';
|
||||||
// Determine whether WAN interface is currently enabled
|
// Determine whether WAN interface is currently enabled
|
||||||
$ifkey_enabled = !empty($config['interfaces'][$ifkey]['enable']) ? true : false;
|
$ifkey_enabled = !empty($config['interfaces'][$ifkey]['enable']) ? true : false;
|
||||||
|
// Lock file to prevent interface flapping
|
||||||
|
$lock_file = '/tmp/carp_wan_disable_lock';
|
||||||
|
$lock_default_age = 5;
|
||||||
|
$lock_max_age = 10;
|
||||||
|
|
||||||
// MASTER event
|
// MASTER event
|
||||||
if ($type === "MASTER") {
|
if ($type === "MASTER") {
|
||||||
// Enable WAN only if it's currently disabled
|
// Enable WAN only if it's currently disabled
|
||||||
if (!$ifkey_enabled) {
|
if (!$ifkey_enabled) {
|
||||||
|
// Check if lock file is present
|
||||||
|
if (file_exists($lock_file)) {
|
||||||
|
$lock_age = time() - (int)file_get_contents($lock_file);
|
||||||
|
if ($lock_age < $lock_max_age) {
|
||||||
|
log_msg("CARP event: WAN disable lock present ({$lock_age}s old), waiting...");
|
||||||
|
$elapsed = 0;
|
||||||
|
while (file_exists($lock_file) && $elapsed < 5000) {
|
||||||
|
usleep(500000);
|
||||||
|
$elapsed += 500;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log_msg("CARP event: removing stale WAN disable lock.");
|
||||||
|
@unlink($lock_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
log_msg("CARP event: switching to '$type', enabling interface '$ifkey'.", LOG_WARNING);
|
log_msg("CARP event: switching to '$type', enabling interface '$ifkey'.", LOG_WARNING);
|
||||||
$config['interfaces'][$ifkey]['enable'] = '1';
|
$config['interfaces'][$ifkey]['enable'] = '1';
|
||||||
write_config("enable interface '$ifkey' due CARP event '$type'", false);
|
write_config("enable interface '$ifkey' due CARP event '$type'", false);
|
||||||
interface_configure(false, $ifkey, false, false);
|
interface_configure(false, $ifkey, false, false);
|
||||||
} else {
|
} else {
|
||||||
log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do.");
|
log_msg("CARP event: already 'MASTER' for interface '$ifkey', nothing to do.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// BACKUP event
|
// BACKUP event
|
||||||
@@ -61,6 +80,10 @@ if ($type === "MASTER") {
|
|||||||
unset($config['interfaces'][$ifkey]['enable']);
|
unset($config['interfaces'][$ifkey]['enable']);
|
||||||
write_config("disable interface '$ifkey' due CARP event '$type'", false);
|
write_config("disable interface '$ifkey' due CARP event '$type'", false);
|
||||||
interface_configure(false, $ifkey, false, false);
|
interface_configure(false, $ifkey, false, false);
|
||||||
|
// Create lock file
|
||||||
|
file_put_contents($lock_file, time());
|
||||||
|
sleep($lock_default_age);
|
||||||
|
@unlink($lock_file);
|
||||||
} else {
|
} else {
|
||||||
log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do.");
|
log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do.");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user