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 48 class modulesPage(semanagePage): 49 50 def __init__(self, xml): 51 semanagePage.__init__(self, xml, "modules", _("Policy Module")) 52 self.module_filter = xml.get_widget("modulesFilterEntry") 53 self.module_filter.connect("focus_out_event", self.filter_changed) 54 self.module_filter.connect("activate", self.filter_changed) 55 self.audit_enabled = False 56 57 self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) 58 self.view.set_model(self.store) 59 self.store.set_sort_column_id(0, gtk.SORT_ASCENDING) 60 col = gtk.TreeViewColumn(_("Module Name"), gtk.CellRendererText(), text=0) 61 col.set_sort_column_id(0) 62 col.set_resizable(True) 63 self.view.append_column(col) 64 self.store.set_sort_column_id(0, gtk.SORT_ASCENDING) 65 col = gtk.TreeViewColumn(_("Version"), gtk.CellRendererText(), text=1) 66 self.enable_audit_button = xml.get_widget("enableAuditButton") 67 self.enable_audit_button.connect("clicked", self.enable_audit) 68 self.new_button = xml.get_widget("newModuleButton") 69 self.new_button.connect("clicked", self.new_module) 70 col.set_sort_column_id(1) 71 col.set_resizable(True) 72 self.view.append_column(col) 73 self.store.set_sort_func(1, self.sort_int, "") 74 status, self.policy_type = selinux.selinux_getpolicytype() 75 76 self.load() 77 78 def sort_int(self, treemodel, iter1, iter2, user_data): 79 try: 80 p1 = int(treemodel.get_value(iter1, 1)) 81 p2 = int(treemodel.get_value(iter1, 1)) 82 if p1 > p2: 83 return 1 84 if p1 == p2: 85 return 0 86 return -1 87 except: 88 return 0 89 90 def load(self, filter=""): 91 self.filter = filter 92 self.store.clear() 93 try: 94 fd = Popen("semodule -l", shell=True, stdout=PIPE).stdout 95 l = fd.readlines() 96 fd.close() 97 for i in l: 98 module, ver, newline = i.split('\t') 99 if not (self.match(module, filter) or self.match(ver, filter)): 100 continue 101 iter = self.store.append() 102 self.store.set_value(iter, 0, module.strip()) 103 self.store.set_value(iter, 1, ver.strip()) 104 except: 105 pass 106 self.view.get_selection().select_path((0,)) 107 108 def new_module(self, args): 109 try: 110 Popen(["/usr/share/system-config-selinux/polgengui.py"]) 111 except ValueError, e: 112 self.error(e.args[0]) 113 114 def delete(self): 115 store, iter = self.view.get_selection().get_selected() 116 module = store.get_value(iter, 0) 117 try: 118 self.wait() 119 status, output = commands.getstatusoutput("semodule -r %s" % module) 120 self.ready() 121 if status != 0: 122 self.error(output) 123 else: 124 store.remove(iter) 125 self.view.get_selection().select_path((0,)) 126 127 except ValueError, e: 128 self.error(e.args[0]) 129 130 def enable_audit(self, button): 131 self.audit_enabled = not self.audit_enabled 132 try: 133 self.wait() 134 if self.audit_enabled: 135 status, output = commands.getstatusoutput("semodule -DB") 136 button.set_label(_("Disable Audit")) 137 else: 138 status, output = commands.getstatusoutput("semodule -B") 139 button.set_label(_("Enable Audit")) 140 self.ready() 141 142 if status != 0: 143 self.error(output) 144 145 except ValueError, e: 146 self.error(e.args[0]) 147 148 def disable_audit(self, button): 149 try: 150 self.wait() 151 status, output = commands.getstatusoutput("semodule -B") 152 self.ready() 153 if status != 0: 154 self.error(output) 155 156 except ValueError, e: 157 self.error(e.args[0]) 158 159 def propertiesDialog(self): 160 # Do nothing 161 return 162 163 def addDialog(self): 164 dialog = gtk.FileChooserDialog(_("Load Policy Module"), 165 None, 166 gtk.FILE_CHOOSER_ACTION_OPEN, 167 (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, 168 gtk.STOCK_OPEN, gtk.RESPONSE_OK)) 169 dialog.set_default_response(gtk.RESPONSE_OK) 170 171 filter = gtk.FileFilter() 172 filter.set_name("Policy Files") 173 filter.add_pattern("*.pp") 174 dialog.add_filter(filter) 175 176 response = dialog.run() 177 if response == gtk.RESPONSE_OK: 178 self.add(dialog.get_filename()) 179 dialog.destroy() 180 181 def add(self, file): 182 try: 183 self.wait() 184 status, output = commands.getstatusoutput("semodule -i %s" % file) 185 self.ready() 186 if status != 0: 187 self.error(output) 188 else: 189 self.load() 190 191 except ValueError, e: 192 self.error(e.args[0]) 193