Support bringing up machines with an "other" address accessible for
authorMitchell E Berger <mitchb@mit.edu>
Tue, 15 May 2018 23:49:39 +0000 (19:49 -0400)
committerMitchell E Berger <mitchb@mit.edu>
Tue, 15 May 2018 23:49:39 +0000 (19:49 -0400)
smooth renumbering events.

debian/changelog
invirt-database
vif-invirtroute

index a4ab8b3..9c1ef64 100644 (file)
@@ -1,3 +1,14 @@
+invirt-xen-config (0.0.54) unstable; urgency=low
+
+  * invirt-database: pass through parameters for the "other" IP address,
+    if any, to vif-invirtroute.
+  * vif-invirtroute: if there is an "other" IP address, DNAT it to the
+    primary IP, set up routing to get it to the VM, and arp for it.
+    Also, cut out the nonsense with backgrounding arpspoof, sleeping, and
+    killing it; we have the technology for 'timeout'.
+
+ -- Mitchell Berger <mitchb@mit.edu>  Tue, 15 Nay 2018 19:50:00 -0400
+
 invirt-xen-config (0.0.53) unstable; urgency=low
 
   * Fix machine UUID assignment after SQLAlchemy started returning Unicode
index b99b548..ade475d 100644 (file)
@@ -123,8 +123,10 @@ for n in machine.nics:
     check(re.match('^[0-9a-fA-F:]+$', n.mac_addr) and re.match('^[0-9.]*$', n.ip))
     if n.nic_type:
         viftype = viftype.replace("pcnet", n.nic_type)
-    d = ('%smac=%s, ip=%s, script=vif-invirtroute netdev=%s'
-         % (viftype, n.mac_addr, n.ip, config.xen.iface))
+    other_netparams = ('other_ip=%s other_gateway=%s'
+                      % (n.other_ip, n.other_gateway) if n.other_ip else '')
+    d = ('%smac=%s, ip=%s, script=vif-invirtroute netdev=%s gateway=%s %s'
+         % (viftype, n.mac_addr, n.ip, config.xen.iface, n.gateway, other_netparams))
     vif.append(d)
 
 for d in machine.disks:
index 4872758..ed2d072 100755 (executable)
@@ -39,11 +39,13 @@ case "$command" in
           ethtool -K ${dev} tx off
         fi
         ipcmd='add'
+       ipt_action='-A'
         cmdprefix=''
         ;;
     offline|remove)
         do_without_error ifdown ${vif}
         ipcmd='del'
+       ipt_action='-D'
         cmdprefix='do_without_error'
         ;;
 esac
@@ -88,12 +90,19 @@ if [  ${vif_type} != "ioemu"  -o  x${qemu_online} = xyes ] ; then
            ${cmdprefix} ip route ${ipcmd} ${addr} dev ${dev} src ${main_ip} $metric
            case "$command" in
                online|add)
-                   arpspoof -i $(invirt-getconf xen.iface) -t 18.181.0.1 ${addr}&
-                   sleep 5
-                   kill %arpspoof
+                   timeout 5 arpspoof -i $(invirt-getconf xen.iface) -t ${gateway} ${addr} || :
                    ;;
            esac
        done 
+       if [ -n "$other_ip" ]; then
+           ${cmdprefix} ip route ${ipcmd} ${other_ip} dev ${dev} src ${main_ip} $metric
+           iptables -t nat ${ipt_action} PREROUTING -d ${other_ip} -j DNAT --to-destination ${addr}
+           case "$command" in
+               online|add)
+                   timeout 5 arpspoof -i $(invirt-getconf xen.iface) -t ${other_gateway} ${other_ip} || :
+                   ;;
+           esac
+       fi
     fi
 fi