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