[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] BUG? domu network interface configuration



I've managed to get vif-route working again, but it requires some changes.

Patch is attached below (posted for sake of discussion, I don't expect
all of this to be immediately applicable).

First, I've added a new tool "sxp_get", which extract data from sxp
formatted data and presents it in a format that is usable in shell
scripts.

Also, my scripts depend on an up-to-date version of vm-tools (vm-xs in
particular), to be able to extract data from xenstored.


Signed-off-by: Michal Ostrowski <mostrows@xxxxxxxxxxxxxx>


--- a/tools/examples/backend.hotplug    Wed Aug 31 23:22:45 2005
+++ b/tools/examples/backend.hotplug    Thu Sep  1 22:14:10 2005
@@ -3,15 +3,37 @@
 #DEVPATH=/devices/xen-backend/vif-1-0
 #ACTION=add
 
-PATH=/etc/xen/scripts:$PATH
+export PATH=/etc/xen/scripts:$PATH
+
+CONFIG_FILE=/etc/xen/xend-config.sxp
+SCRIPT=/bin/false
+if [ -r $CONFIG_FILE ]; then
+    tmp=$(sxp_get vif-script <$CONFIG_FILE)
+    SCRIPT=${tmp#*=}
+fi
+
+if [ -z "$(which $SCRIPT)" ] ; then
+    # not in path, should probably log an error
+    exit
+fi
 
 DEV=$(basename "$DEVPATH")
+
+# DEV is of the form vif-x-y.  This extracts "x"
+idx=${DEV%-*}
+idx=${idx#*-}
+
+dom0_uuid=$(vm-xs -f /domain id 0)
+domU_uuid=$(vm-xs -f /domain/${dom0_uuid}/backend/vif 0/frontend-id $idx)
+
+domain=$(vm-xs -g /domain/$domU_uuid/id)
+
 case "$ACTION" in
   add)
     case "$DEV" in
       vif-*)
         vif=$(echo "$DEV" | sed 's/-\([0-9]*\)-\([0-9]*\)/\1.\2/')
-        vif-bridge up domain=unknown vif="$vif" mac=fe:ff:ff:ff:ff:ff 
bridge=xen-br0 >/dev/null 2>&1
+        $SCRIPT up domain=$domain vif="$vif" mac=fe:ff:ff:ff:ff:ff 
bridge=xen-br0 >/dev/null 2>&1
         ;;
     esac
     ;;
diff -r f0dc15fd3c1b tools/examples/init.d/xend
--- a/tools/examples/vif-route  Wed Aug 31 23:22:45 2005
+++ b/tools/examples/vif-route  Thu Sep  1 22:14:10 2005
@@ -41,12 +44,28 @@
 # Optional parameters. Set defaults.
 ip=${ip:-''}   # default to null (do nothing)
 
-main_ip=`ifconfig eth0 | grep "inet addr:" | sed -e 's/.*inet 
addr:\(\w\w*\.\w\w*\.\w\w*\.\w\w*\).*/\1/'`
+id=$(echo -n $vif | sed -e 's/vif\(.*\)\..*/\1/')
+
+if [ -z "${ip}" ] ; then
+    # Finds "x" such that /domain/x/id == $id  i.e., identifies uuid
+    uuid=$(vm-xs -f /domain id $id)
+    tmp=$(vm-xs -g /domain/$uuid/config | sxp_get.py vm device vif ip)
+    if [ "${tmp%=*}" = "vm_device_vif_ip" ] ; then
+       ip=${tmp#*=}
+    fi
+fi
+
+
+if [ -z "${netdev}" ] ; then
+    netdev=`ip route | sed -e '/default/!d' -e 's/^.*dev \(.*\)$/\1/'`
+fi
+
+main_ip=`ifconfig ${netdev} | grep "inet addr:" | sed -e 's/.*inet 
addr:\(\w\w*\.\w\w*\.\w\w*\.\w\w*\).*/\1/'`
 
 # Are we going up or down?
 case $OP in
     up)
-        ifconfig ${vif} 169.254.1.0 netmask 255.255.255.255 up
+        ifconfig ${vif} ${main_ip} netmask 255.255.255.255 up
         echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp
         iptcmd='-A'
         ipcmd='a'
diff -r f0dc15fd3c1b tools/examples/xend-config.sxp
--- a/tools/misc/Makefile       Wed Aug 31 23:22:45 2005
+++ b/tools/misc/Makefile       Thu Sep  1 22:14:10 2005
@@ -15,7 +15,7 @@
 
 TARGETS  = xenperf xc_shadow
 
-INSTALL_BIN  = $(TARGETS) xencons
+INSTALL_BIN  = $(TARGETS) xencons sxp_get
 INSTALL_SBIN = netfix xm xend xenperf
 
 all: build
diff -r f0dc15fd3c1b tools/misc/sxp_get
--- /dev/null   Wed Aug 31 23:22:45 2005
+++ b/tools/misc/sxp_get        Thu Sep  1 22:17:24 2005
@@ -0,0 +1,98 @@
+#!/usr/bin/env python2.3
+#
+# (C) Copyright IBM Corp. 2005 Michal Ostrowski <mostrows at watson ibm com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+import sys
+import re
+sys.path.append('/usr/lib/python')
+sys.path.append('/usr/lib64/python')
+from xen.xend import sxp
+
+def usage():
+    help = """Usage: sxp_get [key1] [key2] ....
+    Parse the sxp file from stdin and print selected key values in a format
+    that is easily handled by shell scripts.
+
+    Keys specified on the command line provide a filtering mechanism.
+    Example:
+    echo (a (b (c d) (e f)) (g h)) |sxp_get a b
+    a_b_c=d
+    a_b_e=f
+
+    echo (a (b (c d) (e f)) (g h)) |sxp_get a
+    a_b_c=d
+    a_b_e=f
+    a_g=h
+    """
+    print help;
+    
+
+def __show_val(prefix1, prefix2, sxpr, match, out=sys.stdout):
+    """Print an sxpr in key1.key2.key3 = value format.
+       'match' is a list of keys, and if non-empty will restrict
+       printing to those key prefixes that match this list.
+    """
+    
+    prefix = (prefix1 + "_" + prefix2).lstrip("_")
+
+    if isinstance(sxpr, sxp.types.ListType):
+        element = sxp.name(sxpr)
+        for attr in sxp.attributes(sxpr):
+            out.write("%s_%s_%s=%s\n" % (prefix, element, attr[0], attr[1]))
+        for x in sxp.children(sxpr):
+            if len(match) > 0 :
+                item = match[0]
+            else:
+                item = element
+                
+            if item == element:
+                __show_val(prefix, element, x, match[1:], out)
+    elif isinstance(sxpr, sxp.types.StringType) and sxp.atomp(sxpr):
+        out.write('%s=%s\n' % (prefix, sxpr))
+    else:
+        out.write("%s=%s\n" % (prefix,str(sxpr)))
+
+def show_val(sxpr, match, out=sys.stdout):
+    """Print an sxpr in key1.key2.key3 = value format.
+       'match' is a list of keys, and if non-empty will restrict
+       printing to those key prefixes that match this list.
+    """
+    __show_val("", "", sxpr, match, out)
+
+
+def main(argv=sys.argv):
+    if len(argv) > 1:
+        print len(argv);
+        if re.compile('-*help').match(argv[1]):
+            usage();
+            sys.exit(0)
+
+    if len(argv) > 0:
+        match = argv[1:]
+    pin = sxp.Parser()
+    while 1:
+        buf = sys.stdin.read(1024)
+        #buf = sys.stdin.readline()
+        pin.input(buf)
+        while pin.ready():
+            val = pin.get_val()
+            show_val(val, match)
+        if len(buf) == 0:
+            break
+        
+
+
+if __name__ == "__main__":
+    main()

Attachment: pgprO8iNHGcZY.pgp
Description: PGP signature

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.