bitkeeper revision 1.1542.1.1 (42943a71LGhR_dI1LOX6lKtJ08zzTA)

setup.py, Makefile:
  Remove XenSV -- it's been broken since twisted was removed.
Many files:
  Delete: tools/misc/xensv
  Delete: tools/python/xen/sv/params.py
  Delete: tools/python/xen/sv/__init__.py
  Delete: tools/python/xen/sv/MigrateDomain.py
  Delete: tools/python/xen/sv/Daemon.py
  Delete: tools/python/xen/sv/util.py
  Delete: tools/python/xen/sv/Wizard.py
  Delete: tools/python/xen/sv/TabView.py
  Delete: tools/python/xen/sv/SaveDomain.py
  Delete: tools/python/xen/sv/RestoreDomain.py
  Delete: tools/python/xen/sv/NodeInfo.py
  Delete: tools/python/xen/sv/Main.py
  Delete: tools/python/xen/sv/HTMLBase.py
  Delete: tools/python/xen/sv/GenTabbed.py
  Delete: tools/python/xen/sv/DomList.py
  Delete: tools/python/xen/sv/DomInfo.py
  Delete: tools/python/xen/sv/CreateDomain.py
  Delete: tools/sv/images/unpause.png
  Delete: tools/sv/images/small-unpause.png
  Delete: tools/sv/images/small-pause.png
  Delete: tools/sv/images/small-destroy.png
  Delete: tools/sv/images/shutdown.png
  Delete: tools/sv/images/seperator.jpg
  Delete: tools/sv/images/right-end-highlight.jpg
  Delete: tools/sv/images/reboot.png
  Delete: tools/sv/images/previous.png
  Delete: tools/sv/images/pause.png
  Delete: tools/sv/images/orb_02.jpg
  Delete: tools/sv/images/next.png
  Delete: tools/sv/images/middle-no-highlight.jpg
  Delete: tools/sv/images/middle-highlight.jpg
  Delete: tools/sv/images/left-end-no-highlight.jpg
  Delete: tools/sv/images/left-end-highlight.jpg
  Delete: tools/sv/images/finish.png
  Delete: tools/sv/images/destroy.png
  Delete: tools/sv/inc/style.css
  Delete: tools/sv/images/seperator-right-highlight.jpg
  Delete: tools/sv/images/seperator-left-highlight.jpg
  Delete: tools/sv/inc/script.js
  Delete: tools/sv/images/right-end-no-highlight.jpg
  Delete: tools/sv/images/orb_01.jpg
  Delete: tools/sv/Makefile
  Delete: tools/sv/Main.rpy
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
This commit is contained in:
cl349@firebug.cl.cam.ac.uk committed 2005-05-25 08:42:25 +00:00
1 parent cc0943ffa0
commit 76105d8a76
47 files changed
+1 -1768

No files matched your search

-44
View File
@@ -731,7 +731,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
@@ -802,22 +801,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
@@ -893,33 +876,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
+1 -1
View File
@@ -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)
-137
View File
@@ -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())
-1
View File
@@ -39,7 +39,6 @@ setup(name = 'xen',
'xen.util',
'xen.xend',
'xen.xend.server',
'xen.sv',
'xen.xm',
'xen.web',
],
-163
View File
@@ -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."]]
-108
View File
@@ -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
-149
View File
@@ -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
-81
View File
@@ -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>&nbsp;</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" )
-131
View File
@@ -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\", \"&nbsp;\" )' style='button'>")
request.write("&nbsp;&nbsp;")
request.write("<p align='center'><span id='button_desc'>&nbsp;</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 )
-63
View File
@@ -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 )
-113
View File
@@ -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'>&nbsp;</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( " &nbsp;" )
request.write( " </td>\n" )
request.write( " <td width='15px'>&nbsp;</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'>&nbsp;</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 ) )
-72
View File
@@ -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 )
-64
View File
@@ -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()
-46
View File
@@ -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 )
-59
View File
@@ -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 )
-49
View File
@@ -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>" )
-269
View File
@@ -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\", \"&nbsp;\" )'>&nbsp;" )
if currSheet < ( len( self.sheets ) - 2 ):
request.write( "<img src='images/next.png' onclick='doOp( \"next\" )' onmouseover='update( \"wizText\", \"Next\" )' onmouseout='update( \"wizText\", \"&nbsp;\" )'>" )
elif currSheet == ( len( self.sheets ) - 2 ):
request.write( "<img src='images/finish.png' onclick='doOp( \"next\" )' onmouseover='update( \"wizText\", \"Finish\" )' onmouseout='update( \"wizText\", \"&nbsp;\" )'>" )
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>" )
-1
View File
@@ -1 +0,0 @@
-3
View File
@@ -1,3 +0,0 @@
SV_PORT = 8080
SV_ROOT = "/var/lib/xen/sv/"
PID_FILE = "/var/run/xen-sv.pid"
-123
View File
@@ -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"
-3
View File
@@ -1,3 +0,0 @@
from xen.sv.Main import Main
resource = Main()
-34
View File
@@ -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:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 507 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 434 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

-22
View File
@@ -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()
}
-32
View File
@@ -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)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.