1514af85b89fff54f079f239294c727e4d61319edDan Walsh## portsPage.py - show selinux mappings
2514af85b89fff54f079f239294c727e4d61319edDan Walsh## Copyright (C) 2006 Red Hat, Inc.
3514af85b89fff54f079f239294c727e4d61319edDan Walsh
4514af85b89fff54f079f239294c727e4d61319edDan Walsh## This program is free software; you can redistribute it and/or modify
5514af85b89fff54f079f239294c727e4d61319edDan Walsh## it under the terms of the GNU General Public License as published by
6514af85b89fff54f079f239294c727e4d61319edDan Walsh## the Free Software Foundation; either version 2 of the License, or
7514af85b89fff54f079f239294c727e4d61319edDan Walsh## (at your option) any later version.
8514af85b89fff54f079f239294c727e4d61319edDan Walsh
9514af85b89fff54f079f239294c727e4d61319edDan Walsh## This program is distributed in the hope that it will be useful,
10514af85b89fff54f079f239294c727e4d61319edDan Walsh## but WITHOUT ANY WARRANTY; without even the implied warranty of
11514af85b89fff54f079f239294c727e4d61319edDan Walsh## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12514af85b89fff54f079f239294c727e4d61319edDan Walsh## GNU General Public License for more details.
13514af85b89fff54f079f239294c727e4d61319edDan Walsh
14514af85b89fff54f079f239294c727e4d61319edDan Walsh## You should have received a copy of the GNU General Public License
15514af85b89fff54f079f239294c727e4d61319edDan Walsh## along with this program; if not, write to the Free Software
16514af85b89fff54f079f239294c727e4d61319edDan Walsh## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17514af85b89fff54f079f239294c727e4d61319edDan Walsh
18514af85b89fff54f079f239294c727e4d61319edDan Walsh## Author: Dan Walsh
19514af85b89fff54f079f239294c727e4d61319edDan Walshimport string
20514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk
21514af85b89fff54f079f239294c727e4d61319edDan Walshimport gtk.glade
22514af85b89fff54f079f239294c727e4d61319edDan Walshimport os
23514af85b89fff54f079f239294c727e4d61319edDan Walshimport gobject
24514af85b89fff54f079f239294c727e4d61319edDan Walshimport sys
25514af85b89fff54f079f239294c727e4d61319edDan Walshimport seobject
26514af85b89fff54f079f239294c727e4d61319edDan Walshimport commands
27514af85b89fff54f079f239294c727e4d61319edDan Walshfrom semanagePage import *;
28514af85b89fff54f079f239294c727e4d61319edDan Walsh
29514af85b89fff54f079f239294c727e4d61319edDan Walsh##
30514af85b89fff54f079f239294c727e4d61319edDan Walsh## I18N
31514af85b89fff54f079f239294c727e4d61319edDan Walsh##
32514af85b89fff54f079f239294c727e4d61319edDan WalshPROGNAME = "policycoreutils"
33514af85b89fff54f079f239294c727e4d61319edDan Walshimport gettext
34514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.bindtextdomain(PROGNAME, "/usr/share/locale")
35514af85b89fff54f079f239294c727e4d61319edDan Walshgettext.textdomain(PROGNAME)
36514af85b89fff54f079f239294c727e4d61319edDan WalshTYPE_COL = 0
37514af85b89fff54f079f239294c727e4d61319edDan WalshPROTOCOL_COL = 1
38514af85b89fff54f079f239294c727e4d61319edDan WalshMLS_COL = 2
39514af85b89fff54f079f239294c727e4d61319edDan WalshPORT_COL = 3
40514af85b89fff54f079f239294c727e4d61319edDan Walshtry:
41514af85b89fff54f079f239294c727e4d61319edDan Walsh    gettext.install(PROGNAME,
42514af85b89fff54f079f239294c727e4d61319edDan Walsh                    localedir="/usr/share/locale",
43514af85b89fff54f079f239294c727e4d61319edDan Walsh                    unicode=False,
44514af85b89fff54f079f239294c727e4d61319edDan Walsh                    codeset = 'utf-8')
45514af85b89fff54f079f239294c727e4d61319edDan Walshexcept IOError:
46514af85b89fff54f079f239294c727e4d61319edDan Walsh    import __builtin__
47514af85b89fff54f079f239294c727e4d61319edDan Walsh    __builtin__.__dict__['_'] = unicode
48514af85b89fff54f079f239294c727e4d61319edDan Walsh
49514af85b89fff54f079f239294c727e4d61319edDan Walshclass portsPage(semanagePage):
50514af85b89fff54f079f239294c727e4d61319edDan Walsh    def __init__(self, xml):
51514af85b89fff54f079f239294c727e4d61319edDan Walsh        semanagePage.__init__(self, xml, "ports", _("Network Port"))
52514af85b89fff54f079f239294c727e4d61319edDan Walsh        xml.signal_connect("on_group_clicked", self.on_group_clicked)
53514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.group = False
54514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_filter = xml.get_widget("portsFilterEntry")
55514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_filter.connect("focus_out_event", self.filter_changed)
56514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_filter.connect("activate", self.filter_changed)
57514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_name_entry = xml.get_widget("portsNameEntry")
58514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_protocol_combo = xml.get_widget("portsProtocolCombo")
59514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_number_entry = xml.get_widget("portsNumberEntry")
60514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_mls_entry = xml.get_widget("portsMLSEntry")
61514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_add_button = xml.get_widget("portsAddButton")
62514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_properties_button = xml.get_widget("portsPropertiesButton")
63514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_delete_button = xml.get_widget("portsDeleteButton")
64514af85b89fff54f079f239294c727e4d61319edDan Walsh        liststore = self.ports_protocol_combo.get_model()
65514af85b89fff54f079f239294c727e4d61319edDan Walsh        iter = liststore.get_iter_first()
66514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_protocol_combo.set_active_iter(iter)
67514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.init_store()
68514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.edit = True
69514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.load()
70514af85b89fff54f079f239294c727e4d61319edDan Walsh
71514af85b89fff54f079f239294c727e4d61319edDan Walsh    def filter_changed(self, *arg):
72514af85b89fff54f079f239294c727e4d61319edDan Walsh        filter =  arg[0].get_text()
73514af85b89fff54f079f239294c727e4d61319edDan Walsh        if filter != self.filter:
74514af85b89fff54f079f239294c727e4d61319edDan Walsh            if self.edit:
75514af85b89fff54f079f239294c727e4d61319edDan Walsh                self.load(filter)
76514af85b89fff54f079f239294c727e4d61319edDan Walsh            else:
77514af85b89fff54f079f239294c727e4d61319edDan Walsh                self.group_load(filter)
78514af85b89fff54f079f239294c727e4d61319edDan Walsh
79514af85b89fff54f079f239294c727e4d61319edDan Walsh    def init_store(self):
80514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING , gobject.TYPE_STRING)
81514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.set_model(self.store)
82514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_sort_column_id(0, gtk.SORT_ASCENDING)
83514af85b89fff54f079f239294c727e4d61319edDan Walsh
84514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.set_search_equal_func(self.search)
85514af85b89fff54f079f239294c727e4d61319edDan Walsh        col = gtk.TreeViewColumn(_("SELinux Port\nType"), gtk.CellRendererText(), text = TYPE_COL)
86514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_sort_column_id(TYPE_COL)
87514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_resizable(True)
88514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.append_column(col)
89514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_sort_column_id(TYPE_COL, gtk.SORT_ASCENDING)
90514af85b89fff54f079f239294c727e4d61319edDan Walsh
91514af85b89fff54f079f239294c727e4d61319edDan Walsh        col = gtk.TreeViewColumn(_("Protocol"), gtk.CellRendererText(), text = PROTOCOL_COL)
92514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_sort_column_id(PROTOCOL_COL)
93514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_resizable(True)
94514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.append_column(col)
95514af85b89fff54f079f239294c727e4d61319edDan Walsh
96514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.mls_col = gtk.TreeViewColumn(_("MLS/MCS\nLevel"), gtk.CellRendererText(), text = MLS_COL)
97514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.mls_col.set_resizable(True)
98514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.mls_col.set_sort_column_id(MLS_COL)
99514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.append_column(self.mls_col)
100514af85b89fff54f079f239294c727e4d61319edDan Walsh
101514af85b89fff54f079f239294c727e4d61319edDan Walsh        col = gtk.TreeViewColumn(_("Port"), gtk.CellRendererText(), text = PORT_COL)
102514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_sort_column_id(PORT_COL)
103514af85b89fff54f079f239294c727e4d61319edDan Walsh        col.set_resizable(True)
104514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.append_column(col)
105514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_sort_func(PORT_COL,self.sort_int, "")
106514af85b89fff54f079f239294c727e4d61319edDan Walsh
107514af85b89fff54f079f239294c727e4d61319edDan Walsh    def sort_int(self, treemodel, iter1, iter2, user_data):
108514af85b89fff54f079f239294c727e4d61319edDan Walsh        try:
109514af85b89fff54f079f239294c727e4d61319edDan Walsh            p1 = int(treemodel.get_value(iter1,PORT_COL).split('-')[0])
110514af85b89fff54f079f239294c727e4d61319edDan Walsh            p2 = int(treemodel.get_value(iter2,PORT_COL).split('-')[0])
111514af85b89fff54f079f239294c727e4d61319edDan Walsh            if p1 > p2:
112514af85b89fff54f079f239294c727e4d61319edDan Walsh                return 1
113514af85b89fff54f079f239294c727e4d61319edDan Walsh            if p1 == p2:
114514af85b89fff54f079f239294c727e4d61319edDan Walsh                return 0
115514af85b89fff54f079f239294c727e4d61319edDan Walsh            return -1
116514af85b89fff54f079f239294c727e4d61319edDan Walsh        except:
117514af85b89fff54f079f239294c727e4d61319edDan Walsh            return 0
118514af85b89fff54f079f239294c727e4d61319edDan Walsh
119514af85b89fff54f079f239294c727e4d61319edDan Walsh    def load(self,filter = ""):
120514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.filter=filter
121514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.port = seobject.portRecords()
122514af85b89fff54f079f239294c727e4d61319edDan Walsh        dict = self.port.get_all(self.local)
123514af85b89fff54f079f239294c727e4d61319edDan Walsh        keys = dict.keys()
124514af85b89fff54f079f239294c727e4d61319edDan Walsh        keys.sort()
125514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.clear()
126514af85b89fff54f079f239294c727e4d61319edDan Walsh        for k in keys:
127514af85b89fff54f079f239294c727e4d61319edDan Walsh            if not (self.match(str(k[0]), filter) or self.match(dict[k][0], filter) or self.match(k[2], filter) or self.match(dict[k][1], filter) or self.match(dict[k][1], filter)):
128514af85b89fff54f079f239294c727e4d61319edDan Walsh                continue
129514af85b89fff54f079f239294c727e4d61319edDan Walsh            iter = self.store.append()
130514af85b89fff54f079f239294c727e4d61319edDan Walsh            if k[0] == k[1]:
131514af85b89fff54f079f239294c727e4d61319edDan Walsh                self.store.set_value(iter, PORT_COL, k[0])
132514af85b89fff54f079f239294c727e4d61319edDan Walsh            else:
133514af85b89fff54f079f239294c727e4d61319edDan Walsh                rec = "%s-%s" % k[:2]
134514af85b89fff54f079f239294c727e4d61319edDan Walsh                self.store.set_value(iter, PORT_COL, rec)
135514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, TYPE_COL, dict[k][0])
136514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, PROTOCOL_COL, k[2])
137514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, MLS_COL, dict[k][1])
138514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.get_selection().select_path ((0,))
139514af85b89fff54f079f239294c727e4d61319edDan Walsh
140514af85b89fff54f079f239294c727e4d61319edDan Walsh    def group_load(self, filter = ""):
141514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.filter=filter
142514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.port = seobject.portRecords()
143514af85b89fff54f079f239294c727e4d61319edDan Walsh        dict = self.port.get_all_by_type(self.local)
144514af85b89fff54f079f239294c727e4d61319edDan Walsh        keys = dict.keys()
145514af85b89fff54f079f239294c727e4d61319edDan Walsh        keys.sort()
146514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.clear()
147514af85b89fff54f079f239294c727e4d61319edDan Walsh        for k in keys:
148514af85b89fff54f079f239294c727e4d61319edDan Walsh            ports_string = ", ".join(dict[k])
149514af85b89fff54f079f239294c727e4d61319edDan Walsh            if not (self.match(ports_string, filter) or self.match(k[0], filter) or self.match(k[1], filter) ):
150514af85b89fff54f079f239294c727e4d61319edDan Walsh                continue
151514af85b89fff54f079f239294c727e4d61319edDan Walsh            iter = self.store.append()
152514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, TYPE_COL, k[0])
153514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, PROTOCOL_COL, k[1])
154514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, PORT_COL, ports_string)
155514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.store.set_value(iter, MLS_COL, "")
156514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.view.get_selection().select_path ((0,))
157514af85b89fff54f079f239294c727e4d61319edDan Walsh
158514af85b89fff54f079f239294c727e4d61319edDan Walsh    def propertiesDialog(self):
159514af85b89fff54f079f239294c727e4d61319edDan Walsh        if self.edit:
160514af85b89fff54f079f239294c727e4d61319edDan Walsh            semanagePage.propertiesDialog(self)
161514af85b89fff54f079f239294c727e4d61319edDan Walsh
162514af85b89fff54f079f239294c727e4d61319edDan Walsh    def dialogInit(self):
163514af85b89fff54f079f239294c727e4d61319edDan Walsh        store, iter = self.view.get_selection().get_selected()
164514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_number_entry.set_text(store.get_value(iter, PORT_COL))
165514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_number_entry.set_sensitive(False)
166514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_protocol_combo.set_sensitive(False)
167514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_name_entry.set_text(store.get_value(iter, TYPE_COL))
168514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_mls_entry.set_text(store.get_value(iter, MLS_COL))
169514af85b89fff54f079f239294c727e4d61319edDan Walsh        protocol = store.get_value(iter, PROTOCOL_COL)
170514af85b89fff54f079f239294c727e4d61319edDan Walsh        liststore = self.ports_protocol_combo.get_model()
171514af85b89fff54f079f239294c727e4d61319edDan Walsh        iter = liststore.get_iter_first()
172514af85b89fff54f079f239294c727e4d61319edDan Walsh        while iter != None and liststore.get_value(iter,0) != protocol:
173514af85b89fff54f079f239294c727e4d61319edDan Walsh            iter = liststore.iter_next(iter)
174514af85b89fff54f079f239294c727e4d61319edDan Walsh        if iter != None:
175514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.ports_protocol_combo.set_active_iter(iter)
176514af85b89fff54f079f239294c727e4d61319edDan Walsh
177514af85b89fff54f079f239294c727e4d61319edDan Walsh    def dialogClear(self):
178514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_number_entry.set_text("")
179514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_number_entry.set_sensitive(True)
180514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_protocol_combo.set_sensitive(True)
181514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_name_entry.set_text("")
182514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_mls_entry.set_text("s0")
183514af85b89fff54f079f239294c727e4d61319edDan Walsh
184514af85b89fff54f079f239294c727e4d61319edDan Walsh    def delete(self):
185514af85b89fff54f079f239294c727e4d61319edDan Walsh        store, iter = self.view.get_selection().get_selected()
186514af85b89fff54f079f239294c727e4d61319edDan Walsh        port = store.get_value(iter, PORT_COL)
187514af85b89fff54f079f239294c727e4d61319edDan Walsh        protocol = store.get_value(iter, 1)
188514af85b89fff54f079f239294c727e4d61319edDan Walsh        try:
189514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.wait()
190514af85b89fff54f079f239294c727e4d61319edDan Walsh            (rc, out) = commands.getstatusoutput("semanage port -d -p %s %s" % (protocol, port))
191514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.ready()
192514af85b89fff54f079f239294c727e4d61319edDan Walsh            if rc != 0:
193514af85b89fff54f079f239294c727e4d61319edDan Walsh                return self.error(out)
194514af85b89fff54f079f239294c727e4d61319edDan Walsh            store.remove(iter)
195514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.view.get_selection().select_path ((0,))
196514af85b89fff54f079f239294c727e4d61319edDan Walsh        except ValueError, e:
197514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.error(e.args[0])
198514af85b89fff54f079f239294c727e4d61319edDan Walsh
199514af85b89fff54f079f239294c727e4d61319edDan Walsh    def add(self):
200514af85b89fff54f079f239294c727e4d61319edDan Walsh        target = self.ports_name_entry.get_text().strip()
201514af85b89fff54f079f239294c727e4d61319edDan Walsh        mls = self.ports_mls_entry.get_text().strip()
202514af85b89fff54f079f239294c727e4d61319edDan Walsh        port_number = self.ports_number_entry.get_text().strip()
203514af85b89fff54f079f239294c727e4d61319edDan Walsh        if port_number == "":
204514af85b89fff54f079f239294c727e4d61319edDan Walsh            port_number = "1"
205514af85b89fff54f079f239294c727e4d61319edDan Walsh        for i in port_number.split("-"):
206514af85b89fff54f079f239294c727e4d61319edDan Walsh            if not i.isdigit():
207514af85b89fff54f079f239294c727e4d61319edDan Walsh                self.error(_("Port number \"%s\" is not valid.  0 < PORT_NUMBER < 65536 ") % port_number )
208514af85b89fff54f079f239294c727e4d61319edDan Walsh                return False
209514af85b89fff54f079f239294c727e4d61319edDan Walsh        list_model = self.ports_protocol_combo.get_model()
210514af85b89fff54f079f239294c727e4d61319edDan Walsh        iter = self.ports_protocol_combo.get_active_iter()
211514af85b89fff54f079f239294c727e4d61319edDan Walsh        protocol = list_model.get_value(iter,0)
212514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.wait()
213514af85b89fff54f079f239294c727e4d61319edDan Walsh        (rc, out) = commands.getstatusoutput("semanage port -a -p %s -r %s -t %s %s" % (protocol, mls, target, port_number))
214514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ready()
215514af85b89fff54f079f239294c727e4d61319edDan Walsh        if rc != 0:
216514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.error(out)
217514af85b89fff54f079f239294c727e4d61319edDan Walsh            return False
218514af85b89fff54f079f239294c727e4d61319edDan Walsh        iter = self.store.append()
219514af85b89fff54f079f239294c727e4d61319edDan Walsh
220514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, TYPE_COL, target)
221514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, PORT_COL, port_number)
222514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, PROTOCOL_COL, protocol)
223514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, MLS_COL, mls)
224514af85b89fff54f079f239294c727e4d61319edDan Walsh
225514af85b89fff54f079f239294c727e4d61319edDan Walsh    def modify(self):
226514af85b89fff54f079f239294c727e4d61319edDan Walsh        target = self.ports_name_entry.get_text().strip()
227514af85b89fff54f079f239294c727e4d61319edDan Walsh        mls = self.ports_mls_entry.get_text().strip()
228514af85b89fff54f079f239294c727e4d61319edDan Walsh        port_number = self.ports_number_entry.get_text().strip()
229514af85b89fff54f079f239294c727e4d61319edDan Walsh        list_model = self.ports_protocol_combo.get_model()
230514af85b89fff54f079f239294c727e4d61319edDan Walsh        iter = self.ports_protocol_combo.get_active_iter()
231514af85b89fff54f079f239294c727e4d61319edDan Walsh        protocol = list_model.get_value(iter,0)
232514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.wait()
233514af85b89fff54f079f239294c727e4d61319edDan Walsh        (rc, out) = commands.getstatusoutput("semanage port -m -p %s -r %s -t %s %s" % (protocol, mls, target, port_number))
234514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ready()
235514af85b89fff54f079f239294c727e4d61319edDan Walsh        if rc != 0:
236514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.error(out)
237514af85b89fff54f079f239294c727e4d61319edDan Walsh            return False
238514af85b89fff54f079f239294c727e4d61319edDan Walsh        store, iter = self.view.get_selection().get_selected()
239514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, TYPE_COL, target)
240514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, PORT_COL, port_number)
241514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, PROTOCOL_COL, protocol)
242514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.store.set_value(iter, MLS_COL, mls)
243514af85b89fff54f079f239294c727e4d61319edDan Walsh
244514af85b89fff54f079f239294c727e4d61319edDan Walsh    def on_group_clicked(self, button):
245514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_add_button.set_sensitive(self.group)
246514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_properties_button.set_sensitive(self.group)
247514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.ports_delete_button.set_sensitive(self.group)
248514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.mls_col.set_visible(self.group)
249514af85b89fff54f079f239294c727e4d61319edDan Walsh
250514af85b89fff54f079f239294c727e4d61319edDan Walsh        self.group = not self.group
251514af85b89fff54f079f239294c727e4d61319edDan Walsh        if self.group:
252514af85b89fff54f079f239294c727e4d61319edDan Walsh            button.set_label(_("List View"))
253514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.group_load(self.filter)
254514af85b89fff54f079f239294c727e4d61319edDan Walsh        else:
255514af85b89fff54f079f239294c727e4d61319edDan Walsh            button.set_label(_("Group View"))
256514af85b89fff54f079f239294c727e4d61319edDan Walsh            self.load(self.filter)
257514af85b89fff54f079f239294c727e4d61319edDan Walsh
258514af85b89fff54f079f239294c727e4d61319edDan Walsh        return True
259