1 ## domainsPage.py - show selinux domains 2 ## Copyright (C) 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 sepolicy import get_all_entrypoint_domains 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 domainsPage(semanagePage): 49 50 def __init__(self, xml): 51 semanagePage.__init__(self, xml, "domains", _("Process Domain")) 52 self.domain_filter = xml.get_widget("domainsFilterEntry") 53 self.domain_filter.connect("focus_out_event", self.filter_changed) 54 self.domain_filter.connect("activate", self.filter_changed) 55 56 self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) 57 self.view.set_model(self.store) 58 self.store.set_sort_column_id(0, gtk.SORT_ASCENDING) 59 col = gtk.TreeViewColumn(_("Domain Name"), gtk.CellRendererText(), text=0) 60 col.set_sort_column_id(0) 61 col.set_resizable(True) 62 self.view.append_column(col) 63 self.store.set_sort_column_id(0, gtk.SORT_ASCENDING) 64 col = gtk.TreeViewColumn(_("Mode"), gtk.CellRendererText(), text=1) 65 col.set_sort_column_id(1) 66 col.set_resizable(True) 67 self.view.append_column(col) 68 self.view.get_selection().connect("changed", self.itemSelected) 69 70 self.permissive_button = xml.get_widget("permissiveButton") 71 self.enforcing_button = xml.get_widget("enforcingButton") 72 73 self.domains = get_all_entrypoint_domains() 74 self.load() 75 76 def get_modules(self): 77 modules = [] 78 fd = os.popen("semodule -l") 79 mods = fd.readlines() 80 fd.close() 81 for l in mods: 82 modules.append(l.split()[0]) 83 return modules 84 85 def load(self, filter=""): 86 self.filter = filter 87 self.store.clear() 88 try: 89 modules = self.get_modules() 90 for domain in self.domains: 91 if not self.match(domain, filter): 92 continue 93 iter = self.store.append() 94 self.store.set_value(iter, 0, domain) 95 t = "permissive_%s_t" % domain 96 if t in modules: 97 self.store.set_value(iter, 1, _("Permissive")) 98 else: 99 self.store.set_value(iter, 1, "") 100 except: 101 pass 102 self.view.get_selection().select_path((0,)) 103 104 def itemSelected(self, selection): 105 store, iter = selection.get_selected() 106 if iter == None: 107 return 108 p = store.get_value(iter, 1) == _("Permissive") 109 self.permissive_button.set_sensitive(not p) 110 self.enforcing_button.set_sensitive(p) 111 112 def deleteDialog(self): 113 # Do nothing 114 return self.delete() 115 116 def delete(self): 117 selection = self.view.get_selection() 118 store, iter = selection.get_selected() 119 domain = store.get_value(iter, 0) 120 try: 121 self.wait() 122 status, output = commands.getstatusoutput("semanage permissive -d %s_t" % domain) 123 self.ready() 124 if status != 0: 125 self.error(output) 126 else: 127 domain = store.set_value(iter, 1, "") 128 self.itemSelected(selection) 129 130 except ValueError, e: 131 self.error(e.args[0]) 132 133 def propertiesDialog(self): 134 # Do nothing 135 return 136 137 def addDialog(self): 138 # Do nothing 139 return self.add() 140 141 def add(self): 142 selection = self.view.get_selection() 143 store, iter = selection.get_selected() 144 domain = store.get_value(iter, 0) 145 try: 146 self.wait() 147 status, output = commands.getstatusoutput("semanage permissive -a %s_t" % domain) 148 self.ready() 149 if status != 0: 150 self.error(output) 151 else: 152 domain = store.set_value(iter, 1, _("Permissive")) 153 self.itemSelected(selection) 154 155 except ValueError, e: 156 self.error(e.args[0]) 157