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