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