diff options
author | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2005-05-25 08:42:31 +0000 |
---|---|---|
committer | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2005-05-25 08:42:31 +0000 |
commit | eb739ebddc7ed75e9fa3b260837ca223b099b3b3 (patch) | |
tree | 5aae3754b75d717c6e001d7e8abfd68a23ceeb73 | |
parent | 38a5a90c1a002425033e9c5132a1901e4c4567ef (diff) | |
parent | 76105d8a76f6d2c1ee64089e5694f4a947bebfbb (diff) | |
download | xen-eb739ebddc7ed75e9fa3b260837ca223b099b3b3.tar.gz xen-eb739ebddc7ed75e9fa3b260837ca223b099b3b3.tar.bz2 xen-eb739ebddc7ed75e9fa3b260837ca223b099b3b3.zip |
bitkeeper revision 1.1545 (42943a77oCSQWIL-DLwwTV7xUND3eQ)
Merge firebug.cl.cam.ac.uk:/auto/groups/xeno-xenod/BK/xen-unstable.bk
into firebug.cl.cam.ac.uk:/local/scratch/cl349/xen-unstable.bk
47 files changed, 1 insertions, 1768 deletions
@@ -732,7 +732,6 @@ 405eedf6_nnNhFQ1I85lhCkLK6jFGA tools/misc/xencons 40c9c4697z76HDfkCLdMhmaEwzFoNQ tools/misc/xend 41adc641dV-0cDLSyzMs5BT8nL7v3Q tools/misc/xenperf.c -4107986eMWVdBoz4tXYoOscpN_BCYg tools/misc/xensv 4056f5155QYZdsk-1fLdjsZPFTnlhg tools/misc/xensymoops 40cf2937dqM1jWW87O5OoOYND8leuA tools/misc/xm 4270cc81g3nSNYCZ1ryCMDEbLtMtbQ tools/pygrub/Makefile @@ -803,22 +802,6 @@ 3fbd0a42l40lM0IICw2jXbQBVZSdZg tools/python/xen/lowlevel/xc/xc.c 40dc4076St6AmPTmQPrtQ6LGHPxGmw tools/python/xen/lowlevel/xu/__init__.py 40dc4076CwBYRTUQDdbdU1L6KcLgSw tools/python/xen/lowlevel/xu/xu.c -41052eb84_irpx0E9N_kqBp9eoin5g tools/python/xen/sv/CreateDomain.py -4107986egkTAMIHW7n-i4ShvCGWpLQ tools/python/xen/sv/Daemon.py -40fcefb2qm13BbRZBydAatOavaS0fQ tools/python/xen/sv/DomInfo.py -40fcefb2-RIU8GB67mJMRzybME9bxw tools/python/xen/sv/DomList.py -40fcefb23FfQn-ZBCbcHqA0cPGqQxw tools/python/xen/sv/GenTabbed.py -40fcefb2QZAn3u3sX-M7NXBjOv5HGg tools/python/xen/sv/HTMLBase.py -40fcefb2vnfDbl4w_yCTedROPuqs0g tools/python/xen/sv/Main.py -4186e24fZMp7_bX4f50MvUscdrST9Q tools/python/xen/sv/MigrateDomain.py -40fcefb24h-04WaHag-Tg4nxWPhTig tools/python/xen/sv/NodeInfo.py -4186e24fb4YtJw155tNtSXXN6nEWqA tools/python/xen/sv/RestoreDomain.py -4186e24fVXt0lfeQSAy1eiFKnPCHTg tools/python/xen/sv/SaveDomain.py -40fcefb2Sif__6AqrANeBQZZfvP-6w tools/python/xen/sv/TabView.py -41052eb8UrgtUkuJPg7oY1tutVQHsg tools/python/xen/sv/Wizard.py -40fcefb2DqteqCCZYDCvvh4Q5jBd0w tools/python/xen/sv/__init__.py -4107986e6qN1IdvIDdId0AYFmDMkiQ tools/python/xen/sv/params.py -40fcefb4rnaZNjqsBu7A5V2rlLyqRw tools/python/xen/sv/util.py 40d8915cyoVA0hJxiBFNymL7YvDaRg tools/python/xen/util/Brctl.py 40dfd40aGqGkiopOOgJxSF4iCbHM0Q tools/python/xen/util/__init__.py 4270e4efFg3wHCCxXpA0h6yoMTkeSQ tools/python/xen/util/blkif.py @@ -894,33 +877,6 @@ 40cf2937PSslwBliN1g7ofDy2H_RhA tools/python/xen/xm/opts.py 40cf2937Z8WCNOnO2FcWdubvEAF9QQ tools/python/xen/xm/shutdown.py 41b88ba6_C4---jeA895Efg9YFZgKA tools/python/xen/xm/sysrq.py -40fcefb2K1xqVVT4D-p7nL2GzS4scg tools/sv/Main.rpy -40ffbcb66Dj5F-1kCK9BcgSqCWkt1w tools/sv/Makefile -4120b0e5L_nW-u0MWRfIdXg4ng4OjA tools/sv/images/destroy.png -4107c921_OR9NTSv2dKFiLCXxrXoxA tools/sv/images/finish.png -40fcefb3wXQMsl9WkgQAVtdrupm4sw tools/sv/images/left-end-highlight.jpg -40fcefb3K6ESt5sQhD9aCQRscQIlXQ tools/sv/images/left-end-no-highlight.jpg -40fcefb3BUT98zPzW8kAFKuxGdh4XA tools/sv/images/middle-highlight.jpg -40fcefb38OTgsUKHBpwshLLIsiIaCA tools/sv/images/middle-no-highlight.jpg -41052eb9SDUqSLGtG6rxk6Ep5fOhFA tools/sv/images/next.png -40fcefb32SPtrw36c4S6YGFlLvkKuw tools/sv/images/orb_01.jpg -40fcefb3Ok5qkX3iM7ZEPVkRInrUpg tools/sv/images/orb_02.jpg -4104ffca9_GhWOxRE-83uZIad2Z1gg tools/sv/images/pause.png -41052eb9NQqHe_f9-ev1CaA3y5YYZg tools/sv/images/previous.png -41013a82ILk71xLqWFH5ZO5VmOIvBw tools/sv/images/reboot.png -40fcefb3JnT5XeKTuVF4yUMGOtuNZg tools/sv/images/right-end-highlight.jpg -40fcefb3-DuYOS7noo2W7b_0p7TOUg tools/sv/images/right-end-no-highlight.jpg -40fcefb3qNbAZR5FYGPAZ9sFPVMTDA tools/sv/images/seperator-left-highlight.jpg -40fcefb3dgsa24WLk_BJeYQHrDLuOg tools/sv/images/seperator-right-highlight.jpg -40fcefb3FtiX4Pd2kT8wDlp8u8xRhQ tools/sv/images/seperator.jpg -41013a82sUdUqBv8EoAUJii3gsZ-4g tools/sv/images/shutdown.png -4120b0e5RyNoIQNMjUs4A2kshovjaQ tools/sv/images/small-destroy.png -4120b0e6vW66wW6WvjQyFD0AZH2tng tools/sv/images/small-pause.png -4120b0e6USof7ieyGxEvtCdTMpxaQw tools/sv/images/small-unpause.png -4104ffca-jPHLVOrW0n0VghEXXtKxg tools/sv/images/unpause.png -40fcefb3yMSrZvApO9ToIi-iQwnchA tools/sv/images/xen.png -41013a83z27rKvWIxAfUBMVZ1eDCDg tools/sv/inc/script.js -40fcefb3zGC9XNBkSwTEobCoq8YClA tools/sv/inc/style.css 422f27c8MDeRoOWZNdcRC5VDTcj3TQ tools/tests/Makefile 422f27c81CCtXt4Lthf7JF3Ajr0fUA tools/tests/test_x86_emulator.c 420b963dK3yGNtqxRM8npGZtrCQd1g tools/vnet/00INSTALL diff --git a/tools/misc/Makefile b/tools/misc/Makefile index 5281e94e00..5eebbfda12 100644 --- a/tools/misc/Makefile +++ b/tools/misc/Makefile @@ -16,7 +16,7 @@ HDRS = $(wildcard *.h) TARGETS = xenperf xc_shadow INSTALL_BIN = $(TARGETS) xencons -INSTALL_SBIN = netfix xm xend xensv xenperf +INSTALL_SBIN = netfix xm xend xenperf all: build build: $(TARGETS) diff --git a/tools/misc/xensv b/tools/misc/xensv deleted file mode 100755 index 339ed66a93..0000000000 --- a/tools/misc/xensv +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python -# -*- mode: python; -*- -#============================================================================ -# Copyright (C) 2004 Tom Wilkie <tw275@cl.cam.ac.uk> -# Copyright (C) 2004 Mike Wray <mike.wray@hp.com> -#============================================================================ - -"""SV web interface Lives in /usr/sbin. - Provides pretty HTML management interface. - - Run: - - sv start - - The daemon is stopped with: - - sv stop - - The daemon will be accessible from http://localhost:8080/ -""" -import os -import sys -import re - -# add fallback path for non-native python path installs if needed -sys.path.append('/usr/lib/python') -sys.path.append('/usr/lib64/python') -from xen.xend.server.params import XEND_PID_FILE - -class CheckError(ValueError): - pass - -def hline(): - print >>sys.stderr, "*" * 70 - -def msg(message): - print >>sys.stderr, "*" * 3, message - -def check_logging(): - """Check python logging is installed and raise an error if not. - Logging is standard from Python 2.3 on. - """ - try: - import logging - except ImportError: - hline() - msg("Python logging is not installed.") - msg("Use 'make install-logging' at the xen root to install.") - msg("") - msg("Alternatively download and install from") - msg("http://www.red-dove.com/python_logging.html") - hline() - raise CheckError("logging is not installed") - -def check_twisted_version(): - """Check twisted is installed with a supported version and print a warning if not. - Raises an error if twisted is not installed. - """ - # Supported twisted release and major version. - RELEASE = 1 - MAJOR = 3 - try: - from twisted.copyright import version - except ImportError: - hline() - msg("The Twisted framework is not installed.") - msg("Use 'make install-twisted' at the xen root to install.") - msg("") - msg("Alternatively download and install version %d.%d or higher" % (RELEASE, MAJOR)) - msg("from http://www.twistedmatrix.com/products") - hline() - raise CheckError("twisted is not installed") - - - (release, major, minor) = version.split('.') - release = int(release) - major = int(major) - if release > RELEASE: return - if release == RELEASE and major >= MAJOR: return - hline() - msg("Warning: Twisted version not supported: %s" % version) - msg("Use Twisted version %d.%d.0 or higher" % (RELEASE, MAJOR)) - hline() - -def check_xend(): - """Check xend is running - """ - - if not os.path.isfile(XEND_PID_FILE) or not os.path.getsize(XEND_PID_FILE): - hline() - msg( "Warning: Xend has not been detected as running." ) - msg( "Please start it immediately with: xend start " ) - hline() - return 0 - - # Read the pid of the previous invocation and search active process list. - pid = open(XEND_PID_FILE, 'r').read() - lines = os.popen('ps ' + pid + ' 2>/dev/null').readlines() - for line in lines: - if re.search('^ *' + pid + '.+xend', line): - return 1 - - hline() - msg( "Warning: Xend has not been detected as running." ) - msg( "Please start it immediately with: xend start " ) - hline() - return 0 - -def main(): - try: - check_logging() - check_twisted_version() - check_xend() - except CheckError: - sys.exit(1) - - from xen.sv import Daemon - - daemon = Daemon.instance() - - if not sys.argv[1:]: - print 'usage: %s {start|stop|restart}' % sys.argv[0] - elif os.fork(): - pid, status = os.wait() - return status >> 8 - elif sys.argv[1] == 'start': - return daemon.start() - elif sys.argv[1] == 'stop': - return daemon.stop() - elif sys.argv[1] == 'restart': - return daemon.stop() or daemon.start() - else: - print 'not an option:', sys.argv[1] - return 1 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/tools/python/setup.py b/tools/python/setup.py index 76861908a6..e6b04f8708 100644 --- a/tools/python/setup.py +++ b/tools/python/setup.py @@ -39,7 +39,6 @@ setup(name = 'xen', 'xen.util', 'xen.xend', 'xen.xend.server', - 'xen.sv', 'xen.xm', 'xen.web', ], diff --git a/tools/python/xen/sv/CreateDomain.py b/tools/python/xen/sv/CreateDomain.py deleted file mode 100644 index 4378897e5c..0000000000 --- a/tools/python/xen/sv/CreateDomain.py +++ /dev/null @@ -1,163 +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 ) - -class CreatePage0( Sheet ): - - 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" ) ) - -class CreatePage1( Sheet ): - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Setup Kernel Image", 1 ) -# For now we don't need to select a builder... -# self.addControl( ListControl( 'builder', [('linux', 'Linux'), ('netbsd', 'NetBSD')], 'Kernel Type:' ) ) - self.addControl( FileControl( 'kernel', '/boot/vmlinuz-2.6.9-xenU', 'Kernel Image:' ) ) - self.addControl( InputControl( 'extra', '', 'Kernel Command Line Parameters:' ) ) - -class CreatePage2( Sheet ): - - 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 ): - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Setup Virtual Block Device", 3 ) - - def write_BODY( self, request, err ): - 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, err ) - -class CreatePage4( Sheet ): - - 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', '1.2.3.4', 'VM IP Address:' ) ) - self.addControl( InputControl( 'ip_subnet', '255.255.255.0', 'VM Subnet Mask:' ) ) - self.addControl( InputControl( 'ip_gateway', '1.2.3.4', 'VM Gateway:' ) ) - self.addControl( InputControl( 'ip_nfs', '1.2.3.4', 'NFS Server:' ) ) - -class CreateFinish( Sheet ): - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "All Done", 5 ) - - def write_BODY( self, request, err ): - - if not self.passback: self.parseForm( request ) - - xend_sxp = self.translate_sxp( string2sxp( self.passback ) ) - - try: - dom_sxp = server.xend_domain_create( xend_sxp ) - success = "Your domain was successfully created.\n" - except: - success = "There was an error creating your domain.\nThe configuration used is as follows:\n" - dom_sxp = xend_sxp - - - - 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 ) - - 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.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 ) ) ) - - vals.disk = vbds - - #misc - - vals.pci = [] - - vals.blkif = None - vals.netif = None - vals.restart = None - vals.console = None - vals.ramdisk = None - - #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) - - try: - return make_config( vals ) - except: - return [["Error creating domain config."]] - diff --git a/tools/python/xen/sv/Daemon.py b/tools/python/xen/sv/Daemon.py deleted file mode 100644 index 510cfa9f04..0000000000 --- a/tools/python/xen/sv/Daemon.py +++ /dev/null @@ -1,108 +0,0 @@ -########################################################### -## XenSV Web Control Interface Daemon -## Copyright (C) 2004, K A Fraser (University of Cambridge) -## Copyright (C) 2004, Mike Wray <mike.wray@hp.com> -## Copyright (C) 2004, Tom Wilkie <tw275@cam.ac.uk> -########################################################### - -import os -import os.path -import sys -import re - -from xen.sv.params import * - -from twisted.internet import reactor -from twisted.web import static, server, script - -class Daemon: - """The xend daemon. - """ - def __init__(self): - self.shutdown = 0 - self.traceon = 0 - - def daemon_pids(self): - pids = [] - pidex = '(?P<pid>\d+)' - pythonex = '(?P<python>\S*python\S*)' - cmdex = '(?P<cmd>.*)' - procre = re.compile('^\s*' + pidex + '\s*' + pythonex + '\s*' + cmdex + '$') - xendre = re.compile('^/usr/sbin/xend\s*(start|restart)\s*.*$') - procs = os.popen('ps -e -o pid,args 2>/dev/null') - for proc in procs: - pm = procre.match(proc) - if not pm: continue - xm = xendre.match(pm.group('cmd')) - if not xm: continue - #print 'pid=', pm.group('pid'), 'cmd=', pm.group('cmd') - pids.append(int(pm.group('pid'))) - return pids - - def new_cleanup(self, kill=0): - err = 0 - pids = self.daemon_pids() - if kill: - for pid in pids: - print "Killing daemon pid=%d" % pid - os.kill(pid, signal.SIGHUP) - elif pids: - err = 1 - print "Daemon already running: ", pids - return err - - def cleanup(self, kill=False): - # No cleanup to do if PID_FILE is empty. - if not os.path.isfile(PID_FILE) or not os.path.getsize(PID_FILE): - return 0 - # Read the pid of the previous invocation and search active process list. - pid = open(PID_FILE, 'r').read() - lines = os.popen('ps ' + pid + ' 2>/dev/null').readlines() - for line in lines: - if re.search('^ *' + pid + '.+xensv', line): - if not kill: - print "Daemon is already running (pid %d)" % int(pid) - return 1 - # Old daemon is still active: terminate it. - os.kill(int(pid), 1) - # Delete the stale PID_FILE. - os.remove(PID_FILE) - return 0 - - def start(self, trace=0): - if self.cleanup(kill=False): - return 1 - - # Fork -- parent writes PID_FILE and exits. - pid = os.fork() - if pid: - # Parent - pidfile = open(PID_FILE, 'w') - pidfile.write(str(pid)) - pidfile.close() - return 0 - # Child - self.run() - return 0 - - def stop(self): - return self.cleanup(kill=True) - - def run(self): - root = static.File( SV_ROOT ) - root.indexNames = [ 'Main.rpy' ] - root.processors = { '.rpy': script.ResourceScript } - reactor.listenTCP( SV_PORT, server.Site( root ) ) - reactor.run() - - def exit(self): - reactor.disconnectAll() - sys.exit(0) - -def instance(): - global inst - try: - inst - except: - inst = Daemon() - return inst diff --git a/tools/python/xen/sv/DomInfo.py b/tools/python/xen/sv/DomInfo.py deleted file mode 100755 index 8aabb19057..0000000000 --- a/tools/python/xen/sv/DomInfo.py +++ /dev/null @@ -1,149 +0,0 @@ -from xen.xend.XendClient import getAsynchServer -server = getAsynchServer() -from xen.xend import PrettyPrint - -from xen.sv.HTMLBase import HTMLBase -from xen.sv.util import * -from xen.sv.GenTabbed import * - -DEBUG=1 - -class DomInfo( GenTabbed ): - - def __init__( self, urlWriter ): - - self.dom = 0; - - def tabUrlWriter( tab ): - return urlWriter( "&dom=%s%s" % ( self.dom, tab ) ) - - GenTabbed.__init__( self, "Domain Info", tabUrlWriter, [ 'General', 'SXP', 'Devices' ], [ DomGeneralTab, DomSXPTab, NullTab ] ) - - def write_BODY( self, request ): - dom = request.args.get('dom') - - if dom is None or len(dom) != 1: - request.write( "<p>Please Select a Domain</p>" ) - return None - else: - self.dom = dom[0] - - GenTabbed.write_BODY( self, request ) - - def write_MENU( self, request ): - pass - -class DomGeneralTab( CompositeTab ): - def __init__( self ): - CompositeTab.__init__( self, [ DomGenTab, DomActionTab ] ) - -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 = getDomInfoHash( 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 the Domain", "shutdown.png" ), - "reboot" : ( "Reboot the Domain", "reboot.png" ), - "pause" : ( "Pause the Domain", "pause.png" ), - "unpause" : ( "Unpause the Domain", "unpause.png" ), - "destroy" : ( "Destroy the Domain", "destroy.png" ) } - 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 ), "halt" ) - 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 ), "halt" ) - except: - pass - - - - - diff --git a/tools/python/xen/sv/DomList.py b/tools/python/xen/sv/DomList.py deleted file mode 100755 index 86976b7af3..0000000000 --- a/tools/python/xen/sv/DomList.py +++ /dev/null @@ -1,81 +0,0 @@ -from xen.xend.XendClient import server -from xen.xend import sxp - -from xen.sv.HTMLBase import HTMLBase -from xen.sv.util import * - -class DomList( HTMLBase ): - - isLeaf = True - - def __init__( self, urlWriter ): - HTMLBase.__init__(self) - self.urlWriter = urlWriter - - def write_MENU( self, request ): - return self.write_BODY( request, head=True, long=False ) - - def write_BODY( self, request, head=True, long=True ): - - domains = None - - 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" ) - - if head: - request.write( "<tr class='domainInfoHead'>" ) - self.write_DOMAIN_HEAD( request, long ) - request.write( "</tr>" ) - - odd = True - - if not domains is None: - for domain in domains: - if odd: - request.write( "<tr class='domainInfoOdd'>\n" ) - odd = False - else: - request.write( "<tr class='domainInfoEven'>\n" ) - odd = True - self.write_DOMAIN( request, getDomInfoHash( domain ), long ) - 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>\n" ) - - def write_DOMAIN( self, request, domInfoHash, long=True ): - request.write( "<td class='domainInfo' align='center'>%(id)s</td>\n" % domInfoHash ) - - url = self.urlWriter( "&mod=info&dom=%(id)s" % domInfoHash ) - - request.write( "<td class='domainInfo' align='center'><a href='%s'>%s</a></td>\n" % ( url, domInfoHash['name'] ) ) - if long: - request.write( "<td class='domainInfo' align='center'>%(memory)5s</td>\n" % domInfoHash ) - request.write( "<td class='domainInfo' align='center'>%(cpu)2s</td>\n" % domInfoHash ) - request.write( "<td class='domainInfo' align='center'>%(state)5s</td>\n" % domInfoHash ) - if domInfoHash[ 'id' ] != "0": - request.write( "<td class='domainInfo' align='center'>" ) - - if domInfoHash[ 'state' ][ 2 ] == "-": - request.write( "<img src='images/small-pause.png' onclick='doOp2( \"pause\", \"%(dom)-4s\" )'>" % domInfoHash ) - else: - request.write( "<img src='images/small-unpause.png' onclick='doOp2( \"unpause\", \"%(dom)-4s\" )'>" % domInfoHash ) - - request.write( "<img src='images/small-destroy.png' onclick='doOp2( \"destroy\", \"%(dom)-4s\" )'></td>" % domInfoHash) - else: - request.write( "<td> </td>" ) - - def write_DOMAIN_HEAD( self, request, long=True ): - request.write( "<td class='domainInfoHead' align='center'>Domain</td>\n" ) - request.write( "<td class='domainInfoHead' align='center'>Name</td>\n" ) - if long: - request.write( "<td class='domainInfoHead' align='center'>Memory / Mb</td>\n" ) - request.write( "<td class='domainInfoHead' align='center'>CPU</td>\n" ) - request.write( "<td class='domainInfoHead' align='center'>State</td>\n" ) - request.write( "<td class='domainInfoHead' align='center'></td>\n" ) diff --git a/tools/python/xen/sv/GenTabbed.py b/tools/python/xen/sv/GenTabbed.py deleted file mode 100755 index aef1848e7a..0000000000 --- a/tools/python/xen/sv/GenTabbed.py +++ /dev/null @@ -1,131 +0,0 @@ -import types - -from xen.sv.HTMLBase import HTMLBase -from xen.sv.TabView import TabView -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, urlWriter = None ): - - tab = int( getVar( 'tab', request, 0 ) ) - - request.write( "<table style='' width='100%' border='0' cellspacing='0' cellpadding='0'>" ) - request.write( "<tr><td>" ) - - request.write( "<p align='center'><u>%s</u></p>" % self.title ) - - TabView( tab, self.tabStrings, self.urlWriter ).write_BODY( request ) - - request.write( "</td></tr><tr><td>" ) - - render_tab = self.tabObjects[ tab ] - - if render_tab is None: - request.write( "<p>Bad Tab</p>" ) - self.finish_BODY( request ) - else: - render_tab().write_BODY( request ) - - request.write( "</td></tr></table>" ) - - def perform( self, request ): - tab = int( getVar( 'tab', request, 0 ) ) - - op_tab = self.tabObjects[ tab ] - - if op_tab: - op_tab().perform( request ) - -class PreTab( HTMLBase ): - - def __init__( self, source ): - HTMLBase.__init__( self ) - self.source = source - - def write_BODY( self, request ): - - request.write( "<div style='display: block; overflow: auto; border: 0px solid black; width: 540px; padding: 5px; z-index:0; align: center'><pre>" ) - - request.write( self.source ) - - request.write( "</pre></div>" ) - -class GeneralTab( HTMLBase ): - - def __init__( self, dict, titles ): - HTMLBase.__init__( self ) - self.dict = dict - self.titles = titles - - def write_BODY( self, request ): - - request.write( "<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( "<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 ): - HTMLBase.__init__( self ) - self.title = "Null Tab" - - def write_BODY( self, request ): - request.write( "<p>%s</p>" % self.title ) - -class ActionTab( HTMLBase ): - - def __init__( self, actions ): - self.actions = actions - HTMLBase.__init__( self ) - - def write_BODY( self, request ): - request.write("<p align='center'>") - - for ( command, ( text, image ) ) in self.actions.items(): - request.write("<img src='images/%s' width='54' height='54' onclick='doOp( \"%s\" )' onmouseover='update( \"button_desc\", \"%s\" )' " % ( image, command, text ) ) - request.write("onmouseout='update( \"button_desc\", \" \" )' style='button'>") - request.write(" ") - - request.write("<p align='center'><span id='button_desc'> </span></p>") - request.write("</p>") - -class CompositeTab( HTMLBase ): - - def __init__( self, tabs ): - HTMLBase.__init__( self ) - self.tabs = tabs - - def write_BODY( self, request ): - for tab in self.tabs: - request.write( "<br/>" ) - tab().write_BODY( request ) - - def perform( self, request ): - for tab in self.tabs: - tab().perform( request ) - - - - diff --git a/tools/python/xen/sv/HTMLBase.py b/tools/python/xen/sv/HTMLBase.py deleted file mode 100755 index e67784d558..0000000000 --- a/tools/python/xen/sv/HTMLBase.py +++ /dev/null @@ -1,63 +0,0 @@ -from twisted.web.resource import Resource -from xen.sv.util import * - -class HTMLBase( Resource ): - - isLeaf = True - - def __init__( self ): - Resource.__init__(self) - - def render_POST( self, request ): - self.perform( request ) - return self.render_GET( request ) - - def render_GET( self, request ): - self.write_TOP( request ) - self.write_BODY( request ) - self.write_BOTTOM( request ) - return '' - - def write_BODY( self, request ): - request.write( "BODY" ) - - def write_TOP( self, request ): - request.write( '<html><head><title>Xen</title><link rel="stylesheet" type="text/css" href="inc/style.css" />' ) - request.write( '<script src="inc/script.js"></script>' ) - request.write( '</head><body>' ) - request.write('<form method="post" action="%s">' % request.uri) - - def write_BOTTOM( self, request ): - request.write('<input type="hidden" name="op" value="">') - request.write('<input type="hidden" name="args" value="">') - request.write('</form>') - request.write( "</body></html>" ) - - 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 196e1c1450..0000000000 --- a/tools/python/xen/sv/Main.py +++ /dev/null @@ -1,113 +0,0 @@ -from xen.sv.HTMLBase import HTMLBase -from xen.sv.DomList import DomList -from xen.sv.NodeInfo import NodeInfo -from xen.sv.DomInfo import DomInfo -from xen.sv.CreateDomain import CreateDomain -from xen.sv.MigrateDomain import MigrateDomain -from xen.sv.SaveDomain import SaveDomain -from xen.sv.RestoreDomain import RestoreDomain - -from xen.xend.XendClient import server - -from xen.sv.util import getVar - -class Main( HTMLBase ): - - isLeaf = True - - def __init__( self, urlWriter = None ): - self.modules = { "node": NodeInfo, - "list": DomList, - "info": DomInfo, - "create": CreateDomain, - "migrate" : MigrateDomain, - "save" : SaveDomain, - "restore" : RestoreDomain } - - # ordered list of module menus to display - self.module_menus = [ "node", "create", "migrate", "save", - "restore", "list" ] - HTMLBase.__init__(self) - - def render_POST( self, request ): - - #decide what module post'd the action - - args = getVar( 'args', request ) - - mod = getVar( 'mod', request ) - - if not mod is None and args is None: - module = self.modules[ mod ] - #check module exists - if module: - module( self.mainUrlWriter ).perform( request ) - else: - self.perform( request ) - - return self.render_GET( request ) - - def mainUrlWriter( self, module ): - def fun( f ): - return "Main.rpy?mod=%s%s" % ( module, f ) - return fun - - def write_BODY( self, request ): - - request.write( "\n<table style='border:0px solid black; background: url(images/orb_01.jpg) no-repeat' cellspacing='0' cellpadding='0' border='0' width='780px' height='536px'>\n" ) - request.write( "<tr>\n" ) - request.write( " <td width='15px'> </td>" ) - request.write( " <td width='175px' align='center' valign'center'>" ) - request.write( " <table cellspacing='0' cellpadding='0' border='0' width='100%' height='100%'>" ) - request.write( " <tr><td height='140px' align='center' valign='bottom'><a href='http://www.cl.cam.ac.uk/Research/SRG/netos/xen/'>" ) - request.write( " <img src='images/xen.png' width='150' height='75' border='0'/></a><br/></td></tr>" ) - request.write( " <tr><td height='60px' align='center'><p class='small'>SV Web Interface<br/>(C) <a href='mailto:tw275@cam.ac.uk'>Tom Wilkie</a> 2004</p></td></tr>") - request.write( " <tr><td align='center' valign='top'>" ) - - for modName in self.module_menus: - self.modules[modName]( self.mainUrlWriter( modName ) ).write_MENU( request ) - - request.write( " </td></tr>" ) - request.write( " </table>" ) - request.write( " " ) - request.write( " </td>\n" ) - request.write( " <td width='15px'> </td>" ) - request.write( " <td width='558px' align='left' valign='top'>" ) - request.write( " <table cellspacing='0' cellpadding='0' border='0' width='100%' height='100%'>" ) - request.write( " <tr><td height='20px'></td></tr>" ) - request.write( " <tr><td align='center' valign='top'>" ) - - modName = getVar('mod', request) - - if modName is None: - request.write( '<p>Please select a module</p>' ) - else: - module = self.modules[ modName ] - if module: - module( self.mainUrlWriter( modName ) ).write_BODY( request ) - else: - request.write( '<p>Invalid module. Please select another</p>' ) - - request.write( " </td></tr>" ) - request.write( " </table>" ) - request.write( " </td>\n" ) - request.write( " <td width='17px'> </td>" ) - request.write( "</tr>\n" ) - - request.write( "</table>\n" ) - - - def op_destroy( self, request ): - dom = getVar( 'dom', request ) - if not dom is None and dom != "0": - server.xend_domain_destroy( int( dom ), "halt" ) - - def op_pause( self, request ): - dom = getVar( 'dom', request ) - if not dom is None and dom != "0": - server.xend_domain_pause( int( dom ) ) - - def op_unpause( self, request ): - dom = getVar( 'dom', request ) - if not dom is None and dom != "0": - server.xend_domain_unpause( int( dom ) ) diff --git a/tools/python/xen/sv/MigrateDomain.py b/tools/python/xen/sv/MigrateDomain.py deleted file mode 100644 index 928acf3f42..0000000000 --- a/tools/python/xen/sv/MigrateDomain.py +++ /dev/null @@ -1,72 +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 MigrateDomain( Wizard ): - def __init__( self, urlWriter ): - - sheets = [ ChooseMigrateDomain, - DoMigrate ] - - Wizard.__init__( self, urlWriter, "Migrate Domain", sheets ) - - -class ChooseMigrateDomain( Sheet ): - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Configure Migration", 0) - try: - domains = server.xend_domains() - domains.sort() - except: - pass - - domnames = [] - for i in domains: - if i != 'Domain-0': domnames.append((i,i)) - - self.addControl( ListControl('domid', - domnames, - 'Domain ID:') ) - self.addControl( TickControl('live', - 'True', - 'Live migrate:') ) - self.addControl( InputControl('rate', - '0', - 'Rate limit:') ) - self.addControl( InputControl( 'dest', 'myhost.mydomain', - 'Name or IP address:', - ".*") ) - -class DoMigrate( Sheet ): - def __init__(self, urlWriter ): - Sheet.__init__(self, urlWriter, "Migration Done", 1) - - def write_BODY( self, request, err ): - - if not self.passback: self.parseForm( request ) - -# print string2sxp(self.passback) - - config = ssxp2hash ( string2sxp( self.passback ) ) - - try: - print config - print config['domid'], config['dest'] - dom_sxp = server.xend_domain_migrate( config['domid'], - config['dest'], - config.get('live') == 'True', - config['rate'] ) - success = "Your domain was successfully Migrated.\n" - except Exception, e: - success = "There was an error migrating your domain\n" - dom_sxp = str(e) - - pt = PreTab( success + dom_sxp ) # 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/NodeInfo.py b/tools/python/xen/sv/NodeInfo.py deleted file mode 100755 index 5db1a34c50..0000000000 --- a/tools/python/xen/sv/NodeInfo.py +++ /dev/null @@ -1,64 +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', ], [ NodeGeneralTab, NodeDmesgTab ] ) - - 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 ): - CompositeTab.__init__( self, [ NodeInfoTab, NodeActionTab ] ) - -class NodeInfoTab( GeneralTab ): - - def __init__( self ): - - 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 ): - 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 ): - ActionTab.__init__( self, { "shutdown" : ( "Shutdown the Node", "shutdown.png" ), - "reboot" : ( "Reboot the Node", "reboot.png" ) } ) - - def op_shutdown( self, request ): - print ">NodeShutDown" - server.xend_node_shutdown() - - def op_reboot( self, request ): - print ">NodeReboot" - server.xend_node_reboot() diff --git a/tools/python/xen/sv/RestoreDomain.py b/tools/python/xen/sv/RestoreDomain.py deleted file mode 100644 index be8b4f558a..0000000000 --- a/tools/python/xen/sv/RestoreDomain.py +++ /dev/null @@ -1,46 +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 ): - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Configure Restore", 0) - - self.addControl( InputControl( 'file', '', - 'Suspend file name:', - ".*") ) - -class DoRestore( Sheet ): - 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/SaveDomain.py b/tools/python/xen/sv/SaveDomain.py deleted file mode 100644 index 4c4e315272..0000000000 --- a/tools/python/xen/sv/SaveDomain.py +++ /dev/null @@ -1,59 +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 SaveDomain( Wizard ): - def __init__( self, urlWriter ): - - sheets = [ ChooseSaveDomain, - DoSave ] - - Wizard.__init__( self, urlWriter, "Save Domain", sheets ) - - -class ChooseSaveDomain( Sheet ): - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Configure Save", 0) - try: - domains = server.xend_domains() - domains.sort() - except: - pass - - domnames = [] - for i in domains: - if i != 'Domain-0': domnames.append((i,i)) - - self.addControl( ListControl('domid', - domnames, - 'Domain ID:') ) - self.addControl( InputControl( 'file', '', - 'Suspend file name:', - ".*") ) - -class DoSave( Sheet ): - def __init__(self, urlWriter ): - Sheet.__init__(self, urlWriter, "Save 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_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) - - pt = PreTab( success + dom_sxp ) # 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/TabView.py b/tools/python/xen/sv/TabView.py deleted file mode 100755 index cada51c4e8..0000000000 --- a/tools/python/xen/sv/TabView.py +++ /dev/null @@ -1,49 +0,0 @@ -from xen.sv.HTMLBase import HTMLBase - -class TabView( HTMLBase ): - - def __init__( self, tab, tabs, urlWriter ): - HTMLBase.__init__(self) - self.tab = tab # interger - tab id - self.tabs = tabs - self.urlWriter = urlWriter - - def write_BODY( self, request ): - request.write( "<table style='' border='0' cellspacing='0' cellpadding='0' align='center'>" ) - request.write( "<tr height='22'>" ) - - if self.tab == 0: - image = "left-end-highlight.jpg" - else: - image = "left-end-no-highlight.jpg" - - request.write( "<td height='22' width='14'><image src='images/%s' width='14' height='22'></td>" % image ) - - count = len( self.tabs ) - - for i in range( count ): - - if i == self.tab: - image = "middle-highlight.jpg" - else: - image = "middle-no-highlight.jpg" - - request.write( "<td style='background: url(images/%s)'><p align='center'><a href='%s'>%s</a></p></td>" % ( image, self.urlWriter( "&tab=%s" % i ), self.tabs[ i ] ) ) - - if i < count-1: - if i == self.tab: - image = "seperator-left-highlight.jpg" - elif self.tab == i+1: - image = "seperator-right-highlight.jpg" - else: - image = "seperator.jpg" - - request.write( "<td height='22' width='23'><image src='images/%s' width='23' height='22'></td>" % image ) - - if self.tab == count - 1: - image = "right-end-highlight.jpg" - else: - image = "right-end-no-highlight.jpg" - - request.write( "<td height='22' width='14'><image src='images/%s' width='14' height='22'></td>" % image ) - request.write( "</tr></table>" ) diff --git a/tools/python/xen/sv/Wizard.py b/tools/python/xen/sv/Wizard.py deleted file mode 100755 index 089d3f2e67..0000000000 --- a/tools/python/xen/sv/Wizard.py +++ /dev/null @@ -1,269 +0,0 @@ -from xen.sv.util import * -from xen.sv.HTMLBase import HTMLBase -from xen.xend import sxp - -import re - -DEBUG = 0 - -class Wizard( HTMLBase ): - - def __init__( self, urlWriter, title, sheets ): - HTMLBase.__init__( self ) - self.title = title - self.sheets = sheets - self.urlWriter = urlWriter - - 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 ): - - request.write( "<table width='100%' border='0' cellspacing='0' cellpadding='0'><tr><td>" ) - request.write( "<p align='center'><u>%s</u></p></td></tr><tr><td>" % self.title ) - - currSheet = getVar( 'sheet', request ) - - if not currSheet is None: - currSheet = int( currSheet ) - else: - currSheet = 0 - - sheet = self.sheets[ currSheet ]( self.urlWriter ) - - err = not sheet.validate( request ) - - if not err: - op = getVar( 'op', request ) - - if op == 'next': - currSheet += 1 - elif op == 'prev': - currSheet -= 1 - - sheet = self.sheets[ currSheet ]( self.urlWriter ) - - if getVar( 'visited-sheet%s' % currSheet, request ): - sheet.write_BODY( request, err ) - else: - sheet.write_BODY( request, False ) - - - request.write( "</td></tr><tr><td><table width='100%' border='0' cellspacing='0' cellpadding='0'><tr>" ) - request.write( "<td width='80%'></td><td width='20%' align='center'><p align='center'>" ) - if currSheet > 0: - request.write( "<img src='images/previous.png' onclick='doOp( \"prev\" )' onmouseover='update( \"wizText\", \"Previous\" )' onmouseout='update( \"wizText\", \" \" )'> " ) - if currSheet < ( len( self.sheets ) - 2 ): - request.write( "<img src='images/next.png' onclick='doOp( \"next\" )' onmouseover='update( \"wizText\", \"Next\" )' onmouseout='update( \"wizText\", \" \" )'>" ) - elif currSheet == ( len( self.sheets ) - 2 ): - request.write( "<img src='images/finish.png' onclick='doOp( \"next\" )' onmouseover='update( \"wizText\", \"Finish\" )' onmouseout='update( \"wizText\", \" \" )'>" ) - request.write( "</p><p align='center'><span id='wizText'></span></p></td></tr></table>" ) - request.write( "</td></tr></table>" ) - - def op_next( self, request ): - pass - - def op_prev( self, request ): - pass - - def op_finish( self, request ): - pass - -class Sheet( HTMLBase ): - - def __init__( self, urlWriter, title, location ): - HTMLBase.__init__( self ) - self.urlWriter = urlWriter - self.feilds = [] - self.title = title - self.location = location - self.passback = None - - def parseForm( self, request ): - do_not_parse = [ 'mod', 'op', 'sheet', '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, err ): - - 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 (feild, control) in self.feilds: - control.write_Control( request, previous_values.get( feild ) ) - if err and not control.validate( previous_values.get( feild ) ): - 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='sheet' value='%s'></p>" % self.location ) - request.write( "<input type='hidden' name='visited-sheet%s' value='True'></p>" % self.location ) - - def addControl( self, control ): - self.feilds.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 hash for quick reference - if DEBUG: print previous_values - - for (feild, control) in self.feilds: - if not control.validate( previous_values.get( feild ) ): - check = False - if DEBUG: print "> %s = %s" % (feild, previous_values.get( feild )) - - 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 feild." ): - 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 feild." ): - 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 ) - - 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( "</select></td></tr>" ) - - diff --git a/tools/python/xen/sv/__init__.py b/tools/python/xen/sv/__init__.py deleted file mode 100755 index 8d1c8b69c3..0000000000 --- a/tools/python/xen/sv/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/python/xen/sv/params.py b/tools/python/xen/sv/params.py deleted file mode 100644 index beed647a4f..0000000000 --- a/tools/python/xen/sv/params.py +++ /dev/null @@ -1,3 +0,0 @@ -SV_PORT = 8080 -SV_ROOT = "/var/lib/xen/sv/" -PID_FILE = "/var/run/xen-sv.pid" diff --git a/tools/python/xen/sv/util.py b/tools/python/xen/sv/util.py deleted file mode 100755 index 3207b8f0cc..0000000000 --- a/tools/python/xen/sv/util.py +++ /dev/null @@ -1,123 +0,0 @@ -from xen.xend.XendClient import server -from xen.xend import sxp -from xen.xend import PrettyPrint - -import types - -def getDomInfoHash( 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 ): - if int( threads ) > 1: - return "Yes (%d)" % threads - else: - return "No" diff --git a/tools/sv/Main.rpy b/tools/sv/Main.rpy deleted file mode 100755 index 6b75ea9431..0000000000 --- a/tools/sv/Main.rpy +++ /dev/null @@ -1,3 +0,0 @@ -from xen.sv.Main import Main - -resource = Main() diff --git a/tools/sv/Makefile b/tools/sv/Makefile deleted file mode 100755 index 4da91e0674..0000000000 --- a/tools/sv/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -sv_insdir := /var/lib/xen/sv -INSTALL = install -INSTALL_DIR = $(INSTALL) -d -m0755 -INSTALL_DATA = $(INSTALL) -m0644 - -all: - -IMAGES = xen.png orb_01.jpg orb_02.jpg -IMAGES += left-end-highlight.jpg left-end-no-highlight.jpg -IMAGES += right-end-highlight.jpg right-end-no-highlight.jpg -IMAGES += middle-highlight.jpg middle-no-highlight.jpg -IMAGES += seperator.jpg -IMAGES += seperator-left-highlight.jpg seperator-right-highlight.jpg -IMAGES += shutdown.png reboot.png pause.png unpause.png destroy.png -IMAGES += small-destroy.png small-pause.png small-unpause.png -IMAGES += next.png previous.png finish.png - -install: - # copy XenSV Main.rpy file - @[ -d $(DESTDIR)$(sv_insdir) ] || $(INSTALL_DIR) $(DESTDIR)$(sv_insdir) - @$(INSTALL_DATA) Main.rpy $(DESTDIR)$(sv_insdir) - - # copy XenSV images - @[ -d $(DESTDIR)$(sv_insdir)/images ] || \ - $(INSTALL_DIR) $(DESTDIR)$(sv_insdir)/images - @(cd images && $(INSTALL_DATA) $(IMAGES) $(DESTDIR)$(sv_insdir)/images) - - # copy XenSV stylesheet - @[ -d $(DESTDIR)$(sv_insdir)/inc ] || \ - $(INSTALL_DIR) $(DESTDIR)$(sv_insdir)/inc - @$(INSTALL_DATA) inc/style.css inc/script.js $(DESTDIR)$(sv_insdir)/inc - -clean: - diff --git a/tools/sv/images/destroy.png b/tools/sv/images/destroy.png Binary files differdeleted file mode 100644 index 9545fc4837..0000000000 --- a/tools/sv/images/destroy.png +++ /dev/null diff --git a/tools/sv/images/finish.png b/tools/sv/images/finish.png Binary files differdeleted file mode 100644 index 6c5d18a9b7..0000000000 --- a/tools/sv/images/finish.png +++ /dev/null diff --git a/tools/sv/images/left-end-highlight.jpg b/tools/sv/images/left-end-highlight.jpg Binary files differdeleted file mode 100644 index 3922eb593a..0000000000 --- a/tools/sv/images/left-end-highlight.jpg +++ /dev/null diff --git a/tools/sv/images/left-end-no-highlight.jpg b/tools/sv/images/left-end-no-highlight.jpg Binary files differdeleted file mode 100644 index ded4e3933b..0000000000 --- a/tools/sv/images/left-end-no-highlight.jpg +++ /dev/null diff --git a/tools/sv/images/middle-highlight.jpg b/tools/sv/images/middle-highlight.jpg Binary files differdeleted file mode 100644 index db9829d9bf..0000000000 --- a/tools/sv/images/middle-highlight.jpg +++ /dev/null diff --git a/tools/sv/images/middle-no-highlight.jpg b/tools/sv/images/middle-no-highlight.jpg Binary files differdeleted file mode 100644 index da3b4f68a0..0000000000 --- a/tools/sv/images/middle-no-highlight.jpg +++ /dev/null diff --git a/tools/sv/images/next.png b/tools/sv/images/next.png Binary files differdeleted file mode 100644 index da10bbfb9b..0000000000 --- a/tools/sv/images/next.png +++ /dev/null diff --git a/tools/sv/images/orb_01.jpg b/tools/sv/images/orb_01.jpg Binary files differdeleted file mode 100755 index e30efc4985..0000000000 --- a/tools/sv/images/orb_01.jpg +++ /dev/null diff --git a/tools/sv/images/orb_02.jpg b/tools/sv/images/orb_02.jpg Binary files differdeleted file mode 100755 index e5ebc8e4b1..0000000000 --- a/tools/sv/images/orb_02.jpg +++ /dev/null diff --git a/tools/sv/images/pause.png b/tools/sv/images/pause.png Binary files differdeleted file mode 100644 index 6e16daa177..0000000000 --- a/tools/sv/images/pause.png +++ /dev/null diff --git a/tools/sv/images/previous.png b/tools/sv/images/previous.png Binary files differdeleted file mode 100644 index 22292d6e9c..0000000000 --- a/tools/sv/images/previous.png +++ /dev/null diff --git a/tools/sv/images/reboot.png b/tools/sv/images/reboot.png Binary files differdeleted file mode 100755 index 358e6deb8f..0000000000 --- a/tools/sv/images/reboot.png +++ /dev/null diff --git a/tools/sv/images/right-end-highlight.jpg b/tools/sv/images/right-end-highlight.jpg Binary files differdeleted file mode 100644 index 1ffee341ab..0000000000 --- a/tools/sv/images/right-end-highlight.jpg +++ /dev/null diff --git a/tools/sv/images/right-end-no-highlight.jpg b/tools/sv/images/right-end-no-highlight.jpg Binary files differdeleted file mode 100644 index 0ddd058d67..0000000000 --- a/tools/sv/images/right-end-no-highlight.jpg +++ /dev/null diff --git a/tools/sv/images/seperator-left-highlight.jpg b/tools/sv/images/seperator-left-highlight.jpg Binary files differdeleted file mode 100644 index c90f4ffd12..0000000000 --- a/tools/sv/images/seperator-left-highlight.jpg +++ /dev/null diff --git a/tools/sv/images/seperator-right-highlight.jpg b/tools/sv/images/seperator-right-highlight.jpg Binary files differdeleted file mode 100644 index f37e6cd546..0000000000 --- a/tools/sv/images/seperator-right-highlight.jpg +++ /dev/null diff --git a/tools/sv/images/seperator.jpg b/tools/sv/images/seperator.jpg Binary files differdeleted file mode 100644 index c77e2c5500..0000000000 --- a/tools/sv/images/seperator.jpg +++ /dev/null diff --git a/tools/sv/images/shutdown.png b/tools/sv/images/shutdown.png Binary files differdeleted file mode 100755 index 48a52dce21..0000000000 --- a/tools/sv/images/shutdown.png +++ /dev/null diff --git a/tools/sv/images/small-destroy.png b/tools/sv/images/small-destroy.png Binary files differdeleted file mode 100644 index f800bd7685..0000000000 --- a/tools/sv/images/small-destroy.png +++ /dev/null diff --git a/tools/sv/images/small-pause.png b/tools/sv/images/small-pause.png Binary files differdeleted file mode 100644 index 7bbdbfaafe..0000000000 --- a/tools/sv/images/small-pause.png +++ /dev/null diff --git a/tools/sv/images/small-unpause.png b/tools/sv/images/small-unpause.png Binary files differdeleted file mode 100644 index 6ae5687a0c..0000000000 --- a/tools/sv/images/small-unpause.png +++ /dev/null diff --git a/tools/sv/images/unpause.png b/tools/sv/images/unpause.png Binary files differdeleted file mode 100644 index c971308814..0000000000 --- a/tools/sv/images/unpause.png +++ /dev/null diff --git a/tools/sv/images/xen.png b/tools/sv/images/xen.png Binary files differdeleted file mode 100644 index 344c361b3c..0000000000 --- a/tools/sv/images/xen.png +++ /dev/null diff --git a/tools/sv/inc/script.js b/tools/sv/inc/script.js deleted file mode 100755 index 47cd10399c..0000000000 --- a/tools/sv/inc/script.js +++ /dev/null @@ -1,22 +0,0 @@ -function update( objRef, text ) -{ - if ( document.all || document.getElementById ) - { - obj = ( document.getElementById )? document.getElementById( objRef ) : document.all( objRef ); - - obj.innerHTML= text - } -} - -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 100644 index 263ab59b23..0000000000 --- a/tools/sv/inc/style.css +++ /dev/null @@ -1,32 +0,0 @@ - -P {font-family: verdana, arial; font-size: 12px; color: black} -.small {font-size: 10px} - -TD.domainInfo {font-family: verdana, arial; font-size: 10px; color: black} -TD.domainInfoHead {font-family: verdana, arial; font-size: 10px; color: white; font-face: bold} - -TD.domainInfoHead {background-color: black} -TR.domainInfoOdd {background-color: white} -TR.domainInfoEven {background-color: lightgrey} - -body { - width: 670px; - margin: 0px; - padding: 0px; - background-color: #fff; - background-image: url(../images/orb_02.jpg); - background-repeat: repeat-y; - background-position: left top; - font-family: Arial, Helvetica, sans-serif; - font-weight: bold; - color: #333333; - letter-spacing: 0px; - scrollbar-base-color: #333333; - scrollbar-track-color: #666666; - scrollbar-face-color: #fff; - - - } - -.button (cursor:hand) - |