1## modulesPage.py - show selinux mappings
2## Copyright (C) 2006-2009 Red Hat, Inc.
3
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18## Author: Dan Walsh
19import string
20import gtk
21import gtk.glade
22import os
23import commands
24import gobject
25import sys
26import seobject
27import selinux
28from semanagePage import *;
29from subprocess import Popen, PIPE
30
31##
32## I18N
33##
34PROGNAME="policycoreutils"
35import gettext
36gettext.bindtextdomain(PROGNAME, "/usr/share/locale")
37gettext.textdomain(PROGNAME)
38try:
39    gettext.install(PROGNAME,
40                    localedir="/usr/share/locale",
41                    unicode=False,
42                    codeset = 'utf-8')
43except IOError:
44    import __builtin__
45    __builtin__.__dict__['_'] = unicode
46
47class modulesPage(semanagePage):
48    def __init__(self, xml):
49        semanagePage.__init__(self, xml, "modules", _("Policy Module"))
50        self.module_filter = xml.get_widget("modulesFilterEntry")
51        self.module_filter.connect("focus_out_event", self.filter_changed)
52        self.module_filter.connect("activate", self.filter_changed)
53        self.audit_enabled = False
54
55        self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
56        self.view.set_model(self.store)
57        self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
58        col = gtk.TreeViewColumn(_("Module Name"), gtk.CellRendererText(), text = 0)
59        col.set_sort_column_id(0)
60        col.set_resizable(True)
61        self.view.append_column(col)
62        self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
63        col = gtk.TreeViewColumn(_("Version"), gtk.CellRendererText(), text = 1)
64        self.enable_audit_button = xml.get_widget("enableAuditButton")
65        self.enable_audit_button.connect("clicked", self.enable_audit)
66        self.new_button = xml.get_widget("newModuleButton")
67        self.new_button.connect("clicked", self.new_module)
68        col.set_sort_column_id(1)
69        col.set_resizable(True)
70        self.view.append_column(col)
71        self.store.set_sort_func(1,self.sort_int, "")
72        status, self.policy_type = selinux.selinux_getpolicytype()
73
74        self.load()
75
76    def sort_int(self, treemodel, iter1, iter2, user_data):
77        try:
78            p1 = int(treemodel.get_value(iter1,1))
79            p2 = int(treemodel.get_value(iter1,1))
80            if p1 > p2:
81                return 1
82            if p1 == p2:
83                return 0
84            return -1
85        except:
86            return 0
87
88    def load(self, filter=""):
89        self.filter=filter
90        self.store.clear()
91        try:
92            fd = Popen("semodule -l", shell=True, stdout=PIPE).stdout
93            l = fd.readlines()
94            fd.close()
95            for i in l:
96                module, ver, newline = i.split('\t')
97                if not (self.match(module, filter) or self.match(ver, filter)):
98                    continue
99                iter = self.store.append()
100                self.store.set_value(iter, 0, module.strip())
101                self.store.set_value(iter, 1, ver.strip())
102        except:
103            pass
104        self.view.get_selection().select_path ((0,))
105
106
107    def new_module(self, args):
108        try:
109            Popen(["/usr/share/system-config-selinux/polgengui.py"])
110        except ValueError, e:
111            self.error(e.args[0])
112
113    def delete(self):
114        store, iter = self.view.get_selection().get_selected()
115        module = store.get_value(iter, 0)
116        try:
117            self.wait()
118            status, output = commands.getstatusoutput("semodule -r %s" % module)
119            self.ready()
120            if status != 0:
121                self.error(output)
122            else:
123                store.remove(iter)
124                self.view.get_selection().select_path ((0,))
125
126        except ValueError, e:
127            self.error(e.args[0])
128
129    def enable_audit(self, button):
130        self.audit_enabled = not self.audit_enabled
131        try:
132            self.wait()
133            if self.audit_enabled:
134                status, output =commands.getstatusoutput("semodule -DB")
135                button.set_label(_("Disable Audit"))
136            else:
137                status, output =commands.getstatusoutput("semodule -B")
138                button.set_label(_("Enable Audit"))
139            self.ready()
140
141            if status != 0:
142                self.error(output)
143
144        except ValueError, e:
145            self.error(e.args[0])
146
147    def disable_audit(self, button):
148        try:
149            self.wait()
150            status, output =commands.getstatusoutput("semodule -B")
151            self.ready()
152            if status != 0:
153                self.error(output)
154
155        except ValueError, e:
156            self.error(e.args[0])
157
158    def propertiesDialog(self):
159        # Do nothing
160        return
161
162    def addDialog(self):
163        dialog = gtk.FileChooserDialog(_("Load Policy Module"),
164                                       None,
165                                       gtk.FILE_CHOOSER_ACTION_OPEN,
166                                       (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
167                                        gtk.STOCK_OPEN, gtk.RESPONSE_OK))
168        dialog.set_default_response(gtk.RESPONSE_OK)
169
170        filter = gtk.FileFilter()
171        filter.set_name("Policy Files")
172        filter.add_pattern("*.pp")
173        dialog.add_filter(filter)
174
175        response = dialog.run()
176        if response == gtk.RESPONSE_OK:
177            self.add(dialog.get_filename())
178        dialog.destroy()
179
180    def add(self, file):
181        try:
182            self.wait()
183            status, output =commands.getstatusoutput("semodule -i %s" % file)
184            self.ready()
185            if status != 0:
186                self.error(output)
187            else:
188                self.load()
189
190        except ValueError, e:
191            self.error(e.args[0])
192