summaryrefslogtreecommitdiff
path: root/community/ucarp
diff options
context:
space:
mode:
Diffstat (limited to 'community/ucarp')
-rw-r--r--community/ucarp/01-fix-getopt.patch11
-rw-r--r--community/ucarp/02-fix-downscript-on-error.c12
-rw-r--r--community/ucarp/PKGBUILD56
-rw-r--r--community/ucarp/ucarp.8147
-rw-r--r--community/ucarp/ucarp.service8
5 files changed, 234 insertions, 0 deletions
diff --git a/community/ucarp/01-fix-getopt.patch b/community/ucarp/01-fix-getopt.patch
new file mode 100644
index 000000000..9a4b21eeb
--- /dev/null
+++ b/community/ucarp/01-fix-getopt.patch
@@ -0,0 +1,11 @@
+--- ucarp-1.5.1.orig/src/ucarp_p.h
++++ ucarp-1.5.1/src/ucarp_p.h
+@@ -1,7 +1,7 @@
+ #ifndef __CARP_P_H__
+ #define __CARP_P_H__ 1
+
+-static const char *GETOPT_OPTIONS = "i:s:v:p:Pa:hb:k:x:nu:d:r:zf:BoSM";
++static const char *GETOPT_OPTIONS = "i:s:v:p:Pa:hb:k:x:nu:d:r:zf:Bo:SM";
+
+ static struct option long_options[] = {
+ { "interface", 1, NULL, 'i' },
diff --git a/community/ucarp/02-fix-downscript-on-error.c b/community/ucarp/02-fix-downscript-on-error.c
new file mode 100644
index 000000000..08af568b4
--- /dev/null
+++ b/community/ucarp/02-fix-downscript-on-error.c
@@ -0,0 +1,12 @@
+--- ucarp-1.5.1.orig/src/carp.c
++++ ucarp-1.5.1/src/carp.c
+@@ -843,6 +843,9 @@
+ if ((pfds[0].revents & (POLLERR | POLLHUP)) != 0) {
+ logfile(LOG_ERR, _("exiting: pfds[0].revents = %d"),
+ pfds[0].revents);
++ if ((sc.sc_state != BACKUP) && (shutdown_at_exit != 0)) {
++ (void) spawn_handler(dev_desc_fd, downscript);
++ }
+ break;
+ }
+ if (gettimeofday(&now, NULL) != 0) {
diff --git a/community/ucarp/PKGBUILD b/community/ucarp/PKGBUILD
new file mode 100644
index 000000000..467613303
--- /dev/null
+++ b/community/ucarp/PKGBUILD
@@ -0,0 +1,56 @@
+# $Id: PKGBUILD 90534 2013-05-13 00:32:20Z seblu $
+# Maintainer: Sébastien Luttringer
+
+pkgname=ucarp
+pkgver=1.5.2
+pkgrel=5
+pkgdesc='Userspace implementation of the CARP protocol'
+arch=('i686' 'x86_64')
+url='http://www.ucarp.org/project/ucarp'
+license=('GPL2')
+depends=('libpcap')
+optdepends=('iproute2')
+source=("http://download.pureftpd.org/pub/$pkgname/$pkgname-$pkgver.tar.gz"
+ "$pkgname.service"
+ "$pkgname.8"
+ '01-fix-getopt.patch'
+ '02-fix-downscript-on-error.c')
+md5sums=('e3caa733316a32c09e5d3817617e9145'
+ 'fdc72a8d6f89224b40c78705df1f46f9'
+ '2ccfdc464b88c437b38bd0324cf1fef3'
+ '3f20699aaf2ef8139dcd337f1e7f06ab'
+ '09d26233c37956cf08e629554a91b8cd')
+
+prepare() {
+ # Apply patches
+ patch -N -p1 -d $pkgname-$pkgver < 01-fix-getopt.patch
+ patch -N -p1 -d $pkgname-$pkgver < 02-fix-downscript-on-error.c
+}
+
+build() {
+ cd $pkgname-$pkgver
+ ./configure --prefix=/usr --sbindir=/usr/bin
+ make
+
+}
+
+package() {
+ pushd $pkgname-$pkgver
+ make DESTDIR="$pkgdir" install
+ # install examples files
+ install -D -m 644 examples/linux/vip-down.sh \
+ "$pkgdir/usr/share/doc/$pkgname/examples/vip-down.sh"
+ install -D -m 644 examples/linux/vip-up.sh \
+ "$pkgdir/usr/share/doc/$pkgname/examples/vip-up.sh"
+ # install README
+ install -D -m 644 README "$pkgdir/usr/share/doc/$pkgname/README"
+ popd
+ # add manpage
+ install -D -m 644 $pkgname.8 "${pkgdir}/usr/share/man/man8/$pkgname.8"
+ # systemd
+ install -D -m 644 $pkgname.service \
+ "${pkgdir}/usr/lib/systemd/system/$pkgname.service"
+
+}
+
+# vim:set ts=2 sw=2 et:
diff --git a/community/ucarp/ucarp.8 b/community/ucarp/ucarp.8
new file mode 100644
index 000000000..7eb19ddc0
--- /dev/null
+++ b/community/ucarp/ucarp.8
@@ -0,0 +1,147 @@
+.TH "UCARP" "8"
+.SH "NAME"
+ucarp \(em Automatic IP failover
+.SH "SYNOPSIS"
+.PP
+\fBucarp\fR [\fB-i, \-\-interface=\fIINTERFACE\fR\fP] [\fB-s, \-\-srcip=\fIIPADDRESS\fR\fP]
+.br
+[\fB-v, \-\-vhid=\fIVHID\fR\fP] [\fB-p, \-\-pass=\fIPASSWORD\fR\fP] [\fB-o, \-\-passfile=\fIPASSFILE\fR\fP]
+.br
+[\fB-P, \-\-preempt\fP] [\fB-n, \-\-neutral\fP] [\fB-a, \-\-addr=\fIIPADDR\fR\fP] [\fB-h, \-\-help\fP]
+.br
+[\fB-b, \-\-advbase=\fISECS\fR\fP] [\fB-k, \-\-advskew=\fISKEW\fR\fP] [\fB-u, \-\-upscript=\fISCRIPT\fR\fP]
+.br
+[\fB-d, \-\-downscript=\fISCRIPT\fR\fP] [\fB-r, \-\-deadratio=\fIRATIO\fR\fP] [\fB-z, \-\-shutdown\fP]
+.br
+[\fB-B, \-\-daemonize\fP] [\fB-f, \-\-facility=\fIFACILITY\fR\fP] [\fB-x, \-\-xparam \fIPARAM\fR\fP]
+.br
+[\fB-S, \-\-ignoreifstate\fP] [\fB-M, \-\-nomcast\fP]
+.SH "DESCRIPTION"
+.PP
+ucarp allows a pair of hosts to share common IP addresses in
+order to provide automatic failover of an address from one machine to
+another. It is a portable userland implementation of the secure and
+patent-free Common Address Redundancy Protocol, (CARP), OpenBSD's
+alternative to VRRP.
+.SH "OPTIONS"
+.PP
+ucarp supports the following command line options:
+.IP "\fB-i \fIINTERFACE\fR\fP\fB \-\-interface=\fIINTERFACE\fR\fP" 10
+The network interface to bind to.
+.IP "\fB-s \fIIPADDRESS\fR\fP\fB \-\-srcip=\fIIPADDRESS\fR\fP" 10
+The persistent source address, (real IP), associated with this
+interface.
+.IP "\fB-v \fIVHID\fR\fP\fB \-\-vhid=\fIVHID\fR\fP" 10
+The id of the virtual server [1-255].
+.IP "\fB-p \fIPASSWORD\fR\fP\fB \-\-pass=\fIPASSWORD\fR\fP" 10
+The shared password, (this gets encrypted and is not sent in the
+clear).
+.IP "\fB-o \fIPASSFILE\fR\fP\fB \-\-passfile=\fIPASSFILE\fR\fP" 10
+File to read the shared password from. The file specified
+should contain the password on the first line of the file.
+.IP "\fB-P \fP\fB\-\-preempt\fP" 10
+Turn on preemptive failover. This causes an instance of
+ucarp to assume master status right immediately.
+.IP "\fB-n \fP\fB\-\-neutral\fP" 10
+Do not run the downscript on startup when the
+initial state is backup.
+.IP "\fB-a \fIIPADDRESS\fR\fP\fB \-\-addr=\fIIPADDRESS\fR\fP" 10
+The IP address of the virtual server.
+.IP "\fB-h \fP\fB\-\-help\fP" 10
+Display a brief summary of the command line options.
+.IP "\fB-b \fISECONDS\fR\fP\fB \-\-advbase=\fISECONDS\fR\fP" 10
+Interval in seconds that advertisements will occur, (defaults
+to 1 second).
+.IP "\fB-k \fISKEW\fR\fP\fB \-\-advskew=\fISKEW\fR\fP" 10
+Advertisement skew [1-255], (defaults to 0).
+.IP "\fB-u \fICOMMAND\fR\fP\fB \-\-upscript=\fICOMMAND\fR\fP" 10
+Specifies the command to run after ucarp has successfully
+become master, the interface name gets passed as an argument.
+Typically a script used to bring up the virtual address, log the
+result, add routes, clear arp cache entries, etc.
+.IP "\fB-d \fICOMMAND\fR\fP\fB \-\-downscript=\fICOMMAND\fR\fP" 10
+Specifies the command that is run after ucarp has
+transitioned to the backup state, the interface name is passed
+as an argument. This is typically a script used to bring down
+the virtual interface, log the action, remove routes, etc.
+.IP "\fB-r \fIRATIO\fR\fP\fB \-\-deadratio=\fIRATIO\fR\fP" 10
+Ratio used by the backup to determine how long to wait for an
+unresponsive master before considering it dead.
+.IP "\fB-z\fP\fB \-\-shutdown\fP" 10
+Use of this command causes the command specified by the \-d
+argument to be invoked when ucarp shuts down.
+.IP "\fB-B\fP\fB \-\-daemonize\fP" 10
+Causes ucarp to detach from the terminal and run in the
+background as a daemon.
+.IP "\fB-f\fP\fB \-\-facility\fP" 10
+Set the syslog facility, defaults to daemon.
+.IP "\fB-x \fIPARAMETER\fR\fP\fB \-\-xparam=\fIPARAMETER\fR\fP" 10
+Specify an extra parameter to be supplied to the up/down
+scripts.
+.IP "\fB-S\fP\fB \-\-ignoreifstate\fP" 10
+Ignore unplugged network cables. This option is useful when
+ucarp nodes are connected with a crossover cable. Without
+this option the master will transition to backup when the other
+node is powered down, as it no longer has a link (NO-CARRIER).
+
+.IP "\fB-M\fP\fB \-\-nomcast\fP" 10
+Use broadcast instead of multicast advertisements.
+.SH "EXAMPLES"
+.PP
+A host with a real IP of 10.1.1.10 configured to be the master
+in a preemptive configuration with a virtual IP of 10.1.1.252.
+.PP
+.nf
+\fB \fPucarp \-i eth0 \-s 10.1.1.10 \-v 10 \-p secret \-a 10.1.1.252 \\
+\fB \fP\-\-upscript=/usr/local/sbin/vip-up.sh \-\-downscript=/usr/local/sbin/vip-down.sh \-P
+.fi
+.PP
+The backup might be configured something like this.
+.PP
+.nf
+\fB \fPucarp \-i eth0 \-s 10.1.1.11 \-v 10 \-p secret \-a 10.1.1.252 \\
+\fB \fP\-\-upscript=/usr/local/sbin/vip-up.sh \-\-downscript=/usr/local/sbin/vip-down.sh
+.fi
+.PP
+A machine with a real IP of 192.168.1.19 is the preferred master for
+a virtual IP of 10.1.12.7, broadcasts are sent every 5 seconds.
+.PP
+.nf
+\fB \fPucarp \-b 5 \-s 192.168.1.19 \-v 27 \-p badpass \-a 10.1.12.7 \\
+\fB \fP-u /usr/local/sbin/vip-up.sh \-d /usr/local/sbin/vip-down.sh \-z
+.fi
+.PP
+The hot standby with an IP of 192.168.1.20 uses the following
+command, (note the advskew of 50 putting it at a disadvantage and making
+the first machine preferred).
+.PP
+.nf
+\fB \fPucarp \-b 5 \-k 50 \-s 192.168.1.20 \-v 27 \-p badpass \-a 10.1.12.7 \\
+\fB \fP-u /usr/local/sbin/vip-up.sh \-d /usr/local/sbin/vip-down.sh \-z
+.fi
+.SH "SIGNALS"
+.PP
+Sending the ucarp process a SIGUSR1 will have it log a status
+line to syslog, eg "Sep 13 12:59:56 localhost ucarp[2654]: [INFO]
+MASTER on eth0 id 1" or "Sep 13 13:00:25 localhost ucarp[2644]: [INFO]
+BACKUP on eth0 id 1"
+.PP
+Sending the ucarp process a SIGUSR2 will cause it to demote itself
+from master to backup, pause 3 seconds, then proceed as usual to listen
+for other masters, and promote itself if necessary. This could be useful
+if you wish another node to take over master.
+
+.SH "AUTHOR"
+.PP
+ucarp was written by Frank Denis, <j@ucarp.org>.
+.PP
+This manual page was written by Eric Evans <eevans@debian.org>
+for \fBDebian\fP and adapted to \fBArchlinux\fP
+by Sébastien Luttringer <seblu@archlinux.org>. Permission is
+granted to copy, distribute and/or modify this document under
+the terms of the GNU General Public License, Version 2 or any
+later version published by the Free Software Foundation.
+
+.PP
+On Archlinux systems, the complete text of the GNU General Public
+License can be found in /usr/share/licenses/common/GPL.
diff --git a/community/ucarp/ucarp.service b/community/ucarp/ucarp.service
new file mode 100644
index 000000000..2ff694d2c
--- /dev/null
+++ b/community/ucarp/ucarp.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=UCARP daemon
+
+[Service]
+ExecStart=/usr/bin/ucarp
+
+[Install]
+WantedBy=multi-user.target