aboutsummaryrefslogtreecommitdiffstats
path: root/config/quagga_ospfd
diff options
context:
space:
mode:
authorjim-p <jimp@pfsense.org>2013-04-22 15:38:51 -0400
committerjim-p <jimp@pfsense.org>2013-04-22 15:38:51 -0400
commitce882b749e28f4322046e84556d5eed196d6220b (patch)
tree3b096b605e45b04ca4fd65e538e0f37ce9d3dc8e /config/quagga_ospfd
parenteb6234821280e91a77733232bf503562149efe1b (diff)
downloadpfsense-packages-ce882b749e28f4322046e84556d5eed196d6220b.tar.gz
pfsense-packages-ce882b749e28f4322046e84556d5eed196d6220b.tar.bz2
pfsense-packages-ce882b749e28f4322046e84556d5eed196d6220b.zip
Add a way for quagga to determine if it should run based on the CARP status of a specified VIP.
Diffstat (limited to 'config/quagga_ospfd')
-rw-r--r--config/quagga_ospfd/quagga_ospfd.inc33
-rw-r--r--config/quagga_ospfd/quagga_ospfd.xml9
2 files changed, 40 insertions, 2 deletions
diff --git a/config/quagga_ospfd/quagga_ospfd.inc b/config/quagga_ospfd/quagga_ospfd.inc
index 598d3c00..46037bd9 100644
--- a/config/quagga_ospfd/quagga_ospfd.inc
+++ b/config/quagga_ospfd/quagga_ospfd.inc
@@ -290,7 +290,24 @@ EOF;
exec("chmod u+rw,go-rw {$quagga_config_base}/zebra.conf");
// Kick off newly created rc.d script
- exec("/usr/local/etc/rc.d/quagga.sh restart");
+ if (is_ipaddr($ospfd_conf['carpstatusip'])) {
+ $status = quagga_get_carp_status_by_ip($ospfd_conf['carpstatusip']);
+ switch (strtoupper($status)) {
+ // Stop the service if the VIP is in BACKUP or INIT state.
+ case "BACKUP":
+ case "INIT":
+ exec("/usr/local/etc/rc.d/quagga.sh stop");
+ break;
+ // Start the service if the VIP is MASTER state.
+ case "MASTER":
+ // Assume it's up if the status can't be determined.
+ default:
+ exec("/usr/local/etc/rc.d/quagga.sh restart");
+ break;
+ }
+ } else {
+ exec("/usr/local/etc/rc.d/quagga.sh restart");
+ }
// Back to RO mount for NanoBSD and friends
conf_mount_ro();
@@ -345,4 +362,18 @@ function quagga_ospfd_put_raw_config($conffile) {
}
}
+function quagga_get_carp_status_by_ip($ipaddr) {
+ $iface = find_carp_interface($ipaddr);
+ if ($iface) {
+ $status = get_carp_interface_status($iface);
+ // If there is no status for that interface, return null.
+ if (!$status)
+ $status = null;
+ } else {
+ // If there is no VIP by that IP, return null.
+ $status = null;
+ }
+ return $status;
+}
+
?>
diff --git a/config/quagga_ospfd/quagga_ospfd.xml b/config/quagga_ospfd/quagga_ospfd.xml
index 3348dff3..c48d0f47 100644
--- a/config/quagga_ospfd/quagga_ospfd.xml
+++ b/config/quagga_ospfd/quagga_ospfd.xml
@@ -1,6 +1,6 @@
<packagegui>
<name>quagga_ospfd</name>
- <version>0.5.2</version>
+ <version>0.5.3</version>
<title>Services: Quagga OSPFd</title>
<include_file>/usr/local/pkg/quagga_ospfd.inc</include_file>
<aftersaveredirect>pkg_edit.php?xml=quagga_ospfd.xml&amp;id=0</aftersaveredirect>
@@ -176,6 +176,13 @@
</rowhelperfield>
</rowhelper>
</field>
+ <field>
+ <fielddescr>CARP Status IP</fielddescr>
+ <fieldname>carpstatusip</fieldname>
+ <description>IP address used to determine the CARP status. When the VIP is in BACKUP status, quagga will not be started. &lt;br/&gt;NOTE: Requires changes to /etc/rc.carpmaster to start quagga and /etc/rc.carpbackup to stop quagga or it will not be fully effective.</description>
+ <type>input</type>
+ <size>25</size>
+ </field>
</fields>
<custom_php_resync_config_command>
quagga_ospfd_install_conf();