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 import commands
     24 import gobject
     25 import sys
     26 import seobject
     27 import selinux
     28 from semanagePage import *;
     29 from subprocess import Popen, PIPE
     30 
     31 ##
     32 ## I18N
     33 ##
     34 PROGNAME="policycoreutils"
     35 import gettext
     36 gettext.bindtextdomain(PROGNAME, "/usr/share/locale")
     37 gettext.textdomain(PROGNAME)
     38 try:
     39     gettext.install(PROGNAME,
     40                     localedir="/usr/share/locale",
     41                     unicode=False,
     42                     codeset = 'utf-8')
     43 except IOError:
     44     import __builtin__
     45     __builtin__.__dict__['_'] = unicode
     46 
     47 class 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