diff options
-rw-r--r-- | tools/misc/Makefile | 2 | ||||
-rw-r--r-- | tools/misc/xsview | 11 | ||||
-rw-r--r-- | tools/python/setup.py | 1 | ||||
-rw-r--r-- | tools/python/xen/xsview/main.py | 10 | ||||
-rw-r--r-- | tools/python/xen/xsview/xsviewer.py | 168 |
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() + + |