def action_export_repository(self, widget): """Create a new unverified group""" smodel, siter = self.widgets['groups_tree'].get_selection( ).get_selected() if not siter: return if self.imported_groups or self.groups_changed: if askyesno(_("Save Changes"), _("Do you want to save your changes?")): self.save_groups() iter = smodel.convert_iter_to_child_iter(siter) model = smodel.get_model() if askyesno( _("Export Group"), _("Are you sure you want to send this group to the repository?" )): if upload_group(model.get_value(iter, 0), model.get_value(iter, 1).split('\n')): showwarning(_("Exported"), _("Thank you for sending us the group details")) else: showwarning(_("Error"), _("Please try again"), 4)
def delete_user(self, widget): (model, node) = self.arw["treeview1"].get_selection().get_selected() name = model.get_value(node, 0) if model.iter_has_child(node): res = askyesno("Remove user", "Do you want to remove category %s?" % name) else: res = askyesno("Remove user", "Do you want to remove user %s?" % name) if res: self.users_store.remove(node) # User should be removed from the maclist too if name in self.controller.maclist: del self.controller.maclist[name] # Remove user from the filter_store for item in self.controller.filter_store: users = (item[5] or '').split('\n') try: users.remove(name) except ValueError: continue self.controller.filter_store.set_value(item.iter, 5, '\n'.join(users)) # Refresh the proxy users list self.controller.filter_rules.update_filter_user_list()
def proxy_group_remove_item(self, widget): """When right clicked, Remove the selected item from the list""" model, iter = self.arw['proxy_group_domain_tree'].get_selection().get_selected() if not iter: return domain = model.get_value(iter, 0) if askyesno(_("Remove domain?"), _("Remove domain: %s") % domain): model.remove(iter)
def delete_item(self, widget): """Delete an entry""" model, iter = self.widgets['groups_tree'].get_selection().get_selected( ) name = model.get_value(iter, 0) if askyesno(_("Delete Group"), _("Do you want to delete %s?" % name)): iter = model.convert_iter_to_child_iter(iter) model.get_model().remove(iter) self.groups_changed = True
def profile_delete_selected(self, widget): """Delete an existing configuration""" model, selected_iter = self.arw['profiles_tree'].get_selection( ).get_selected() if askyesno( "Delete Profile", "Really delete %s?" % model.get_value(selected_iter, COLUMN_NAME)): model.remove(selected_iter)
def ports_delete_group(self, widget): """Delete the selected ports group""" model, iter = self.arw['ports_tree'].get_selection().get_selected() name = model.get_value(iter, 0) if not askyesno(_('Delete %s') % name, _('Are you sure you want to delete port group?')): return model, iter = self.arw['ports_tree'].get_selection().get_selected() iter = model.convert_iter_to_child_iter(iter) model = model.get_model() model.remove(iter)
def load_defaults(self, widget=None): response = askyesno( _("No user data"), _("There is no user data present. \nDo you want to create standard categories ?" )) if response == 1: if os.path.isfile("./idefix-default.json"): data_str = open("./idefix-default.json", "r").read() self.config = json.loads(data_str, object_pairs_hook=OrderedDict) self.update_gui() self.set_colors()
def check_date(self): """Test if idefix date is out and if it is then update it""" data = self.get_infos('infos_system') if not data: return local_tz = tzlocal.get_localzone() try: lines = data.decode('cp860').split('\n') timestamp, idefix_tz = lines[0:2] idefix_date = datetime.datetime.fromtimestamp( int(timestamp), tz=pytz.timezone(idefix_tz)) except: print( "Confix cannot check the date of Idefix. Perhaps a too old version of trigger.py" ) return now = datetime.datetime.now(tz=local_tz) if not dateutil.utils.within_delta(now, idefix_date, DATE_THRESHOLD): # The time is over six hours out, ask the user if we should change time answer = askyesno( _("Idefix date/time might be incorrect"), _("The time set on your Idefix is: %s\nYour computer's time is %s.\n\nUpdate the idefix time?" ) % (idefix_date.strftime('%X %x %Z'), now.astimezone().strftime('%X %x %Z'))) if answer: self.set_date() elif idefix_tz != local_tz.zone: # Check if the timezone between the two are different answer = askyesno( _("Idefix timezone different"), _("The timezone on your idefix does not match your system timezone. \nIdefix: %s\nComputer: %s\n\n" + "Update the timezone?") % (idefix_tz, local_tz.zone)) if answer: self.set_date()
def action_import_groups(self, widget): """Imports groups from a json file, first adds them into the tree view for later merging/replacing""" if self.groups_changed: if askyesno(_("Save Changes"), _("Do you want to save your changes?")): self.save_groups() self.groups_changed = False dialog = Gtk.FileChooserDialog( _("Import File"), self.widgets['groups_window'], Gtk.FileChooserAction.OPEN, (_("Import"), Gtk.ResponseType.ACCEPT), ) file_filter = Gtk.FileFilter() file_filter.add_pattern('*.json') file_filter.add_pattern('*.txt') dialog.set_filter(file_filter) self.buffer = Gtk.TextBuffer() self.widgets['groups_view'].set_buffer(self.buffer) self.groups_store.clear() dialog.show_all() response = dialog.run() if response == Gtk.ResponseType.ACCEPT: with open(dialog.get_filename(), 'r', encoding='utf-8-sig', newline='\n') as f: if dialog.get_filename().lower().endswith('txt'): # Load the simple group format path, ext = os.path.splitext(dialog.get_filename()) data = { 'groups': [{ 'group': os.path.basename(path).title(), 'group_id': '', 'dest': [line.strip() for line in f.read().split('\n')] }] } else: data = json.load(f, object_pairs_hook=OrderedDict) self.read_config_data(data) self.imported_groups = True dialog.destroy()
def delete_proxy_group(self, widget): model, iter = self.arw['proxy_group'].get_selection().get_selected() name = model.get_value(iter, 0).strip() names = self.controller.filter_rules.current_store.get_value(self.controller.iter_filter, 7).split('\n') if name not in names or name == 'any': return res = askyesno("Remove group", "Do you want to remove group %s?" % name) if not res: return names.remove(name) self.controller.filter_rules.current_store.set_value(self.controller.iter_filter, 7, '\n'.join(names)) self.update_proxy_group_list()
def action_edit_groups(self, widget): """Show the groups in the tree view to allow the user to edit """ if self.imported_groups or self.groups_changed: if askyesno(_("Save Changes"), _("Do you want to save your changes?")): self.save_groups() self.imported_groups = False self.groups_changed = False self.widgets['add_group_menu'].show() self.groups_store.clear() self.buffer = Gtk.TextBuffer() self.widgets['groups_view'].set_buffer(self.buffer) for row in self.controller.groups_store: self.groups_store.append((row[0], row[1]))
def open_connexion_profile(self, configname=""): print("open connexion profile") self.mymac = None self.arw['loading_window'].show() while Gtk.events_pending(): Gtk.main_iteration() # ftp connect ftp1 = self.ftp_config self.ftp = ftp_connect(ftp1["server"], ftp1["login"], ftp1["pass"], self) self.arw['loading_window'].hide() if not self.ftp: # alert(_("Could not connect to %s (%s). \nVerify your cables or your configuration.") % (ftp1["server"], configname)) return False else: # retrieve files by ftp data0 = ftp_get(self.ftp, "idefix.json", json=True) self.active_config_text = data0 if data0: try: self.config = json.loads(data0, object_pairs_hook=OrderedDict) self.update() self.update_gui() except: # Try load a backup configuration if askyesno( _("Corrupted Configuration"), _('Your configuration is corrupted. Search for backup?' )): return self.find_good_backup() else: self.config = OrderedDict() self.load_defaults() self.ftp.close() else: self.load_defaults() if self.load_connection(): return True
def delete_verified(self, widget): """Delete a verified group""" model, iter = self.widgets['verified_treeview'].get_selection().get_selected() if not iter: return iter = model.convert_iter_to_child_iter(iter) if not iter: return model = model.get_model() if model.get_value(iter, COLUMN_TYPE) == TYPE_CATEGORY: return name = model.get_value(iter, COLUMN_NAME) if askyesno("Delete Verified Group", "Delete %s?" % name): self.database.delete_group(int(model.get_value(iter, COLUMN_ID))) self.refresh_database() self.verified_dirty = False
def delete_filter_user(self, widget): model, iter = self.arw['filter_users'].get_selection().get_selected() name = model.get_value(iter, 0).strip() value = self.current_store.get_value(self.controller.iter_filter, 5) if not value: names = [] else: names = value.split('\n') if name not in names: return res = askyesno(_("Remove user"), _("Do you want to remove user %s?") % name) if not res: return names.remove(name) self.current_store.set_value(self.controller.iter_filter, 5, '\n'.join(names)) self.update_filter_user_list()
def delete_user3(self, widget): (model, node) = self.arw["treeview2"].get_selection().get_selected() name = model.get_value(node, 0) if askyesno("Remove rule", "Do you want to remove %s?" % name): self.firewall_store.remove(node)
def ask_verified_save_changes(self): """Asks the user if they want to save their changes""" if self.verified_dirty: return askyesno("Save Changes?", "Do you want to save your changes first?")
def delete_rule(self, widget): (model, node) = self.arw["treeview3"].get_selection().get_selected() name = model.get_value(node, 0) if askyesno("Remove filter rule", "Do you want to remove %s?" % name): self.current_store.remove(node)
def action_import_repository(self, widget): if self.imported_groups or self.groups_changed: if askyesno(_("Save Changes"), _("Do you want to save your changes?")): self.save_groups() self.imported_groups = False self.groups_changed = False self.widgets['add_group_menu'].hide() # Get the categories from the server data = fetch_repository_categories() if not data: showwarning(_("Repository"), _("Could not get files from server")) return self._cached_categories = {} self._cached_groups = {} self._cached_groups_by_category_id = {} self.group_results = [] self.categories_in_results = [] self.widgets['repository_store'].clear() category_iters = {None: None} # Always make sure parent id is at the top data.sort(key=lambda x: x['parent_id'] is None, reverse=True) for category in data: self._cached_categories[int(category['id'])] = category category_id = int(category['id']) if category.get('parent_id'): parent_id = int(category['parent_id']) else: parent_id = None category_iters[category_id] = iter = self.widgets[ 'repository_store'].append(category_iters.get(parent_id)) self.widgets['repository_store'].set_value(iter, IMPORT_COLUMN_NAME, category['name']) self.widgets['repository_store'].set_value(iter, IMPORT_COLUMN_ID, category_id) self.widgets['repository_store'].set_value( iter, IMPORT_COLUMN_PARENT_ID, parent_id) self.widgets['repository_store'].set_value(iter, IMPORT_COLUMN_TYPE, CATEGORY_TYPE) self.widgets['repository_store'].set_value(iter, IMPORT_COLUMN_CATEGORY, True) self._cached_categories[int( category['id'] )]['path'] = self.widgets['repository_store'].get_path(iter) for group in search_repository_groups(): self.add_group_to_store(group) self.widgets['import_window'].show_all()