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 19import string 20import gtk 21import gtk.glade 22import os 23import commands 24import gobject 25import sys 26import seobject 27import selinux 28from semanagePage import *; 29from subprocess import Popen, PIPE 30 31## 32## I18N 33## 34PROGNAME="policycoreutils" 35import gettext 36gettext.bindtextdomain(PROGNAME, "/usr/share/locale") 37gettext.textdomain(PROGNAME) 38try: 39 gettext.install(PROGNAME, 40 localedir="/usr/share/locale", 41 unicode=False, 42 codeset = 'utf-8') 43except IOError: 44 import __builtin__ 45 __builtin__.__dict__['_'] = unicode 46 47class 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