[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] tools: drop 'sv'
commit 484a3711b42261f3a82e21bf5164a7021d52356f Author: Ian Campbell <ian.campbell@xxxxxxxxxx> AuthorDate: Wed Jul 31 16:15:57 2013 +0100 Commit: Ian Campbell <ian.campbell@xxxxxxxxxx> CommitDate: Tue Aug 20 15:39:58 2013 +0100 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> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- 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(-) 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> </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 9545fc4..0000000 Binary files a/tools/sv/images/destroy.png and /dev/null differ diff --git a/tools/sv/images/finish.png b/tools/sv/images/finish.png deleted file mode 100755 index 6c5d18a..0000000 Binary files a/tools/sv/images/finish.png and /dev/null differ diff --git a/tools/sv/images/next.png b/tools/sv/images/next.png deleted file mode 100755 index da10bbf..0000000 Binary files a/tools/sv/images/next.png and /dev/null differ diff --git a/tools/sv/images/pause.png b/tools/sv/images/pause.png deleted file mode 100755 index 6e16daa..0000000 Binary files a/tools/sv/images/pause.png and /dev/null differ diff --git a/tools/sv/images/previous.png b/tools/sv/images/previous.png deleted file mode 100755 index 22292d6..0000000 Binary files a/tools/sv/images/previous.png and /dev/null differ diff --git a/tools/sv/images/reboot.png b/tools/sv/images/reboot.png deleted file mode 100755 index 358e6de..0000000 Binary files a/tools/sv/images/reboot.png and /dev/null differ diff --git a/tools/sv/images/shutdown.png b/tools/sv/images/shutdown.png deleted file mode 100755 index 48a52dc..0000000 Binary files a/tools/sv/images/shutdown.png and /dev/null differ diff --git a/tools/sv/images/small-destroy.png b/tools/sv/images/small-destroy.png deleted file mode 100755 index f800bd7..0000000 Binary files a/tools/sv/images/small-destroy.png and /dev/null differ diff --git a/tools/sv/images/small-pause.png b/tools/sv/images/small-pause.png deleted file mode 100755 index 7bbdbfa..0000000 Binary files a/tools/sv/images/small-pause.png and /dev/null differ diff --git a/tools/sv/images/small-unpause.png b/tools/sv/images/small-unpause.png deleted file mode 100755 index 6ae5687..0000000 Binary files a/tools/sv/images/small-unpause.png and /dev/null differ diff --git a/tools/sv/images/unpause.png b/tools/sv/images/unpause.png deleted file mode 100755 index c971308..0000000 Binary files a/tools/sv/images/unpause.png and /dev/null differ diff --git a/tools/sv/images/xen.png b/tools/sv/images/xen.png deleted file mode 100755 index 344c361..0000000 Binary files a/tools/sv/images/xen.png and /dev/null differ 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> -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |