1 ## modulesPage.py - show selinux mappings 2 ## Copyright (C) 2006-2009 Red Hat, Inc. 3 4 ## This program is free software; you can redistribute it and/or modify 5 ## it under the terms of the GNU General Public License as published by 6 ## the Free Software Foundation; either version 2 of the License, or 7 ## (at your option) any later version. 8 9 ## This program is distributed in the hope that it will be useful, 10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of 11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 ## GNU General Public License for more details. 13 14 ## You should have received a copy of the GNU General Public License 15 ## along with this program; if not, write to the Free Software 16 ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 17 18 ## Author: Dan Walsh 19 import string 20 import gtk 21 import gtk.glade 22 import os 23 import commands 24 import gobject 25 import sys 26 import seobject 27 import selinux 28 from semanagePage import *; 29 from subprocess import Popen, PIPE 30 31 ## 32 ## I18N 33 ## 34 PROGNAME="policycoreutils" 35 import gettext 36 gettext.bindtextdomain(PROGNAME, "/usr/share/locale") 37 gettext.textdomain(PROGNAME) 38 try: 39 gettext.install(PROGNAME, 40 localedir="/usr/share/locale", 41 unicode=False, 42 codeset = 'utf-8') 43 except IOError: 44 import __builtin__ 45 __builtin__.__dict__['_'] = unicode 46 47 class modulesPage(semanagePage): 48 def __init__(self, xml): 49 semanagePage.__init__(self, xml, "modules", _("Policy Module")) 50 self.module_filter = xml.get_widget("modulesFilterEntry") 51 self.module_filter.connect("focus_out_event", self.filter_changed) 52 self.module_filter.connect("activate", self.filter_changed) 53 self.audit_enabled = False 54 55 self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) 56 self.view.set_model(self.store) 57 self.store.set_sort_column_id(0, gtk.SORT_ASCENDING) 58 col = gtk.TreeViewColumn(_("Module Name"), gtk.CellRendererText(), text = 0) 59 col.set_sort_column_id(0) 60 col.set_resizable(True) 61 self.view.append_column(col) 62 self.store.set_sort_column_id(0, gtk.SORT_ASCENDING) 63 col = gtk.TreeViewColumn(_("Version"), gtk.CellRendererText(), text = 1) 64 self.enable_audit_button = xml.get_widget("enableAuditButton") 65 self.enable_audit_button.connect("clicked", self.enable_audit) 66 self.new_button = xml.get_widget("newModuleButton") 67 self.new_button.connect("clicked", self.new_module) 68 col.set_sort_column_id(1) 69 col.set_resizable(True) 70 self.view.append_column(col) 71 self.store.set_sort_func(1,self.sort_int, "") 72 status, self.policy_type = selinux.selinux_getpolicytype() 73 74 self.load() 75 76 def sort_int(self, treemodel, iter1, iter2, user_data): 77 try: 78 p1 = int(treemodel.get_value(iter1,1)) 79 p2 = int(treemodel.get_value(iter1,1)) 80 if p1 > p2: 81 return 1 82 if p1 == p2: 83 return 0 84 return -1 85 except: 86 return 0 87 88 def load(self, filter=""): 89 self.filter=filter 90 self.store.clear() 91 try: 92 fd = Popen("semodule -l", shell=True, stdout=PIPE).stdout 93 l = fd.readlines() 94 fd.close() 95 for i in l: 96 module, ver, newline = i.split('\t') 97 if not (self.match(module, filter) or self.match(ver, filter)): 98 continue 99 iter = self.store.append() 100 self.store.set_value(iter, 0, module.strip()) 101 self.store.set_value(iter, 1, ver.strip()) 102 except: 103 pass 104 self.view.get_selection().select_path ((0,)) 105 106 107 def new_module(self, args): 108 try: 109 Popen(["/usr/share/system-config-selinux/polgengui.py"]) 110 except ValueError, e: 111 self.error(e.args[0]) 112 113 def delete(self): 114 store, iter = self.view.get_selection().get_selected() 115 module = store.get_value(iter, 0) 116 try: 117 self.wait() 118 status, output = commands.getstatusoutput("semodule -r %s" % module) 119 self.ready() 120 if status != 0: 121 self.error(output) 122 else: 123 store.remove(iter) 124 self.view.get_selection().select_path ((0,)) 125 126 except ValueError, e: 127 self.error(e.args[0]) 128 129 def enable_audit(self, button): 130 self.audit_enabled = not self.audit_enabled 131 try: 132 self.wait() 133 if self.audit_enabled: 134 status, output =commands.getstatusoutput("semodule -DB") 135 button.set_label(_("Disable Audit")) 136 else: 137 status, output =commands.getstatusoutput("semodule -B") 138 button.set_label(_("Enable Audit")) 139 self.ready() 140 141 if status != 0: 142 self.error(output) 143 144 except ValueError, e: 145 self.error(e.args[0]) 146 147 def disable_audit(self, button): 148 try: 149 self.wait() 150 status, output =commands.getstatusoutput("semodule -B") 151 self.ready() 152 if status != 0: 153 self.error(output) 154 155 except ValueError, e: 156 self.error(e.args[0]) 157 158 def propertiesDialog(self): 159 # Do nothing 160 return 161 162 def addDialog(self): 163 dialog = gtk.FileChooserDialog(_("Load Policy Module"), 164 None, 165 gtk.FILE_CHOOSER_ACTION_OPEN, 166 (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, 167 gtk.STOCK_OPEN, gtk.RESPONSE_OK)) 168 dialog.set_default_response(gtk.RESPONSE_OK) 169 170 filter = gtk.FileFilter() 171 filter.set_name("Policy Files") 172 filter.add_pattern("*.pp") 173 dialog.add_filter(filter) 174 175 response = dialog.run() 176 if response == gtk.RESPONSE_OK: 177 self.add(dialog.get_filename()) 178 dialog.destroy() 179 180 def add(self, file): 181 try: 182 self.wait() 183 status, output =commands.getstatusoutput("semodule -i %s" % file) 184 self.ready() 185 if status != 0: 186 self.error(output) 187 else: 188 self.load() 189 190 except ValueError, e: 191 self.error(e.args[0]) 192