[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> </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 zcmWkwc{r5YAAjH3V;CB;6_ZQ`VaA9o!#g4jGRD$GiJ7s)O_H)iy))`sldan%)eyH$ zj5bPYl59^&q9m<9yB1lBy7;~Qan5<pdCqg5@A-Z|%Qu_5)m=qNR|x<B6;BUW9<ti} z83Y_M=efnaMHWmH+lLJRFZ+9a`BunYC((_c=)X5IF)2JD0$_{w3L+?;d%~k4coE^E zlzkl$jsT!E>gmc3NFEUUx4i6(zNL6mzZVOasH;sjrOt6?-Zmz6zQ3Pdyzu*H?bw4O z%k#2MCkB)GAW|qi)ZEsVw9UoklRX~aMwQLmg@=D6^(H7o0E0JCcf!DV8f~&oW?W|A zm>ib0yp(>8WZ*=nTUlAjuV1$USYRZR!4UUld`5@MqIBSM5%Y7CT4)Cchm5?uCmShF zm6eq@wJt^3Iy*1Ba|W?$kmwL`Y%NyyND}w%o=*I5r{){WUH9QNglU2uFqHrP!I2DB zwM-Vz_x0VIQBcrrFT)!Y2=yVL@G~PU0ZqN!e|1}J>yCTL&ruqB3ejW82gvC#a6U{2 zipN)w$;DKOM3O7+m?fJ;0vI(<eROK)@ar2<m)%e3tNflBCH1k6KFx4GvLxaL1nh{2 zjI_}kd(LW^z!E4GESz_$T_(w(tMSm!8dGCqV>An-rJx?}v9+!D?Ck9H&w7qlgD@=I zYypM7T=L~@W4(q4^M+hraPkPmAXczb3d+(5J<1!Rmvr^?l44_HlfapGhteiM6rr{a z_Vh*ZoBKZZ*R9hVTFX6bh=(0N4G%vCo|qAheb0#+4t~*neT+!^1`79FId;rVnf|^> zQKd?OrBlfqwV}&j-qiaKnWzEwN7+1H5y;=gke)e{F{6415VbZP`gt9xR46)Ooy7qF zY&mKy>OA;$@U+U6T-tXH0(=D&W%>mtNuHozo_am{?7ZcpDjWrtrxLaO?HZH5SsV+j z$xw$K@!maE3R7eJ8Ak{RPyYP$jIBkc>Y7fp%`vIxoJMsZd+S3e-zn@f6Tt$VB(>hz zJq)0-Ry0jx`}`HrLDZ^Qv}PM+uC%n2Xm4*nH9}?p0l^$kPlmR(Ha#mh_mP*c0F+w< zvJ!?oOmBV!@JOhVpw!3u4hJ{n^`|NY<z2mcmB|kYVJc?Ds|ntnt|!wJk>rf}dRs?2 zT>dQng941#E0O}J%V6YLde~wrfzR1`EE|ncBlGU_8qyXLi0$Q-Mg}1vAvi59E!>a- zu=}T<i+|}((+6xMI?c_^+Hn5Sz$dOJOD=9bn*+9%qP&R|_``bC84I?8*D8@lu6*L3 zpPx@uw3=>Vjt$<~?`quEcEW&p@9?6oTV7^n=EGO7v{uiwq^k1u`8yio*AiOs1j_no z@k3Hf6?sydYc|-^v$72H-0T_a&=30H-2=JNC&Z}e#b0y86Z)*?EG&sck{f4dr*m&5 zB8Na2MSRzfh-3ouG^EBhZct8Le;ZnRsl5E5thV;VyIGWjn)IcPhe<L-wQT?R=Jp=p zru`$t9OH(D25m<cE4wBEj=PaQKUHp)rJ@FTclUHJOunjhJ!U~OVq>vZ^RwgRM|TfQ zDy;2%sC;*g-a%Bjh+=5i93~RAK;G~0cfNF;b?BnlAbbal%Yg!6=AgYoD@3uR&S8U` z!y)x?*i(X%pb^;+rt`ewzJAUonn6a95d)l^9rtfMWw}cU;Tf5JLl3;*tE|x@cLB9< zDTESYAt<*NBrh+qIOUT3eVR`F^!7E1CH+l53MWkCd+@`1T;ed1=xcbAzBY(F(0wXZ z7RO?AaD9AKR$rk{eSPZ?KUVaH*LKRPyV$5bPB3lJo(?6A|G7&au+F~a9T=$T_PM9Z z%X&9nGOc$>?bm+`%pJs%V2Fhg-1VS1BRAWHo$Yn7rBGsJmEcbh*_k{w=4E1`k#*>l zl$45zjbXygItanws&XP@LAkdS`hk%fMa(ZPI<V9Gr*#+;?1SKpQ;w6LpI^l+YNmn+ z0b(VRpTK2JQvhn%GWhW-Ui*cqh57lcFO@l{KaqKUSNHe6V4KIrs$TmYGj_mi#qs@4 zFdzV{whKx(jGco6r7dGv>UNP$-J<2}e;CeMnfAI$EhCZ|B&(dy*7kxl>8WGt4hKO~ z47}(lzqqw*6FYGZeiscTq4iIsqX?9+KE<?dyP9E1HOz|1`-*E9whS@3pKG??_<QK1 zZD?p{UZtn^H2z8o0*4Kd*EzsE$T(o=LX?QR!tE~}=4W)F={CVE+?$o1U7jTl-X!0` z1e<*S5LsIJb)~;8%wZ4l(I<<>R{4`*flluLgp<{%FibH0m_}s;VTytWs+`7_UXt%Q z$A{5nD_<O5hgT*L;5L^6p<1sAHGm|!j^}<mfczTuudrgkO;&I>ZNVx>nv<i{5B8Qh z9z7uP@$vDS{*<d_sW^@j%%Ub6z5Wm&&!*e^(?*wkbk!bi9@uC{Q`y=*1yI*D_LuS! z5)!nVvTj5@TiHjzrGD0>|N9InaB)S&Cp??|aI<V&SD-6Ji0ZD6wnJzx8LN;=^Q#*h z9XO$=+fnRw4_t>WWjdMF)zwZ2UinpsJB4yH3#C8w<^D>o?Lf(2&>F5_#?*#rs(==2 z3JTP4adB}amACf3cd8hWQf?`%gq9xW2mn~PC&rE9<AaY{j7+!*z;PYJBonAZ!<slc zF`*P$Tx1=tio#iJPE52;-h$JCe?`dtbMs!rZn#A<Gc)^!t3%uXv9i=9f_IT#w^{g( z6qTU@L~1WspM(HwrPX9I`fI(|F|$@z+?6CY3+MJA$%V2_)EW|ol{W2Fe{l`<8gCt& z(bU9B=IJBaH6x7bD)ZZvHb0dRW`CQq-aKQq%EY|5bs4(gIR^CJ!c(_%-vNQuvLJMO z0++d>mxJ#U%TO-C!Md?tm?0DXN~86+;p5Zf;NalGrKKejlm-JXr{~|?-0g4EtuPt$ z(Mdapw(DtY%Zxd>k+u;oGKi+BYA9Ngl?LctCNvsM+J`7Grx$p!Adp=Q5)+Mau#0YQ z`t~{jw&7;wO%Z0eD)4HM7@y^Fx*0X{Gf)xKDG)JWpjmnaX-sOB<ya?`ei4sa^#B`# z5(@_U`?Vb>T{>G@XGWhrWMK4SD33$KoF14P8Wx=_E6clH0U+kp#YS&7$4i~p11$IH zDKafZvKntX43UX4BPC9aERA4>D5mKpKb47J8Ks^w&iS&_{<57%#2s=OqMSl12mv3< zcARGjw>Z#WYzs5f_So&Fpx-Xs#S`LL|BAt0Kg30{eUJ>tuR5X_>cwt2d{JT=$NBp? zG^c;*lUr+hY<2sb27RwD);w47$4}!^iF|{5_?KShiccw~sp%UFfFYBxK&!x=JDaF9 z8eue;1OtW*aKvcWSqY-_H1ywG6FTlRzQ<qYi2cho5v>R8R99C|){-L-eeRV%(slOC z%<T9JNA7OV$#B~pRR;9!zNY5p)R+!+q#?TLLF5PD9c)ap)Z}X)eICowyz~LQ9UKJe z)!$$;nc1O6I5o(~a`Mgf2<7Mq_6GUaY%sM;B0aeJPRfe0ax&!b53H-IsC4hSj!2Z@ zp|v9ew_-J6PbPs+#Q?=w=9diIjvFam8HGE((&gO)6bp;{77WIB&~5~Y@3B|Zt7{=` z%M*QO+hq8&;<JGcVZ<15PNE=pKbMD2!S%0h#0}}AZioIrna#abSP<R3qCiwuVd?)g z5rfi7{{7>cI(@}BShv2rt`nMxfG!-6l_&8Z8PI;{j*S~b&)#EgfEx67YS{Uy9RUFv feXAVM7;V6O*9ZG8<Bt1~z8LUy+v-~55+?aSHj%~{ 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!F1s0gzBvLtFtD?;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 zcmV-o2c7tdP)<h;3K|Lk000e1NJLTq001@s001@!1^@s6j74hQ00004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU&^hrcPRCwBA z{Qv(y1GT{0w{Hc2lo1f?y?XUZ^Zxz&CSSgMk^cAZA1@GdK$ZPuVq*Hj#>VzaL`3A0 zva<3i4i1h>K=E_J!onY@<raVdVx-h#A3uKN2U4!@-o10aaN&aQ^XJc{$uS4$(J!j1 zsvC86bvH0GGw<f-=l@8Fy8r@+Y>xpwqyUVCptEPs#@xDf%aDPJ02qU>9334yg@lCG z0X_JD95Vm{h-8lelN%q9iamDhSkB|ek2M%*2pAa||G2uk76=LoE(RvkPo(Gt2q2O? z2K1B*&@&l8PX#m35ddTGp_i9eiiCv39%A(X1Q5|4117zkO`A3~e*XMfh+%+$ySsZX zu&|jzj9P#IBIq%ohXjEoTiM2q8!H$F0g#uMUu<JzlMl>$@A0Vv2q3&3113F*4<A0% z?A*CCn-t4gSXe;$gW>n@-!$<YH#hegA0HoIV7_~SOASB(G2!u)Ai19M@bF*&TFk)8 z%1RTDef|2?WHS(e+=xpJKmg(N*pDAS%E<MUoSYnkq@*NGJ@@U~H<Mkvb}hvv4-i0D zJqC=a98&WXur&eq6b#VXbMN23_dI#>WGOZ|fB?eq*qb+RT-L8&-$tsZfW<M2r|9K5 zU<0A+-o1M+=;8nY#Dre?g6gU7-@o%x!&Atf^Y!(mndf%w*s%-RaDW4V07CH?u#Fab z{P=N_Dqmpx4zH(R09d)w(sPW!m_tdD00G2=l&=&HA3mHzs);vm-efp)<_uA4Y3aE; zcka{xV@(0Z2M8dz$A13&8ANW|@6@SNgTiybQoIw!1_&S~Xo0~GbX*c8h7JbL0aIPr z>({SA-6#ft0AhmXEmvS{X;W(OVDKEUPZ$lN0Ro5#S{gc2%V2Um2kc~0Gp|hm(EtI& z1Wbkkr%#^_q-Lm*>N!w7M=j3*+rBI>U%nIo2p}e4FW3lJgNsu;BM+eG7=cw*7(f6q z0bAjEwCZAz>bcO+PzFv;PKxaXcD4Kg0*DD1ZJM;~Kat`&U>}PiDk_R%&jDNio&W*F zbp85uTUvJxN%0&zJ3BQz#|RKWOu**9I0GF3IiBO<;v%~Y0SF)_U@5}IKqo*i&w)k- z00Ib9Dzeja%z_lpfl5hGfdcBllA06&0*LAF-@kMpkO2lJ(Q3bZ`2rq4Au-1O0|XE# zDgL3Sr%X&t7|hJfh*AqIu^BdP+C=i85YSJ50RjlvPh|QroIC|ihm4GW0Rjl*vCo6e zQ?FjVBHL5Y82bSbKuo}H`xa_WB~imu8#ivGXiO5=TVV$XASO{!(d(pS=E3eMSZV|a zAQoO;-b;hQQ!ie;VA#BQGgU^9fiZRjAb^;Fb;UU#<Nt8+6fpJu(ACuq0SF)_MMcFA zz+UVfYUZ<n@)WG<v$C@K01!an9yHL0Rn)4eN%hp0EnBEMc>yftxj{5Q0D(OwARw@t zjAjc40C|X1PyPD!i)x+%M$QLqZEZ;q8z6wd9@Eg!_^70$RQ&1FCyG1;imie26cjYu z+uMUD<pBZ+KCUPtBC?K$hvyYJd2KLw3fTR+Atxud4#o!vASR@|@c<~%1ngFmWFTnx zOhrXypkoTuy%F~J_kRH60|XGt*u9L5%wk}EV<4p<0cHFR8#aKZbOy{*@7}#zrJ$gI z61o5ZgyJzHBco61>guk*ymp(EBneCg;1&Ze&w*MLwDQ!?pFdv%TTd6gyu45f2!H^> zm>+X?cHX0^syYdnB>$3_#<6-1)}W<@r=XqD*Xil$81s1m0fco%Gb}7@ija^{H!w6v z&A=$hlGdIA+P5J)I~(iJJU{^9oP*ZX)a+tsXaDl&4{80-@87?JJ$K{A4O)9@C$Ngb zIgtVoKzNr!?Ay0b0_ec!AjeU2e4SG8`Sa(sKu_g_hKAx?4gnBAO!y3Na&mg1tgI{q z@)R&8{tdK;K#>4Se)972srWnv0ssL-^pc~QGiS~P7OSp&e0;K`4z5rG08<U9vHl*I zr<90M4-h~kEfQO`YL(0L=g+4C^PL(s#@LCCC1BFq3k*=!tgI}1V)X$85XsB>fb|h* zWx@OpA3msab8~A`qw$Q(Ltnpsy$!U3MOawaAR;1yq=qa&0Fk{AbM4x-3NK&2ya254 z9su*8J_iQ}12vK;s1ycz=pxWVAA!C5_{7A-2jrLo5I__!on5zX9Y3(Xas}3TwZIk& zC$P<?3L2gUd6F29g6s!1%YcQ`ePCbe0?;#o{QUd^(b3TqEu94jAVzBToY${kFYxy5 zTO(kI>jAsyVPC#{`3p23)ISmiVjfrz7Z@uqfl2r^FaX{HdldS>07wS5QO`w1MNw_B cGeCd=0K&9|^EfPl`~Uy|07*qoM6N<$f`4^S82|tP 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |