diff --git a/.rootkeys b/.rootkeys index 053bb5cede..b888478532 100644 --- a/.rootkeys +++ b/.rootkeys @@ -442,6 +442,7 @@ 40fcefb38OTgsUKHBpwshLLIsiIaCA tools/sv/images/middle-no-highlight.jpg 40fcefb32SPtrw36c4S6YGFlLvkKuw tools/sv/images/orb_01.jpg 40fcefb3Ok5qkX3iM7ZEPVkRInrUpg tools/sv/images/orb_02.jpg +4104ffca9_GhWOxRE-83uZIad2Z1gg tools/sv/images/pause.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 @@ -449,6 +450,7 @@ 40fcefb3dgsa24WLk_BJeYQHrDLuOg tools/sv/images/seperator-right-highlight.jpg 40fcefb3FtiX4Pd2kT8wDlp8u8xRhQ tools/sv/images/seperator.jpg 41013a82sUdUqBv8EoAUJii3gsZ-4g tools/sv/images/shutdown.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 diff --git a/tools/python/xen/sv/DomInfo.py b/tools/python/xen/sv/DomInfo.py index a718871fd5..7e23ab792d 100755 --- a/tools/python/xen/sv/DomInfo.py +++ b/tools/python/xen/sv/DomInfo.py @@ -26,6 +26,9 @@ class DomInfo( GenTabbed ): self.dom = dom[0] GenTabbed.write_BODY( self, request ) + + def write_MENU( self, request ): + pass class DomGeneralTab( CompositeTab ): def __init__( self ): @@ -86,15 +89,37 @@ class DomSXPTab( PreTab ): class DomActionTab( ActionTab ): def __init__( self ): - ActionTab.__init__( self, { "shutdown" : ( "Shutdown the Domain", "shutdown.png" ), - "reboot" : ( "Reboot the Domain", "reboot.png" ) } ) + 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" ) } + ActionTab.__init__( self, actions ) def op_shutdown( self, request ): - print ">DomShutDown" + dom = getVar( 'dom', request ) + if not dom is None: + print ">DomShutDown %s" % dom #server.xend_node_shutdown() def op_reboot( self, request ): - print ">DomReboot" + dom = getVar( 'dom', request ) + if not dom is None: + print ">DomReboot %s" % dom #server.xend_node_reboot() + def op_pause( self, request ): + dom = getVar( 'dom', request ) + if not dom is None: + print ">DomPause %s" % dom + server.xend_domain_pause( int( dom ) ) + + def op_unpause( self, request ): + dom = getVar( 'dom', request ) + if not dom is None: + print ">DomUnpause %s" % dom + server.xend_domain_unpause( int( dom ) ) + + + + diff --git a/tools/python/xen/sv/DomList.py b/tools/python/xen/sv/DomList.py index ee55957ba6..82f7cc424b 100755 --- a/tools/python/xen/sv/DomList.py +++ b/tools/python/xen/sv/DomList.py @@ -11,6 +11,9 @@ class DomList( HTMLBase ): 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 ): @@ -44,11 +47,9 @@ class DomList( HTMLBase ): request.write( "%s\n" % ( url, domInfoHash['name'] ) ) if long: - request.write( "%(mem)7d\n" % domInfoHash ) - request.write( "%(cpu)3d\n" % domInfoHash ) + request.write( "%(memory)5s\n" % domInfoHash ) + request.write( "%(cpu)2s\n" % domInfoHash ) request.write( "%(state)5s\n" % domInfoHash ) - if long: - request.write( "%(cpu_time)7.1f\n" % domInfoHash ) def write_DOMAIN_HEAD( self, request, long=True ): request.write( "Domain\n" ) @@ -57,6 +58,4 @@ class DomList( HTMLBase ): request.write( "Memory / Mb\n" ) request.write( "CPU\n" ) request.write( "State\n" ) - if long: - request.write( "CPU time / s\n" ) diff --git a/tools/python/xen/sv/Main.py b/tools/python/xen/sv/Main.py index 50712c7710..9de097a1d4 100755 --- a/tools/python/xen/sv/Main.py +++ b/tools/python/xen/sv/Main.py @@ -38,14 +38,13 @@ class Main( HTMLBase ): request.write( "  " ) request.write( " " ) request.write( " " ) - request.write( " " ) + request.write( " " ) + request.write( " ") request.write( " " ) request.write( "
" ) - request.write( "
" ) + request.write( "

SV Web Interface
(C) Tom Wilkie 2004

" ) for (modName, (modTitle, module)) in self.modules.items(): - request.write( "

%s

" % (modName, modTitle)) - - DomList( self.mainUrlWriter ).write_BODY( request, True, False ) + module( self.mainUrlWriter ).write_MENU( request ) request.write( "
" ) diff --git a/tools/python/xen/sv/NodeInfo.py b/tools/python/xen/sv/NodeInfo.py index f13781bf1a..a3aac1d34c 100755 --- a/tools/python/xen/sv/NodeInfo.py +++ b/tools/python/xen/sv/NodeInfo.py @@ -11,6 +11,9 @@ class NodeInfo( GenTabbed ): return urlWriter( "mod=node%s" % url ) GenTabbed.__init__( self, "Node Details", newUrlWriter, [ 'General', 'Dmesg', ], [ NodeGeneralTab, NodeDmesgTab ] ) + + def write_MENU( self, request ): + request.write( "

Node details

" % self.urlWriter( '' ) ) class NodeGeneralTab( CompositeTab ): def __init__( self ): diff --git a/tools/python/xen/sv/util.py b/tools/python/xen/sv/util.py index 64503bad29..57940d9287 100755 --- a/tools/python/xen/sv/util.py +++ b/tools/python/xen/sv/util.py @@ -2,26 +2,21 @@ from xen.xend.XendClient import server from xen.xend import sxp from xen.xend import PrettyPrint +import types + def getDomInfoHash( domain ): - domInfo = server.xend_domain( int( domain ) ) - d = {} - d['dom'] = int( domain ) - d['name'] = sxp.child_value( domInfo, 'name' ) - d['mem'] = int( sxp.child_value( domInfo, 'memory' ) ) - d['cpu'] = int( sxp.child_value( domInfo, 'cpu' ) ) - d['state'] = sxp.child_value( domInfo, 'state' ) - d['cpu_time'] = float( sxp.child_value( domInfo, 'cpu_time' ) ) - if( sxp.child_value( domInfo, 'up_time' ) ): - d['up_time'] = float( sxp.child_value( domInfo, 'up_time' ) ) - if( sxp.child_value( domInfo, 'start_time' ) ): - d['start_time'] = float( sxp.child_value( domInfo, 'start_time' ) ) - return d + domInfoHash = sxp2hash( server.xend_domain( int( domain ) ) ) + domInfoHash['dom'] = int( domain ) + return domInfoHash def sxp2hash( s ): sxphash = {} for child in sxp.children( s ): - sxphash[ child[0] ] = child[1] + if child is types.ListType: + sxphash[ child[0] ] = sxp2hash( child[1] ) + else: + sxphash[ child[0] ] = child[1] return sxphash @@ -33,9 +28,19 @@ def sxp2string( sxp ): self.str = self.str + str temp = tmp() PrettyPrint.prettyprint( sxp, out=temp ) - return temp.str + return temp.str + +def getVar( var, request ): + + arg = request.args.get( var ) + + if arg is None or len(arg) != 1: + return None + else: + return arg[0] def bigTimeFormatter( time ): + time = float( time ) weeks = time // 604800 remainder = time % 604800 days = remainder // 86400 @@ -47,6 +52,7 @@ def bigTimeFormatter( time ): return "%d weeks, %d days, %s" % ( weeks, days, hms ) def smallTimeFormatter( time ): + time = float( time ) hours = time // 3600 remainder = time % 3600 mins = remainder // 60 @@ -56,12 +62,14 @@ def smallTimeFormatter( time ): def stateFormatter( state ): states = [ 'Running', 'Blocked', 'Paused', 'Shutdown', 'Crashed' ] + stateStr = "" + for i in range( len( state ) ): if state[i] != "-": - return states[ i ] + " (%s)" % state - - return state - + stateStr += "%s, " % states[ i ] + + return stateStr + " (%s)" % state + def memoryFormatter( mem ): mem = int( mem ) if mem >= 1024: @@ -71,6 +79,7 @@ def memoryFormatter( mem ): return "%7dMb" % mem def cpuFormatter( mhz ): + mhz = int( mhz ) if mhz > 1000: ghz = float( mhz ) / 1000.0 return "%4.2fGHz" % ghz diff --git a/tools/sv/Makefile b/tools/sv/Makefile index db432d18be..8a63d4ac1b 100755 --- a/tools/sv/Makefile +++ b/tools/sv/Makefile @@ -31,6 +31,8 @@ install: install -m0644 images/shutdown.png $(sv_insdir)/images install -m0644 images/reboot.png $(sv_insdir)/images + install -m0644 images/pause.png $(sv_insdir)/images + install -m0644 images/unpause.png $(sv_insdir)/images # make include folder mkdir -p $(sv_insdir)/inc diff --git a/tools/sv/images/pause.png b/tools/sv/images/pause.png new file mode 100644 index 0000000000..6e16daa177 Binary files /dev/null and b/tools/sv/images/pause.png differ diff --git a/tools/sv/images/unpause.png b/tools/sv/images/unpause.png new file mode 100644 index 0000000000..c971308814 Binary files /dev/null and b/tools/sv/images/unpause.png differ