1#!/usr/bin/python -Es 2# 3# system-config-selinux.py - GUI for SELinux Config tool in system-config-selinux 4# 5# Dan Walsh <dwalsh@redhat.com> 6# 7# Copyright 2006-2009 Red Hat, Inc. 8# 9# This program is free software; you can redistribute it and/or modify 10# it under the terms of the GNU General Public License as published by 11# the Free Software Foundation; either version 2 of the License, or 12# (at your option) any later version. 13# 14# This program is distributed in the hope that it will be useful, 15# but WITHOUT ANY WARRANTY; without even the implied warranty of 16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17# GNU General Public License for more details. 18# 19# You should have received a copy of the GNU General Public License 20# along with this program; if not, write to the Free Software 21# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22# 23import signal 24import string 25import sys 26try: 27 import gtk 28except RuntimeError, e: 29 print "system-config-selinux:", e 30 print "This is a graphical application and requires DISPLAY to be set." 31 sys.exit (1) 32 33import gtk.glade 34import os 35import gobject 36import gnome 37import statusPage 38import booleansPage 39import loginsPage 40import usersPage 41import portsPage 42import modulesPage 43import domainsPage 44import fcontextPage 45import selinux 46## 47## I18N 48## 49PROGNAME="policycoreutils" 50 51import gettext 52gettext.bindtextdomain(PROGNAME, "/usr/share/locale") 53gettext.textdomain(PROGNAME) 54try: 55 gettext.install(PROGNAME, 56 localedir="/usr/share/locale", 57 unicode=False, 58 codeset = 'utf-8') 59except IOError: 60 import __builtin__ 61 __builtin__.__dict__['_'] = unicode 62 63gnome.program_init("SELinux Management Tool", "5") 64 65version = "1.0" 66 67sys.path.append('/usr/share/system-config-selinux') 68 69 70 71## 72## Pull in the Glade file 73## 74if os.access("system-config-selinux.glade", os.F_OK): 75 xml = gtk.glade.XML ("system-config-selinux.glade", domain=PROGNAME) 76else: 77 xml = gtk.glade.XML ("/usr/share/system-config-selinux/system-config-selinux.glade", domain=PROGNAME) 78 79class childWindow: 80 def __init__(self): 81 self.tabs=[] 82 self.xml = xml 83 xml.signal_connect("on_quit_activate", self.destroy) 84 xml.signal_connect("on_delete_clicked", self.delete) 85 xml.signal_connect("on_add_clicked", self.add) 86 xml.signal_connect("on_properties_clicked", self.properties) 87 xml.signal_connect("on_local_clicked", self.on_local_clicked) 88 self.add_page(statusPage.statusPage(xml)) 89 if selinux.is_selinux_enabled() > 0: 90 try: 91 self.add_page(booleansPage.booleansPage(xml)) 92 self.add_page(fcontextPage.fcontextPage(xml)) 93 self.add_page(loginsPage.loginsPage(xml)) 94 self.add_page(usersPage.usersPage(xml)) 95 self.add_page(portsPage.portsPage(xml)) 96 self.add_page(modulesPage.modulesPage(xml)) # modules 97 self.add_page(domainsPage.domainsPage(xml)) # domains 98 except ValueError, e: 99 self.error(e.message) 100 101 xml.signal_connect("on_quit_activate", self.destroy) 102 xml.signal_connect("on_policy_activate", self.policy) 103 xml.signal_connect("on_logging_activate", self.logging) 104 xml.signal_connect("on_about_activate", self.on_about_activate) 105 106 self.add_menu = xml.get_widget("add_menu_item") 107 self.properties_menu = xml.get_widget("properties_menu_item") 108 self.delete_menu = xml.get_widget("delete_menu_item") 109 110 def error(self, message): 111 dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, 112 gtk.BUTTONS_CLOSE, 113 message) 114 dlg.set_position(gtk.WIN_POS_MOUSE) 115 dlg.show_all() 116 dlg.run() 117 dlg.destroy() 118 119 def add_page(self, page): 120 self.tabs.append(page) 121 122 def policy(self, args): 123 os.spawnl(os.P_NOWAIT, "/usr/share/system-config-selinux/semanagegui.py") 124 def logging(self, args): 125 os.spawnl(os.P_NOWAIT, "/usr/bin/seaudit") 126 127 def delete(self, args): 128 self.tabs[self.notebook.get_current_page()].deleteDialog() 129 130 def add(self, args): 131 self.tabs[self.notebook.get_current_page()].addDialog() 132 133 def properties(self, args): 134 self.tabs[self.notebook.get_current_page()].propertiesDialog() 135 136 def on_local_clicked(self, button): 137 self.tabs[self.notebook.get_current_page()].on_local_clicked(button) 138 139 def on_about_activate(self, args): 140 dlg = xml.get_widget ("aboutWindow") 141 dlg.run () 142 dlg.hide () 143 144 def destroy(self, args): 145 gtk.main_quit() 146 147 def use_menus(self, use_menus): 148 self.add_menu.set_sensitive(use_menus) 149 self.properties_menu.set_sensitive(use_menus) 150 self.delete_menu.set_sensitive(use_menus) 151 152 def itemSelected(self, selection): 153 store, rows = selection.get_selected_rows() 154 if store != None and len(rows) > 0: 155 self.notebook.set_current_page(rows[0][0]) 156 self.use_menus(self.tabs[rows[0][0]].use_menus()) 157 else: 158 self.notebook.set_current_page(0) 159 self.use_menus(self.tabs[0].use_menus()) 160 161 162 def setupScreen(self): 163 # Bring in widgets from glade file. 164 self.mainWindow = self.xml.get_widget("mainWindow") 165 self.notebook = self.xml.get_widget("notebook") 166 self.view = self.xml.get_widget("selectView") 167 self.view.get_selection().connect("changed", self.itemSelected) 168 self.store = gtk.ListStore(gobject.TYPE_STRING) 169 self.view.set_model(self.store) 170 col = gtk.TreeViewColumn("", gtk.CellRendererText(), text = 0) 171 col.set_resizable(True) 172 self.view.append_column(col) 173 174 for page in self.tabs: 175 iter = self.store.append() 176 self.store.set_value(iter, 0, page.get_description()) 177 self.view.get_selection().select_path ((0,)) 178 179 def stand_alone(self): 180 desktopName = _("Configue SELinux") 181 182 self.setupScreen() 183 184 self.mainWindow.connect("destroy", self.destroy) 185 186 self.mainWindow.show_all() 187 gtk.main() 188 189if __name__ == "__main__": 190 signal.signal (signal.SIGINT, signal.SIG_DFL) 191 192 app = childWindow() 193 app.stand_alone() 194