[Ocfs2-tools-commits] manish commits r714 -
trunk/ocfs2console/ocfs2interface
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Sun Mar 20 23:32:04 CST 2005
Author: manish
Date: 2005-03-20 23:32:02 -0600 (Sun, 20 Mar 2005)
New Revision: 714
Added:
trunk/ocfs2console/ocfs2interface/partitionview.py
Modified:
trunk/ocfs2console/ocfs2interface/Makefile
trunk/ocfs2console/ocfs2interface/console.py
trunk/ocfs2console/ocfs2interface/fsck.py
trunk/ocfs2console/ocfs2interface/menu.py
trunk/ocfs2console/ocfs2interface/toolbar.py
Log:
Factored out PartitionView into its own file, more context on widget
sensitivity.
Modified: trunk/ocfs2console/ocfs2interface/Makefile
===================================================================
--- trunk/ocfs2console/ocfs2interface/Makefile 2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/Makefile 2005-03-21 05:32:02 UTC (rev 714)
@@ -65,6 +65,7 @@
guiutil.py \
menu.py \
nodemap.py \
+ partitionview.py \
process.py \
toolbar.py \
tune.py
Modified: trunk/ocfs2console/ocfs2interface/console.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/console.py 2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/console.py 2005-03-21 05:32:02 UTC (rev 714)
@@ -17,10 +17,9 @@
import gtk
-import ocfs2
-
from guiutil import set_props, error_box, query_text
+from partitionview import PartitionView
from menu import Menu
from toolbar import Toolbar
from about import about, process_gui_args
@@ -33,114 +32,12 @@
from clconfig import cluster_configurator
from fsck import fsck_volume
-COLUMN_DEVICE = 0
-COLUMN_MOUNTPOINT = 1
-
-notebook_items = (
- ('general', 'General', General),
- ('browser', 'File Listing', Browser),
- ('nodemap', 'Configured Nodes', NodeMap),
+info_items = (
+ ('General', General),
+ ('File Listing', Browser),
+ ('Configured Nodes', NodeMap),
)
-class PartitionView(gtk.TreeView):
- def __init__(self):
- store = gtk.ListStore(str, str, str)
-
- gtk.TreeView.__init__(self, store)
-
- self.insert_column_with_attributes(-1, 'Device',
- gtk.CellRendererText(),
- text=COLUMN_DEVICE)
- self.insert_column_with_attributes(-1, 'Mountpoint',
- gtk.CellRendererText(),
- text=COLUMN_MOUNTPOINT)
-
- sel = self.get_selection()
- sel.connect('changed', self.on_select)
-
- def get_sel_values(self):
- sel = self.get_selection()
- store, iter = sel.get_selected()
-
- if store and iter:
- return store[iter]
- else:
- return (None, None)
-
- def get_device(self):
- selection = self.get_sel_values()
- return selection[COLUMN_DEVICE]
-
- def on_select(self, sel):
- self.selected = True
-
- device, mountpoint = self.get_sel_values()
-
- if mountpoint:
- self.mount_button.set_sensitive(False)
- self.unmount_button.set_sensitive(True)
- else:
- self.mount_button.set_sensitive(True)
- self.unmount_button.set_sensitive(False)
-
- self.update_notebook(device)
-
- def update_notebook(self, device):
- for tag, d, info in notebook_items:
- frame = getattr(self, tag + '_frame')
- frame.child.destroy()
-
- frame.add(info(device).widget)
- frame.show_all()
-
- def select_device(self, device):
- for row in self.get_model():
- if row[COLUMN_DEVICE] == device:
- sel = self.get_selection()
- sel.select_iter(row.iter)
-
- def refresh_partitions(self):
- def list_compare(store, a, b):
- d1, m1 = store[a]
- d2, m2 = store[b]
-
- if m1 and not m2:
- return -1
- elif not m1 and m2:
- return 1
- else:
- return cmp(d1, d2)
-
- self.mount_button.set_sensitive(False)
- self.unmount_button.set_sensitive(False)
-
- filter = self.filter_entry.get_text()
-
- old_device = self.get_device()
-
- store = gtk.ListStore(str, str)
- self.set_model(store)
-
- self.store = store
- self.sel = self.get_selection()
- self.selected = False
-
- store.set_sort_func(COLUMN_DEVICE, list_compare)
- store.set_sort_column_id(COLUMN_DEVICE, gtk.SORT_ASCENDING)
-
- ocfs2.partition_list(self.add_partition, data=old_device,
- filter=filter, fstype='ocfs2', async=True)
-
- if len(store) and not self.selected:
- self.sel.select_iter(store.get_iter_first())
-
- def add_partition(self, device, mountpoint, fstype, old_device):
- iter = self.store.append((device, mountpoint))
-
- if device == old_device:
- self.sel.select_iter(iter)
- self.selected = True
-
class Console(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
@@ -151,26 +48,44 @@
border_width=0)
self.connect('delete_event', self.cleanup)
- pv = PartitionView()
+ notebook = gtk.Notebook()
+ notebook.set_tab_pos(gtk.POS_TOP)
+ info_frames = []
+
+ for desc, info in info_items:
+ frame = gtk.Frame()
+ set_props(frame, shadow=gtk.SHADOW_NONE,
+ border_width=0)
+
+ notebook.add_with_properties(frame, 'tab_label', desc)
+
+ info_frames.append((frame, info))
+
+ self.pv = PartitionView(info_frames)
+
vbox = gtk.VBox()
self.add(vbox)
- self.menu = Menu(self)
+ menu = Menu(self)
- menubar = self.menu.get_widget(pv)
+ menubar, unmounted_items = menu.get_widgets()
vbox.pack_start(menubar, expand=False, fill=False)
- self.toolbar = Toolbar(self)
+ self.pv.add_unmount_widgets(unmounted_items)
- tb, buttons, pv.filter_entry = self.toolbar.get_widgets(pv)
+ toolbar = Toolbar(self)
+
+ tb, buttons, filter_entry = toolbar.get_widgets()
vbox.pack_start(tb, expand=False, fill=False)
- for k, v in buttons.iteritems():
- setattr(pv, k + '_button', v)
+ self.pv.add_mount_widgets(buttons['unmount'])
+ self.pv.add_unmount_widgets(buttons['mount'])
- pv.filter_entry.connect('activate', self.filter_update, pv)
+ filter_entry.connect('activate', self.refresh)
+ self.pv.set_filter_entry(filter_entry)
+
vpaned = gtk.VPaned()
vpaned.set_border_width(4)
vbox.pack_start(vpaned, expand=True, fill=True)
@@ -178,40 +93,28 @@
scrl_win = gtk.ScrolledWindow()
set_props(scrl_win, hscrollbar_policy=gtk.POLICY_AUTOMATIC,
vscrollbar_policy=gtk.POLICY_AUTOMATIC)
- scrl_win.add(pv)
+ scrl_win.add(self.pv)
vpaned.pack1(scrl_win)
- notebook = gtk.Notebook()
- notebook.set_tab_pos(gtk.POS_TOP)
vpaned.pack2(notebook)
- for tag, desc, info in notebook_items:
- frame = gtk.Frame()
- set_props(frame, shadow=gtk.SHADOW_NONE,
- border_width=0)
-
- tag = tag + '_frame'
- setattr(pv, tag, frame)
-
- frame.add(info().widget)
- frame.show_all()
-
- notebook.add_with_properties(frame, 'tab_label', desc)
-
- pv.refresh_partitions()
- pv.grab_focus()
-
+ self.pv.grab_focus()
self.show_all()
+ self.refresh()
+
def cleanup(self, *args):
gtk.main_quit()
- def about(self, pv):
+ def about(self):
about(self)
- def mount(self, pv):
- device, mountpoint = pv.get_sel_values()
+ def refresh(self, *args):
+ self.pv.refresh_partitions()
+ def mount(self):
+ device, mountpoint = self.pv.get_sel_values()
+
mountpoint = query_text(self, 'Mountpoint')
if not mountpoint:
return
@@ -229,19 +132,15 @@
else:
error_box(self, '%s: Could not mount %s' % (output, device))
- pv.refresh_partitions()
+ def unmount(self):
+ device, mountpoint = self.pv.get_sel_values()
- def unmount(pv):
- device, mountpoint = pv.get_sel_values()
-
command = ('umount', mountpoint)
p = Process(command, 'Unmount', 'Unmounting...', self, spin_now=False)
success, output, killed = p.reap()
- if success:
- pv.refresh_partitions()
- else:
+ if not success:
if killed:
error_box(self, 'umount died unexpectedly! Your system is '
'probably in an inconsistent state. You '
@@ -250,38 +149,24 @@
error_box(self, '%s: Could not unmount %s mounted on %s' %
(output, device, mountpoint))
- def refresh(self, pv):
- pv.refresh_partitions()
+ def format(self):
+ format_partition(self, self.pv.get_device())
- if len(pv.get_model()) == 0:
- pv.update_notebook(None)
+ def relabel(self):
+ tune_label(self, self.pv.get_device())
- def format(self, pv):
- format_partition(self, pv.get_device())
- pv.refresh_partitions()
+ def node_num(self):
+ tune_nodes(self, self.pv.get_device())
- def relabel(self, pv):
- tune_label(self, pv.get_device())
- pv.refresh_partitions()
+ def check(self):
+ fsck_volume(self, self.pv.get_device(), check=True)
- def node_num(self, pv):
- tune_nodes(self, pv.get_device())
- pv.refresh_partitions()
+ def repair(self):
+ fsck_volume(self, self.pv.get_device(), check=False)
- def check(self, pv):
- fsck_volume(self, pv.get_device(), check=True)
- pv.refresh_partitions()
-
- def repair(self, pv):
- fsck_volume(self, pv.get_device(), check=False)
- pv.refresh_partitions()
-
- def clconfig(self, pv):
+ def clconfig(self):
cluster_configurator(self)
- def filter_update(self, entry, pv):
- refresh(pv)
-
def main():
process_gui_args()
console = Console()
Modified: trunk/ocfs2console/ocfs2interface/fsck.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/fsck.py 2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/fsck.py 2005-03-21 05:32:02 UTC (rev 714)
@@ -15,13 +15,13 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
-import os
-
import gobject
import gtk
from guiutil import set_props
+base_command = ('fsck.ocfs2',)
+
try:
import vte
except ImportError:
@@ -52,8 +52,8 @@
frame.add(hbox)
terminal = vte.Terminal()
- terminal.set_scrollback_lines(2048)
- terminal.set_font_from_string('monospace 12')
+ terminal.set_scrollback_lines(8192)
+ #terminal.set_font_from_string('monospace 12')
hbox.pack_start(terminal)
scrollbar = gtk.VScrollbar()
@@ -96,14 +96,14 @@
dialog.finished = True
def fsck_command(device, check):
- command = ['fsck.ocfs2']
+ command = list(base_command)
if check:
command.append('-n')
else:
command.append('-y')
- command.append(device)
+ command.append("'%s'" % device)
realcommand = '%s; sleep 1' % ' '.join(command)
Modified: trunk/ocfs2console/ocfs2interface/menu.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/menu.py 2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/menu.py 2005-03-21 05:32:02 UTC (rev 714)
@@ -25,36 +25,36 @@
stock_about = ''
file_menu_data = (
- ('/_File', None, None, 0, '<Branch>'),
- ('/File/_Quit', None, 'cleanup', 0, '<StockItem>',
+ ('/_File', None, None, 0, '<Branch>'),
+ ('/File/_Quit', None, 'cleanup', 0, '<StockItem>',
gtk.STOCK_QUIT)
)
help_menu_data = (
- ('/_Help', None, None, 0, '<Branch>'),
- ('/Help/_About', None, 'about', 0, '<StockItem>',
+ ('/_Help', None, None, 0, '<Branch>'),
+ ('/Help/_About', None, 'about', 0, '<StockItem>',
stock_about)
)
if fsck_ok:
task_menu_fsck_data = (
- ('/Tasks/Chec_k...', '<control>K', 'check'),
- ('/Tasks/_Repair...', '<control>R', 'repair'),
- ('/Tasks/---', None, None, 0, '<Separator>')
+ ('/Tasks/Chec_k...', '<control>K', 'check', 'refresh'),
+ ('/Tasks/_Repair...', '<control>R', 'repair', 'refresh', True),
+ ('/Tasks/---', None, None, 0, '<Separator>')
)
else:
task_menu_fsck_data = ()
task_menu_head_data = (
- ('/_Tasks', None, None, 0, '<Branch>'),
- ('/Tasks/_Format...', '<control>F', 'format'),
- ('/Tasks/---', None, None, 0, '<Separator>')
+ ('/_Tasks', None, None, 0, '<Branch>'),
+ ('/Tasks/_Format...', '<control>F', 'format', 'refresh'),
+ ('/Tasks/---', None, None, 0, '<Separator>')
)
task_menu_tail_data = (
- ('/Tasks/Change _Label...', None, 'relabel'),
- ('/Tasks/Edit _Node Count...', None, 'node_num'),
- ('/Tasks/---', None, None, 0, '<Separator>'),
+ ('/Tasks/Change _Label...', None, 'relabel', 'refresh', True),
+ ('/Tasks/Edit _Node Count...', None, 'node_num', 'refresh', True),
+ ('/Tasks/---', None, None, 0, '<Separator>'),
('/Tasks/_Cluster Config...', None, 'clconfig')
)
@@ -68,31 +68,59 @@
self.items = []
- for i in menu_data:
- item = list(i)
+ for data in menu_data:
+ item = list(data)
- if i[2]:
+ data_list = [None] * 6
+ data_list[0:len(data)] = data
+
+ path, accel, callback, sub_callback, item_type, extra = data_list
+
+ if item_type is True:
+ del item[4:]
+
+ if callback:
def make_cb():
- callback = getattr(window, i[2])
+ cb = getattr(window, callback)
- def cb(d, a, w):
- callback(d)
+ if sub_callback:
+ del item[3:]
- return cb
+ sub_cb = getattr(window, sub_callback)
+ def cb_func(a, w):
+ cb()
+ sub_cb()
+ else:
+ def cb_func(a, w):
+ cb()
+
+ return cb_func
+
item[2] = make_cb()
self.items.append(tuple(item))
- def get_widget(self, data=None):
+ def get_widgets(self):
accel_group = gtk.AccelGroup()
self.window.add_accel_group(accel_group)
- self.item_factory = gtk.ItemFactory(gtk.MenuBar, '<main>', accel_group)
- self.item_factory.create_items(self.items, data)
+ item_factory = gtk.ItemFactory(gtk.MenuBar, '<main>', accel_group)
+ item_factory.create_items(self.items)
- return self.item_factory.get_widget('<main>')
+ menu_bar = item_factory.get_widget('<main>')
+ widgets = []
+
+ for data in menu_data:
+ if len(data) >= 5 and data[4] is True:
+ path = data[0].replace('_', '')
+ widgets.append(item_factory.get_item('<main>%s' % path))
+
+ self.window.item_factory = item_factory
+
+ return menu_bar, widgets
+
def main():
def dummy(*args):
gtk.main_quit()
@@ -100,16 +128,18 @@
window = gtk.Window()
window.connect('delete_event', dummy)
+ window.refresh = dummy
+
for i in menu_data:
if i[2]:
setattr(window, i[2], dummy)
- menubar = Menu(window)
+ menu = Menu(window)
vbox = gtk.VBox()
window.add(vbox)
- vbox.add(menubar.get_widget())
+ vbox.add(menu.get_widgets()[0])
window.show_all()
Added: trunk/ocfs2console/ocfs2interface/partitionview.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/partitionview.py 2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/partitionview.py 2005-03-21 05:32:02 UTC (rev 714)
@@ -0,0 +1,161 @@
+# OCFS2Console - GUI frontend for OCFS2 management and debugging
+# Copyright (C) 2002, 2005 Oracle. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
+
+import gtk
+
+import ocfs2
+
+COLUMN_DEVICE = 0
+COLUMN_MOUNTPOINT = 1
+
+class PartitionView(gtk.TreeView):
+ def __init__(self, info_frames=()):
+ store = gtk.ListStore(str, str, str)
+
+ gtk.TreeView.__init__(self, store)
+
+ self.insert_column_with_attributes(-1, 'Device',
+ gtk.CellRendererText(),
+ text=COLUMN_DEVICE)
+ self.insert_column_with_attributes(-1, 'Mountpoint',
+ gtk.CellRendererText(),
+ text=COLUMN_MOUNTPOINT)
+
+ sel = self.get_selection()
+ sel.connect('changed', self.on_select)
+
+ self.filter_entry = None
+
+ self.mount_widgets = []
+ self.unmount_widgets = []
+
+ self.info_frames = tuple(info_frames)
+
+ def get_sel_values(self):
+ sel = self.get_selection()
+ store, iter = sel.get_selected()
+
+ if store and iter:
+ return store[iter]
+ else:
+ return (None, None)
+
+ def get_device(self):
+ selection = self.get_sel_values()
+ return selection[COLUMN_DEVICE]
+
+ def on_select(self, sel):
+ self.selected = True
+
+ device, mountpoint = self.get_sel_values()
+
+ if mountpoint:
+ self.set_widgets_sensitive(self.mount_widgets, True)
+ self.set_widgets_sensitive(self.unmount_widgets, False)
+ else:
+ self.set_widgets_sensitive(self.mount_widgets, False)
+ self.set_widgets_sensitive(self.unmount_widgets, True)
+
+ self.update_info(device)
+
+ def update_info(self, device):
+ for frame, info in self.info_frames:
+ if frame.child:
+ frame.child.destroy()
+
+ frame.add(info(device).widget)
+ frame.show_all()
+
+ def select_device(self, device):
+ for row in self.get_model():
+ if row[COLUMN_DEVICE] == device:
+ sel = self.get_selection()
+ sel.select_iter(row.iter)
+
+ def refresh_partitions(self):
+ def list_compare(store, a, b):
+ d1, m1 = store[a]
+ d2, m2 = store[b]
+
+ if m1 and not m2:
+ return -1
+ elif not m1 and m2:
+ return 1
+ else:
+ return cmp(d1, d2)
+
+ self.set_widgets_sensitive(self.mount_widgets, False)
+ self.set_widgets_sensitive(self.unmount_widgets, False)
+
+ if self.filter_entry:
+ filter = self.filter_entry.get_text()
+ else:
+ filter = None
+
+ old_device = self.get_device()
+
+ store = gtk.ListStore(str, str)
+ self.set_model(store)
+
+ self.store = store
+ self.sel = self.get_selection()
+ self.selected = False
+
+ store.set_sort_func(COLUMN_DEVICE, list_compare)
+ store.set_sort_column_id(COLUMN_DEVICE, gtk.SORT_ASCENDING)
+
+ ocfs2.partition_list(self.add_partition, data=old_device,
+ filter=filter, fstype='ocfs2', async=True)
+
+ if len(store):
+ if not self.selected:
+ self.sel.select_iter(store.get_iter_first())
+ else:
+ self.update_info(None)
+
+ def add_partition(self, device, mountpoint, fstype, old_device):
+ iter = self.store.append((device, mountpoint))
+
+ if device == old_device:
+ self.sel.select_iter(iter)
+ self.selected = True
+
+ def set_filter_entry(self, entry):
+ self.filter_entry = entry
+
+ def add_to_widget_list(self, widget_list, widgets):
+ try:
+ widget_list.extend(widgets)
+ except TypeError:
+ widget_list.append(widgets)
+
+ def add_mount_widgets(self, widgets):
+ self.add_to_widget_list(self.mount_widgets, widgets)
+
+ def add_unmount_widgets(self, widgets):
+ self.add_to_widget_list(self.unmount_widgets, widgets)
+
+ def set_widgets_sensitive(self, widgets, sensitive=True):
+ for widget in widgets:
+ widget.set_sensitive(sensitive)
+
+def main():
+ console = Console()
+ gtk.main()
+
+if __name__ == '__main__':
+ main()
Modified: trunk/ocfs2console/ocfs2interface/toolbar.py
===================================================================
--- trunk/ocfs2console/ocfs2interface/toolbar.py 2005-03-21 04:50:54 UTC (rev 713)
+++ trunk/ocfs2console/ocfs2interface/toolbar.py 2005-03-21 05:32:02 UTC (rev 714)
@@ -27,23 +27,25 @@
def __init__(self, window):
self.window = window
- def get_widgets(self, data=None):
+ def get_widgets(self):
toolbar = gtk.Toolbar()
items = {}
- for i in toolbar_data:
+ for data in toolbar_data:
+ label, stock_id, callback = data
+
def make_cb():
- callback = getattr(self.window, i[2])
+ cb = getattr(self.window, callback)
- def cb(w, d=None):
- callback(d)
+ def cb_func(w):
+ cb()
- return cb
+ return cb_func
icon = gtk.Image()
- icon.set_from_stock(i[1], gtk.ICON_SIZE_BUTTON)
- items[i[2]] = toolbar.append_item(i[0], i[0], None, icon,
- make_cb(), data)
+ icon.set_from_stock(stock_id, gtk.ICON_SIZE_BUTTON)
+ items[callback] = toolbar.append_item(label, label, None, icon,
+ make_cb())
toolbar.append_space()
More information about the Ocfs2-tools-commits
mailing list