Index: trunk/packages/sipb-xen-remote-server/files/usr/sbin/sipb-xen-remote-listvms
===================================================================
--- trunk/packages/sipb-xen-remote-server/files/usr/sbin/sipb-xen-remote-listvms	(revision 538)
+++ trunk/packages/sipb-xen-remote-server/files/usr/sbin/sipb-xen-remote-listvms	(revision 549)
@@ -8,70 +8,71 @@
 from itertools import chain
 from subprocess import CalledProcessError, PIPE, Popen
-from sys import argv
+from sys import argv, stdout
+from cPickle import dump, loads
 
 ###
 
-import compiler
-
-class Unsafe_Source_Error(Exception):
-    def __init__(self,error,descr = None,node = None):
-        self.error = error
-        self.descr = descr
-        self.node = node
-        self.lineno = getattr(node,"lineno",None)
-        
-    def __repr__(self):
-        return "Line %d.  %s: %s" % (self.lineno, self.error, self.descr)
-    __str__ = __repr__    
-           
-class SafeEval(object):
-    
-    def visit(self, node,**kw):
-        cls = node.__class__
-        meth = getattr(self,'visit'+cls.__name__,self.default)
-        return meth(node, **kw)
-            
-    def default(self, node, **kw):
-        for child in node.getChildNodes():
-            return self.visit(child, **kw)
-            
-    visitExpression = default
-    
-    def visitConst(self, node, **kw):
-        return node.value
-
-    def visitDict(self,node,**kw):
-        return dict([(self.visit(k),self.visit(v)) for k,v in node.items])
-        
-    def visitTuple(self,node, **kw):
-        return tuple(self.visit(i) for i in node.nodes)
-        
-    def visitList(self,node, **kw):
-        return [self.visit(i) for i in node.nodes]
-
-class SafeEvalWithErrors(SafeEval):
-
-    def default(self, node, **kw):
-        raise Unsafe_Source_Error("Unsupported source construct",
-                                node.__class__,node)
-            
-    def visitName(self,node, **kw):
-        if node.name == 'None': return None
-        raise Unsafe_Source_Error("Strings must be quoted", 
-                                 node.name, node)
-                                 
-    # Add more specific errors if desired
-            
-def safe_eval(source, fail_on_error = True):
-    if source.strip() == '': return None
-    walker = fail_on_error and SafeEvalWithErrors() or SafeEval()
-    try:
-        ast = compiler.parse(source,"eval")
-    except SyntaxError, err:
-        raise
-    try:
-        return walker.visit(ast)
-    except Unsafe_Source_Error, err:
-        raise
+#import compiler
+#
+#class Unsafe_Source_Error(Exception):
+#    def __init__(self,error,descr = None,node = None):
+#        self.error = error
+#        self.descr = descr
+#        self.node = node
+#        self.lineno = getattr(node,"lineno",None)
+#        
+#    def __repr__(self):
+#        return "Line %d.  %s: %s" % (self.lineno, self.error, self.descr)
+#    __str__ = __repr__    
+#           
+#class SafeEval(object):
+#    
+#    def visit(self, node,**kw):
+#        cls = node.__class__
+#        meth = getattr(self,'visit'+cls.__name__,self.default)
+#        return meth(node, **kw)
+#            
+#    def default(self, node, **kw):
+#        for child in node.getChildNodes():
+#            return self.visit(child, **kw)
+#            
+#    visitExpression = default
+#    
+#    def visitConst(self, node, **kw):
+#        return node.value
+#
+#    def visitDict(self,node,**kw):
+#        return dict([(self.visit(k),self.visit(v)) for k,v in node.items])
+#        
+#    def visitTuple(self,node, **kw):
+#        return tuple(self.visit(i) for i in node.nodes)
+#        
+#    def visitList(self,node, **kw):
+#        return [self.visit(i) for i in node.nodes]
+#
+#class SafeEvalWithErrors(SafeEval):
+#
+#    def default(self, node, **kw):
+#        raise Unsafe_Source_Error("Unsupported source construct",
+#                                node.__class__,node)
+#            
+#    def visitName(self,node, **kw):
+#        if node.name == 'None': return None
+#        raise Unsafe_Source_Error("Strings must be quoted", 
+#                                 node.name, node)
+#                                 
+#    # Add more specific errors if desired
+#            
+#def safe_eval(source, fail_on_error = True):
+#    if source.strip() == '': return None
+#    walker = fail_on_error and SafeEvalWithErrors() or SafeEval()
+#    try:
+#        ast = compiler.parse(source,"eval")
+#    except SyntaxError, err:
+#        raise
+#    try:
+#        return walker.visit(ast)
+#    except Unsafe_Source_Error, err:
+#        raise
 
 ###
@@ -95,5 +96,5 @@
   servers = [ 'black-mesa.mit.edu', 'sx-blade-2.mit.edu' ]
   # XXX
-  results = [ safe_eval(run(['remctl', server, 'remote', 'web', 'listvms'] + argv[1:]))
+  results = [ loads(run(['remctl', server, 'remote', 'web', 'listvms', '--pickle']))
               for server in servers ]
   results = filter( lambda x: x is not None, results )
@@ -102,6 +103,9 @@
   merged = {}
   for result in results: merged.update(result)
-  print merged
-  print '.'
+  if argv[1:] == ['--pickle']:
+    dump(merged, stdout)
+  else:
+    print merged
+    print '.'
 
 if __name__ == '__main__':
