If the admin makes a configuration mistake and configures NATGW to use the
[sahlberg/ctdb.git] / config / events.d / 11.natgw
index b994308d488221b57cae2e08706966d84603444b..e6e54f48dc2b1b3c988ff5ce28ca414297a44543 100644 (file)
@@ -6,18 +6,16 @@
 #
 
 . $CTDB_BASE/functions
-loadconfig ctdb
+loadconfig
 
 [ -z "$CTDB_NATGW_PUBLIC_IFACE" ] && exit 0
 
-cmd="$1"
-shift
-PATH=/usr/bin:/bin:/usr/sbin:/sbin:$PATH
-
-
 delete_all() {
-       remove_ip $CTDB_NATGW_PUBLIC_IP $CTDB_NATGW_PUBLIC_IFACE
-       remove_ip $CTDB_NATGW_PUBLIC_IP_HOST lo
+       local _ip=`echo $CTDB_NATGW_PUBLIC_IP | cut -d '/' -f1`
+       local _maskbits=`echo $CTDB_NATGW_PUBLIC_IP | cut -d '/' -f2`
+
+       delete_ip_from_iface $CTDB_NATGW_PUBLIC_IFACE $_ip $_maskbits
+       delete_ip_from_iface lo $_ip 32
 
        ip route del 0.0.0.0/0 metric 10 >/dev/null 2>/dev/null
 
@@ -27,28 +25,39 @@ delete_all() {
 
 }
 
-case $cmd in 
-     startup)
+case "$1" in 
+    startup)
+       [ -z "$CTDB_PUBLIC_ADDRESSES" ] && {
+               CTDB_PUBLIC_ADDRESSES=/etc/ctdb/public_addresses
+       }
+       egrep "^$CTDB_NATGW_PUBLIC_IP[ \t]" $CTDB_PUBLIC_ADDRESSES >/dev/null
+       [ "$?" = "0" ] && {
+               echo ERROR: NATGW configured to use a public address. NATGW must not use a public address.
+               exit 1
+       }
+
        # do not respond to ARPs that are for ip addresses with scope 'host'
        echo 3 > /proc/sys/net/ipv4/conf/all/arp_ignore
        # do not send out arp requests from loopback addresses
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
+       # update capabilities to show we are using natgw
+       ctdb setnatgwstate on
        ;;
 
-     recovered)
+    recovered|updatenatgw)
        MYPNN=`ctdb pnn | cut -d: -f2`
        NATGWMASTER=`ctdb natgwlist | head -1 | sed -e "s/ .*//"`
        NATGWIP=`ctdb natgwlist | head -1 | sed -e "s/^[^ ]* *//"`
 
        CTDB_NATGW_PUBLIC_IP_HOST=`echo $CTDB_NATGW_PUBLIC_IP | sed -e "s/\/.*/\/32/"`
-       if [ "$NATGWMASTER" == "-1" ]; then
+       if [ "$NATGWMASTER" = "-1" ]; then
                echo "There is not NATGW master node"
                exit 1
        fi
 
        delete_all
 
-       if [ "$MYPNN" == "$NATGWMASTER" ]; then
+       if [ "$MYPNN" = "$NATGWMASTER" ]; then
                # This is the first node, set it up as the NAT GW
                echo 1 >/proc/sys/net/ipv4/ip_forward
                iptables -A POSTROUTING -t nat -s $CTDB_NATGW_PRIVATE_NETWORK -d ! $CTDB_NATGW_PRIVATE_NETWORK -j MASQUERADE
@@ -69,10 +78,13 @@ case $cmd in
        echo 1 > /proc/sys/net/ipv4/route/flush
        ;;
 
-     shutdown)
+    shutdown|stopped|removenatgw)
        delete_all
        ;;
 
+    *)
+       ctdb_standard_event_handler "@"
+       ;;
 esac
 
 exit 0