aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/misc/Makefile2
-rw-r--r--tools/misc/xsview11
-rw-r--r--tools/python/setup.py1
-rw-r--r--tools/python/xen/xsview/main.py10
-rw-r--r--tools/python/xen/xsview/xsviewer.py168
5 files changed, 191 insertions, 1 deletions
diff --git a/tools/misc/Makefile b/tools/misc/Makefile
index ffa67ada40..ee81fe34b9 100644
--- a/tools/misc/Makefile
+++ b/tools/misc/Makefile
@@ -14,7 +14,7 @@ TARGETS-$(CONFIG_X86) += xen-detect
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 --git a/tools/misc/xsview b/tools/misc/xsview
new file mode 100644
index 0000000000..c6726554b7
--- /dev/null
+++ b/tools/misc/xsview
@@ -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 --git a/tools/python/setup.py b/tools/python/setup.py
index 25c87c3b91..68ce0070d4 100644
--- a/tools/python/setup.py
+++ b/tools/python/setup.py
@@ -79,6 +79,7 @@ setup(name = 'xen',
'xen.xm',
'xen.web',
'xen.sv',
+ 'xen.xsview',
'xen.xend.tests',
'xen.xend.server.tests',
diff --git a/tools/python/xen/xsview/main.py b/tools/python/xen/xsview/main.py
new file mode 100644
index 0000000000..b8d3b411cf
--- /dev/null
+++ b/tools/python/xen/xsview/main.py
@@ -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 --git a/tools/python/xen/xsview/xsviewer.py b/tools/python/xen/xsview/xsviewer.py
new file mode 100644
index 0000000000..4dbaf9813c
--- /dev/null
+++ b/tools/python/xen/xsview/xsviewer.py
@@ -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@cl.cam.ac.uk>')
+
+ about_dia.exec_loop()
+
+