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

[Xen-devel] [PATCH 9/9] tools: drop 'sv'



I'm not even sure what this thing is. Looks like some sort of Twisted Python
based frontend to xend.

Whatever it is I am perfectly sure no one can be using it. Apart from drive by
build fixes caused by updates elsewhere it has seen no real development since
2005. I suspect it was never even finished/usable.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
 tools/python/setup.py                |    1 -
 tools/python/xen/sv/CreateDomain.py  |  205 --------------------------
 tools/python/xen/sv/DomInfo.py       |  268 ----------------------------------
 tools/python/xen/sv/GenTabbed.py     |  147 -------------------
 tools/python/xen/sv/HTMLBase.py      |   53 -------
 tools/python/xen/sv/Main.py          |   82 -----------
 tools/python/xen/sv/NodeInfo.py      |   73 ---------
 tools/python/xen/sv/RestoreDomain.py |   50 -------
 tools/python/xen/sv/Wizard.py        |  245 -------------------------------
 tools/python/xen/sv/__init__.py      |    1 -
 tools/python/xen/sv/util.py          |  126 ----------------
 tools/sv/Makefile                    |    3 -
 tools/sv/images/destroy.png          |  Bin 2408 -> 0 bytes
 tools/sv/images/finish.png           |  Bin 1189 -> 0 bytes
 tools/sv/images/next.png             |  Bin 1270 -> 0 bytes
 tools/sv/images/pause.png            |  Bin 1662 -> 0 bytes
 tools/sv/images/previous.png         |  Bin 1285 -> 0 bytes
 tools/sv/images/reboot.png           |  Bin 3132 -> 0 bytes
 tools/sv/images/shutdown.png         |  Bin 2901 -> 0 bytes
 tools/sv/images/small-destroy.png    |  Bin 483 -> 0 bytes
 tools/sv/images/small-pause.png      |  Bin 434 -> 0 bytes
 tools/sv/images/small-unpause.png    |  Bin 500 -> 0 bytes
 tools/sv/images/unpause.png          |  Bin 1890 -> 0 bytes
 tools/sv/images/xen.png              |  Bin 10575 -> 0 bytes
 tools/sv/inc/script.js               |   31 ----
 tools/sv/inc/style.css               |   95 ------------
 tools/sv/index.psp                   |   34 -----
 27 files changed, 0 insertions(+), 1414 deletions(-)
 delete mode 100755 tools/python/xen/sv/CreateDomain.py
 delete mode 100755 tools/python/xen/sv/DomInfo.py
 delete mode 100755 tools/python/xen/sv/GenTabbed.py
 delete mode 100755 tools/python/xen/sv/HTMLBase.py
 delete mode 100755 tools/python/xen/sv/Main.py
 delete mode 100755 tools/python/xen/sv/NodeInfo.py
 delete mode 100755 tools/python/xen/sv/RestoreDomain.py
 delete mode 100755 tools/python/xen/sv/Wizard.py
 delete mode 100755 tools/python/xen/sv/__init__.py
 delete mode 100755 tools/python/xen/sv/util.py
 delete mode 100644 tools/sv/Makefile
 delete mode 100755 tools/sv/images/destroy.png
 delete mode 100755 tools/sv/images/finish.png
 delete mode 100755 tools/sv/images/next.png
 delete mode 100755 tools/sv/images/pause.png
 delete mode 100755 tools/sv/images/previous.png
 delete mode 100755 tools/sv/images/reboot.png
 delete mode 100755 tools/sv/images/shutdown.png
 delete mode 100755 tools/sv/images/small-destroy.png
 delete mode 100755 tools/sv/images/small-pause.png
 delete mode 100755 tools/sv/images/small-unpause.png
 delete mode 100755 tools/sv/images/unpause.png
 delete mode 100755 tools/sv/images/xen.png
 delete mode 100755 tools/sv/inc/script.js
 delete mode 100755 tools/sv/inc/style.css
 delete mode 100755 tools/sv/index.psp

diff --git a/tools/python/setup.py b/tools/python/setup.py
index 8e584e6..8127b21 100644
--- a/tools/python/setup.py
+++ b/tools/python/setup.py
@@ -132,7 +132,6 @@ setup(name            = 'xen',
       description     = 'Xen',
       packages        = ['xen',
                          'xen.lowlevel',
-                         'xen.sv',
                          ] + xend_packages,
       ext_package = "xen.lowlevel",
       ext_modules = modules
diff --git a/tools/python/xen/sv/CreateDomain.py 
b/tools/python/xen/sv/CreateDomain.py
deleted file mode 100755
index 748d99b..0000000
--- a/tools/python/xen/sv/CreateDomain.py
+++ /dev/null
@@ -1,205 +0,0 @@
-from xen.sv.Wizard import *
-from xen.sv.util import *
-from xen.sv.GenTabbed import PreTab
-
-from xen.xm.create import make_config, OptVals
-
-from xen.xend.XendClient import server
-
-class CreateDomain( Wizard ):
-    def __init__( self, urlWriter ):
-       
-       sheets = [ CreatePage0,
-                  CreatePage1,
-                  CreatePage2,
-                   CreatePage3,
-                   CreatePage4,
-                   CreateFinish ]
-    
-       Wizard.__init__( self, urlWriter, "Create Domain", sheets )
-
-    def op_finish( self, request ):
-        pass
-    
-class CreatePage0( Sheet ):
-
-    title = "General"
-    
-    def __init__( self, urlWriter ):
-        Sheet.__init__( self, urlWriter, "General", 0 )
-        self.addControl( InputControl( 'name', 'VM Name', 'VM Name:', 
"[\\w|\\S]+", "You must enter a name in this field" ) )
-        self.addControl( InputControl( 'memory', '64', 'Memory (Mb):', 
"[\\d]+", "You must enter a number in this field" ) )
-        self.addControl( InputControl( 'cpu', '0', 'CPU:', "[\\d]+", "You must 
enter a number in this feild" ) )
-        self.addControl( InputControl( 'cpu_weight', '1', 'CPU Weight:', 
"[\\d]+", "You must enter a number in this feild" ) )
-        self.addControl( InputControl( 'vcpus', '1', 'Virtual CPUs:', 
'[\\d]+', "You must enter a number in this feild") )
-                        
-class CreatePage1( Sheet ):
-
-    title = "Setup Kernel Image"
-
-    def __init__( self, urlWriter ):
-        Sheet.__init__( self, urlWriter, "Setup Kernel Image", 1 )
-        self.addControl( ListControl( 'builder', [('linux', 'Linux'), 
('netbsd', 'NetBSD')], 'Domain Builder:' ) )
-        self.addControl( FileControl( 'kernel', '/boot/vmlinuz-2.6.12-xenU', 
'Kernel Image:' ) )
-        self.addControl( InputControl( 'extra', '', 'Kernel Command Line 
Parameters:' ) )
-        self.addControl( ListControl( 'use-initrd', [('yes', 'Yes'), ('no', 
'No')], 'Use an Initial Ram Disk?:' ) )
-        self.addControl( FileControl( 'initrd', 
'/boot/initrd-2.6.12-xenU.img', 'Initial Ram Disk:' ) )
-
-    def validate( self, request ):
-        if not self.passback: self.parseForm( request )
-        check = True
-        request.write( previous_values.get( '>>>>>use-initrd' ) )
-        previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the 
map for quick reference
-        if DEBUG: print previous_values
-        for (feild, control) in self.feilds:
-            if feild == 'initrd' and previous_values.get( 'use-initrd' ) != 
'no':
-                request.write( previous_values.get( '>>>>>use-initrd' ) )
-                if control.validate( previous_values.get( feild ) ):
-                    check = False
-            elif not control.validate( previous_values.get( feild ) ):
-                check = False
-
-            if DEBUG: print "> %s = %s" % (feild, previous_values.get( feild ))
-
-        return check
-                                                 
-
-class CreatePage2( Sheet ):
-
-    title = "Choose number of VBDS"
-
-    def __init__( self, urlWriter ):
-       Sheet.__init__( self, urlWriter, "Setup Virtual Block Device", 2 )
-        self.addControl( InputControl( 'num_vbds', '1', 'Number of VBDs:', 
'[\\d]+', "You must enter a number in this field" ) )
-
-class CreatePage3( Sheet ):
-
-    title = "Setup VBDS"
-
-    def __init__( self, urlWriter ):
-        Sheet.__init__( self, urlWriter, "Setup Virtual Block Device", 3 )
-        
-    def write_BODY( self, request ):
-        if not self.passback: self.parseForm( request )
-    
-       previous_values = sxp2hash( string2sxp( self.passback ) ) #get the hash 
for quick reference
-        
-        num_vbds = previous_values.get( 'num_vbds' )
-        
-        for i in range( int( num_vbds ) ):
-            self.addControl( InputControl( 'vbd%s_dom0' % i, 'phy:sda%s' % 
str(i + 1), 'Device %s name:' % i  ) )
-            self.addControl( InputControl( 'vbd%s_domU' % i, 'sda%s' % str(i + 
1), 'Virtualized device %s:' % i ) )
-            self.addControl( ListControl( 'vbd%s_mode' % i, [('w', 'Read + 
Write'), ('r', 'Read Only')], 'Device %s mode:' % i ) )
-            
-        self.addControl( InputControl( 'root', '/dev/sda1', 'Root device (in 
VM):' ) )
-        
-        Sheet.write_BODY( self, request )
-                
-class CreatePage4( Sheet ):
-
-    title = "Network Setting"
-
-    def __init__( self, urlWriter ):        
-        Sheet.__init__( self, urlWriter, "Network settings", 4 )
-        self.addControl( ListControl( 'dhcp', [('off', 'No'), ('dhcp', 
'Yes')], 'Use DHCP:' ) )
-        self.addControl( InputControl( 'hostname', 'hostname', 'VM Hostname:' 
) )
-        self.addControl( InputControl( 'ip_addr', '192.168.1.1', 'VM IP 
Address:' ) )
-        self.addControl( InputControl( 'ip_subnet', '255.255.255.0', 'VM 
Subnet Mask:' ) ) 
-        self.addControl( InputControl( 'ip_gateway', '192.168.1.1', 'VM 
Gateway:' ) )           
-        self.addControl( InputControl( 'ip_nfs', '192.168.1.1', 'NFS Server:' 
) )  
-                 
-class CreateFinish( Sheet ):
-
-    title = "Finish"
-
-    def __init__( self, urlWriter ):
-        Sheet.__init__( self, urlWriter, "All Done", 5 )
-        
-    def write_BODY( self, request ):
-    
-        if not self.passback: self.parseForm( request )
-        
-        xend_sxp = self.translate_sxp( string2sxp( self.passback ) )
-
-        request.write( "<pre>%s</pre>" % sxp2prettystring( xend_sxp ) )
-        
-        try:
-            server.xend_domain_create( xend_sxp )
-            request.write( "<p>You domain had been successfully created.</p>" )
-        except Exception, e:
-            request.write( "<p>There was an error creating your 
domain.<br/>The configuration used is as follows:\n</p>" )
-            request.write( "<pre>%s</pre>" % sxp2prettystring( xend_sxp ) )
-            request.write( "<p>The error was:</p>" )
-            request.write( "<pre>%s</pre>" % str( e ) )
-
-        request.write( "<input type='hidden' name='passback' 
value=\"%s\"></p>" % self.passback )
-        request.write( "<input type='hidden' name='sheet' value='%s'></p>" % 
self.location )
-    
-    def translate_sxp( self, fin_sxp ):
-       fin_hash = ssxp2hash( fin_sxp )
-    
-        def get( key ):
-            ret = fin_hash.get( key )
-            if ret:
-                return ret
-            else:
-                return ""
-        
-       vals = OptVals()
-        
-        vals.name =    get( 'name' )
-        vals.memory =  get( 'memory' )
-        vals.maxmem =   get( 'maxmem' )
-        vals.cpu =     get( 'cpu' )
-        vals.cpu_weight = get( 'cpu_weight' )
-        vals.vcpus = get( 'vcpus' )
-        
-        vals.builder =  get( 'builder' )       
-        vals.kernel =   get( 'kernel' )
-       vals.root =     get( 'root' )
-        vals.extra =   get( 'extra' )
-        
-        #setup vbds
-        
-        vbds = []
-        
-        for i in range( int( get( 'num_vbds' ) ) ):
-            vbds.append( ( get( 'vbd%s_dom0' % i ), get('vbd%s_domU' % i ), 
get( 'vbd%s_mode' % i ), None ) )
-        
-        vals.disk = vbds    
-            
-        #misc
-        
-        vals.pci = []
-        
-        vals.blkif = None
-        vals.netif = None
-        vals.restart = None
-        vals.console = None
-        vals.ramdisk = None
-        vals.ssidref = -1
-        vals.bootloader = None
-        vals.usb = []
-        vals.acpi = []
-        
-        #setup vifs
-        
-        vals.vif = []
-        vals.nics = 1
-                
-        ip =   get( 'ip_addr' )
-        nfs =  get( 'ip_nfs' )
-        gate = get( 'ip_gateway' )
-        mask = get( 'ip_subnet' )
-        host = get( 'hostname' )
-        dhcp = get( 'dhcp' )
-        
-        vals.cmdline_ip = "%s:%s:%s:%s:%s:eth0:%s" % (ip, nfs, gate, mask, 
host, dhcp)
-
-        opts = None
-        
-        try:
-            return make_config( opts, vals )
-        except Exception, e:
-            return [["There was an error creating the domain config SXP.  This 
is typically due to an interface change in xm/create.py:make_config", e]]    
-        
diff --git a/tools/python/xen/sv/DomInfo.py b/tools/python/xen/sv/DomInfo.py
deleted file mode 100755
index 89feca0..0000000
--- a/tools/python/xen/sv/DomInfo.py
+++ /dev/null
@@ -1,268 +0,0 @@
-from xen.xend.XendClient import server
-from xen.xend import PrettyPrint
-
-from xen.sv.HTMLBase import HTMLBase
-from xen.sv.util import *
-from xen.sv.GenTabbed import *
-from xen.sv.Wizard import *
-
-DEBUG=1
-
-class DomInfo( GenTabbed ):
-
-    def __init__( self, urlWriter ):
-        
-        self.dom = 0;
-                   
-        GenTabbed.__init__( self, "Domain Info", urlWriter, [ 'General', 
'SXP', 'Devices', 'Migrate', 'Save' ], [ DomGeneralTab, DomSXPTab, 
DomDeviceTab, DomMigrateTab, DomSaveTab ]  )
-
-    def write_BODY( self, request ):
-        try:
-            dom = int( getVar( 'dom', request ) )
-        except:
-            request.write( "<p>Please Select a Domain</p>" )
-            return None
-       
-        GenTabbed.write_BODY( self, request )
-        
-    def write_MENU( self, request ):
-       domains = []
-
-       try:
-           domains = server.xend_domains()
-           domains.sort()
-       except:
-           pass
-
-       request.write( "\n<table style='border:0px solid white' cellspacing='0' 
cellpadding='0' border='0' width='100%'>\n" )
-       request.write( "<tr class='domainInfoHead'>" )
-       request.write( "<td class='domainInfoHead' 
align='center'>Domain</td>\n" )
-       request.write( "<td class='domainInfoHead' align='center'>Name</td>\n" )
-       request.write( "<td class='domainInfoHead' align='center'>State</td>\n" 
)
-       request.write( "<td class='domainInfoHead' align='center'></td>\n" )
-       request.write( "</tr>" )
-
-       odd = True
-       if not domains is None:
-           for domain in domains:
-               odd = not odd;
-               if odd:
-                   request.write( "<tr class='domainInfoOdd'>\n" )
-               else:
-                   request.write( "<tr class='domainInfoEven'>\n" )
-               domInfo = getDomInfo( domain )
-               request.write( "<td class='domainInfo' 
align='center'>%(id)s</td>\n" % domInfo )
-               url = self.urlWriter( "&dom=%(id)s" % domInfo )
-               request.write( "<td class='domainInfo' align='center'><a 
href='%s'>%s</a></td>\n" % ( url, domInfo['name'] ) )
-               request.write( "<td class='domainInfo' 
align='center'>%(state)5s</td>\n" % domInfo )
-               if domInfo[ 'id' ] != "0":
-                   request.write( "<td class='domainInfo' align='center'>" )
-                   if domInfo[ 'state' ][ 2 ] == "-":
-                       request.write( "<img src='images/small-pause.png' 
onclick='doOp2( \"pause\", \"%(dom)-4s\" )'>" % domInfo )
-                   else:
-                       request.write( "<img src='images/small-unpause.png' 
onclick='doOp2( \"unpause\", \"%(dom)-4s\" )'>" % domInfo )
-                   request.write( "<img src='images/small-destroy.png' 
onclick='doOp2( \"destroy\", \"%(dom)-4s\" )'></td>" % domInfo )
-               else:
-                   request.write( "<td>&nbsp;</td>" )
-               request.write( "</tr>\n" )
-       else:
-           request.write( "<tr colspan='10'><p class='small'>Error getting 
domain list<br/>Perhaps XenD not running?</p></tr>")
-       request.write( "</table>" )
-       
-class DomGeneralTab( CompositeTab ):
-    def __init__( self, urlWriter ):
-       CompositeTab.__init__( self, [ DomGenTab, DomActionTab ], urlWriter )   
     
-       
-class DomGenTab( GeneralTab ):
-
-    def __init__( self, _ ):
-    
-        titles = {}
-    
-        titles[ 'ID' ] = 'dom'      
-        titles[ 'Name' ] = 'name'
-        titles[ 'CPU' ] = 'cpu'
-        titles[ 'Memory' ] = ( 'mem', memoryFormatter )
-        titles[ 'State' ] = ( 'state', stateFormatter )
-        titles[ 'Total CPU' ] = ( 'cpu_time', smallTimeFormatter )
-        titles[ 'Up Time' ] = ( 'up_time', bigTimeFormatter )
-    
-        GeneralTab.__init__( self, {}, titles )
-        
-    def write_BODY( self, request ):
-    
-        self.dom = getVar('dom', request)
-        
-        if self.dom is None:
-            request.write( "<p>Please Select a Domain</p>" )
-            return None
-            
-        self.dict = getDomInfo( self.dom )
-        
-        GeneralTab.write_BODY( self, request )
-            
-class DomSXPTab( PreTab ):
-
-    def __init__( self, _ ):
-        self.dom = 0
-        PreTab.__init__( self, "" )
-
-
-    def write_BODY( self, request ):
-        self.dom = getVar('dom', request)
-        
-        if self.dom is None:
-            request.write( "<p>Please Select a Domain</p>" )
-            return None
-
-        try:
-            domInfo = server.xend_domain( self.dom )
-        except:
-            domInfo = [["Error getting domain details."]]
-            
-        self.source = sxp2prettystring( domInfo )
-        
-        PreTab.write_BODY( self, request )
-       
-class DomActionTab( ActionTab ):
-
-    def __init__( self, _ ):
-       actions = { "shutdown" : "Shutdown",
-                   "reboot" : "Reboot",
-                    "pause" : "Pause",
-                    "unpause" : "Unpause",
-                    "destroy" : "Destroy" }
-        ActionTab.__init__( self, actions )    
-        
-    def op_shutdown( self, request ):
-       dom = getVar( 'dom', request )
-        if not dom is None and dom != '0':
-          if DEBUG: print ">DomShutDown %s" % dom
-           try:
-               server.xend_domain_shutdown( int( dom ), "poweroff" )
-           except:
-               pass
-    
-    def op_reboot( self, request ):
-               dom = getVar( 'dom', request )
-        if not dom is None and dom != '0':
-           if DEBUG: print ">DomReboot %s" % dom
-            try:
-               server.xend_domain_shutdown( int( dom ), "reboot" )
-            except:
-               pass
-                
-    def op_pause( self, request ):
-               dom = getVar( 'dom', request )
-        if not dom is None and dom != '0':
-           if DEBUG: print ">DomPause %s" % dom
-            try:
-                server.xend_domain_pause( int( dom ) )
-            except:
-               pass
-               
-    def op_unpause( self, request ):
-               dom = getVar( 'dom', request )
-        if not dom is None and dom != '0':
-          if DEBUG: print ">DomUnpause %s" % dom
-           try:
-               server.xend_domain_unpause( int( dom ) )
-          except:
-               pass
-               
-    def op_destroy( self, request ):
-       dom = getVar( 'dom', request )
-        if not dom is None and dom != '0':
-          if DEBUG: print ">DomDestroy %s" % dom
-           try:
-               server.xend_domain_destroy(int( dom ))
-           except:
-               pass
-
-class DomDeviceTab( CompositeTab ):
-
-    def __init__( self, urlWriter ):
-        CompositeTab.__init__( self, [ DomDeviceListTab, DomDeviceOptionsTab, 
DomDeviceActionTab ], urlWriter )
-
-class DomDeviceListTab( NullTab ):
-
-    title = "Device List"
-
-    def __init__( self, _ ):
-        pass
-
-class DomDeviceOptionsTab( NullTab ):
-
-    title = "Device Options"
-
-    def __init__( self, _ ):
-        pass
-
-class DomDeviceActionTab( ActionTab ):
-
-    def __init__( self, _ ):
-        ActionTab.__init__( self, { "addvcpu" : "Add VCPU", "addvbd" : "Add 
VBD", "addvif" : "Add VIF" } )
-
-class DomMigrateTab( CompositeTab ):
-
-    def __init__( self, urlWriter ):
-        CompositeTab.__init__( self, [ DomMigrateExtraTab, DomMigrateActionTab 
], urlWriter ) 
-
-class DomMigrateExtraTab( Sheet ):
-
-    def __init__( self, urlWriter ):
-        Sheet.__init__( self, urlWriter, "Configure Migration", 0)
-        self.addControl( TickControl('live', 'True', 'Live migrate:') )
-        self.addControl( InputControl('rate', '0', 'Rate limit:') )
-        self.addControl( InputControl( 'dest', 'host.domain', 'Name or IP 
address:', ".*") )
-                                                                               
                             
-class DomMigrateActionTab( ActionTab ):
-
-    def __init__( self, _ ):
-        actions = { "migrate" : "Migrate" }
-        ActionTab.__init__( self, actions )
-                
-    def op_migrate( self, request ):
-        try:
-            domid = int( getVar( 'dom', request ) )
-            live  = getVar( 'live', request )
-            rate  = getVar( 'rate', request )
-            dest  = getVar( 'dest', request )
-            dom_sxp = server.xend_domain_migrate( domid, dest, live == 'True', 
rate )
-            success = "Your domain was successfully Migrated.\n"
-        except Exception, e:
-            success = "There was an error migrating your domain\n"
-            dom_sxp = str(e)
-                                                        
-class DomSaveTab( CompositeTab ):
-
-    def __init__( self, urlWriter ):
-        CompositeTab.__init__( self, [ DomSaveExtraTab, DomSaveActionTab ], 
urlWriter ) 
-
-class DomSaveExtraTab( Sheet ):
-
-    title = "Save location"
-
-    def __init__( self, urlWriter ):
-        Sheet.__init__( self, urlWriter, "Save Domain to file", 0 )
-        self.addControl( InputControl( 'file', '', 'Suspend file name:', ".*") 
)
-               
-class DomSaveActionTab( ActionTab ):
-
-    def __init__( self, _ ):
-        actions = { "save" : "Save" }
-        ActionTab.__init__( self, actions )
-
-    def op_save( self, request ):
-
-        try:
-            dom_sxp = server.xend_domain_save( config['domid'], config['file'] 
)
-            success = "Your domain was successfully saved.\n"
-        except Exception, e:
-            success = "There was an error saving your domain\n"
-            dom_sxp = str(e)
-                                                                               
        
-        try:
-            dom = int( getVar( 'dom', request ) )
-        except:
-            pass
diff --git a/tools/python/xen/sv/GenTabbed.py b/tools/python/xen/sv/GenTabbed.py
deleted file mode 100755
index 6631663..0000000
--- a/tools/python/xen/sv/GenTabbed.py
+++ /dev/null
@@ -1,147 +0,0 @@
-import types
-
-from xen.sv.HTMLBase import HTMLBase
-from xen.sv.util import getVar
-
-class GenTabbed( HTMLBase ):
-
-    def __init__( self, title, urlWriter, tabStrings, tabObjects ):
-        HTMLBase.__init__(self)
-        self.tabStrings = tabStrings
-        self.tabObjects = tabObjects
-        self.urlWriter = urlWriter
-        self.title = title
-        
-    def write_BODY( self, request ):
-        if not self.__dict__.has_key( "tab" ):
-            try:
-                self.tab = int( getVar( 'tab', request, 0 ) )
-            except:
-                self.tab = 0
-            
-        request.write( "\n<div class='title'>%s</div>" % self.title )
-        
-        TabView( self.tab, self.tabStrings, self.urlWriter ).write_BODY( 
request )
-        
-        try:
-            request.write( "\n<div class='tab'>" )
-            render_tab = self.tabObjects[ self.tab ]
-            render_tab( self.urlWriter ).write_BODY( request )
-            request.write( "\n</div>" )
-        except Exception, e:
-            request.write( "\n<p>Error Rendering Tab</p>" )
-            request.write( "\n<p>%s</p>" % str( e ) )
-
-        request.write( "\n<input type=\"hidden\" name=\"tab\" value=\"%d\">" % 
self.tab )
-
-    def perform( self, request ):
-        request.write( "Tab> perform" )
-        request.write( "<br/>op: " + str( getVar( 'op', request ) ) )
-        request.write( "<br/>args: " + str( getVar( 'args', request ) ) )
-        request.write( "<br/>tab: " + str( getVar( 'tab', request ) ) )      
-
-        try:
-            action = getVar( 'op', request, 0 )
-            if action == "tab":
-                self.tab = int( getVar( 'args', request ) )
-            else:
-                this.tab = int( getVar( 'tab', request, 0 ) )
-                self.tabObjects[ self.tab ]( self.urlWriter ).perform( request 
)
-        except:
-            pass
-        
-class PreTab( HTMLBase ):
-
-    def __init__( self, source ):
-        HTMLBase.__init__( self )
-        self.source = source
-    
-    def write_BODY( self, request ):
-        request.write( "\n<pre>" )
-        request.write( self.source )
-        request.write( "\n</pre>" )
-
-class GeneralTab( HTMLBase ):
-                        
-    def __init__( self, dict, titles ):
-        HTMLBase.__init__( self )
-        self.dict = dict
-        self.titles = titles
-                        
-    def write_BODY( self, request ): 
-        
-        request.write( "\n<table width='100%' cellspacing='0' cellpadding='0' 
border='0'>" )
-        
-        def writeAttr( niceName, attr, formatter=None ):
-            if type( attr ) is types.TupleType:
-                ( attr, formatter ) = attr
-            
-            if attr in self.dict:
-                if formatter:
-                    temp = formatter( self.dict[ attr ] )
-                else:
-                    temp = str( self.dict[ attr ] )
-                request.write( "\n<tr><td width='50%%'><p>%s:</p></td><td 
width='50%%'><p>%s</p></td></tr>" % ( niceName, temp ) )
-        
-        for niceName, attr in self.titles.items():
-            writeAttr( niceName, attr )
-                            
-        request.write( "</table>" )
-
-class NullTab( HTMLBase ):
-    
-    def __init__( self, title="Null Tab" ):
-        HTMLBase.__init__( self )
-        self.title = title
-
-    def write_BODY( self, request ):
-        request.write( "\n<p>%s</p>" % self.title )
-
-class ActionTab( HTMLBase ):
-
-    def __init__( self, actions ):
-        self.actions = actions
-        HTMLBase.__init__( self )
-        
-    def write_BODY( self, request ):
-        for item in self.actions.items():
-            try:
-                ((op, attr), title) = item
-            except:
-                (op, title) = item
-                attr = ""
-            request.write( "\n<div class='button' onclick=\"doOp2( '%s', '%s' 
)\">%s</a></div>" % (op, attr, title) )
-
-class CompositeTab( HTMLBase ):
-
-    def __init__( self, tabs, urlWriter ):
-       HTMLBase.__init__( self )
-        self.tabs = tabs
-        self.urlWriter = urlWriter
-        
-    def write_BODY( self, request ):
-       for tab in self.tabs:
-            tab( self.urlWriter ).write_BODY( request )
-            
-    def perform( self, request ):
-       for tab in self.tabs:
-            tab( self.urlWriter ).perform( request )
-
-class TabView( HTMLBase ):
-
-        # tab - int, id into tabs of selected tab
-        # tabs - list of strings, tab names
-        # urlWriter -
-        def __init__( self, tab, tabs, urlWriter ):
-            HTMLBase.__init__(self)
-            self.tab = tab
-            self.tabs = tabs
-            self.urlWriter = urlWriter
-
-        def write_BODY( self, request ):
-            for i in range( len( self.tabs ) ):
-                if self.tab == i:
-                    at = " id='activeTab'"
-                else:
-                    at = ""
-                request.write( "\n<div%s class='tabButton' onclick=\"doOp2( 
'tab', '%d' )\">%s</div>" % ( at, i, self.tabs[ i ] ) )
diff --git a/tools/python/xen/sv/HTMLBase.py b/tools/python/xen/sv/HTMLBase.py
deleted file mode 100755
index d0fca13..0000000
--- a/tools/python/xen/sv/HTMLBase.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from xen.sv.util import *
-
-class HTMLBase:
-
-    isLeaf = True
- 
-    def __init__( self ):
-        pass
-
-    def render_POST( self, request ):
-        self.perform( request )
-        return self.render_GET( request )
-        
-    def render_GET( self, request ):
-        pass
-    
-    def write_BODY( self, request ):
-        pass
-        
-    def write_TOP( self, request ):
-        pass
-    
-    def write_BOTTOM( self, request ):
-        pass
-    
-    def get_op_method(self, op):
-        """Get the method for an operation.
-        For operation 'foo' looks for 'op_foo'.
-
-        op     operation name
-        returns method or None
-        """
-        op_method_name = 'op_' + op
-        return getattr(self, op_method_name, None)
-        
-    def perform(self, req):
-        """General operation handler for posted operations.
-        For operation 'foo' looks for a method op_foo and calls
-        it with op_foo(req). Replies with code 500 if op_foo
-        is not found.
-
-        The method must return a list when req.use_sxp is true
-        and an HTML string otherwise (or list).
-        Methods may also return a Deferred (for incomplete processing).
-
-        req    request
-        """
-        op = req.args.get('op')
-        if not op is None and len(op) == 1:
-            op = op[0]
-            op_method = self.get_op_method(op)
-            if op_method:
-                op_method( req )   
diff --git a/tools/python/xen/sv/Main.py b/tools/python/xen/sv/Main.py
deleted file mode 100755
index ea62af1..0000000
--- a/tools/python/xen/sv/Main.py
+++ /dev/null
@@ -1,82 +0,0 @@
-
-from xen.sv.NodeInfo import NodeInfo
-from xen.sv.DomInfo  import DomInfo
-from xen.sv.CreateDomain import CreateDomain
-from xen.sv.RestoreDomain import RestoreDomain
-
-from xen.sv.util import getVar
-
-# adapter to make this all work with mod_python
-# as opposed to Twisted
-# (c) Tom Wilkie 2005
-
-class Args:
-    def __init__( self, req ):
-        from mod_python.util import FieldStorage
-        self.fieldStorage = FieldStorage( req, True )
-
-    # return a list of values for the given key,
-    # or None if key not there
-    def get( self, var ):
-        retVar = self.fieldStorage.getlist( var )
-        if len( retVar ) == 0:
-            return None
-        else:
-            return retVar
-
-    # return a list of tuples,
-    # (key, value) where value is a list of values
-    def items( self ):
-        result = [];
-        for key in self.fieldStorage.keys():
-            result.append( (key, self.fieldStorage.getlist( key ) ) )
-        return result
-                                                                               
                                                                             
-# This is the Main class
-# It pieces together all the modules
-
-class Main:
-    def __init__( self ):
-        self.modules = { "node": NodeInfo, 
-                         "create": CreateDomain,
-                         "restore" : RestoreDomain,
-                         "info": DomInfo }
-
-        self.init_done = False
-
-    def init_modules( self, request ):
-        for moduleName, module in self.modules.iteritems():
-            self.modules[ moduleName ] = module( self.urlWriter( moduleName, 
request.url ) )             
-
-    def render_menu( self, request ):
-        if not self.init_done:
-            self.init_modules( request )
-            self.init_done = True
-            
-        for _, module in self.modules.iteritems():
-            module.write_MENU( request )
-            request.write( "\n" )
-
-    def render_main( self, request ):
-        if not self.init_done:
-            self.init_modules( request )
-            self.init_done = True
-                                   
-        moduleName = getVar('mod', request)
-        if moduleName not in self.modules:
-            request.write( '<p>Please select a module</p>' )
-        else:
-            module = self.modules[ moduleName ]
-            module.write_BODY( request )
-
-    def do_POST( self, request ): 
-        if not self.init_done:
-            self.init_modules( request )
-            self.init_done = True                       
-        
-       moduleName = getVar( 'mod', request )      
-        if moduleName in self.modules:
-            self.modules[ moduleName ].perform( request )
-
-    def urlWriter( self, module, url ):
-        return lambda x: "%s?mod=%s%s" % ( url, module, x )
diff --git a/tools/python/xen/sv/NodeInfo.py b/tools/python/xen/sv/NodeInfo.py
deleted file mode 100755
index f8b47b1..0000000
--- a/tools/python/xen/sv/NodeInfo.py
+++ /dev/null
@@ -1,73 +0,0 @@
-from xen.xend.XendClient import server
-
-from xen.sv.util import *
-from xen.sv.GenTabbed import *
-
-class NodeInfo( GenTabbed ):
-
-    def __init__( self, urlWriter ):  
-        GenTabbed.__init__( self, "Node Details", urlWriter, [ 'General', 
'Dmesg', 'SXP' ], [ NodeGeneralTab, NodeDmesgTab, NodeSXPTab ] )
-    
-    def write_MENU( self, request ):
-        request.write( "<p class='small'><a href='%s'>Node details</a></p>" % 
self.urlWriter( '' ) )
-
-class NodeGeneralTab( CompositeTab ):
-    def __init__( self, urlWriter ):
-       CompositeTab.__init__( self, [ NodeInfoTab, NodeActionTab ], urlWriter 
)        
-        
-class NodeInfoTab( GeneralTab ):
-                        
-    def __init__( self, urlWriter ):
-         
-       nodeInfo = {}
-        try:
-            nodeInfo = sxp2hash( server.xend_node() )
-       except:
-            nodeInfo[ 'system' ] = 'Error getting node info'
-             
-        dictTitles = {}
-        dictTitles[ 'System' ] = 'system'
-        dictTitles[ 'Hostname' ] = 'host' 
-        dictTitles[ 'Release' ] = 'release' 
-        dictTitles[ 'Version' ] ='version' 
-        dictTitles[ 'Machine' ] = 'machine' 
-        dictTitles[ 'Cores' ] = 'cores' 
-        dictTitles[ 'Hyperthreading' ] = ( 'hyperthreads_per_core', 
hyperthreadFormatter )
-        dictTitles[ 'CPU Speed' ] = ( 'cpu_mhz', cpuFormatter )
-        dictTitles[ 'Memory' ] = ( 'memory', memoryFormatter )
-        dictTitles[ 'Free Memory' ] = ( 'free_memory', memoryFormatter )
-        
-        GeneralTab.__init__( self, dict=nodeInfo, titles=dictTitles )
-
-class NodeDmesgTab( PreTab ):
-
-    def __init__( self, urlWriter ):
-       try:
-            dmesg = server.xend_node_get_dmesg()
-        except:
-            dmesg = "Error getting node information: XenD not running?"
-        PreTab.__init__( self, dmesg )
-  
-class NodeActionTab( ActionTab ):
-
-    def __init__( self, urlWriter ):
-        ActionTab.__init__( self, { "shutdown" : "shutdown",
-               "reboot" : "reboot" } )    
-        
-    def op_shutdown( self, request ):
-        if debug: print ">NodeShutDown"
-       server.xend_node_shutdown()
-    
-    def op_reboot( self, request ):
-        if debug: print ">NodeReboot"
-        server.xend_node_reboot()
-
-class NodeSXPTab( PreTab ):
-
-    def __init__( self, urlWriter ):
-        try:
-            nodeSXP = sxp2string( server.xend_node() )
-        except:
-            nodeSXP = 'Error getting node sxp'
-
-        PreTab.__init__( self, nodeSXP )
diff --git a/tools/python/xen/sv/RestoreDomain.py 
b/tools/python/xen/sv/RestoreDomain.py
deleted file mode 100755
index b836a43..0000000
--- a/tools/python/xen/sv/RestoreDomain.py
+++ /dev/null
@@ -1,50 +0,0 @@
-from xen.sv.Wizard import *
-from xen.sv.util import *
-from xen.sv.GenTabbed import PreTab
-
-from xen.xm.create import make_config, OptVals
-
-from xen.xend.XendClient import server
-
-class RestoreDomain( Wizard ):
-    def __init__( self, urlWriter ):
-
-        sheets = [ ChooseRestoreDomain,
-                   DoRestore ]
-
-        Wizard.__init__( self, urlWriter, "Restore Domain", sheets )
-
-
-class ChooseRestoreDomain( Sheet ):
-    title = "Configure Restore"
-
-    def __init__( self, urlWriter ):
-        Sheet.__init__( self, urlWriter, "Configure Restore", 0)
-        
-        self.addControl( InputControl( 'file', '',
-                                       'Suspend file name:',
-                                       ".*") )
-
-class DoRestore( Sheet ):
-    title = "Restore Done"
-    
-    def __init__(self, urlWriter ):
-        Sheet.__init__(self, urlWriter, "Restore Done", 1)
-
-    def write_BODY( self, request, err ):
-
-        if not self.passback: self.parseForm( request )
-        config = ssxp2hash ( string2sxp( self.passback ) )
-      
-        try:
-            dom_sxp = server.xend_domain_restore( config['file'] )
-            success = "Your domain was successfully restored.\n"
-        except Exception, e:
-            success = "There was an error restoring your domain\n"
-            dom_sxp = str(e)
-        
-        pt = PreTab( success + sxp2prettystring( dom_sxp ) )
-        pt.write_BODY( request )
-
-        request.write( "<input type='hidden' name='passback' 
value=\"%s\"></p>" % self.passback )
-        request.write( "<input type='hidden' name='sheet' value='%s'></p>" % 
self.location )
diff --git a/tools/python/xen/sv/Wizard.py b/tools/python/xen/sv/Wizard.py
deleted file mode 100755
index c4ac53b..0000000
--- a/tools/python/xen/sv/Wizard.py
+++ /dev/null
@@ -1,245 +0,0 @@
-from xen.sv.util import *
-from xen.sv.HTMLBase import HTMLBase
-from xen.sv.GenTabbed import GenTabbed, ActionTab
-from xen.xend import sxp
-
-import re
-
-DEBUG = 0
-
-class Wizard( GenTabbed ):
-
-    def __init__( self, urlWriter, title, sheets ):
-        self.title = title
-        self.sheets = sheets
-        self.urlWriter = urlWriter
-        self.offset = 0
-        GenTabbed.__init__( self, title, urlWriter, map( lambda x: x.title, 
sheets ), sheets ) 
-        
-    def write_MENU( self, request ):
-       request.write( "<p class='small'><a href='%s'>%s</a></p>" % 
(self.urlWriter( '' ), self.title) ) 
-    
-    def write_BODY( self, request ):
-        GenTabbed.write_BODY( self, request )
-        actionTab = ActionTab( { ("tab", str(self.tab-1)) : "< Prev", ("tab", 
str(self.tab+1)) : "Next >", "finish" : "Finish" } )
-        actionTab.write_BODY( request )
-
-    def perform( self, request ):
-        try:
-            action = getVar( 'op', request, 0 )
-            if action == "tab":
-                self.tab = int( getVar( 'args', request ) )
-                oldtab = int( getVar( 'tab', request ) )
-                if not self.tabObjects[ oldtab ]( self.urlWriter ).validate( 
request ):
-                    self.tab = oldtab
-            else:
-                self.tab = int( getVar( 'tab', request, 0 ) )
-                self.tabObjects[ self.tab ]( self.urlWriter ).perform( request 
)
-                getattr( self, "op_" +  getVar( "op", request ), None )( 
request )
-        except:
-            pass
-            
-    def op_finish( self, request ):
-       pass  
-        
-class Sheet( HTMLBase ):
-
-    def __init__( self, urlWriter, title, location ):
-        HTMLBase.__init__( self )
-        self.urlWriter = urlWriter
-        self.fields = []
-        self.title = title
-        self.location = location
-        self.passback = None
-        
-    def parseForm( self, request ):
-       do_not_parse = [ 'mod', 'op', 'passback' ] 
-    
-       passed_back = request.args
-        
-        temp_passback = passed_back.get( "passback" )
-        
-        if temp_passback is not None and len( temp_passback ) > 0:
-            temp_passback = temp_passback[ len( temp_passback )-1 ]
-        else:
-            temp_passback = "( )"        
-        
-        last_passback = ssxp2hash( string2sxp( temp_passback ) ) #use special 
function - will work with no head on sxp
-        
-        if DEBUG: print last_passback
-        
-        for (key, value) in passed_back.items():
-            if key not in do_not_parse:
-                last_passback[ key ] = value[ len( value ) - 1 ]
-                
-        self.passback = sxp2string( hash2sxp( last_passback ) ) #store the sxp
-        
-        if DEBUG: print self.passback
-        
-    def write_BODY( self, request ):
-    
-       if not self.passback: self.parseForm( request )
-        
-       request.write( "<p>%s</p>" % self.title )
-    
-       previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the 
hash for quick reference
-        
-        request.write( "<table width='100%' cellpadding='0' cellspacing='1' 
border='0'>" )
-        
-       for (field, control) in self.fields:
-            control.write_Control( request, previous_values.get( field ) )
-            if previous_values.get( field ) is not None and not 
control.validate( previous_values.get( field ) ):
-               control.write_Help( request )
-            
-        request.write( "</table>" )
-            
-        request.write( "<input type='hidden' name='passback' 
value=\"%s\"></p>" % self.passback )
-        #request.write( "<input type='hidden' name='visited-sheet%s' 
value='True'></p>" % self.location )
-                
-    def addControl( self, control ):
-       self.fields.append( [ control.getName(), control ] )
-        
-    def validate( self, request ):
-    
-        if not self.passback: self.parseForm( request )
-            
-       check = True
-        
-        previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the 
map for quick reference
-       if DEBUG: print previous_values
-      
-       for (field, control) in self.fields:
-            if not control.validate( previous_values.get( field ) ):
-                check = False
-                if DEBUG: print "> %s = %s" % (field, previous_values.get( 
field ))
-
-        return check
-        
-class SheetControl( HTMLBase ):
-
-    def __init__( self, reg_exp = ".*" ):
-        HTMLBase.__init__( self )
-        self.name = ""
-        self.reg_exp = reg_exp 
-        
-    def write_Control( self, request, persistedValue ):
-        request.write( "<tr colspan='2'><td>%s</td></tr>" % persistedValue )
-        
-    def write_Help( self, request ):
-        request.write( "<tr><td align='right' colspan='2'><p 
class='small'>Text must match pattern:" )
-        request.write( " %s</p></td></tr>" % self.reg_exp )
-        
-    def validate( self, persistedValue ):
-       if persistedValue is None:
-            persistedValue = ""
-            
-        return not re.compile( self.reg_exp ).match( persistedValue ) is None
-
-    def getName( self ):
-       return self.name
-        
-    def setName( self, name ):
-       self.name = name
-        
-class InputControl( SheetControl ):
-
-    def __init__( self, name, defaultValue, humanText,  reg_exp = ".*", 
help_text = "You must enter the appropriate details in this field." ):
-        SheetControl.__init__( self, reg_exp )
-        self.setName( name )
-        
-        self.defaultValue = defaultValue
-        self.humanText = humanText
-        self.help_text = help_text
-        
-    def write_Control( self, request, persistedValue ):
-       if persistedValue is None:
-            persistedValue = self.defaultValue
-        
-        request.write( "<tr><td width='50%%'><p>%s</p></td><td 
width='50%%'><input size='40'type='text' name='%s' value=\"%s\"></td></tr>" % 
(self.humanText, self.getName(), persistedValue) )
-
-    def write_Help( self, request ):
-        request.write( "<tr><td align='right' colspan='2'><p class='small'>" )
-        request.write( " %s</p></td></tr>" % self.help_text )         
-        
-class TextControl( SheetControl ):
-
-    def __init__( self, text ):
-       SheetControl.__init__( self )
-        self.text = text
-        
-    def write_Control( self, request, persistedValue ):
-       request.write( "<tr><td colspan='2'><p>%s</p></td></tr>" % self.text )
-
-class SmallTextControl( SheetControl ):
-
-    def __init__( self, text ):
-       SheetControl.__init__( self )
-        self.text = text
-        
-    def write_Control( self, request, persistedValue ):
-       request.write( "<tr><td colspan='2'><p class='small'>%s</p></tr></td>" 
% self.text )
-        
-class ListControl( SheetControl ):
-
-    def __init__( self, name, options, humanText ):
-       SheetControl.__init__( self )
-        self.setName( name )
-        self.options = options
-        self.humanText = humanText
-        
-    def write_Control( self, request, persistedValue ):
-        request.write( "<tr><td width='50%%'><p>%s</p></td><td width='50%%'>" 
% self.humanText )
-       request.write( "<select name='%s'>" % self.getName() )
-        for (value, text) in self.options:
-            if value == persistedValue:
-               request.write( "<option value='%s' selected>%s\n" % (value, 
text) )
-            else:
-                request.write( "<option value='%s'>%s\n" % (value, text) )
-        request.write( "</select></td></tr>" )
-
-    def validate( self, persistedValue ):
-        for (value, text) in self.options:
-            if value == persistedValue:
-                return True
-                
-        return False
-        
-class FileControl( InputControl ):
-
-    def __init__( self, name, defaultValue, humanText,  reg_exp = ".*", 
help_text = "You must enter the appropriate details in this field." ):
-       InputControl.__init__( self, name, defaultValue, humanText )
-        
-    def validate( self, persistedValue ):
-        if persistedValue is None: return False
-        try:
-            open( persistedValue )
-            return True
-        except IOError, TypeError:
-            return False
-    
-    def write_Help( self, request ):
-        request.write( "<tr><td colspan='2' align='right'><p 
class='small'>File does not exist: you must enter a valid, absolute file 
path.</p></td></tr>" )
-
-class TickControl( SheetControl ):
-
-    def __init__( self, name, defaultValue, humanText ):
-        SheetControl.__init__( self )
-        self.setName( name )
-        self.defaultValue = defaultValue
-        self.humanText = humanText
-        
-    def write_Control( self, request, persistedValue ):
-        request.write( "<tr><td width='50%%'><p>%s</p></td><td width='50%%'>" 
% self.humanText )
-
-        #request.write( str( persistedValue ) )
-
-        #TODO: Theres a problem with this: it doesn't persist an untick, 
because the browsers don't pass it back. Need a fix...
-        
-        if persistedValue == 'True':
-           request.write( "<input type='checkbox' name='%s' value='True' 
checked>" % self.getName() )
-        else:
-           request.write( "<input type='checkbox' name='%s' value='True'>" % 
self.getName() )
-            
-        request.write( "</td></tr>" )
-
-      
diff --git a/tools/python/xen/sv/__init__.py b/tools/python/xen/sv/__init__.py
deleted file mode 100755
index 8d1c8b6..0000000
--- a/tools/python/xen/sv/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
- 
diff --git a/tools/python/xen/sv/util.py b/tools/python/xen/sv/util.py
deleted file mode 100755
index cfed397..0000000
--- a/tools/python/xen/sv/util.py
+++ /dev/null
@@ -1,126 +0,0 @@
-from xen.xend.XendClient import server
-from xen.xend import sxp
-from xen.xend import PrettyPrint
-
-import types
-
-def getDomInfo( domain ):
-    domInfoHash = {}
-    try:
-        domInfoHash = sxp2hash( server.xend_domain( domain ) )
-        domInfoHash['dom'] = domain
-    except:
-       domInfoHash['name'] = "Error getting domain details"
-    return domInfoHash
-
-def sxp2hash( s ):
-    sxphash = {}
-        
-    for child in sxp.children( s ):
-       if isinstance( child, types.ListType ) and len( child ) > 1:
-            if isinstance( child[1], types.ListType ) and len( child ) > 1:
-                sxphash[ child[0] ] = sxp2hash( child[1] )
-            else:
-                sxphash[ child[0] ] = child[1]
-        
-    return sxphash  
-    
-def ssxp2hash( s ):
-    sxphash = {}
-    
-    for i in s:
-       if isinstance( i, types.ListType ) and len( i ) > 1:
-          sxphash[ i[0] ] = i[1]
-    
-    return sxphash 
-    
-def hash2sxp( h ):
-    hashsxp = []
-    
-    for (key, item) in h.items():
-       hashsxp.append( [key, item] )
-        
-    return hashsxp    
-    
-def string2sxp( string ):
-    pin = sxp.Parser()
-    pin.input( string )
-    return pin.get_val()    
-
-def sxp2string( sexp ):
-    return sxp.to_string( sexp )    
-    
-def sxp2prettystring( sxp ):
-    class tmp:
-        def __init__( self ):
-                self.str = ""
-        def write( self, str ):
-                self.str = self.str + str
-    temp = tmp()
-    PrettyPrint.prettyprint( sxp, out=temp )
-    return temp.str
-
-def getVar( var, request, default=None ):
-   
-    arg = request.args.get( var )
-
-    if arg is None:
-        return default
-    else:
-        return arg[ len( arg )-1 ]
-
-def bigTimeFormatter( time ):
-    time = float( time )
-    weeks = time // 604800
-    remainder = time % 604800
-    days = remainder // 86400
-    
-    remainder = remainder % 86400
-
-    hms = smallTimeFormatter( remainder )
-    
-    return "%d weeks, %d days, %s" % ( weeks, days, hms )
-
-def smallTimeFormatter( time ):
-    time = float( time )
-    hours = time // 3600
-    remainder = time % 3600
-    mins = remainder // 60
-    secs = time % 60
-    return "%02d:%02d:%04.1f (hh:mm:ss.s)" % ( hours, mins, secs ) 
-
-def stateFormatter( state ):
-    states = [ 'Running', 'Blocked', 'Paused', 'Shutdown', 'Crashed' ]
-    
-    stateStr = ""
-    
-    for i in range( len( state ) ):
-        if state[i] != "-":
-            stateStr += "%s, " % states[ i ] 
-           
-    return stateStr + " (%s)" % state
-
-def memoryFormatter( mem ):
-    mem = int( mem )
-    if mem >= 1024:
-        mem = float( mem ) / 1024
-        return "%3.2fGb" % mem
-    else:    
-        return "%7dMb" % mem
-
-def cpuFormatter( mhz ):
-    mhz = int( mhz )
-    if mhz > 1000:
-        ghz = float( mhz ) / 1000.0
-        return "%4.2fGHz" % ghz
-    else:
-        return "%4dMHz" % mhz
-        
-def hyperthreadFormatter( threads ):
-    try:
-        if int( threads ) > 1:
-            return "Yes"
-        else:
-            return "No"
-    except:
-        return "No"
diff --git a/tools/sv/Makefile b/tools/sv/Makefile
deleted file mode 100644
index c9ae1de..0000000
--- a/tools/sv/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-
-.PHONY: all
-all:
diff --git a/tools/sv/images/destroy.png b/tools/sv/images/destroy.png
deleted file mode 100755
index 
9545fc4837b958ef6e146c2c5f21e30258e8d8ad..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2408
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
LyF6>$`KkW_*RmVu

diff --git a/tools/sv/images/finish.png b/tools/sv/images/finish.png
deleted file mode 100755
index 
6c5d18a9b7f6091f3a92723f27029b7629ee45e0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1189
zcmV;W1X}xvP)<h;3K|Lk000e1NJLTq000{R000{Z1^@s6jnwp200004XF*Lt007q5
z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$H%UZ6RCwBA
zeDmfF0}L=SGBW)8_YX{iFgrUt!>?bz6rVnQ>h|v4JG-}U-)epM@Im_j|Nm@2<-fSN
zxL%5ji(h7CWj&^(q_iEV{_fwue;Gc1{><?G`*#LeSy_fZfBwMD2M8cWY?iUHv4Jd6
zy?5_k(XCszLOy={C<5d&u&}T&FflQ~)dMXB8wL^wTKq{tL1Dd$ib^+7{3^&objtt&
z2*Wav#uqPMWSl*Fw)W-Amr~5k%qSLs)L;W3M}iFI<>mdTuC87O^zkGhX88U4H(U)s
z0HIh03=SrsZ#s@0J5~yFG0X=rOOV;v04NwiKvh+BmYJDZKG2~*U}69P!~#<U3c5RY
z?sObEa-<aILu|gmXAua1LIUKV8#ivG0UgY0XlR(k!NCER0|+2+_<#(4_Uu{u@#DwA
z79j^4IRIn^Fq9bX-o2X$45>nx!vO+_3FH!>H<izvInxXZUrH@Pwh(0Y)vH%Kfhk!R
zWFbHRfi1gz`*!K;*RMrEuAwFXIsE6(pRAWIU1|UYEkFP<0XgzFZ{7?CSxO54jUvAX
z4<6_M1P~K2nR|Zv^htnLmVts3=phzh$b|p|5DPHr+k=uhC^ZrjEFg8D)CCHbA3uJ8
zGC!D2gzxMD0tjTIHZi^eS;WuJ&!DWV%pff-4YuIn!-ov_@81U(PxveZ>HYHMixEHo
zvAlo(UW%9$2ueJ1a&io6YHAF8e0*TTK|Tce4(3Aw!TBE`fS7=qm<eT6m}P>3f($%7
zJYbiCLIdPe5JoNl@Bx4T0$KK-7=@rB2jm0fvJT`MVC2J#D0~2D&0l~3Vgd%mGh*xm
z8T|P1V=(^u^(!b2!149``EwKp;0sBB0Adjq7QPIuLbM5GXprk)y?O=q9k3Vzm-4_Y
z15O+uHWB&lEkFRVaB^~90<t5BaT>@6zy!qrbR4`|A;uz5))EpDS_=?BOu$HA1FT_x
z5E*swdJBY!u?Xs`Z@`e-0}w!<IJ*tBa2axqN=*QA5YV#K!0fUIAb>z+BPf&h0F(1i
zbl(x{TLPB726|>T$R2<IVgltcpsm-%#KiJJ0_f!$B^H7b6)-=}=H});3d)NB0mKAK
zUEjWaV-OJ$nF(~keDvUiSqN)!5$j`6@B!m#7BJJ-gUkdaE`R_62P4QrPywr`s8|3j
zA-1FE8(6CggbB4lU={(@%m8{I2WZ|OkY%8J3J^d{Fc*Uq0KNPP=w%<Emy3Zx@CiA!
z!7RXK5lkGY?>i9B06IPgm=1o!%mB#)1P~K?f&eP~2W*b@0rQ0mP{9_UtG<H59$eD`
z%S4#tU~G^$G&}qTs#_1tx1K=9W`c?*bO!+h5DSiS3>4m{ftLCLgH#<D%$`7D3m~lv
zG*AG@<^rnu3Ji(Qz&!dCXwg<+7P<nod^f)83LwA$D7i&LWmbQW00000NkvXXu0mjf
Dy`t*W

diff --git a/tools/sv/images/next.png b/tools/sv/images/next.png
deleted file mode 100755
index 
da10bbfb9b48eeebdfdebea4c05bd29648fed054..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1270
zcmV<S1PS|zP)<h;3K|Lk000e1NJLTq000{R000{Z1^@s6jnwp200004XF*Lt007q5
z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$h)G02RCwBA
zeDmfF0}L=SGBW)8_YX{iFgrUt!>?bz6rVnQ>h|v4JG-}U-)epM@Im_j|Nm@2<-fSN
zxL%5ji(h7CWj&^(q_iEV{_fwue;Gc1{><?G`*#LeSy_fZfBwMD2M8cWY?iUHv4Jd6
zy?5_k(XCszLOy={C<5d&u&}T&FflQ~)dMXB8wL^wTKq{tL1Dd$ib^+7{3^&objtt&
z2*Wav#uqPMWSl*Fw)W-Amr~5k%qSLs)L;W3M}iFI<>mdTuC87O^zkGhX88U4H(U)s
z0HIh03=SrsZ#s@0J5~yFG0Y&4g&>PS!Gvr%IsnOofU2tMEHg8+e4yGNFfo7tVu2|F
z1>K!HcRG$7IZ_JqAxtxf@8smf0P^LoUAw?yAT~At5(fqEjT<-8fDUFgG&D@&;NSqu
z0R#}(i6DcYJ$sgZ{P=OOMKG6xG=VfbIyy3FXlQ_3%i!$n43>wv78?MW0SqOEyLay<
z0z;}0=5T-jVgeZk)Tn&s%$a6T_#y`p$UtCFFlcLQ!^J?By12LyWg*Dyt5>gf0#mXs
z$U=Ys0$X<b_U+QwuV0ITT!XFw=rRUiYD5tSCIF%=1j+yW`IGh1rArN<Pyz@bCLl-t
z=FOYo*x~>r_Wb#ChAmsRkZmC}iu@itc%TCiKuo}7?)mA{Cjnd$4)QI~*JN7=3LT(_
zSb%1P00a;dFzMSPXFO~Glv43o=;r1I_5m&np}w;R2p}e)A=<cnMXZIORO;pBh0{Wi
z&%b>6VgwLCOz+>nm%^7xaajmVVJLF)^73E{IXOAOSq4jR{s#ykCZGf}t|ADRg`h+O
z%##>$APYgkid;k?1AqVmS@xfS1OO_KB_t#mEG#TA<bbJ~;o7xp4Cq-1T0r~-2p}e4
zQSyvf`#=_nh=?%w`1mjg3k##j0c!__J$v?m)!+yzMt}ff0&2QUC^e#6Bp@Jw;iKKV
zcY_OTT!{^sc-{g85EC#$FHvd{$Vd1r0(pj?pMNbt05J&)3a$axus?7GB`C5*MMcTB
z2<oeEz<AsP5I~?fyA8B(8MdGV<rz=~=;!B0wnZR$pk=H1`1tk!1Q4ifWRRAY?g8et
zpXj~=@wvIVK~+9k7C|k04fM=xkUana!~{w?KwGbiiHYTd1kj5aP^rIt`*v`=A*VWG
zEP__Dvw;pi3Ni~IfLMO~_yJC;zyvV!+qZA#z=ld9tg?d@#K0OHY_Oc19K)eQhluqN
zNbf8j9-ewo6oKpj2q4D&`}f1E6QE1@fIe9Pw9pehW5UWj<eD6xML=~kfbpFNbog%&
z9~3130mKArBSKyK3Fu`Xpn_tc;h#Wa$aNdY5?mI+GBQx#cOaetEY@;>YJbDb0LcRc
z5EFWW04n?kY>xE_2?@CX6>I?p!B>#4z%GNfuwcFe(I9bXGwwG~-FjfY^#nRL6I48*
zI|v|vSg^SgWB@Q2PXjIW1?Dq#V7z()g)M-zF3><w9^eA1`3m&yXJ8(E3bbe|FbiD)
gTD}`!Tml3b0AQ7WJRz?@@c;k-07*qoM6N<$f~_$chyVZp

diff --git a/tools/sv/images/pause.png b/tools/sv/images/pause.png
deleted file mode 100755
index 
6e16daa177a47f3cf58fc0dc83bea2f2cba888c6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1662
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
IM6N<$f|-xg+W-In

diff --git a/tools/sv/images/previous.png b/tools/sv/images/previous.png
deleted file mode 100755
index 
22292d6e9c8d7aa0c3ee21d9dfa96988178837c5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1285
zcmV+g1^W7lP)<h;3K|Lk000e1NJLTq000{R000{Z1^@s6jnwp200004XF*Lt007q5
z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$mq|oHRCwBA
zdGqEC0}QaRurNG+{Fs50laqm$mzRN=nVI3|&!5Wo?%nhJ{rk7o%a<>8zkT~A4php<
z$jJChKtSNBu(0qoAt9kd($dnq*x1<a1JyJ9|NkG1nV6WsGz<U)5F<9rKo$WF)4p@(
zPU(XO4+4P}@csGo2P_X1hpYeh?;it59B2sxKR^E)H8r(0N=iz7K>qDtzkXp@1`t3f
zma($3G5}o<!g)7u-fa5(`7=Mr0+1$b0NEgr#ee_)We^t^e`aiK+$<p>F$3ffWHkT*
z1h)(nWIzoZr%s)kc>DJ4G?*AJ05TjT4>AnIhB*ip0#;U5-9TSf0E7P@Ob<W+vA`H#
zzkX#nfByV5V9+Ike25%e=m6vckl`*aE@1YaJ$t}3$a0WHAj=OQK3ocNh>D6z87N3W
z03d)^U~vUZ1ci6+-X+>1XJ=;yRaI5E*ujGb!M+6P1<8XfJbwImDHj*lU0{&T1o;>s
zfS5oQy?ggg_v+QFogkMH>mv;f4Y;_rwl;&AnHg9f20-e7LCA3C%$a7OxH8CWfB<3w
zx#rTPOAWvz%Ze)@pj)J_u8t!2@#9BO$Y3}W6iTmOzZM0ifl`oV00G1VOxilno;~ve
z`H)<TwrttL@cj96tO*Jv229!EK+nhn1P~L@<`5u*1y}G9V-e5{urIIykY%4feG+)_
z;)N$b0I>jlWsl2OAd5h9Ad6s$0h>jjOpOnK5(hAg*#iU+%a<=-jIhNO%pxx@F9vye
zd9p2n`3|U78z6u{!S^3q$p9)JU0q!<ECQxnhV9$86KxSJWxjv^UJ4+9uqHoHk_E*N
zx<w!W%sb%3K&(aJVhWfZfF5852p~|>|BEgOitKCGu7Oe!hDHku3kF~&Wq_3m!~&o_
z{{aFB<TFNWE&&+^Du!;|x`iSKtWp?!e0&&0L_~<T5ELyO930O80ti%syu}r%pdx4Y
z?%fzZ1lD6DSqMsvKu2B%2p}e4J+v0Y!Dk`Jhm=|fOmLR~0*DD1KYM__`-U&s60%TK
zR1}=3a0MYdJNpkoLBTZu0mQ_|#|N@(HON46E%fvA167(R1u=3E0xenwjI-MS0mKAq
zGXOcWfrh;%lreEx2&_gJxVgDeYGs(OfO+gEuzk`4vIii5z*P)T;ZdMrv$44hmxZuY
z3W_gKCI^-J=*1q$0x>bMd|>EZ2c>X;0Ac}!HOK|Pgi;SIx<r89PQzE#fGh+#YVY2?
z;COoU=n(_3cE`x%(BPX7Oh7Y%4JNQ100G1Tav8{09v+@Qz;Mk0Hg<rH|Cd3Gh5PpH
z1M|@>0yzTMLffvWs8|3}`{TzCusA>fF~O=9XrtvfP-70zpcz2?9hSjym3JVFT!%qh
zSf7BwSqzLCAE4YPkQm4e5C#Y!CM-$yFHmtNFkg5AHLeE+$8V4Z<n{$zGqha@@+DB+
zSD@GyV1v~K=&L@U*gy0H0}wzgc!KI6(3b~+8eD<Fpaaa0-rv7}mj)Wb3pA7)sN@?^
v%?F^G%Roy{0Ha_#P|ZzHxr(ch00=Mu{2iBr9p6k*00000NkvXXu0mjf_-z#c

diff --git a/tools/sv/images/reboot.png b/tools/sv/images/reboot.png
deleted file mode 100755
index 
358e6deb8fc74e1a89d5f615ffaf4d264e8c89fc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3132
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
C+(l6U

diff --git a/tools/sv/images/shutdown.png b/tools/sv/images/shutdown.png
deleted file mode 100755
index 
48a52dce217ebe0e3e3d5c148bb1bfcfa2a7fd88..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2901
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

diff --git a/tools/sv/images/small-destroy.png 
b/tools/sv/images/small-destroy.png
deleted file mode 100755
index 
f800bd768599e99d2b41f832aa0c92d922d73b41..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 483
zcmV<90UZ8`P)<h;3K|Lk000e1NJLTq000UA000UI1^@s6jWW-@00004XF*Lt007q5
z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzbxA})RCw9|
zDFD|00qpGT00RR90PyheIo#abWa8rDNBjHx1{M|;#vUFXoe~lfvk?&y00M{+sDR<_
z-MjgxPoHl8{{1^AND~N4N=h=ke*Kz3T3ULxg@r{1Kmf74d-u-l)TvY5zkdB<Wnp1q
zU}R)uP*PH25D*Xm*}`z^)~!^a=|=zphy`d}_KzPwSV5++v9U48%gZx>z{!&*89*9A
z7^D~=fLMTTas!!SWMsr(U|_(&!NI}s;K2ii$B!Q~01W^;<KxGVx&Q&h1aud>l#~>M
zm6a6(H#av}LRndvK}Sc2;m@Bx3{b!X5I{_Pe0(QFL`1-DLk6Ovq6|z-Obq}3{|8zB
z1R#KzfWDg!vgYT{pC}4JVjx8z476!JKmalE@bGK~S}}j$zI_aD-@aw|{P{D(rAwC>
zu3x_nb_US213-7r1PCA&kUPZ1#Zw<Xe0T`xvB-b_{^<ivX8|gD0JM57J3ISSApHp-
ZzyQ+jk#`~~Vom@6002ovPDHLkV1j@-#AW~h

diff --git a/tools/sv/images/small-pause.png b/tools/sv/images/small-pause.png
deleted file mode 100755
index 
7bbdbfaafed8a5154933cd68bed6e160e8d731a7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 434
zcmV;j0ZsmiP)<h;3K|Lk000e1NJLTq000UA000UI1^@s6jWW-@00004XF*Lt007q5
z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzL`g(JRCw9|
zDFD|00qpGT00RR90PpYbIosRYWaQ-JNBsQ!1{D<*#vUFXof8uivk(vv00M~d!-o$H
zckbNDKX>k2`|sbsIsgCv&j12UOiT<Qwt|AfY;$w-41fS)diU;~*|B5Cx@BZ!I1>{S
z8H9v{7+6_Z84?l_81(h^8LnKpl6vpny%>N1Vgj0${r&rQR!&Y%1`r0B#K_19X0x-i
zgZZ~^-AV-rAf`u;9=U-`fLVzQKw=>GfBg7S7a)L`fbL=knLq$A0R#|}prGK1zkmPY
zQ~@%Tg@xq_Kmaj`h=@$br3hrxzkmN2xVgFK0|XFrdV2b;A3uJ`1KnZx;>8Pww{PDv
z0K*YX1H+U7Xxjl`IF<ke5DUm!psA@(pFTZw^XAP+peg!5!&t6eyY>L+k+r<Myi<Wb
c{{#?V0K+eX)Z)E+U;qFB07*qoM6N<$f`~`84gdfE

diff --git a/tools/sv/images/small-unpause.png 
b/tools/sv/images/small-unpause.png
deleted file mode 100755
index 
6ae5687a0ccb0aa833a06b219ac383e8a884f6df..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 500
zcmV<Q0So?#P)<h;3K|Lk000e1NJLTq000UA000UI1^@s6jWW-@00004XF*Lt007q5
z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzhDk(0RCwBA
zeDmfF12Z!-!-o$aEN|VqmGbc6L-+sx|FemUiyxDfm7OanD7YDj82|!^5vYLS?%lij
zr%s(}2WsHt<>h5~@!|yoBO@aN6B84Iii*l?Gc&UcfB<58_wJn;P*L}{Z{IjgO-&gB
z0s<K1<>eWGrh*j%ZAra%?_LZ*05RRUb0_=9j~}dTY-|iyu3TaG{rfkAudgqIw6rwC
z-@kvsrh*g$1Q4^mz5R5cZXS@pmoHx!9z1veR-~`5&+zHfCx*9g-!lCA^@|@MfS7<L
zu!F1s0gz&#6BvLtFtD?;gE7bnASr+VVgmZ;1jvei|Nem`{QUeF<mBWScJAECaQX6O
z1{M|;23A(qCjbG&BqAaLvKs6jU0q!UNl8hDy?ggET)%!DtOz8>&CNX@Ab?mnIXOY$
zH2?kk_ldw@VgQB$1JHvEAkTpm0TmzM;NX}E5I`&-lZ1qXQh)yZdFbQEkCCrmzt#ta
qCkxOi4}fl83v|v@pxZwI1Q-D0x2PKrYw5%Q0000<MNUMnLSTYAF4Ers

diff --git a/tools/sv/images/unpause.png b/tools/sv/images/unpause.png
deleted file mode 100755
index 
c9713088147357d721c5c3ebfdcbd8c106e53a58..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1890
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

diff --git a/tools/sv/images/xen.png b/tools/sv/images/xen.png
deleted file mode 100755
index 
344c361b3cc1182bf22ab1da590936157f8e851d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 10575
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

diff --git a/tools/sv/inc/script.js b/tools/sv/inc/script.js
deleted file mode 100755
index ebafa1e..0000000
--- a/tools/sv/inc/script.js
+++ /dev/null
@@ -1,31 +0,0 @@
-function update( objRef, text ) {
-    if ( document.all || document.getElementById ) {
-        obj = ( document.getElementById )? document.getElementById( objRef ) : 
document.all( objRef );
-        obj.innerHTML= text
-    }
-}
-
-function buttonMouseOver( objRef ) {
-    if ( document.all || document.getElementById ) {
-        obj = ( document.getElementById )? document.getElementById( objRef ) : 
document.all( objRef );
-        objRef.style.background = "white";
-    }
-}
-
-function buttonMouseOut( objRef ) {
-    if ( document.all || document.getElementById ) {
-        obj = ( document.getElementById )? document.getElementById( objRef ) : 
document.all( objRef );
-        objRef.style.background = "grey";
-    }
-}
-
-function doOp( op ) {
-    document.forms[0].op.value = op
-    document.forms[0].submit()
-}
-
-function doOp2( op, args ) {
-    document.forms[0].op.value = op
-    document.forms[0].args.value = args
-    document.forms[0].submit()
-}
diff --git a/tools/sv/inc/style.css b/tools/sv/inc/style.css
deleted file mode 100755
index 1606b21..0000000
--- a/tools/sv/inc/style.css
+++ /dev/null
@@ -1,95 +0,0 @@
-.small  {
-       font-size: 10px
-}
-
-TD.domainInfo     { 
-       font-size: 10px; 
-       color: black
-}
-
-TD.domainInfoHead {
-       font-size: 10px; 
-       color: white; 
-       font-face: bold
-}
-
-TD.domainInfoHead {background-color: black}
-TR.domainInfoOdd  {background-color: white}
-TR.domainInfoEven {background-color: lightgrey}
-
-body { 
-       margin:         0px;
-       padding:        0px;
-       font-family:    Arial, Helvetica, sans-serif;
-       font-size:      12px;
-       color:          #000000;
-}
-
-div#menu {
-        position:       absolute;
-        left:           10px;
-        top:            10px;
-        width:          160px;
-        padding:        10px;
-        border:         0px solid black;
-        text-align:     center;
-}
-
-div#main {
-        position:       absolute;
-        left:           200px;
-        top:            10px;
-        right:          10px;
-        padding:        10px;
-        border:         0px solid black;
-}
-
-div.button {
-        float:          right;
-        margin:         10px 0px 0px 10px;
-        padding:        5px;
-        text-align:     center;
-        border:         1px solid black;
-        background:     gray;
-       cursor:         hand;
-}
-
-div.tabButton {
-       position:       relative;
-       top:            0px;
-        float:          left;
-        margin:         0px 10px -1px 0px;
-        padding:        5px;
-        text-align:     center;
-        border:         1px solid black;
-        background:     gray;
-       cursor:         hand;
-}
-
-div.tabButton#activeTab {
-       top:            0px;
-        background:     white;
-        border-color:   black black white black;
-}
-
-div.button:hover, div.tabButton:hover {
-        background:     white;
-}
-
-div.button a, div.tabButton a {
-        font-size:      12px;
-       font-weight:    bold;
-}
-
-div.title {
-       float:          right;
-       font-size:      14px;
-       font-weight:    bold;
-}
-
-div.tab {
-        overflow:       auto;
-        clear:          both;
-        border:         1px solid black;
-        padding:        10px;
-}
diff --git a/tools/sv/index.psp b/tools/sv/index.psp
deleted file mode 100755
index 829d468..0000000
--- a/tools/sv/index.psp
+++ /dev/null
@@ -1,34 +0,0 @@
-<%
-import sys
-
-debug = True and False
-
-for path in sys.path:
-    if debug: req.write( path + "<br/>" )
-
-from xen.sv.Main import Main, TwistedAdapter
-
-main = Main()
-request = TwistedAdapter( req )
-main.do_POST( request )
-%>
-<html>
-<head>
-       <title>XenSV</title>
-       <script src="inc/script.js"></script>
-       <link rel="StyleSheet" type="text/css" href="inc/style.css">
-</head>
-<body>
-    <form method="post" action="<%=request.uri%>">
-        <div id="menu">
-               <img src="images/xen.png">
-               <% main.render_menu( request ) %>
-       </div>
-       <div id="main">
-               <% main.render_main( request ) %>
-       </div>
-       <input type="hidden" name="op" value="">
-        <input type="hidden" name="args" value="">
-    </form>
-</body>
-</html>
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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