ia64/xen-unstable

changeset 1897:90591e5e7c45

bitkeeper revision 1.1108.2.25 (41013a8fLV3ITgssCERrYvdjCK-2YQ)

Merge labyrinth.cl.cam.ac.uk:/auto/groups/xeno/BK/xeno.bk
into labyrinth.cl.cam.ac.uk:/local/scratch/tw275/xeno.bk
author tw275@labyrinth.cl.cam.ac.uk
date Fri Jul 23 16:19:27 2004 +0000 (2004-07-23)
parents 8cae910510d1 ca69dc4da1ff
children fbcefe1a0285
files .rootkeys tools/python/xen/sv/DomInfo.py tools/python/xen/sv/GenTabbed.py tools/python/xen/sv/HTMLBase.py tools/python/xen/sv/Main.py tools/python/xen/sv/NodeInfo.py tools/python/xen/sv/util.py tools/python/xen/xend/XendClient.py tools/sv/Makefile tools/sv/images/reboot.png tools/sv/images/shutdown.png tools/sv/inc/script.js tools/sv/inc/style.css
line diff
     1.1 --- a/.rootkeys	Fri Jul 23 15:50:54 2004 +0000
     1.2 +++ b/.rootkeys	Fri Jul 23 16:19:27 2004 +0000
     1.3 @@ -390,12 +390,15 @@ 40fcefb3BUT98zPzW8kAFKuxGdh4XA tools/sv/
     1.4  40fcefb38OTgsUKHBpwshLLIsiIaCA tools/sv/images/middle-no-highlight.jpg
     1.5  40fcefb32SPtrw36c4S6YGFlLvkKuw tools/sv/images/orb_01.jpg
     1.6  40fcefb3Ok5qkX3iM7ZEPVkRInrUpg tools/sv/images/orb_02.jpg
     1.7 +41013a82ILk71xLqWFH5ZO5VmOIvBw tools/sv/images/reboot.png
     1.8  40fcefb3JnT5XeKTuVF4yUMGOtuNZg tools/sv/images/right-end-highlight.jpg
     1.9  40fcefb3-DuYOS7noo2W7b_0p7TOUg tools/sv/images/right-end-no-highlight.jpg
    1.10  40fcefb3qNbAZR5FYGPAZ9sFPVMTDA tools/sv/images/seperator-left-highlight.jpg
    1.11  40fcefb3dgsa24WLk_BJeYQHrDLuOg tools/sv/images/seperator-right-highlight.jpg
    1.12  40fcefb3FtiX4Pd2kT8wDlp8u8xRhQ tools/sv/images/seperator.jpg
    1.13 +41013a82sUdUqBv8EoAUJii3gsZ-4g tools/sv/images/shutdown.png
    1.14  40fcefb3yMSrZvApO9ToIi-iQwnchA tools/sv/images/xen.png
    1.15 +41013a83z27rKvWIxAfUBMVZ1eDCDg tools/sv/inc/script.js
    1.16  40fcefb3zGC9XNBkSwTEobCoq8YClA tools/sv/inc/style.css
    1.17  403a3edbrr8RE34gkbR40zep98SXbg tools/xentrace/Makefile
    1.18  40a107afN60pFdURgBv9KwEzgRl5mQ tools/xentrace/formats
     2.1 --- a/tools/python/xen/sv/DomInfo.py	Fri Jul 23 15:50:54 2004 +0000
     2.2 +++ b/tools/python/xen/sv/DomInfo.py	Fri Jul 23 16:19:27 2004 +0000
     2.3 @@ -14,7 +14,7 @@ class DomInfo( GenTabbed ):
     2.4          def tabUrlWriter( tab ):
     2.5              return urlWriter( "mod=info&dom=%s%s" % ( self.dom, tab ) )
     2.6          
     2.7 -        GenTabbed.__init__( self, tabUrlWriter, [ 'General', 'SXP', 'Devices' ], [ DomGenTab, DomSXPTab, NullTab ]  )
     2.8 +        GenTabbed.__init__( self, "Domain Info", tabUrlWriter, [ 'General', 'SXP', 'Devices' ], [ DomGeneralTab, DomSXPTab, NullTab ]  )
     2.9  
    2.10      def write_BODY( self, request ):
    2.11          dom = request.args.get('dom')
    2.12 @@ -27,6 +27,10 @@ class DomInfo( GenTabbed ):
    2.13          
    2.14          GenTabbed.write_BODY( self, request )
    2.15  
    2.16 +class DomGeneralTab( CompositeTab ):
    2.17 +    def __init__( self ):
    2.18 +       CompositeTab.__init__( self, [ DomGenTab, DomActionTab ] )        
    2.19 +        
    2.20  class DomGenTab( GeneralTab ):
    2.21  
    2.22      def __init__( self ):
    2.23 @@ -41,7 +45,7 @@ class DomGenTab( GeneralTab ):
    2.24          titles[ 'Total CPU' ] = ( 'cpu_time', smallTimeFormatter )
    2.25          titles[ 'Up Time' ] = ( 'up_time', bigTimeFormatter )
    2.26      
    2.27 -        GeneralTab.__init__( self, "General Domain Info", {}, titles )
    2.28 +        GeneralTab.__init__( self, {}, titles )
    2.29          
    2.30      def write_BODY( self, request ):
    2.31      
    2.32 @@ -79,4 +83,18 @@ class DomSXPTab( PreTab ):
    2.33          
    2.34          PreTab.write_BODY( self, request )
    2.35          
    2.36 +class DomActionTab( ActionTab ):
    2.37  
    2.38 +    def __init__( self ):
    2.39 +        ActionTab.__init__( self, { "shutdown" : ( "Shutdown the Domain", "shutdown.png" ),
    2.40 +        	"reboot" : ( "Reboot the Domain", "reboot.png" ) } )    
    2.41 +        
    2.42 +    def op_shutdown( self, request ):
    2.43 +    	print ">DomShutDown"
    2.44 +    	#server.xend_node_shutdown()
    2.45 +    
    2.46 +    def op_reboot( self, request ):
    2.47 +    	print ">DomReboot"
    2.48 +        #server.xend_node_reboot()
    2.49 +        
    2.50 +
     3.1 --- a/tools/python/xen/sv/GenTabbed.py	Fri Jul 23 15:50:54 2004 +0000
     3.2 +++ b/tools/python/xen/sv/GenTabbed.py	Fri Jul 23 16:19:27 2004 +0000
     3.3 @@ -5,12 +5,13 @@ from xen.sv.TabView import TabView
     3.4  
     3.5  class GenTabbed( HTMLBase ):
     3.6  
     3.7 -    def __init__( self, urlWriter, tabStrings, tabObjects ):
     3.8 +    def __init__( self, title, urlWriter, tabStrings, tabObjects ):
     3.9          HTMLBase.__init__(self)
    3.10          self.tab = 0;
    3.11          self.tabStrings = tabStrings
    3.12          self.tabObjects = tabObjects
    3.13          self.urlWriter = urlWriter
    3.14 +        self.title = title
    3.15  
    3.16      def write_BODY( self, request, urlWriter = None ):
    3.17          tab = request.args.get('tab')
    3.18 @@ -23,19 +24,34 @@ class GenTabbed( HTMLBase ):
    3.19          request.write( "<table style='' width='100%' border='0' cellspacing='0' cellpadding='0'>" )
    3.20          request.write( "<tr><td>" )
    3.21          
    3.22 +        request.write( "<p align='center'><u>%s</u></p>" % self.title )
    3.23 +        
    3.24          TabView( self.tab, self.tabStrings, self.urlWriter ).write_BODY( request )
    3.25          
    3.26          request.write( "</td></tr><tr><td>" )
    3.27          
    3.28 -        render_tab = self.tabObjects[ self.tab ]()
    3.29 +        render_tab = self.tabObjects[ self.tab ]
    3.30                  
    3.31          if render_tab is None:
    3.32              request.write( "<p>Bad Tab</p>" )
    3.33              self.finish_BODY( request )
    3.34          else:
    3.35 -            render_tab.write_BODY( request )
    3.36 +            render_tab().write_BODY( request )
    3.37  
    3.38          request.write( "</td></tr></table>" )
    3.39 +       
    3.40 +    def perform( self, request ):
    3.41 +        tab = request.args.get('tab')
    3.42 +        
    3.43 +        if tab is None or len( tab) != 1:
    3.44 +            self.tab = 0
    3.45 +        else:
    3.46 +            self.tab = int( tab[0] )
    3.47 +            
    3.48 +        op_tab = self.tabObjects[ self.tab ]
    3.49 +        
    3.50 +        if op_tab:
    3.51 +            op_tab().perform( request )
    3.52          
    3.53  class PreTab( HTMLBase ):
    3.54  
    3.55 @@ -45,7 +61,7 @@ class PreTab( HTMLBase ):
    3.56      
    3.57      def write_BODY( self, request ):
    3.58          
    3.59 -        request.write( "<div style='display: block; overflow: auto; border: 0px solid black; height: 400px; width: 540px; padding: 5px; z-index:0; align: center'><pre>" )
    3.60 +        request.write( "<div style='display: block; overflow: auto; border: 0px solid black; width: 540px; padding: 5px; z-index:0; align: center'><pre>" )
    3.61          
    3.62          request.write( self.source )
    3.63          
    3.64 @@ -53,16 +69,13 @@ class PreTab( HTMLBase ):
    3.65  
    3.66  class GeneralTab( HTMLBase ):
    3.67                          
    3.68 -    def __init__( self, title, dict, titles ):
    3.69 +    def __init__( self, dict, titles ):
    3.70          HTMLBase.__init__( self )
    3.71 -        self.title = title
    3.72          self.dict = dict
    3.73          self.titles = titles
    3.74                          
    3.75      def write_BODY( self, request ): 
    3.76          
    3.77 -        request.write( "<p><u>%s</u></p>" % self.title )
    3.78 -        
    3.79          request.write( "<table width='100%' cellspacing='0' cellpadding='0' border='0'>" )
    3.80          
    3.81          def writeAttr( niceName, attr, formatter=None ):
    3.82 @@ -90,4 +103,38 @@ class NullTab( HTMLBase ):
    3.83      def write_BODY( self, request ):
    3.84          request.write( "<p>%s</p>" % self.title )
    3.85  
    3.86 +class ActionTab( HTMLBase ):
    3.87 +
    3.88 +    def __init__( self, actions ):
    3.89 +        self.actions = actions
    3.90 +        HTMLBase.__init__( self )
    3.91          
    3.92 +    def write_BODY( self, request ):
    3.93 +        request.write("<p align='center'>")
    3.94 +         
    3.95 +        for ( command, ( text, image ) ) in self.actions.items():
    3.96 +            request.write("<img src='images/%s' width='54' height='54' onclick='doOp( \"%s\" )' onmouseover='update( \"button_desc\", \"%s\" )' " % ( image, command, text ) )
    3.97 +            request.write("onmouseout='update( \"button_desc\", \"&nbsp;\" )' style='button'>")
    3.98 +            request.write("&nbsp;&nbsp;")
    3.99 +    
   3.100 +        request.write("<p align='center'><span id='button_desc'>&nbsp;</span></p>")   
   3.101 +        request.write("</p>")        
   3.102 +        
   3.103 +class CompositeTab( HTMLBase ):
   3.104 +
   3.105 +    def __init__( self, tabs ):
   3.106 +    	HTMLBase.__init__( self )
   3.107 +        self.tabs = tabs
   3.108 +        
   3.109 +    def write_BODY( self, request ):
   3.110 +    	for tab in self.tabs:
   3.111 +            request.write( "<br/>" )
   3.112 +            tab().write_BODY( request )
   3.113 +            
   3.114 +    def perform( self, request ):
   3.115 +    	for tab in self.tabs:
   3.116 +            tab().perform( request )
   3.117 +    
   3.118 +    
   3.119 +       
   3.120 +        
     4.1 --- a/tools/python/xen/sv/HTMLBase.py	Fri Jul 23 15:50:54 2004 +0000
     4.2 +++ b/tools/python/xen/sv/HTMLBase.py	Fri Jul 23 16:19:27 2004 +0000
     4.3 @@ -7,6 +7,10 @@ class HTMLBase( Resource ):
     4.4      def __init__( self ):
     4.5          Resource.__init__(self)
     4.6  
     4.7 +    def render_POST( self, request ):
     4.8 +        self.perform( request )
     4.9 +        self.render_GET( request ) 
    4.10 +        
    4.11      def render_GET( self, request ):
    4.12          self.write_TOP( request )
    4.13          self.write_BODY( request )
    4.14 @@ -19,7 +23,40 @@ class HTMLBase( Resource ):
    4.15          
    4.16      def write_TOP( self, request ):
    4.17          request.write( '<html><head><title>Xen</title><link rel="stylesheet" type="text/css" href="inc/style.css" />' )
    4.18 +        request.write( '<script src="inc/script.js"></script>' )
    4.19          request.write( '</head><body>' )
    4.20  
    4.21      def write_BOTTOM( self, request ):
    4.22 +        request.write('<form method="post" action="%s">' % request.uri)
    4.23 +        request.write('<input type="hidden" name="op" value="">')
    4.24 +        request.write('</form>')
    4.25          request.write( "</body></html>" )
    4.26 +
    4.27 +    def get_op_method(self, op):
    4.28 +        """Get the method for an operation.
    4.29 +        For operation 'foo' looks for 'op_foo'.
    4.30 +
    4.31 +        op	operation name
    4.32 +        returns method or None
    4.33 +        """
    4.34 +        op_method_name = 'op_' + op
    4.35 +        return getattr(self, op_method_name, None)
    4.36 +        
    4.37 +    def perform(self, req):
    4.38 +        """General operation handler for posted operations.
    4.39 +        For operation 'foo' looks for a method op_foo and calls
    4.40 +        it with op_foo(req). Replies with code 500 if op_foo
    4.41 +        is not found.
    4.42 +
    4.43 +        The method must return a list when req.use_sxp is true
    4.44 +        and an HTML string otherwise (or list).
    4.45 +        Methods may also return a Deferred (for incomplete processing).
    4.46 +
    4.47 +        req	request
    4.48 +        """
    4.49 +        op = req.args.get('op')
    4.50 +        if not op is None and len(op) == 1:
    4.51 +            op = op[0]
    4.52 +            op_method = self.get_op_method(op)
    4.53 +            if op_method:
    4.54 +                op_method( req )   
     5.1 --- a/tools/python/xen/sv/Main.py	Fri Jul 23 15:50:54 2004 +0000
     5.2 +++ b/tools/python/xen/sv/Main.py	Fri Jul 23 16:19:27 2004 +0000
     5.3 @@ -1,14 +1,31 @@
     5.4  from xen.sv.HTMLBase import HTMLBase
     5.5 -from xen.sv import DomList, NodeInfo, DomInfo
     5.6 +from xen.sv.DomList  import DomList
     5.7 +from xen.sv.NodeInfo import NodeInfo
     5.8 +from xen.sv.DomInfo  import DomInfo
     5.9  
    5.10  class Main( HTMLBase ):
    5.11      
    5.12      isLeaf = True
    5.13  
    5.14 -    def __init__( self ):
    5.15 +    def __init__( self, urlWriter = None ):
    5.16 +        self.modules = { "node": ( "Node details", NodeInfo ), 
    5.17 +                         "list": ( "Domain summary", DomList ), 
    5.18 +                         "info": ( "Domain info", DomInfo ) }
    5.19          HTMLBase.__init__(self)
    5.20          
    5.21      def render_POST( self, request ):
    5.22 +    
    5.23 +    	#decide what module post'd the action
    5.24 +
    5.25 +        mod = request.args.get('mod')
    5.26 +                
    5.27 +        if not mod is None and len(mod) == 1:
    5.28 +            modTup = self.modules[ mod[0] ]
    5.29 +            #check module exists
    5.30 +            if modTup:
    5.31 +               (modName, module) = modTup
    5.32 +               module( self.mainUrlWriter ).perform( request )     
    5.33 +    
    5.34          return self.render_GET( request )
    5.35  
    5.36      def mainUrlWriter( self, s ):
    5.37 @@ -25,10 +42,10 @@ class Main( HTMLBase ):
    5.38          request.write( "   <img src='images/xen.png' width='150' height='75' border='0'/></a></td></tr>" )
    5.39          request.write( "   <tr><td align='center' valign='top'>" )
    5.40          
    5.41 -        request.write( "    <p class='small'><a href='Main.rpy?mod=node'>Node details</a></p>" )
    5.42 -        request.write( "    <p class='small'><a href='Main.rpy?mod=list'>Domains summary</a></p>" )
    5.43 +        for (modName, (modTitle, module)) in self.modules.items():
    5.44 +            request.write( "    <p class='small'><a href='Main.rpy?mod=%s'>%s</a></p>" % (modName, modTitle))
    5.45      
    5.46 -        DomList.DomList( self.mainUrlWriter ).write_BODY( request, True, False )
    5.47 +        DomList( self.mainUrlWriter ).write_BODY( request, True, False )
    5.48  
    5.49          request.write( "   </td></tr>" )
    5.50          request.write( "  </table>" )
    5.51 @@ -44,14 +61,13 @@ class Main( HTMLBase ):
    5.52          
    5.53          if mod is None or len(mod) != 1:
    5.54              request.write( '<p>Please select a module</p>' )
    5.55 -        elif mod[0] == 'info':
    5.56 -            DomInfo.DomInfo( self.mainUrlWriter ).write_BODY( request )
    5.57 -        elif mod[0] == 'list':
    5.58 -            DomList.DomList( self.mainUrlWriter ).write_BODY( request )
    5.59 -        elif mod[0] == 'node':
    5.60 -            NodeInfo.NodeInfo( self.mainUrlWriter ).write_BODY( request )
    5.61          else:
    5.62 -            request.write( '<p>Invalid module. Please select another</p>' )
    5.63 +            modTup = self.modules[ mod[0] ]
    5.64 +            if modTup:
    5.65 +               (modName, module) = modTup
    5.66 +               module( self.mainUrlWriter ).write_BODY( request )  
    5.67 +            else:
    5.68 +               request.write( '<p>Invalid module. Please select another</p>' )
    5.69      
    5.70          request.write( "   </td></tr>" )
    5.71          request.write( "  </table>" )
     6.1 --- a/tools/python/xen/sv/NodeInfo.py	Fri Jul 23 15:50:54 2004 +0000
     6.2 +++ b/tools/python/xen/sv/NodeInfo.py	Fri Jul 23 16:19:27 2004 +0000
     6.3 @@ -10,24 +10,18 @@ class NodeInfo( GenTabbed ):
     6.4          def newUrlWriter( url ):
     6.5              return urlWriter( "mod=node%s" % url )
     6.6      
     6.7 -        GenTabbed.__init__( self, newUrlWriter, [ 'General', 'Dmesg' ], [ NodeGenTab, NodeDmesgTab ] )
     6.8 +        GenTabbed.__init__( self, "Node Details", newUrlWriter, [ 'General', 'Dmesg', ], [ NodeGeneralTab, NodeDmesgTab ] )
     6.9  
    6.10 -class NodeGenTab( PreTab ):
    6.11 +class NodeGeneralTab( CompositeTab ):
    6.12      def __init__( self ):
    6.13 -       text = sxp2string( server.xend_node() )
    6.14 -       PreTab.__init__( self, text )            
    6.15 -    
    6.16 -class NodeGeneralTab( GeneralTab ):
    6.17 +    	CompositeTab.__init__( self, [ NodeInfoTab, NodeActionTab ] )        
    6.18 +        
    6.19 +class NodeInfoTab( GeneralTab ):
    6.20                          
    6.21      def __init__( self ):
    6.22           
    6.23 -        nodeInfo = server.xend_node()
    6.24 -        
    6.25 -        dictNodeInfo = {}
    6.26 -        
    6.27 -        for l in nodeInfo:
    6.28 -            dictNodeInfo[ l[0] ] = l[1]
    6.29 -            
    6.30 +        nodeInfo = sxp2hash( server.xend_node() )
    6.31 +    
    6.32          dictTitles = {}
    6.33          dictTitles[ 'System' ] = 'system'
    6.34          dictTitles[ 'Hostname' ] = 'host' 
    6.35 @@ -40,11 +34,24 @@ class NodeGeneralTab( GeneralTab ):
    6.36          dictTitles[ 'Memory' ] = ( 'memory', memoryFormatter )
    6.37          dictTitles[ 'Free Memory' ] = ( 'free_memory', memoryFormatter )
    6.38          
    6.39 -        GeneralTab.__init__( self, title="General Node Info", dict=dictNodeInfo, titles=dictTitles )
    6.40 +        GeneralTab.__init__( self, dict=nodeInfo, titles=dictTitles )
    6.41  
    6.42  class NodeDmesgTab( PreTab ):
    6.43  
    6.44      def __init__( self ):
    6.45          dmesg = server.xend_node_dmesg()
    6.46          PreTab.__init__( self, dmesg[ 1 ] )
    6.47 +  
    6.48 +class NodeActionTab( ActionTab ):
    6.49 +
    6.50 +    def __init__( self ):
    6.51 +        ActionTab.__init__( self, { "shutdown" : ( "Shutdown the Node", "shutdown.png" ),
    6.52 +        	"reboot" : ( "Reboot the Node", "reboot.png" ) } )    
    6.53 +        
    6.54 +    def op_shutdown( self, request ):
    6.55 +    	print ">NodeShutDown"
    6.56 +    	#server.xend_node_shutdown()
    6.57      
    6.58 +    def op_reboot( self, request ):
    6.59 +    	print ">NodeReboot"
    6.60 +        #server.xend_node_reboot()
     7.1 --- a/tools/python/xen/sv/util.py	Fri Jul 23 15:50:54 2004 +0000
     7.2 +++ b/tools/python/xen/sv/util.py	Fri Jul 23 16:19:27 2004 +0000
     7.3 @@ -17,8 +17,13 @@ def getDomInfoHash( domain ):
     7.4          d['start_time'] = float( sxp.child_value( domInfo, 'start_time' ) )
     7.5      return d
     7.6  
     7.7 -def sxp2hash( sxp ):
     7.8 -    pass
     7.9 +def sxp2hash( s ):
    7.10 +    sxphash = {}
    7.11 +        
    7.12 +    for child in sxp.children( s ):
    7.13 +        sxphash[ child[0] ] = child[1]
    7.14 +        
    7.15 +    return sxphash
    7.16      
    7.17  def sxp2string( sxp ):
    7.18      class tmp:
    7.19 @@ -58,7 +63,12 @@ def stateFormatter( state ):
    7.20      return state
    7.21      
    7.22  def memoryFormatter( mem ):
    7.23 -    return "%7dMb" % mem
    7.24 +    mem = int( mem )
    7.25 +    if mem >= 1024:
    7.26 +        mem = float( mem ) / 1024
    7.27 +        return "%3.2fGb" % mem
    7.28 +    else:    
    7.29 +        return "%7dMb" % mem
    7.30  
    7.31  def cpuFormatter( mhz ):
    7.32      if mhz > 1000:
     8.1 --- a/tools/python/xen/xend/XendClient.py	Fri Jul 23 15:50:54 2004 +0000
     8.2 +++ b/tools/python/xen/xend/XendClient.py	Fri Jul 23 16:19:27 2004 +0000
     8.3 @@ -366,6 +366,14 @@ class Xend:
     8.4      def xend_node(self):
     8.5          return self.xendGet(self.nodeurl())
     8.6          
     8.7 +    def xend_node_shutdown(self):
     8.8 +        return self.xendPost(self.nodeurl(),
     8.9 +                {'op'      : 'shutdown'})
    8.10 +                
    8.11 +    def xend_node_restart(self):
    8.12 +        return self.xendPost(self.nodeurl(),
    8.13 +                {'op'      : 'reboot'})
    8.14 +
    8.15      def xend_node_dmesg(self):
    8.16          return self.xendGet(self.dmesgurl())
    8.17  
     9.1 --- a/tools/sv/Makefile	Fri Jul 23 15:50:54 2004 +0000
     9.2 +++ b/tools/sv/Makefile	Fri Jul 23 16:19:27 2004 +0000
     9.3 @@ -28,12 +28,16 @@ install:
     9.4  	install -m0644 images/seperator.jpg $(sv_insdir)/images
     9.5  	install -m0644 images/seperator-left-highlight.jpg $(sv_insdir)/images
     9.6  	install -m0644 images/seperator-right-highlight.jpg $(sv_insdir)/images
     9.7 +	
     9.8 +	install -m0644 images/shutdown.png $(sv_insdir)/images
     9.9 +	install -m0644 images/reboot.png $(sv_insdir)/images
    9.10  
    9.11  	# make include folder
    9.12  	mkdir -p $(sv_insdir)/inc
    9.13  	
    9.14  	# copy stylesheet
    9.15  	install -m0644 inc/style.css $(sv_insdir)/inc
    9.16 +	install -m0644 inc/script.js $(sv_insdir)/inc
    9.17  
    9.18  clean:
    9.19  
    10.1 Binary file tools/sv/images/reboot.png has changed
    11.1 Binary file tools/sv/images/shutdown.png has changed
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/tools/sv/inc/script.js	Fri Jul 23 16:19:27 2004 +0000
    12.3 @@ -0,0 +1,15 @@
    12.4 +function update( objRef, text )
    12.5 +{
    12.6 +    if ( document.all || document.getElementById )
    12.7 +    {
    12.8 +        obj = ( document.getElementById )? document.getElementById( objRef ) : document.all( objRef );
    12.9 +
   12.10 +        obj.innerHTML= text
   12.11 +    }
   12.12 +}
   12.13 +
   12.14 +function doOp( op )
   12.15 +{
   12.16 +    document.forms[0].op.value = op
   12.17 +    document.forms[0].submit()
   12.18 +}
    13.1 --- a/tools/sv/inc/style.css	Fri Jul 23 15:50:54 2004 +0000
    13.2 +++ b/tools/sv/inc/style.css	Fri Jul 23 16:19:27 2004 +0000
    13.3 @@ -27,4 +27,6 @@ body {
    13.4  	
    13.5  	
    13.6  	}
    13.7 -	
    13.8 \ No newline at end of file
    13.9 +        
   13.10 +.button (cursor:hand)
   13.11 +