• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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