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