Home | History | Annotate | Download | only in gui
      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
     19 import string
     20 import gtk
     21 import gtk.glade
     22 import os
     23 try:
     24     from subprocess import getstatusoutput
     25 except ImportError:
     26     from commands import getstatusoutput
     27 
     28 import gobject
     29 import sys
     30 import seobject
     31 import selinux
     32 from semanagePage import *
     33 from subprocess import Popen, PIPE
     34 
     35 ##
     36 ## I18N
     37 ##
     38 PROGNAME = "policycoreutils"
     39 try:
     40     import gettext
     41     kwargs = {}
     42     if sys.version_info < (3,):
     43         kwargs['unicode'] = True
     44     gettext.install(PROGNAME,
     45                     localedir="/usr/share/locale",
     46                     codeset='utf-8',
     47                     **kwargs)
     48 except:
     49     try:
     50         import builtins
     51         builtins.__dict__['_'] = str
     52     except ImportError:
     53         import __builtin__
     54         __builtin__.__dict__['_'] = unicode
     55 
     56 
     57 class modulesPage(semanagePage):
     58 
     59     def __init__(self, xml):
     60         semanagePage.__init__(self, xml, "modules", _("Policy Module"))
     61         self.module_filter = xml.get_widget("modulesFilterEntry")
     62         self.module_filter.connect("focus_out_event", self.filter_changed)
     63         self.module_filter.connect("activate", self.filter_changed)
     64         self.audit_enabled = False
     65 
     66         self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
     67         self.view.set_model(self.store)
     68         self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
     69         col = gtk.TreeViewColumn(_("Module Name"), gtk.CellRendererText(), text=0)
     70         col.set_sort_column_id(0)
     71         col.set_resizable(True)
     72         self.view.append_column(col)
     73         self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
     74         col = gtk.TreeViewColumn(_("Version"), gtk.CellRendererText(), text=1)
     75         self.enable_audit_button = xml.get_widget("enableAuditButton")
     76         self.enable_audit_button.connect("clicked", self.enable_audit)
     77         self.new_button = xml.get_widget("newModuleButton")
     78         self.new_button.connect("clicked", self.new_module)
     79         col.set_sort_column_id(1)
     80         col.set_resizable(True)
     81         self.view.append_column(col)
     82         self.store.set_sort_func(1, self.sort_int, "")
     83         status, self.policy_type = selinux.selinux_getpolicytype()
     84 
     85         self.load()
     86 
     87     def sort_int(self, treemodel, iter1, iter2, user_data):
     88         try:
     89             p1 = int(treemodel.get_value(iter1, 1))
     90             p2 = int(treemodel.get_value(iter1, 1))
     91             if p1 > p2:
     92                 return 1
     93             if p1 == p2:
     94                 return 0
     95             return -1
     96         except:
     97             return 0
     98 
     99     def load(self, filter=""):
    100         self.filter = filter
    101         self.store.clear()
    102         try:
    103             fd = Popen("semodule -l", shell=True, stdout=PIPE).stdout
    104             l = fd.readlines()
    105             fd.close()
    106             for i in l:
    107                 module, ver, newline = i.split('\t')
    108                 if not (self.match(module, filter) or self.match(ver, filter)):
    109                     continue
    110                 iter = self.store.append()
    111                 self.store.set_value(iter, 0, module.strip())
    112                 self.store.set_value(iter, 1, ver.strip())
    113         except:
    114             pass
    115         self.view.get_selection().select_path((0,))
    116 
    117     def new_module(self, args):
    118         try:
    119             Popen(["/usr/share/system-config-selinux/polgengui.py"])
    120         except ValueError as e:
    121             self.error(e.args[0])
    122 
    123     def delete(self):
    124         store, iter = self.view.get_selection().get_selected()
    125         module = store.get_value(iter, 0)
    126         try:
    127             self.wait()
    128             status, output = getstatusoutput("semodule -r %s" % module)
    129             self.ready()
    130             if status != 0:
    131                 self.error(output)
    132             else:
    133                 store.remove(iter)
    134                 self.view.get_selection().select_path((0,))
    135 
    136         except ValueError as e:
    137             self.error(e.args[0])
    138 
    139     def enable_audit(self, button):
    140         self.audit_enabled = not self.audit_enabled
    141         try:
    142             self.wait()
    143             if self.audit_enabled:
    144                 status, output = getstatusoutput("semodule -DB")
    145                 button.set_label(_("Disable Audit"))
    146             else:
    147                 status, output = getstatusoutput("semodule -B")
    148                 button.set_label(_("Enable Audit"))
    149             self.ready()
    150 
    151             if status != 0:
    152                 self.error(output)
    153 
    154         except ValueError as e:
    155             self.error(e.args[0])
    156 
    157     def disable_audit(self, button):
    158         try:
    159             self.wait()
    160             status, output = getstatusoutput("semodule -B")
    161             self.ready()
    162             if status != 0:
    163                 self.error(output)
    164 
    165         except ValueError as e:
    166             self.error(e.args[0])
    167 
    168     def propertiesDialog(self):
    169         # Do nothing
    170         return
    171 
    172     def addDialog(self):
    173         dialog = gtk.FileChooserDialog(_("Load Policy Module"),
    174                                        None,
    175                                        gtk.FILE_CHOOSER_ACTION_OPEN,
    176                                        (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
    177                                         gtk.STOCK_OPEN, gtk.RESPONSE_OK))
    178         dialog.set_default_response(gtk.RESPONSE_OK)
    179 
    180         filter = gtk.FileFilter()
    181         filter.set_name("Policy Files")
    182         filter.add_pattern("*.pp")
    183         dialog.add_filter(filter)
    184 
    185         response = dialog.run()
    186         if response == gtk.RESPONSE_OK:
    187             self.add(dialog.get_filename())
    188         dialog.destroy()
    189 
    190     def add(self, file):
    191         try:
    192             self.wait()
    193             status, output = getstatusoutput("semodule -i %s" % file)
    194             self.ready()
    195             if status != 0:
    196                 self.error(output)
    197             else:
    198                 self.load()
    199 
    200         except ValueError as e:
    201             self.error(e.args[0])
    202