Some minor fixes..
[snf-network] / common.sh
index af80017..78895ae 100755 (executable)
--- a/common.sh
+++ b/common.sh
@@ -1,8 +1,10 @@
 #!/bin/bash
 
+source /etc/default/snf-network
+
 function try {
 
-  $1 &>/dev/null || true 
+  $1 &>/dev/null || true
 
 }
 
@@ -20,6 +22,19 @@ function clear_routed_setup_ipv6 {
 
 }
 
+function delete_neighbor_proxy {
+
+  get_uplink $LINK "-6"
+  get_eui64 $MAC $NETWORK_SUBNET6
+
+  if [ -z "$EUI64" -z -o "$UPLINK" ]; then
+    return
+  fi
+
+  $SNF_NETWORK_LOG $0 "ip -6 neigh del proxy $EUI64 dev $UPLINK"
+  ip -6 neigh del proxy $EUI64 dev $UPLINK
+
+}
 
 function clear_routed_setup_firewall {
 
@@ -68,11 +83,19 @@ function routed_setup_ipv4 {
        # Enable proxy ARP
        echo 1 > /proc/sys/net/ipv4/conf/$INTERFACE/proxy_arp
 
-  # Send GARP from host to upstream router
+}
+
+function send_garp {
+
   get_uplink $TABLE
+  if [ -z "$IP" -o -z "$UPLINK" ]; then
+    return
+  fi
+
+  # Send GARP from host to upstream router
   echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
-  hooks-log $0 "arping  -c3 -I $UPLINK -U $IP"
-  arping  -c3 -I $UPLINK -U $IP
+  $SNF_NETWORK_LOG $0 "arpsend -U -i $IP -c1 $UPLINK"
+  arpsend -U -i $IP -c1 $UPLINK
   echo 0 > /proc/sys/net/ipv4/ip_nonlocal_bind
 
 }
@@ -96,7 +119,7 @@ function routed_setup_ipv6 {
        echo 0 > /proc/sys/net/ipv6/conf/$INTERFACE/proxy_ndp
 
   # Send Unsolicited Neighbor Advertisement
-  hooks-log $0 "ndsend $EUI64 $UPLINK"
+  $SNF_NETWORK_LOG $0 "ndsend $EUI64 $UPLINK"
   ndsend $EUI64 $UPLINK
 
 }
@@ -195,7 +218,8 @@ function get_uplink {
 
   local table=$1
   local version=$2
-  UPLINK=$(ip "$version" route list table "$table" | grep "default via" | awk '{print $5}')
+  UPLINK=$(ip $version route list table $table | grep "default via" | awk '{print $5}')
+  $SNF_NETWORK_LOG $0 "* uplink for table $table is $UPLINK"
 
 }
 
@@ -212,6 +236,142 @@ get_eui64 () {
     EUI64=
   else
     EUI64=$($MAC2EUI64 $mac $prefix)
+    $SNF_NETWORK_LOG $0 "* eui64 for $mac inside $prefix is $EUI64"
+  fi
+
+}
+
+
+# DDNS related functions
+
+# ommit zone statement
+# nsupdate  will attempt determine the correct zone to update based on the rest of the input
+send_command () {
+
+  local command="$1"
+  $SNF_NETWORK_LOG $0 "* $command"
+  nsupdate -k $KEYFILE > /dev/null << EOF
+  server $SERVER
+  $command
+  send
+EOF
+
+}
+
+
+update_arecord () {
+
+  local action=$1
+  local command=
+  if [ -n "$IP" ]; then
+    command="update $action $GANETI_INSTANCE_NAME.$FZONE $TTL A $IP"
+    send_command "$command"
+  fi
+
+}
+
+
+update_aaaarecord () {
+
+  local action=$1
+  local command=
+  if [ -n "$EUI64" ]; then
+    command="update $action $GANETI_INSTANCE_NAME.$FZONE $TTL AAAA $EUI64"
+    send_command "$command"
+  fi
+
+}
+
+
+update_ptrrecord () {
+
+  local action=$1
+  local command=
+  if [ -n "$IP" ]; then
+    command="update $action $RLPART.$RZONE. $TTL PTR $GANETI_INSTANCE_NAME.$FZONE"
+    send_command "$command"
+  fi
+
+}
+
+update_ptr6record () {
+
+  local action=$1
+  local command=
+  if [ -n "$EUI64" ]; then
+    command="update $action $R6LPART$R6ZONE. $TTL PTR $GANETI_INSTANCE_NAME.$FZONE"
+    send_command "$command"
+  fi
+
+}
+
+update_all () {
+
+  local action=$1
+  update_arecord $action
+  update_aaaarecord $action
+  update_ptrrecord $action
+  update_ptr6record $action
+
+}
+
+
+# first argument is an eui64 (IPv6)
+# sets GLOBAL args R6REC, R6ZONE, R6LPART
+# lets assume eui64=2001:648:2ffc:1::1
+# the following commands produce:
+# R6REC=1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.c.f.f.2.8.4.6.0.1.0.0.2.ip6.arpa
+# R6ZONE=1.0.0.0.c.f.f.2.8.4.6.0.1.0.0.2.ip6.arpa
+# R6LPART=1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
+get_rev6_info () {
+
+  local eui64=$1
+  if [ -z "$eui64" ]; then
+    R6REC= ; R6ZONE= ; R6LPART= ;
+  else
+    R6REC=$(host $eui64 | egrep -o '([[:alnum:]]\.){32}ip6.arpa' )
+    R6ZONE=$(echo $R6REC | awk -F. 'BEGIN{rpart="";} { for (i=32;i>16;i=i-1) rpart=$i "." rpart; } END{print rpart "ip6.arpa";}')
+    R6LPART=$(echo $R6REC | awk -F. 'BEGIN{lpart="";} { for (i=16;i>0;i=i-1) lpart=$i "." lpart; } END{print lpart;}')
+  fi
+
+}
+
+
+# first argument is an ipv4
+# sets args RZONE, RLPART
+# lets assume IP=203.0.113.1
+# RZONE="113.0.203.in-add.arpa"
+# RLPART="1"
+get_rev4_info () {
+
+  local ip=$1
+  if [ -z "$ip" ]; then
+    RZONE= ; RLPART= ;
+  else
+    OLDIFS=$IFS
+    IFS=". "
+    set -- $ip
+    a=$1 ; b=$2; c=$3; d=$4;
+    IFS=$OLDIFS
+    RZONE="$c.$b.$a.in-addr.arpa"
+    RLPART="$d"
   fi
 
 }
+
+
+# Query nameserver for entries related to the specific instance
+# An example output is the following:
+# www.google.com has address 173.194.113.114
+# www.google.com has address 173.194.113.115
+# www.google.com has address 173.194.113.116
+# www.google.com has address 173.194.113.112
+# www.google.com has address 173.194.113.113
+# www.google.com has IPv6 address 2a00:1450:4001:80b::1012
+query_dns () {
+
+  HOSTQ="host -s -R 3 -W 3"
+  HOST_IP_ALL=$($HOSTQ $GANETI_INSTANCE_NAME.$FZONE $SERVER | sed -n 's/.*has address //p')
+  HOST_IP6_ALL=$($HOSTQ $GANETI_INSTANCE_NAME.$FZONE $SERVER | sed -n 's/.*has IPv6 address //p')
+
+}