1#!/usr/bin/python3 -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 os 24import signal 25import sys 26import gi 27gi.require_version('Gtk', '3.0') 28try: 29 from gi.repository import Gtk 30except RuntimeError as e: 31 print("system-config-selinux:", e) 32 print("This is a graphical application and requires DISPLAY to be set.") 33 sys.exit(1) 34 35from gi.repository import GObject 36import statusPage 37import booleansPage 38import loginsPage 39import usersPage 40import portsPage 41import modulesPage 42import domainsPage 43import fcontextPage 44import selinux 45## 46## I18N 47## 48PROGNAME = "selinux-gui" 49try: 50 import gettext 51 kwargs = {} 52 if sys.version_info < (3,): 53 kwargs['unicode'] = True 54 t = gettext.translation(PROGNAME, 55 localedir="/usr/share/locale", 56 **kwargs, 57 fallback=True) 58 _ = t.gettext 59except: 60 try: 61 import builtins 62 builtins.__dict__['_'] = str 63 except ImportError: 64 import __builtin__ 65 __builtin__.__dict__['_'] = unicode 66 67version = "1.0" 68 69sys.path.append('/usr/share/system-config-selinux') 70 71 72## 73## Pull in the Glade file 74## 75xml = Gtk.Builder() 76xml.set_translation_domain(PROGNAME) 77if os.access("system-config-selinux.ui", os.F_OK): 78 xml.add_from_file("system-config-selinux.ui") 79else: 80 xml.add_from_file("/usr/share/system-config-selinux/system-config-selinux.ui") 81 82 83class childWindow: 84 85 def __init__(self): 86 self.tabs = [] 87 self.xml = xml 88 xml.connect_signals({ 89 "on_quit_activate": self.destroy, 90 "on_delete_clicked": self.delete, 91 "on_add_clicked": self.add, 92 "on_properties_clicked": self.properties, 93 "on_local_clicked": self.on_local_clicked, 94 "on_policy_activate": self.policy, 95 "on_logging_activate": self.logging, 96 "on_about_activate": self.on_about_activate, 97 }) 98 self.add_page(statusPage.statusPage(xml)) 99 if selinux.is_selinux_enabled() > 0: 100 try: 101 self.add_page(booleansPage.booleansPage(xml)) 102 self.add_page(fcontextPage.fcontextPage(xml)) 103 self.add_page(loginsPage.loginsPage(xml)) 104 self.add_page(usersPage.usersPage(xml)) 105 self.add_page(portsPage.portsPage(xml)) 106 self.add_page(modulesPage.modulesPage(xml)) # modules 107 self.add_page(domainsPage.domainsPage(xml)) # domains 108 except ValueError as e: 109 self.error(e.message) 110 111 self.add_menu = xml.get_object("add_menu_item") 112 self.properties_menu = xml.get_object("properties_menu_item") 113 self.delete_menu = xml.get_object("delete_menu_item") 114 115 def error(self, message): 116 dlg = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR, 117 Gtk.ButtonsType.CLOSE, 118 message) 119 dlg.set_position(Gtk.WindowPosition.MOUSE) 120 dlg.show_all() 121 dlg.run() 122 dlg.destroy() 123 124 def add_page(self, page): 125 self.tabs.append(page) 126 127 def policy(self, args): 128 os.spawnl(os.P_NOWAIT, "/usr/share/system-config-selinux/semanagegui.py") 129 130 def logging(self, args): 131 os.spawnl(os.P_NOWAIT, "/usr/bin/seaudit") 132 133 def delete(self, args): 134 self.tabs[self.notebook.get_current_page()].deleteDialog() 135 136 def add(self, args): 137 self.tabs[self.notebook.get_current_page()].addDialog() 138 139 def properties(self, args): 140 self.tabs[self.notebook.get_current_page()].propertiesDialog() 141 142 def on_local_clicked(self, button): 143 self.tabs[self.notebook.get_current_page()].on_local_clicked(button) 144 145 def on_about_activate(self, args): 146 dlg = xml.get_object("aboutWindow") 147 dlg.run() 148 dlg.hide() 149 150 def destroy(self, args): 151 Gtk.main_quit() 152 153 def use_menus(self, use_menus): 154 self.add_menu.set_sensitive(use_menus) 155 self.properties_menu.set_sensitive(use_menus) 156 self.delete_menu.set_sensitive(use_menus) 157 158 def itemSelected(self, selection): 159 store, rows = selection.get_selected_rows() 160 if store != None and len(rows) > 0: 161 self.notebook.set_current_page(rows[0][0]) 162 self.use_menus(self.tabs[rows[0][0]].use_menus()) 163 else: 164 self.notebook.set_current_page(0) 165 self.use_menus(self.tabs[0].use_menus()) 166 167 def setupScreen(self): 168 # Bring in widgets from glade file. 169 self.mainWindow = self.xml.get_object("mainWindow") 170 self.notebook = self.xml.get_object("notebook") 171 self.view = self.xml.get_object("selectView") 172 self.view.get_selection().connect("changed", self.itemSelected) 173 self.store = Gtk.ListStore(GObject.TYPE_STRING) 174 self.view.set_model(self.store) 175 col = Gtk.TreeViewColumn("", Gtk.CellRendererText(), text=0) 176 col.set_resizable(True) 177 self.view.append_column(col) 178 179 for page in self.tabs: 180 iter = self.store.append() 181 self.store.set_value(iter, 0, page.get_description()) 182 self.view.get_selection().select_path((0,)) 183 184 def stand_alone(self): 185 desktopName = _("Configure SELinux") 186 187 self.setupScreen() 188 189 self.mainWindow.connect("destroy", self.destroy) 190 191 self.mainWindow.show_all() 192 Gtk.main() 193 194if __name__ == "__main__": 195 signal.signal(signal.SIGINT, signal.SIG_DFL) 196 197 app = childWindow() 198 app.stand_alone() 199