[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] xsview: a xenstore viewer written in PyQT.



# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1191502371 -3600
# Node ID 56b543dd0da23176662d1a50efdbb3222f1e64a1
# Parent  062fe1c7b09f1b3dc906ed6718dea8cd72c5416b
xsview: a xenstore viewer written in PyQT.
From: Mark Williamson <mark.williamson@xxxxxxxxxxxx>
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 tools/misc/Makefile                 |    2 
 tools/misc/xsview                   |   11 ++
 tools/python/setup.py               |    1 
 tools/python/xen/xsview/main.py     |   10 ++
 tools/python/xen/xsview/xsviewer.py |  168 ++++++++++++++++++++++++++++++++++++
 5 files changed, 191 insertions(+), 1 deletion(-)

diff -r 062fe1c7b09f -r 56b543dd0da2 tools/misc/Makefile
--- a/tools/misc/Makefile       Thu Oct 04 10:31:44 2007 +0100
+++ b/tools/misc/Makefile       Thu Oct 04 13:52:51 2007 +0100
@@ -14,7 +14,7 @@ TARGETS := $(TARGETS-y)
 TARGETS := $(TARGETS-y)
 
 INSTALL_BIN  = $(TARGETS) xencons
-INSTALL_SBIN = netfix xm xen-bugtool xen-python-path xend xenperf
+INSTALL_SBIN = netfix xm xen-bugtool xen-python-path xend xenperf xsview
 
 .PHONY: all
 all: build
diff -r 062fe1c7b09f -r 56b543dd0da2 tools/misc/xsview
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/misc/xsview Thu Oct 04 13:52:51 2007 +0100
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+
+import sys
+
+sys.path.append('/usr/lib/python')
+sys.path.append('/usr/lib64/python')
+from xen.xsview import main
+
+main.main(sys.argv)
+
+
diff -r 062fe1c7b09f -r 56b543dd0da2 tools/python/setup.py
--- a/tools/python/setup.py     Thu Oct 04 10:31:44 2007 +0100
+++ b/tools/python/setup.py     Thu Oct 04 13:52:51 2007 +0100
@@ -79,6 +79,7 @@ setup(name            = 'xen',
                          'xen.xm',
                          'xen.web',
                          'xen.sv',
+                         'xen.xsview',
 
                          'xen.xend.tests',
                          'xen.xend.server.tests',
diff -r 062fe1c7b09f -r 56b543dd0da2 tools/python/xen/xsview/main.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/xsview/main.py   Thu Oct 04 13:52:51 2007 +0100
@@ -0,0 +1,10 @@
+from xsviewer import *
+from qt import *
+
+def main(args):
+    app = QApplication(args)
+    mainwin = XSViewer(app)
+    mainwin.show()
+    app.connect(app, SIGNAL("lastWindowClosed()"),
+                app, SLOT("quit()"))
+    app.exec_loop()
diff -r 062fe1c7b09f -r 56b543dd0da2 tools/python/xen/xsview/xsviewer.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/xsview/xsviewer.py       Thu Oct 04 13:52:51 2007 +0100
@@ -0,0 +1,168 @@
+from qt import *
+
+import xen.lowlevel.xs
+
+class XSViewer(QMainWindow):
+    
+    def __init__(self, app):
+        apply(QMainWindow.__init__, (self,))
+        
+        self.setCaption('XenStore Viewer')
+
+        self.new_node = QAction(self, 'New Node')
+        self.new_node.setText('New Node...')
+        self.connect(self.new_node, SIGNAL('activated()'),
+                     self.do_new_node)
+        
+        self.rm_node = QAction(self, 'Remove Node')
+        self.rm_node.setText('Remove Node')
+        self.connect(self.rm_node, SIGNAL('activated()'),
+                     self.do_rm_node)
+
+        self.refresh = QAction(self, 'Refresh')
+        self.refresh.setText('Refresh')
+        self.connect(self.refresh, SIGNAL('activated()'),
+                     self.do_refresh)
+ 
+        self.file_menu = QPopupMenu(self)
+        self.new_node.addTo(self.file_menu)
+        self.rm_node.addTo(self.file_menu)
+        self.refresh.addTo(self.file_menu)
+
+
+        self.about = QAction(self, 'About')
+        self.about.setText('About...')
+        self.connect(self.about, SIGNAL('activated()'),
+                     self.do_about)
+
+        self.help_menu = QPopupMenu(self)
+        self.about.addTo(self.help_menu)
+
+        self.menubar = QMenuBar(self)
+        self.menubar.insertItem('&File', self.file_menu)
+        self.menubar.insertItem('&Help', self.help_menu)
+
+        self.vbox = QVBox(self)
+        self.setCentralWidget(self.vbox)
+
+        self.xs_tree = QListView(self.vbox)
+        self.xs_tree.addColumn('Key')
+        self.xs_tree.setRootIsDecorated(1)
+        self.xs_tree.connect(self.xs_tree, 
SIGNAL('selectionChanged(QListViewItem*)'), self.showValue)
+
+        self.info_box = QHBox(self.vbox)
+        self.info_box.setMargin(2)
+        self.info_box.setSpacing(2)
+        self.info_label = QLabel(self.info_box)
+        self.info_label.setText('Value')
+        self.info = QLineEdit(self.info_box)
+        self.setval = QPushButton(self.info_box)
+        self.setval.setText('Set')
+        self.setval.connect(self.setval, SIGNAL('clicked()'), self.setValue)
+
+        self.xs_handle = xen.lowlevel.xs.xs()
+
+        self.showtree()
+
+
+    def showtree(self):
+        xstransact = self.xs_handle.transaction_start()
+        self.walktree(xstransact, '/', '/', self.xs_tree)
+        self.xs_handle.transaction_end(xstransact)
+
+    def walktree(self, trans, node, subdir_prepend, parent_widget):
+
+        ents = self.xs_handle.ls(trans, node)
+        if ents == None:
+            return
+
+        for e in ents:
+            i = QListViewItem(parent_widget, e)
+            i.full_path = subdir_prepend + e
+            self.walktree(trans, i.full_path, i.full_path + '/', i)
+
+    
+    def showValue(self, item):
+        trans = self.xs_handle.transaction_start()
+        val = self.xs_handle.read(trans, item.full_path)
+        self.info.setText(val)
+        self.xs_handle.transaction_end(trans)
+
+
+    def setValue(self):
+        trans = self.xs_handle.transaction_start()
+        item = self.xs_tree.currentItem()
+        newval = str(self.info.text())
+
+        self.xs_handle.write(trans, item.full_path, newval)
+
+        self.xs_handle.transaction_end(trans)
+
+
+    def do_refresh(self):
+        self.xs_tree.clear()
+        self.info.clear()
+        self.showtree()
+
+    def do_new_node(self):
+        dia = QDialog(self)
+        dia.setCaption('Create new node')
+
+        vbox = QVBox(dia)
+
+        setting_hbox = QHBox(vbox)
+        
+        path_label = QLabel(setting_hbox)
+        path_label.setText('Node path')
+        path = QLineEdit(setting_hbox)
+        
+        value_label = QLabel(setting_hbox)
+        value_label.setText('Node value')
+        val = QLineEdit(setting_hbox)
+
+        button_hbox = QHBox(vbox)
+
+        set = QPushButton(button_hbox)
+        set.setText('Set')
+        self.connect(set, SIGNAL('clicked()'), dia, SLOT('accept()'))
+
+        cancel = QPushButton(button_hbox)
+        cancel.setText('Cancel')
+        self.connect(cancel, SIGNAL('clicked()'), dia, SLOT('reject()'))
+
+        setting_hbox.adjustSize()
+        button_hbox.adjustSize()
+        vbox.adjustSize()
+
+        if dia.exec_loop() == QDialog.Accepted:
+            trans = self.xs_handle.transaction_start()
+            self.xs_handle.write(trans, str(path.text()), str(val.text()))
+            
+            self.xs_handle.transaction_end(trans)
+
+            self.do_refresh()
+        
+        # nothing to set.
+
+    def do_rm_node(self):
+        trans = self.xs_handle.transaction_start()
+        item = self.xs_tree.currentItem()
+        newval = str(self.info.text())
+
+        self.xs_handle.rm(trans, item.full_path)
+
+        self.xs_handle.transaction_end(trans)
+
+        self.do_refresh()
+
+    def do_about(self):
+        about_dia = QMessageBox(self)
+        about_dia.setIcon(QMessageBox.Information)
+
+        about_dia.setCaption('About XenStore Viewer')
+        about_dia.setText('XenStore Viewer\n'
+                          'by Mark Williamson <mark.williamson@xxxxxxxxxxxx>')
+
+        about_dia.exec_loop()
+        
+        

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.