From f6e555739389284dc4ac7489984f15c13624bb25 Mon Sep 17 00:00:00 2001 From: Christopher Harvey Date: Tue, 1 Jun 2010 18:16:38 -0400 Subject: Added RcUpdateWindow. It only displays current status, no updates yet. --- src/frontend/RcUpdateWindow.py | 111 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/frontend/RcUpdateWindow.py diff --git a/src/frontend/RcUpdateWindow.py b/src/frontend/RcUpdateWindow.py new file mode 100644 index 0000000..a9653e1 --- /dev/null +++ b/src/frontend/RcUpdateWindow.py @@ -0,0 +1,111 @@ +""" + + This file is part of the Ventoo program. + + This 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 3 of the License, or + (at your option) any later version. + + It 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 software. If not, see . + + Copyright 2010 Christopher Harvey + + +""" + +import sys +sys.path.append('../backend') +import pygtk +pygtk.require('2.0') +import gtk +import gobject +import os.path as osp +import augeas_utils +import subprocess +import getpass +import os +import re +import pdb + +class RcUpdateWindow(gtk.Window): + def __init__(self): + gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) + self.set_default_size(300, 500) + self.connect("delete_event", self.close) + self.runlevels = ["boot", "default", "nonetwork"] + # name boot default nonetwork + self.tv_store = gtk.ListStore(str, 'gboolean', 'gboolean', 'gboolean') + self.tv_store.set_sort_column_id(0, gtk.SORT_ASCENDING) + self.tv_view = gtk.TreeView(self.tv_store) + + #renderers and columns + nameRenderer = gtk.CellRendererText() + nameColumn = gtk.TreeViewColumn("Script Name") + nameColumn.pack_start(nameRenderer, False) + nameColumn.add_attribute(nameRenderer, 'text', 0) + self.tv_view.append_column(nameColumn) + i = 1 + for level in self.runlevels: + renderer = gtk.CellRendererToggle() + renderer.set_property("activatable", True) + renderer.connect("toggled", self.entry_toggled) + column = gtk.TreeViewColumn(level) + column.pack_start(renderer, False) + column.add_attribute(renderer, 'active', i) + self.tv_view.append_column(column) + i += 1 + + scrollWindow = gtk.ScrolledWindow() + scrollWindow.add(self.tv_view) + scrollWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) + self.add(scrollWindow) + + #fill model with data + reportedData = [] + username = getpass.getuser() + if username == 'root': + process = subprocess.Popen("rc-update -s", stdout=subprocess.PIPE, shell=True) + os.waitpid(process.pid, 0) + output = process.stdout.read().strip() + output = output.split('\n') + for line in output: + datas = line.split(' ') + datas = filter(lambda a: a != '', datas) #remove all '' + datas = filter(lambda a: a != '|', datas) #remove the '|' + scriptName = datas[0] + reportedData.append(scriptName) + datas = datas[1:] + rowData = [scriptName] + for level in self.runlevels: + if level in datas: + rowData.append(True) + else: + rowData.append(False) + self.tv_store.append(rowData) + + #fill in the rest of the data that rc-update -s hasn't reported. + allNames = os.listdir("/etc/init.d") + for name in allNames: + if not name in reportedData: #this name wasn't reported by rc-update -s + rowData = [False]*len(self.runlevels) + rowData.insert(0, name) + self.tv_store.append(rowData) + #TODO: sort the view. + else: + pass #say something about having to be a root user to rc-update + + def entry_toggled(self, cell, path): + #column = int(path) + #self.tv_store[path][0] = not self.tv_store[path][0] + #self.emit("entry-toggled", path) + pass + + def close(self, widget, event, data=None): + pass -- cgit v1.2.3-65-gdbad From 5e24a86b40b15707bacf049bed97964053e14e4c Mon Sep 17 00:00:00 2001 From: Christopher Harvey Date: Tue, 1 Jun 2010 18:17:37 -0400 Subject: Added the option to display the RcUpdate window. (added a button) --- src/frontend/main.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/frontend/main.py b/src/frontend/main.py index 71e2340..4a74017 100644 --- a/src/frontend/main.py +++ b/src/frontend/main.py @@ -35,6 +35,7 @@ import os import re import ErrorDialog import gtkmozembed +import RcUpdateWindow sandboxDir = '/' @@ -53,9 +54,12 @@ class MainWindow(gtk.Window): self.diffButton = gtk.ToolButton(None, "Diff!") self.diffButton.connect("clicked", self.diffPressed, None) self.showErrorsButton = gtk.ToolButton(None, "Augeas Errors") + self.showRCUpdateButton = gtk.ToolButton(None, "rc-update") + self.showRCUpdateButton.connect("clicked", self.showRCUpdate, None) self.showErrorsButton.connect("clicked", self.showErrPressed, None) self.mainToolbar.insert(self.diffButton, -1) self.mainToolbar.insert(self.showErrorsButton, -1) + self.mainToolbar.insert(self.showRCUpdateButton, -1) self.rootBox.pack_start(self.mainToolbar, False, False) self.mainPaned = gtk.HPaned() self.rootBox.pack_start(self.docBox) @@ -158,6 +162,10 @@ class MainWindow(gtk.Window): else: os.system(call) + def showRCUpdate(self, button, data=None): + win = RcUpdateWindow.RcUpdateWindow() + win.show_all() + def showErrPressed(self, button, data=None): d = ErrorDialog.ErrorDialog(augeas_utils.getFileErrorList(self.a)) d.show_all() -- cgit v1.2.3-65-gdbad From 7a0907a6e301aa54ab4a14330a3e2dafa0f0b09f Mon Sep 17 00:00:00 2001 From: Christopher Harvey Date: Wed, 2 Jun 2010 06:52:03 -0400 Subject: rc-update window now applies changes. --- src/frontend/RcUpdateWindow.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/frontend/RcUpdateWindow.py b/src/frontend/RcUpdateWindow.py index a9653e1..29533f7 100644 --- a/src/frontend/RcUpdateWindow.py +++ b/src/frontend/RcUpdateWindow.py @@ -55,7 +55,7 @@ class RcUpdateWindow(gtk.Window): for level in self.runlevels: renderer = gtk.CellRendererToggle() renderer.set_property("activatable", True) - renderer.connect("toggled", self.entry_toggled) + renderer.connect("toggled", self.entry_toggled, i) column = gtk.TreeViewColumn(level) column.pack_start(renderer, False) column.add_attribute(renderer, 'active', i) @@ -101,9 +101,22 @@ class RcUpdateWindow(gtk.Window): else: pass #say something about having to be a root user to rc-update - def entry_toggled(self, cell, path): - #column = int(path) - #self.tv_store[path][0] = not self.tv_store[path][0] + def entry_toggled(self, cell, path, column): + add = not self.tv_store[path][column] + scriptName = self.tv_store[path][0] + call = ["rc-update"] + if add: + call.append("add") + else: + call.append("del") + call.append(scriptName) + level = self.runlevels[column-1] + call.append(level) + retcode = subprocess.call(call) + if retcode == 0: + self.tv_store[path][column] = not self.tv_store[path][column] + else: + print "Call to rc-update failed." #TODO: print nice error. #self.emit("entry-toggled", path) pass -- cgit v1.2.3-65-gdbad