1#!/usr/bin/python3 -EsI 2# 3# system-config-selinux.py - GUI for SELinux Config tool in system-config-selinux 4# 5# Dan Walsh <[email protected]> 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 35sys.path.append('/usr/share/system-config-selinux') 36 37from gi.repository import GObject 38import statusPage 39import booleansPage 40import loginsPage 41import usersPage 42import portsPage 43import modulesPage 44import domainsPage 45import fcontextPage 46import selinux 47## 48## I18N 49## 50PROGNAME = "selinux-gui" 51try: 52 import gettext 53 kwargs = {} 54 if sys.version_info < (3,): 55 kwargs['unicode'] = True 56 t = gettext.translation(PROGNAME, 57 localedir="/usr/share/locale", 58 **kwargs, 59 fallback=True) 60 _ = t.gettext 61except: 62 try: 63 import builtins 64 builtins.__dict__['_'] = str 65 except ImportError: 66 import __builtin__ 67 __builtin__.__dict__['_'] = unicode 68 69version = "1.0" 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