1514af85b89fff54f079f239294c727e4d61319edDan Walsh#!/usr/bin/python -Es 2514af85b89fff54f079f239294c727e4d61319edDan Walsh# 3514af85b89fff54f079f239294c727e4d61319edDan Walsh# system-config-selinux.py - GUI for SELinux Config tool in system-config-selinux 4514af85b89fff54f079f239294c727e4d61319edDan Walsh# 5514af85b89fff54f079f239294c727e4d61319edDan Walsh# Dan Walsh <dwalsh@redhat.com> 6514af85b89fff54f079f239294c727e4d61319edDan Walsh# 7514af85b89fff54f079f239294c727e4d61319edDan Walsh# Copyright 2006-2009 Red Hat, Inc. 8514af85b89fff54f079f239294c727e4d61319edDan Walsh# 9514af85b89fff54f079f239294c727e4d61319edDan Walsh# This program is free software; you can redistribute it and/or modify 10514af85b89fff54f079f239294c727e4d61319edDan Walsh# it under the terms of the GNU General Public License as published by 11514af85b89fff54f079f239294c727e4d61319edDan Walsh# the Free Software Foundation; either version 2 of the License, or 12514af85b89fff54f079f239294c727e4d61319edDan Walsh# (at your option) any later version. 13514af85b89fff54f079f239294c727e4d61319edDan Walsh# 14514af85b89fff54f079f239294c727e4d61319edDan Walsh# This program is distributed in the hope that it will be useful, 15514af85b89fff54f079f239294c727e4d61319edDan Walsh# but WITHOUT ANY WARRANTY; without even the implied warranty of 16514af85b89fff54f079f239294c727e4d61319edDan Walsh# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17514af85b89fff54f079f239294c727e4d61319edDan Walsh# GNU General Public License for more details. 18514af85b89fff54f079f239294c727e4d61319edDan Walsh# 19514af85b89fff54f079f239294c727e4d61319edDan Walsh# You should have received a copy of the GNU General Public License 20514af85b89fff54f079f239294c727e4d61319edDan Walsh# along with this program; if not, write to the Free Software 21514af85b89fff54f079f239294c727e4d61319edDan Walsh# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22514af85b89fff54f079f239294c727e4d61319edDan Walsh# 23514af85b89fff54f079f239294c727e4d61319edDan Walshimport signal 24514af85b89fff54f079f239294c727e4d61319edDan Walshimport string 25dd6c619ccb83362432c37bac388eed28e1a17cf4Dan Walshimport sys 26dd6c619ccb83362432c37bac388eed28e1a17cf4Dan Walshtry: 27dd6c619ccb83362432c37bac388eed28e1a17cf4Dan Walsh import gtk 28dd6c619ccb83362432c37bac388eed28e1a17cf4Dan Walshexcept RuntimeError, e: 29dd6c619ccb83362432c37bac388eed28e1a17cf4Dan Walsh print "system-config-selinux:", e 30dd6c619ccb83362432c37bac388eed28e1a17cf4Dan Walsh print "This is a graphical application and requires DISPLAY to be set." 31dd6c619ccb83362432c37bac388eed28e1a17cf4Dan Walsh sys.exit (1) 32dd6c619ccb83362432c37bac388eed28e1a17cf4Dan Walsh 33514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk.glade 34514af85b89fff54f079f239294c727e4d61319edDan Walshimport os 35514af85b89fff54f079f239294c727e4d61319edDan Walshimport gobject 36514af85b89fff54f079f239294c727e4d61319edDan Walshimport gnome 37514af85b89fff54f079f239294c727e4d61319edDan Walshimport statusPage 38514af85b89fff54f079f239294c727e4d61319edDan Walshimport booleansPage 39514af85b89fff54f079f239294c727e4d61319edDan Walshimport loginsPage 40514af85b89fff54f079f239294c727e4d61319edDan Walshimport usersPage 41514af85b89fff54f079f239294c727e4d61319edDan Walshimport portsPage 42514af85b89fff54f079f239294c727e4d61319edDan Walshimport modulesPage 43514af85b89fff54f079f239294c727e4d61319edDan Walshimport domainsPage 44514af85b89fff54f079f239294c727e4d61319edDan Walshimport fcontextPage 45514af85b89fff54f079f239294c727e4d61319edDan Walshimport selinux 46514af85b89fff54f079f239294c727e4d61319edDan Walsh## 47514af85b89fff54f079f239294c727e4d61319edDan Walsh## I18N 48514af85b89fff54f079f239294c727e4d61319edDan Walsh## 49514af85b89fff54f079f239294c727e4d61319edDan WalshPROGNAME="policycoreutils" 50514af85b89fff54f079f239294c727e4d61319edDan Walsh 51514af85b89fff54f079f239294c727e4d61319edDan Walshimport gettext 52514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.bindtextdomain(PROGNAME, "/usr/share/locale") 53514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.textdomain(PROGNAME) 54514af85b89fff54f079f239294c727e4d61319edDan Walshtry: 55514af85b89fff54f079f239294c727e4d61319edDan Walsh gettext.install(PROGNAME, 56514af85b89fff54f079f239294c727e4d61319edDan Walsh localedir="/usr/share/locale", 57514af85b89fff54f079f239294c727e4d61319edDan Walsh unicode=False, 58514af85b89fff54f079f239294c727e4d61319edDan Walsh codeset = 'utf-8') 59514af85b89fff54f079f239294c727e4d61319edDan Walshexcept IOError: 60514af85b89fff54f079f239294c727e4d61319edDan Walsh import __builtin__ 61514af85b89fff54f079f239294c727e4d61319edDan Walsh __builtin__.__dict__['_'] = unicode 62514af85b89fff54f079f239294c727e4d61319edDan Walsh 63514af85b89fff54f079f239294c727e4d61319edDan Walshgnome.program_init("SELinux Management Tool", "5") 64514af85b89fff54f079f239294c727e4d61319edDan Walsh 65514af85b89fff54f079f239294c727e4d61319edDan Walshversion = "1.0" 66514af85b89fff54f079f239294c727e4d61319edDan Walsh 67514af85b89fff54f079f239294c727e4d61319edDan Walshsys.path.append('/usr/share/system-config-selinux') 68514af85b89fff54f079f239294c727e4d61319edDan Walsh 69514af85b89fff54f079f239294c727e4d61319edDan Walsh 70514af85b89fff54f079f239294c727e4d61319edDan Walsh 71514af85b89fff54f079f239294c727e4d61319edDan Walsh## 72514af85b89fff54f079f239294c727e4d61319edDan Walsh## Pull in the Glade file 73514af85b89fff54f079f239294c727e4d61319edDan Walsh## 74514af85b89fff54f079f239294c727e4d61319edDan Walshif os.access("system-config-selinux.glade", os.F_OK): 75514af85b89fff54f079f239294c727e4d61319edDan Walsh xml = gtk.glade.XML ("system-config-selinux.glade", domain=PROGNAME) 76514af85b89fff54f079f239294c727e4d61319edDan Walshelse: 77514af85b89fff54f079f239294c727e4d61319edDan Walsh xml = gtk.glade.XML ("/usr/share/system-config-selinux/system-config-selinux.glade", domain=PROGNAME) 78514af85b89fff54f079f239294c727e4d61319edDan Walsh 79514af85b89fff54f079f239294c727e4d61319edDan Walshclass childWindow: 80514af85b89fff54f079f239294c727e4d61319edDan Walsh def __init__(self): 81514af85b89fff54f079f239294c727e4d61319edDan Walsh self.tabs=[] 82514af85b89fff54f079f239294c727e4d61319edDan Walsh self.xml = xml 83514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_quit_activate", self.destroy) 84514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_delete_clicked", self.delete) 85514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_add_clicked", self.add) 86514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_properties_clicked", self.properties) 87514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_local_clicked", self.on_local_clicked) 88514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_page(statusPage.statusPage(xml)) 89514af85b89fff54f079f239294c727e4d61319edDan Walsh if selinux.is_selinux_enabled() > 0: 90514af85b89fff54f079f239294c727e4d61319edDan Walsh try: 91514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_page(booleansPage.booleansPage(xml)) 92514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_page(fcontextPage.fcontextPage(xml)) 93514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_page(loginsPage.loginsPage(xml)) 94514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_page(usersPage.usersPage(xml)) 95514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_page(portsPage.portsPage(xml)) 96514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_page(modulesPage.modulesPage(xml)) # modules 97514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_page(domainsPage.domainsPage(xml)) # domains 98514af85b89fff54f079f239294c727e4d61319edDan Walsh except ValueError, e: 99514af85b89fff54f079f239294c727e4d61319edDan Walsh self.error(e.message) 100514af85b89fff54f079f239294c727e4d61319edDan Walsh 101514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_quit_activate", self.destroy) 102514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_policy_activate", self.policy) 103514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_logging_activate", self.logging) 104514af85b89fff54f079f239294c727e4d61319edDan Walsh xml.signal_connect("on_about_activate", self.on_about_activate) 105514af85b89fff54f079f239294c727e4d61319edDan Walsh 106514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_menu = xml.get_widget("add_menu_item") 107514af85b89fff54f079f239294c727e4d61319edDan Walsh self.properties_menu = xml.get_widget("properties_menu_item") 108514af85b89fff54f079f239294c727e4d61319edDan Walsh self.delete_menu = xml.get_widget("delete_menu_item") 109514af85b89fff54f079f239294c727e4d61319edDan Walsh 110514af85b89fff54f079f239294c727e4d61319edDan Walsh def error(self, message): 111514af85b89fff54f079f239294c727e4d61319edDan Walsh dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, 112514af85b89fff54f079f239294c727e4d61319edDan Walsh gtk.BUTTONS_CLOSE, 113514af85b89fff54f079f239294c727e4d61319edDan Walsh message) 114514af85b89fff54f079f239294c727e4d61319edDan Walsh dlg.set_position(gtk.WIN_POS_MOUSE) 115514af85b89fff54f079f239294c727e4d61319edDan Walsh dlg.show_all() 116514af85b89fff54f079f239294c727e4d61319edDan Walsh dlg.run() 117514af85b89fff54f079f239294c727e4d61319edDan Walsh dlg.destroy() 118514af85b89fff54f079f239294c727e4d61319edDan Walsh 119514af85b89fff54f079f239294c727e4d61319edDan Walsh def add_page(self, page): 120514af85b89fff54f079f239294c727e4d61319edDan Walsh self.tabs.append(page) 121514af85b89fff54f079f239294c727e4d61319edDan Walsh 122514af85b89fff54f079f239294c727e4d61319edDan Walsh def policy(self, args): 123514af85b89fff54f079f239294c727e4d61319edDan Walsh os.spawnl(os.P_NOWAIT, "/usr/share/system-config-selinux/semanagegui.py") 124514af85b89fff54f079f239294c727e4d61319edDan Walsh def logging(self, args): 125514af85b89fff54f079f239294c727e4d61319edDan Walsh os.spawnl(os.P_NOWAIT, "/usr/bin/seaudit") 126514af85b89fff54f079f239294c727e4d61319edDan Walsh 127514af85b89fff54f079f239294c727e4d61319edDan Walsh def delete(self, args): 128514af85b89fff54f079f239294c727e4d61319edDan Walsh self.tabs[self.notebook.get_current_page()].deleteDialog() 129514af85b89fff54f079f239294c727e4d61319edDan Walsh 130514af85b89fff54f079f239294c727e4d61319edDan Walsh def add(self, args): 131514af85b89fff54f079f239294c727e4d61319edDan Walsh self.tabs[self.notebook.get_current_page()].addDialog() 132514af85b89fff54f079f239294c727e4d61319edDan Walsh 133514af85b89fff54f079f239294c727e4d61319edDan Walsh def properties(self, args): 134514af85b89fff54f079f239294c727e4d61319edDan Walsh self.tabs[self.notebook.get_current_page()].propertiesDialog() 135514af85b89fff54f079f239294c727e4d61319edDan Walsh 136514af85b89fff54f079f239294c727e4d61319edDan Walsh def on_local_clicked(self, button): 137514af85b89fff54f079f239294c727e4d61319edDan Walsh self.tabs[self.notebook.get_current_page()].on_local_clicked(button) 138514af85b89fff54f079f239294c727e4d61319edDan Walsh 139514af85b89fff54f079f239294c727e4d61319edDan Walsh def on_about_activate(self, args): 140514af85b89fff54f079f239294c727e4d61319edDan Walsh dlg = xml.get_widget ("aboutWindow") 141514af85b89fff54f079f239294c727e4d61319edDan Walsh dlg.run () 142514af85b89fff54f079f239294c727e4d61319edDan Walsh dlg.hide () 143514af85b89fff54f079f239294c727e4d61319edDan Walsh 144514af85b89fff54f079f239294c727e4d61319edDan Walsh def destroy(self, args): 145514af85b89fff54f079f239294c727e4d61319edDan Walsh gtk.main_quit() 146514af85b89fff54f079f239294c727e4d61319edDan Walsh 147514af85b89fff54f079f239294c727e4d61319edDan Walsh def use_menus(self, use_menus): 148514af85b89fff54f079f239294c727e4d61319edDan Walsh self.add_menu.set_sensitive(use_menus) 149514af85b89fff54f079f239294c727e4d61319edDan Walsh self.properties_menu.set_sensitive(use_menus) 150514af85b89fff54f079f239294c727e4d61319edDan Walsh self.delete_menu.set_sensitive(use_menus) 151514af85b89fff54f079f239294c727e4d61319edDan Walsh 152514af85b89fff54f079f239294c727e4d61319edDan Walsh def itemSelected(self, selection): 153514af85b89fff54f079f239294c727e4d61319edDan Walsh store, rows = selection.get_selected_rows() 154514af85b89fff54f079f239294c727e4d61319edDan Walsh if store != None and len(rows) > 0: 155514af85b89fff54f079f239294c727e4d61319edDan Walsh self.notebook.set_current_page(rows[0][0]) 156514af85b89fff54f079f239294c727e4d61319edDan Walsh self.use_menus(self.tabs[rows[0][0]].use_menus()) 157514af85b89fff54f079f239294c727e4d61319edDan Walsh else: 158514af85b89fff54f079f239294c727e4d61319edDan Walsh self.notebook.set_current_page(0) 159514af85b89fff54f079f239294c727e4d61319edDan Walsh self.use_menus(self.tabs[0].use_menus()) 160514af85b89fff54f079f239294c727e4d61319edDan Walsh 161514af85b89fff54f079f239294c727e4d61319edDan Walsh 162514af85b89fff54f079f239294c727e4d61319edDan Walsh def setupScreen(self): 163514af85b89fff54f079f239294c727e4d61319edDan Walsh # Bring in widgets from glade file. 164514af85b89fff54f079f239294c727e4d61319edDan Walsh self.mainWindow = self.xml.get_widget("mainWindow") 165514af85b89fff54f079f239294c727e4d61319edDan Walsh self.notebook = self.xml.get_widget("notebook") 166514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view = self.xml.get_widget("selectView") 167514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.get_selection().connect("changed", self.itemSelected) 168514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store = gtk.ListStore(gobject.TYPE_STRING) 169514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.set_model(self.store) 170514af85b89fff54f079f239294c727e4d61319edDan Walsh col = gtk.TreeViewColumn("", gtk.CellRendererText(), text = 0) 171514af85b89fff54f079f239294c727e4d61319edDan Walsh col.set_resizable(True) 172514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.append_column(col) 173514af85b89fff54f079f239294c727e4d61319edDan Walsh 174514af85b89fff54f079f239294c727e4d61319edDan Walsh for page in self.tabs: 175514af85b89fff54f079f239294c727e4d61319edDan Walsh iter = self.store.append() 176514af85b89fff54f079f239294c727e4d61319edDan Walsh self.store.set_value(iter, 0, page.get_description()) 177514af85b89fff54f079f239294c727e4d61319edDan Walsh self.view.get_selection().select_path ((0,)) 178514af85b89fff54f079f239294c727e4d61319edDan Walsh 179514af85b89fff54f079f239294c727e4d61319edDan Walsh def stand_alone(self): 180514af85b89fff54f079f239294c727e4d61319edDan Walsh desktopName = _("Configue SELinux") 181514af85b89fff54f079f239294c727e4d61319edDan Walsh 182514af85b89fff54f079f239294c727e4d61319edDan Walsh self.setupScreen() 183514af85b89fff54f079f239294c727e4d61319edDan Walsh 184514af85b89fff54f079f239294c727e4d61319edDan Walsh self.mainWindow.connect("destroy", self.destroy) 185514af85b89fff54f079f239294c727e4d61319edDan Walsh 186514af85b89fff54f079f239294c727e4d61319edDan Walsh self.mainWindow.show_all() 187514af85b89fff54f079f239294c727e4d61319edDan Walsh gtk.main() 188514af85b89fff54f079f239294c727e4d61319edDan Walsh 189514af85b89fff54f079f239294c727e4d61319edDan Walshif __name__ == "__main__": 190514af85b89fff54f079f239294c727e4d61319edDan Walsh signal.signal (signal.SIGINT, signal.SIG_DFL) 191514af85b89fff54f079f239294c727e4d61319edDan Walsh 192514af85b89fff54f079f239294c727e4d61319edDan Walsh app = childWindow() 193514af85b89fff54f079f239294c727e4d61319edDan Walsh app.stand_alone() 194