From 5c9d4bc3dff5789e8c0e472a85b6d3faa425ace9 Mon Sep 17 00:00:00 2001 From: Mikael Nordin Date: Thu, 26 Nov 2020 16:57:57 +0100 Subject: [PATCH] v0.0.2 --- build/lib/wireguide/__init__.py | 0 build/lib/wireguide/logo.png | Bin 7699 -> 0 bytes build/lib/wireguide/wireguide | 392 ------------------------ build/scripts-3.8/wireguide | 392 ------------------------ dist/wireguide-0.0.1-py3-none-any.whl | Bin 30444 -> 0 bytes dist/wireguide-0.0.1.tar.gz | Bin 15028 -> 0 bytes wireguide.egg-info/PKG-INFO | 41 --- wireguide.egg-info/SOURCES.txt | 10 - wireguide.egg-info/dependency_links.txt | 1 - wireguide.egg-info/top_level.txt | 1 - 10 files changed, 837 deletions(-) delete mode 100644 build/lib/wireguide/__init__.py delete mode 100644 build/lib/wireguide/logo.png delete mode 100755 build/lib/wireguide/wireguide delete mode 100755 build/scripts-3.8/wireguide delete mode 100644 dist/wireguide-0.0.1-py3-none-any.whl delete mode 100644 dist/wireguide-0.0.1.tar.gz delete mode 100644 wireguide.egg-info/PKG-INFO delete mode 100644 wireguide.egg-info/SOURCES.txt delete mode 100644 wireguide.egg-info/dependency_links.txt delete mode 100644 wireguide.egg-info/top_level.txt diff --git a/build/lib/wireguide/__init__.py b/build/lib/wireguide/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/build/lib/wireguide/logo.png b/build/lib/wireguide/logo.png deleted file mode 100644 index 9ada82d554931f2ab94ef4e525edde46c4631629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7699 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 E1M+Eq+5i9m diff --git a/build/lib/wireguide/wireguide b/build/lib/wireguide/wireguide deleted file mode 100755 index 5e85216..0000000 --- a/build/lib/wireguide/wireguide +++ /dev/null @@ -1,392 +0,0 @@ -#!/usr/bin/env python3 -""" -This is a program that can manage Wireguard Configuration graphically -""" -import configparser -import os -import re -import sys -import uuid -from socket import AF_INET - -import gi -import wx -import wx.adv - -gi.require_version("NM", "1.0") -from gi.repository import NM # pylint: disable=wrong-import-position - - -class WireFrame(wx.Frame): # pylint: disable=too-many-ancestors,too-many-instance-attributes - """ - The WireGUIde wx.Frame - """ - def __init__(self, *args, **kw): - super().__init__(*args, **kw) - - self.version = 0.1 - - # Get active conns from NetworkManager - self.client = NM.Client.new(None) - self.conns = self.get_wg_conns() - self.active_conns = self.get_wg_aconns() - - # Set up for loaded configs - self.inactive_conns = get_inactive_conns() - - # create a panel in the frame - self.pnl = wx.Panel(self) - - # and create a sizer to manage the layout of child widgets - self.sizer = wx.BoxSizer(wx.VERTICAL) - self.write_to_sizer() - self.pnl.SetSizer(self.sizer) - - # create a menu bar - self.make_menu_bar() - - # and a status bar - self.statusbar = self.CreateStatusBar(style=wx.BORDER_NONE) - self.set_status() - - self.timer = wx.Timer(self) - self.count = 0 - - self.Bind(wx.EVT_TIMER, self.do_on_timer) - self.Bind(wx.EVT_PAINT, self.timing) - self.Show() - - def about_clicked(self, event): # pylint: disable=unused-argument - """Display an About Dialog""" - about = "WireGUIde is a GUI for WireGuard." - lic_text = """ - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see .""" - #wx.MessageBox(about, "About WireGUIde" ,wx.OK | wx.ICON_INFORMATION) - info = wx.adv.AboutDialogInfo() - info.SetIcon(wx.Icon('logo.png', wx.BITMAP_TYPE_PNG)) - info.SetName('WireGUIde') - info.SetVersion(str(self.version)) - info.SetDescription(about) - info.SetCopyright('(C) 2020 Mikael Nordin') - info.SetWebSite('https://github.com/mickenordin') - info.SetLicence(lic_text) - info.AddDeveloper('Mikael Nordin') - info.AddDocWriter('Mikael Nordin') - info.AddArtist('Mikael Nordin') - - wx.adv.AboutBox(info) - - def activate_button_clicked(self, event, conn): # pylint: disable=unused-argument - """ - This activates an imported config - """ - print(conn.get_id()) - self.client.add_connection_async(conn, False, None, self.add_callback, - None) - self.remove_inactive(conn) - - def add_callback(self, client, result, data): # pylint: disable=unused-argument - """ - This is here to let us know if the connection was successful or not - """ - try: - client.add_connection_finish(result) - print( - "The connection profile has been successfully added to NetworkManager." - ) - except Exception as exception: # pylint: disable=broad-except - sys.stderr.write("Error: %s\n" % exception) - self.active_conns = self.get_wg_aconns() - self.conns = self.get_wg_conns() - self.write_to_sizer() - - def create_conn_from_file(self, pathname): - """ - Read a WireGuardUI config file and convert it in to - an object that can be user by NetworkManager - """ - filename = os.path.basename(pathname) - try: - config = configparser.ConfigParser() - config.read(pathname) - iname = self.get_next_int_name() - profile = NM.SimpleConnection.new() - s_con = NM.SettingConnection.new() - s_con.set_property(NM.SETTING_CONNECTION_ID, iname) - s_con.set_property(NM.SETTING_CONNECTION_INTERFACE_NAME, iname) - s_con.set_property(NM.SETTING_CONNECTION_UUID, str(uuid.uuid4())) - s_con.set_property(NM.SETTING_CONNECTION_TYPE, - NM.SETTING_WIREGUARD_SETTING_NAME) - - s_wireguard = NM.SettingWireGuard.new() - s_wireguard.set_property(NM.SETTING_WIREGUARD_PRIVATE_KEY, - config['Interface']['PrivateKey']) - s_peer = NM.WireGuardPeer.new() - s_peer.set_endpoint(config['Peer']['Endpoint'], False) - s_peer.set_public_key(config['Peer']['PublicKey'], False) - s_peer.append_allowed_ip(config['Peer']['AllowedIPs'], False) - s_wireguard.append_peer(s_peer) - - s_ip4 = NM.SettingIP4Config.new() - s_ip4_address = NM.IPAddress(AF_INET, - config['Interface']['Address'], - int(32)) - s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, "manual") - s_ip4.add_address(s_ip4_address) - s_ip4.add_dns(config['Interface']['DNS']) - - profile.add_setting(s_con) - profile.add_setting(s_ip4) - profile.add_setting(s_wireguard) - return profile - - except IOError: - wx.LogError("Cannot open file '%s'." % filename) - return None - - def deactivate_button_clicked(self, event, conn): # pylint: disable=unused-argument - """ - This deactivates an active config - """ - print(conn.get_id()) - self.client.deactivate_connection_async(conn, None, self.de_callback, - conn) - conn.get_connection().delete_async(None, None, None) - - def de_callback(self, client, result, data): # pylint: disable=unused-argument - """ - This is here to let us know if the deactivation was successful or not - """ - try: - client.deactivate_connection_finish(result) - print( - "The connection profile has been successfully removed from NetworkManager." - ) - except Exception as exception: # pylint: disable=broad-except - sys.stderr.write("Error: %s\n" % exception) - self.active_conns = self.get_wg_aconns() - self.conns = self.get_wg_conns() - self.write_to_sizer() - - def do_on_timer(self, event): # pylint: disable=unused-argument - """ - Do stuff to redraw the window when the timer times out - Ths is because connections might change outside of WireGUIde - """ - self.count += 1 - if self.count == 5: - self.client.reload_connections_async() - self.active_conns = self.get_wg_aconns() - self.conns = self.get_wg_conns() - self.set_status() - self.write_to_sizer() - self.count = 0 - - def exit_clicked(self, event): # pylint: disable=unused-argument - """ - Close the frame, terminating the application. - """ - self.Close(True) - - def file_chooser_clicked(self, event): # pylint: disable=unused-argument - """ - This is what happens when you click on the file chooser - """ - with wx.FileDialog(self, - "Open WireGuard config file", - wildcard="WireGuard files (*.conf)|*.conf", - style=wx.FD_OPEN - | wx.FD_FILE_MUST_EXIST) as file_dialog: - - if file_dialog.ShowModal() == wx.ID_CANCEL: - return # the user changed their mind - - # Proceed loading the file chosen by the user - pathname = file_dialog.GetPath() - new_conn = self.create_conn_from_file(pathname) - self.inactive_conns.append(new_conn) - self.write_to_sizer() - - def get_next_int_name(self): - """ - Determins what we should call the next interface - """ - temp = [] - for conn in self.conns: - temp.append(re.findall(r'\d+', conn.get_interface_name())) - for conn in self.inactive_conns: - temp.append(re.findall(r'\d+', conn.get_interface_name())) - numbers = [int(item) for sublist in temp for item in sublist] - if not numbers: - num = 0 - else: - numbers.sort(reverse=True) - num = numbers[0] + 1 - return "wg" + str(num) - - def get_wg_aconns(self): - """ - Reads all active wireguard connections from NetworkManager - and returns them as objects in an array - """ - mconns = [] - wgconns = self.client.get_active_connections() - for conn in wgconns: - if conn.get_connection_type() == NM.SETTING_WIREGUARD_SETTING_NAME: - mconns.append(conn) - return mconns - - def get_wg_conns(self): - """ - Reads all current wireguard connections from NetworkManager - and returns them as objects in an array - """ - mconns = [] - wgconns = self.client.get_connections() - for conn in wgconns: - if conn.get_connection_type() == NM.SETTING_WIREGUARD_SETTING_NAME: - mconns.append(conn) - return mconns - - def make_menu_bar(self): - """ - A menu bar is composed of menus, which are composed of menu items. - This method builds a set of menus and binds handlers to be called - when the menu item is selected. - """ - - file_menu = wx.Menu() - file_chooser_item = file_menu.Append(-1, "&Open...\tCtrl-O", - "Select WireGuard config file") - file_menu.AppendSeparator() - exit_item = file_menu.Append(wx.ID_EXIT) - - help_menu = wx.Menu() - about_item = help_menu.Append(wx.ID_ABOUT) - - menu_bar = wx.MenuBar() - menu_bar.Append(file_menu, "&File") - menu_bar.Append(help_menu, "&Help") - - self.SetMenuBar(menu_bar) - - self.Bind(wx.EVT_MENU, self.file_chooser_clicked, file_chooser_item) - self.Bind(wx.EVT_MENU, self.exit_clicked, exit_item) - self.Bind(wx.EVT_MENU, self.about_clicked, about_item) - - def remove_inactive(self, conn): - """ - Remove the inactive connection from the array - """ - for i in range(len(self.inactive_conns)): - if self.inactive_conns[i].get_id() == conn.get_id(): - self.inactive_conns.pop(i) - - def set_status(self): - """ - Update the status bar - """ - status = str(len(self.active_conns)) + " active connection(s)" - self.statusbar.SetStatusText(status) - - def timing(self, event): # pylint: disable=unused-argument - """ - Start a timer - """ - self.timer.Start(20) - - def write_to_sizer(self): - """ - We use the BoxSizer to hold our configs - This method redraws the sizer - """ - self.sizer.Clear(delete_windows=True) - if len(self.active_conns) > 0: - hd1 = wx.StaticText(self.pnl) - hd1.SetLabelMarkup("Active connections") - self.sizer.Add(hd1, 0, wx.ALIGN_CENTER) - for conn in self.active_conns: - statstr = wx.StaticText(self.pnl) - info = get_info_as_text(conn) - statstr.SetLabelMarkup(info) - self.sizer.Add(statstr, - wx.SizerFlags().Border(wx.TOP | wx.LEFT, 25)) - dbtn = wx.Button(self.pnl, -1, "Deactivate") - self.sizer.Add(dbtn, 0, wx.ALIGN_CENTER) - self.Bind(wx.EVT_BUTTON, - lambda event, mconn=conn: self. - deactivate_button_clicked(event, mconn), - dbtn) - if len(self.inactive_conns) > 0: - hd2 = wx.StaticText(self.pnl) - hd2.SetLabelMarkup("Imported configs") - self.sizer.Add(hd2, 0, wx.ALIGN_CENTER) - if self.inactive_conns: - for conn in self.inactive_conns: - statstr = wx.StaticText(self.pnl) - info = get_info_as_text(conn) - statstr.SetLabelMarkup(info) - self.sizer.Add( - statstr, - wx.SizerFlags().Border(wx.TOP | wx.LEFT, 25)) - btn = wx.Button(self.pnl, -1, "Activate") - self.sizer.Add(btn, 0, wx.ALIGN_CENTER) - self.Bind(wx.EVT_BUTTON, - lambda event, mconn=conn: self. - activate_button_clicked(event, mconn), - btn) - if (len(self.active_conns) == 0) and (len(self.inactive_conns) == 0): - hd0 = wx.StaticText(self.pnl) - hd0.SetLabelMarkup("No configs available") - missingstr = wx.StaticText(self.pnl) - missingstr.SetLabelMarkup( - "Please choose a config file from the file menu (CTRL+O).") - self.sizer.Add(hd0, 0, wx.ALIGN_CENTER) - self.sizer.Add(missingstr, 0, wx.ALIGN_LEFT) - self.sizer.Layout() - - -def get_inactive_conns(): - """ - TODO: Not implemented yet - """ - minactive_conns = [] - #return empty array for now, we cant read configs from stash yet - return minactive_conns - - -def get_info_as_text(aconn): - """ - Returns info about a connection as text - """ - try: - conn = aconn.get_connection() - except Exception: # pylint: disable=broad-except - conn = aconn - mid = conn.get_id() - miname = conn.get_interface_name() - muuid = conn.get_uuid() - info = "id: " + mid + '\n' - info += "interface name: " + miname + '\n' - info += "uuid: " + muuid + '\n' - return info - - -if __name__ == '__main__': - # When this module is run (not imported) then create the app, the - # frame, show it, and start the event loop. - app = wx.App() - frm = WireFrame(None, title='WireGUIde') - frm.Show() - app.MainLoop() diff --git a/build/scripts-3.8/wireguide b/build/scripts-3.8/wireguide deleted file mode 100755 index b3c44b0..0000000 --- a/build/scripts-3.8/wireguide +++ /dev/null @@ -1,392 +0,0 @@ -#!python -""" -This is a program that can manage Wireguard Configuration graphically -""" -import configparser -import os -import re -import sys -import uuid -from socket import AF_INET - -import gi -import wx -import wx.adv - -gi.require_version("NM", "1.0") -from gi.repository import NM # pylint: disable=wrong-import-position - - -class WireFrame(wx.Frame): # pylint: disable=too-many-ancestors,too-many-instance-attributes - """ - The WireGUIde wx.Frame - """ - def __init__(self, *args, **kw): - super().__init__(*args, **kw) - - self.version = 0.1 - - # Get active conns from NetworkManager - self.client = NM.Client.new(None) - self.conns = self.get_wg_conns() - self.active_conns = self.get_wg_aconns() - - # Set up for loaded configs - self.inactive_conns = get_inactive_conns() - - # create a panel in the frame - self.pnl = wx.Panel(self) - - # and create a sizer to manage the layout of child widgets - self.sizer = wx.BoxSizer(wx.VERTICAL) - self.write_to_sizer() - self.pnl.SetSizer(self.sizer) - - # create a menu bar - self.make_menu_bar() - - # and a status bar - self.statusbar = self.CreateStatusBar(style=wx.BORDER_NONE) - self.set_status() - - self.timer = wx.Timer(self) - self.count = 0 - - self.Bind(wx.EVT_TIMER, self.do_on_timer) - self.Bind(wx.EVT_PAINT, self.timing) - self.Show() - - def about_clicked(self, event): # pylint: disable=unused-argument - """Display an About Dialog""" - about = "WireGUIde is a GUI for WireGuard." - lic_text = """ - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see .""" - #wx.MessageBox(about, "About WireGUIde" ,wx.OK | wx.ICON_INFORMATION) - info = wx.adv.AboutDialogInfo() - info.SetIcon(wx.Icon('logo.png', wx.BITMAP_TYPE_PNG)) - info.SetName('WireGUIde') - info.SetVersion(str(self.version)) - info.SetDescription(about) - info.SetCopyright('(C) 2020 Mikael Nordin') - info.SetWebSite('https://github.com/mickenordin') - info.SetLicence(lic_text) - info.AddDeveloper('Mikael Nordin') - info.AddDocWriter('Mikael Nordin') - info.AddArtist('Mikael Nordin') - - wx.adv.AboutBox(info) - - def activate_button_clicked(self, event, conn): # pylint: disable=unused-argument - """ - This activates an imported config - """ - print(conn.get_id()) - self.client.add_connection_async(conn, False, None, self.add_callback, - None) - self.remove_inactive(conn) - - def add_callback(self, client, result, data): # pylint: disable=unused-argument - """ - This is here to let us know if the connection was successful or not - """ - try: - client.add_connection_finish(result) - print( - "The connection profile has been successfully added to NetworkManager." - ) - except Exception as exception: # pylint: disable=broad-except - sys.stderr.write("Error: %s\n" % exception) - self.active_conns = self.get_wg_aconns() - self.conns = self.get_wg_conns() - self.write_to_sizer() - - def create_conn_from_file(self, pathname): - """ - Read a WireGuardUI config file and convert it in to - an object that can be user by NetworkManager - """ - filename = os.path.basename(pathname) - try: - config = configparser.ConfigParser() - config.read(pathname) - iname = self.get_next_int_name() - profile = NM.SimpleConnection.new() - s_con = NM.SettingConnection.new() - s_con.set_property(NM.SETTING_CONNECTION_ID, iname) - s_con.set_property(NM.SETTING_CONNECTION_INTERFACE_NAME, iname) - s_con.set_property(NM.SETTING_CONNECTION_UUID, str(uuid.uuid4())) - s_con.set_property(NM.SETTING_CONNECTION_TYPE, - NM.SETTING_WIREGUARD_SETTING_NAME) - - s_wireguard = NM.SettingWireGuard.new() - s_wireguard.set_property(NM.SETTING_WIREGUARD_PRIVATE_KEY, - config['Interface']['PrivateKey']) - s_peer = NM.WireGuardPeer.new() - s_peer.set_endpoint(config['Peer']['Endpoint'], False) - s_peer.set_public_key(config['Peer']['PublicKey'], False) - s_peer.append_allowed_ip(config['Peer']['AllowedIPs'], False) - s_wireguard.append_peer(s_peer) - - s_ip4 = NM.SettingIP4Config.new() - s_ip4_address = NM.IPAddress(AF_INET, - config['Interface']['Address'], - int(32)) - s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, "manual") - s_ip4.add_address(s_ip4_address) - s_ip4.add_dns(config['Interface']['DNS']) - - profile.add_setting(s_con) - profile.add_setting(s_ip4) - profile.add_setting(s_wireguard) - return profile - - except IOError: - wx.LogError("Cannot open file '%s'." % filename) - return None - - def deactivate_button_clicked(self, event, conn): # pylint: disable=unused-argument - """ - This deactivates an active config - """ - print(conn.get_id()) - self.client.deactivate_connection_async(conn, None, self.de_callback, - conn) - conn.get_connection().delete_async(None, None, None) - - def de_callback(self, client, result, data): # pylint: disable=unused-argument - """ - This is here to let us know if the deactivation was successful or not - """ - try: - client.deactivate_connection_finish(result) - print( - "The connection profile has been successfully removed from NetworkManager." - ) - except Exception as exception: # pylint: disable=broad-except - sys.stderr.write("Error: %s\n" % exception) - self.active_conns = self.get_wg_aconns() - self.conns = self.get_wg_conns() - self.write_to_sizer() - - def do_on_timer(self, event): # pylint: disable=unused-argument - """ - Do stuff to redraw the window when the timer times out - Ths is because connections might change outside of WireGUIde - """ - self.count += 1 - if self.count == 5: - self.client.reload_connections_async() - self.active_conns = self.get_wg_aconns() - self.conns = self.get_wg_conns() - self.set_status() - self.write_to_sizer() - self.count = 0 - - def exit_clicked(self, event): # pylint: disable=unused-argument - """ - Close the frame, terminating the application. - """ - self.Close(True) - - def file_chooser_clicked(self, event): # pylint: disable=unused-argument - """ - This is what happens when you click on the file chooser - """ - with wx.FileDialog(self, - "Open WireGuard config file", - wildcard="WireGuard files (*.conf)|*.conf", - style=wx.FD_OPEN - | wx.FD_FILE_MUST_EXIST) as file_dialog: - - if file_dialog.ShowModal() == wx.ID_CANCEL: - return # the user changed their mind - - # Proceed loading the file chosen by the user - pathname = file_dialog.GetPath() - new_conn = self.create_conn_from_file(pathname) - self.inactive_conns.append(new_conn) - self.write_to_sizer() - - def get_next_int_name(self): - """ - Determins what we should call the next interface - """ - temp = [] - for conn in self.conns: - temp.append(re.findall(r'\d+', conn.get_interface_name())) - for conn in self.inactive_conns: - temp.append(re.findall(r'\d+', conn.get_interface_name())) - numbers = [int(item) for sublist in temp for item in sublist] - if not numbers: - num = 0 - else: - numbers.sort(reverse=True) - num = numbers[0] + 1 - return "wg" + str(num) - - def get_wg_aconns(self): - """ - Reads all active wireguard connections from NetworkManager - and returns them as objects in an array - """ - mconns = [] - wgconns = self.client.get_active_connections() - for conn in wgconns: - if conn.get_connection_type() == NM.SETTING_WIREGUARD_SETTING_NAME: - mconns.append(conn) - return mconns - - def get_wg_conns(self): - """ - Reads all current wireguard connections from NetworkManager - and returns them as objects in an array - """ - mconns = [] - wgconns = self.client.get_connections() - for conn in wgconns: - if conn.get_connection_type() == NM.SETTING_WIREGUARD_SETTING_NAME: - mconns.append(conn) - return mconns - - def make_menu_bar(self): - """ - A menu bar is composed of menus, which are composed of menu items. - This method builds a set of menus and binds handlers to be called - when the menu item is selected. - """ - - file_menu = wx.Menu() - file_chooser_item = file_menu.Append(-1, "&Open...\tCtrl-O", - "Select WireGuard config file") - file_menu.AppendSeparator() - exit_item = file_menu.Append(wx.ID_EXIT) - - help_menu = wx.Menu() - about_item = help_menu.Append(wx.ID_ABOUT) - - menu_bar = wx.MenuBar() - menu_bar.Append(file_menu, "&File") - menu_bar.Append(help_menu, "&Help") - - self.SetMenuBar(menu_bar) - - self.Bind(wx.EVT_MENU, self.file_chooser_clicked, file_chooser_item) - self.Bind(wx.EVT_MENU, self.exit_clicked, exit_item) - self.Bind(wx.EVT_MENU, self.about_clicked, about_item) - - def remove_inactive(self, conn): - """ - Remove the inactive connection from the array - """ - for i in range(len(self.inactive_conns)): - if self.inactive_conns[i].get_id() == conn.get_id(): - self.inactive_conns.pop(i) - - def set_status(self): - """ - Update the status bar - """ - status = str(len(self.active_conns)) + " active connection(s)" - self.statusbar.SetStatusText(status) - - def timing(self, event): # pylint: disable=unused-argument - """ - Start a timer - """ - self.timer.Start(20) - - def write_to_sizer(self): - """ - We use the BoxSizer to hold our configs - This method redraws the sizer - """ - self.sizer.Clear(delete_windows=True) - if len(self.active_conns) > 0: - hd1 = wx.StaticText(self.pnl) - hd1.SetLabelMarkup("Active connections") - self.sizer.Add(hd1, 0, wx.ALIGN_CENTER) - for conn in self.active_conns: - statstr = wx.StaticText(self.pnl) - info = get_info_as_text(conn) - statstr.SetLabelMarkup(info) - self.sizer.Add(statstr, - wx.SizerFlags().Border(wx.TOP | wx.LEFT, 25)) - dbtn = wx.Button(self.pnl, -1, "Deactivate") - self.sizer.Add(dbtn, 0, wx.ALIGN_CENTER) - self.Bind(wx.EVT_BUTTON, - lambda event, mconn=conn: self. - deactivate_button_clicked(event, mconn), - dbtn) - if len(self.inactive_conns) > 0: - hd2 = wx.StaticText(self.pnl) - hd2.SetLabelMarkup("Imported configs") - self.sizer.Add(hd2, 0, wx.ALIGN_CENTER) - if self.inactive_conns: - for conn in self.inactive_conns: - statstr = wx.StaticText(self.pnl) - info = get_info_as_text(conn) - statstr.SetLabelMarkup(info) - self.sizer.Add( - statstr, - wx.SizerFlags().Border(wx.TOP | wx.LEFT, 25)) - btn = wx.Button(self.pnl, -1, "Activate") - self.sizer.Add(btn, 0, wx.ALIGN_CENTER) - self.Bind(wx.EVT_BUTTON, - lambda event, mconn=conn: self. - activate_button_clicked(event, mconn), - btn) - if (len(self.active_conns) == 0) and (len(self.inactive_conns) == 0): - hd0 = wx.StaticText(self.pnl) - hd0.SetLabelMarkup("No configs available") - missingstr = wx.StaticText(self.pnl) - missingstr.SetLabelMarkup( - "Please choose a config file from the file menu (CTRL+O).") - self.sizer.Add(hd0, 0, wx.ALIGN_CENTER) - self.sizer.Add(missingstr, 0, wx.ALIGN_LEFT) - self.sizer.Layout() - - -def get_inactive_conns(): - """ - TODO: Not implemented yet - """ - minactive_conns = [] - #return empty array for now, we cant read configs from stash yet - return minactive_conns - - -def get_info_as_text(aconn): - """ - Returns info about a connection as text - """ - try: - conn = aconn.get_connection() - except Exception: # pylint: disable=broad-except - conn = aconn - mid = conn.get_id() - miname = conn.get_interface_name() - muuid = conn.get_uuid() - info = "id: " + mid + '\n' - info += "interface name: " + miname + '\n' - info += "uuid: " + muuid + '\n' - return info - - -if __name__ == '__main__': - # When this module is run (not imported) then create the app, the - # frame, show it, and start the event loop. - app = wx.App() - frm = WireFrame(None, title='WireGUIde') - frm.Show() - app.MainLoop() diff --git a/dist/wireguide-0.0.1-py3-none-any.whl b/dist/wireguide-0.0.1-py3-none-any.whl deleted file mode 100644 index cfb132a3e030d6584fa52bfb50addd4178ededdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30444 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 diff --git a/dist/wireguide-0.0.1.tar.gz b/dist/wireguide-0.0.1.tar.gz deleted file mode 100644 index 404b7c7603ff56cb1df5ab9a857fadc71a6f0758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15028 zcma)@Q*b3rw6y$;3|f#7-u*ZQIGjwrzW2+qP}*{eN{X{&Rb(-pj7;s;=s_ z*1LK=q|tD2^|O8Y5FisvXBQTCOD9uvS4$I9CRS!vW;SLQLnp9nUsz$4$pzL3=%Sz> z>WXn9ROoOa%m{jv1+*b{Vli~E5yctVidc$ERRK{(uST%gSLLgE^+r-xQMgK~S4J%P zUtKh0&_Q0i&mX?KpvGI>U+YbLU3`2Td>mbT;YLyopG@f~XW@I&cfR~4*C4Fyi zDVk-DsWRo9Y~rVQ@gDtn6Xh5x@M+MM2#^$jViy5+2(O4*8Ql||B=8k3>gwR?;^<0s zcD?|5r3<7HF*f06wz5`eC{w%!G6CIPUBmnR2XQ8qSbCFn|i+B-I_ipC3~fL$y!diw=}-mJWJjC%=O5 z5Y-~@SD+NO9j?X$qsJK>Qg-L-!Xv?9FjnCq56lS|jT8$dhfkwvR%tn+8Z?r?aHovN z9Tk0tgY>T(YmtCvB-tfKzdP^~d#|UTQ-%lUN1;y+`bmx_hA%RR4@E$KEbU>0bX#B2 z9gYqJ`&lSGK@>tGp(z~`LiP99QPW49T7n8rA)+AB0ta?js)#7h3JD$_9?LUawokxcL0d1g^AD$gD9UG+YG<5pJy1J2@MD!4Mqy04+HnhFEV1MUgry zZezR{EHqhD_8(1EFhCkf9zqkn@&^@V)IAYVh@{r;j~AZgU^1YnEO}y7KZQb%5mFpE z_@xj|w37r8T_{bXSg4y1PS|fYE}jWk(g0kxXw1>5eRyLqhz{DUQ4IPsPqQZy0+v)d;R>8@GU*5I1FPmp8_NtAZB=b!$4fsayyF zp)Mw?!Pagt%Mr+l&voQqoHh|*jlhypBCafQC`eu~N?Jt#t-YWO{jtQO;*YZ+D)Juz zP!MCk!5PWW=mSExM0&I7`;&?!Jww}rS%L<>&{-NZ$)lt??zrQ-BUtFgsR9~G3@ ziWrG+BfzKw7@0(*d;7uf|E`!I*Si?XVmO_09pk_N@UCOT6bH&auE>SJ(YjaW%rjUhSRirGfv~ zr`u>{f;mR zp^_*xKGrVwNkA)yt3)QwrxPDN@WaN)5LN^)-ixE`{u>WXiL3;07ANHA*7NK97aWn4 zPo5NN|L%>(g#uyGZG12a&L2TA3XVm!^l>cmbwUR%0X_Unx^!S1(v>t-s$D#6!-BY4 zY7psqI30m7FOn*<{~y=S4lLwJN&`3{FMd%asd+#}I6-QWr>LFpZ3$&#cYZg8a-1~w z%yNLlIHF^+ws(HM(`MouBwq(yfh5CGIz{wz#m_Xw9h)Po;3J;;DY1 zjkd-H?g&(RtZ)kYpIai$0czBNDpn%%CPDtUz`SV4Wi@xuf06U@2*lC~BHqf*c6sTO z2SUEjnmmN?$BciS&IH_kfCwl2VZEg)qi2Atx2F^$z9(y zsHAg)kFy(eeQ{992YQuJmSi1lBQ793dUFH%H7g4AnBnYsmKe(1-MV$=mgMFFZ~5(S z4gBrx#Tn5h9^cAyN$B{fHV1Fl>~Uz)6Z~t>*NlXF3AuM8uCe|2O^ok22QCa7G~%}U zOu9FAy?1)Niv@BRt)y(6b`M{k01`rjbOPv-I21`3UUhamdl|YhO;&n6v~@o7Jx11L zC5LX)3%h9B&n`v*`cw6m*ef?B&R$c0u*dXHEpyg+*{m;z;z(&+{8$^iFRCP#;;pyF zMaB?T1XIUXP(*^1Zq(>ruWG*G>OT4=UN5%zo`JpQb<n8x+{^+OfH+k~Lvm@@eq*{Cen3oefbM%c7H%f6(a z?i8;%ZB3_HR>o~hSMw;|x>52Te796 zrCt^Ea`y1P^{K(G&cgnx8TO+nG2m(o0iDy-5@VsVYa0RspVVJBU2GM&7>sSxAsai5 zp3u|Vq``>8?Lko1E+}}PwU|~=dI4-Ko%z;CBC)l|jm+ue7wp&o^IU@SC+cE2& z%&o7ULX#_uAUWo+mwCRY$xKsb)(Gxj1iaTCGf>7Tenqm{;YfYr@Y#f&@%k3+g5A7Q?WkUy!q#`mtOYe zX)o!LWml;0@tEbjV9*|h$j{i|!CmF$GhK$zB6pON_zZ%ODmYcg{Jz4i zdkKqJ1iY9D7`nMhf7YHTam1aJ`r)Ovna-kl<%+~C!cgo)Tx#g2GTQcj{2rh58EPJm zagi~LzIuA1+tC?s6tM2L6x1!T6V!Ox)@f5u75Z#q3~c4VMLK*vk7*c9lLMkj@F{co35S*YAv;-1&DFJNj%fg$powL z%{X-hJ8^`<>-eDRc|X{B-{xa!h9eH^Xh@!p{wP}%lpzhVaQc;KyyTkNUE4&%izmMw zzYVYINHJBDrMkd=K9gjvK1&~2VEeba)UBM3Z=Gs7Tj+-y%(Y2?$I3`NgG`XTmy0g0 zdS)uP(h8$Ei$KoN&ly*}vb3^r(?3gBjN=wKre+Dxqmcx5_>7`iBDuGXX0Jqw2#1~S zP)}f`5yG%Jow$646O#wsQ*K;*LR&HS&^=cU6Vp0N#5e+W$}3ynG5#y*R4?Bvs*Lv> znrXHOqkfg1cDPOIVv+hr@-Mce51WTB1nzQ=2i?q&J}kV=^7~nSz@yYZS86{WJZGwR z89J+NUG2i+j>9I1llHy{p04ja6h`HbZNajO`m|m=?d=k6dA*ntEC9U$E4{S*yaQ8( z+E0`CG*s_Rq7*`;2Fczoc5KF-sK_(sX1Kd}2cI+4Oi}jDZ0SAuTC8K;m#1=FpL6#O zQe|jtmMiy>sW%iFFA#&?Si(h)r(7(0rU|w~`C8d|@MkG2lc~~UUdN4vgcn^20**T7 zycRL0%3fYu#L`TEsVBK}FLd95O!MnD0bOwbjZ;VBTf5D)+t=f_FBj<>+|{e|i4VJfEE{D1Mn{k zQ{6Gv?N-plOs{J|4l|A!UMMvpw5@Cu&&BLCnpFJKN z5;K;47=-3haE86z@UGUKZcAL}lON@eReYkZ#YzcM=Rbf6J(SG`R+g{i_T0hd(4^Kx zBvD{lkPDAlO@O+l=hY>7?-|KMsOJ|8j)t?R97D?yYX440$nv%kNwdVQcC$!Zp)j?0 z(cBg?LHyl^A~DyD&mi1)d%IhYN0aGMJHQn9By0vty>-Uzmb)9yvCaI%3%ZM0{`69C z*f^75RFvCeB=wUiMEL3~(g+?&esOpFk?P+H2Sx&BVr@k>_vgPSurT=M=I)`uRNMKSB+I2$@|tapSR37CqfmWLU9ShbyYPE-;N_0=b*5SgKqyph zJ8}1X$OwpcZ&50Su98`*nD4!CG*9e?}BJ3H|>){)p!E2Dg z$(?TheNJ?dmYoVR==OBgT)2j2fo+k$xodEL`7s_u-x9+yaJ`$ z*F&hJPb>9~zxnIb`u1;ylI@quF-`$xX%0-(;#RxS+!4o(MaG8BR)C5SqkY21sTN(6 z?)6YqZJ>5hX4+yda%}@MPqMQ!a3vTg@?_ajf&(Vq)n4PiotC}ESxt1^=kVdEj&6oY z-s$hIA6m*27wuY8NVl2a(9!xYY`aOFm$l-0_Ag$E2n98vXg7bJER( zr}AFY(l~-VTkUII&U2kAZ@z)xR>4IE?rL9Sv!=e?(BM?(zu42+-R)YstK#VWUY>d% zjH9d@DYO12e)aR*Gnmz~_V|fR9|sNQw+)e@GCB6kF<0yU=W`TGeD0t2Y|_sbZ0(l; z%_%j?=8RhIj~9^Z8lM+qh52*XMV}t*ktwekWCmTZl2$8JI1 zZFRRl&&5H`eXI=%FWK?0-)$HEwlp_MO|Ei5u+JgQnv4K>uAFJ!pO)Uc zIJa;FYoiO&R#^`}>Mg!&Hh4wmCw09i%bq%@9j{*C4H-EZZ>#keE~*+HQw7vfBwxci zp$N7Npj=G<`t%%3JC4V`gZr@n&+O5EMX**LuYxZJJEitCRsfeOmJ7_rJIqU{KDq|2 z`$ANGq_YDst=?N?bG5LJ6FO3+luarxa zJl3}D;&E7AmW4|6)-6so(rm49=k^30`CA0+{RFLyb8S&z6!A~A8VXiPHcRW=pBAkW zsKng0Ij zUWc9hxzp$QpM}aYoNhbv{pFF6zD_sT{5;hPef(JJke%o=rCqY}+)^(2X)>D+dGGF_ z=G4EKPW+c8g!+XmL4X;h-IPb5a3Jf%bHQUQbTF*N?W*N8SMuWwwk9_>A#0tPugm*j zvPsGgriHr$=e#}8>k7yC@>uR^nSWgDqxm;sgLhTO<)URC(=>9Em5x`3so#yG(Zo@^ z%>1!m&!fI3dbB@Cn!LS^N8d;+J%`fay(f5defdOn5RufAwZk7r5RrarL zu`D-ZpIqeJHEqS~<~PHJM-s*wi?O*JqKlO-oq=qOr1(*;I8@y!uJOWJZM_7Z)?k3T z!cLYp)0)33Omk%wp?-q0YPR1OhWQg|3&0TnJ@0R5pC)tb`b3t8+eKh3((2u_F~w{) zy-ixVzQ9xaBI0TCD?U0|+uC>UP%Ar+z}tvL-HyiPo3WnY8rB=aCAZP`B{;4T&K78T z)Lg>NDrJ&jZ~||z|( zqc6X5-DelG1#kEibN}Q%j!%6Jr8pn+F`RZI4t8!`9~d@&#}5|0>uL*S`aQ1OXC-;J zb$?i{CeI8ftO?(Ck4_22^sK5NqaJM=yI@s7W zrvE@3SqiOY``miY9IVVHu9C^_8a0Ve+tH!qsv?~83v(8pI;k+zea+>y6h(S}02{l* z^mTUA8&KaGV(tYDFlKRV(757R34T-rtQ1-)D{%#S6nsNAIgONx<(0~g3z&FXRObKZ zRf;FR-Q7EU-dM?ju2x(i_0w6*|DIj-Pdr>3&F-IN3yoh#d4a_4lGo`M=E%*hzV)UO+IHFpX%4rEXC7d>8Pc0(+$P;Bs``HfLk?6p28E9cgu(1g z3O%nTA}Z80$+vRys8AyVIo+mK=sM=*&u83c+H(8QAG`g&x6HsB)EcVbGj#Alp8sM9 zPrEmxJXga6;)~5CuKutlGG+EPrdhtPqx<4c%TITs-*v)vZT5aq!2;K){v6@@d+fxX zazSh~Z$CaNm>ax?zW|7>v!^|;<&k19&e#%d`ATrcchqTSvfYeMHzrLEa6rv%@>et! zgn!-q?A9wrua8$JcX&EOTOQo%D+=Wq$Y!%Prro4tUH@*nYHy;#fAjTfU*JEhZd`;V z+|T&AQoD(e$8c1!&ROX$;qy|V#XMwT_?5}a`JMW%5mG+lct?Q5f@&$k8x&wu4q~Yz?@B0&>H!rT7Ed^^m zMR0mnLv7cSHQ8IrYj10_;|69r^87~y(>V3_y-A%37P{Z?Y;BhzMdhMyqtcOsUm2SS z7S03irC#t7Qu;F@&-Gv2f1m0_Hrwf4HG%5hc3<uos^bUrQq4){5V&jX?FG)JGI8Kb z(*Pp_MWS(6ov3~^7p>_pY`mP^X_Ha!!%`dQ)84ILyw@W|s|pP>uqwDmeKoFvi|dsC zj$U)!Iz-Z{e71bd1b3U+AKZlBBh{FqOtWIXHJW8}I!#uU|6VVB+hu^W-1wqF*$Lcw z)t8J@MQg_lJR*s_-9)nFfXX!;Os{Gpk`{ZS%@Q@d{_-TftUdtqZr7R%rgN`zjLq2C ziVXTyE=^mm*itY#Zl)*bcw7zcN|zwrv`Ky3JjW*=I~oqYX%OSW56y|I$Mn5S6h;)S z_q%ThCnG4rvbwcA{MI|Foer6TCgF3~VN_xf!zE5`w%^J5PiLl_<4AY#<*Cg*T6IA@ zzPmu(ZMR2+mv2vxM~RCVq;Lez!aiN^Cj(;VnWbYI?NoWQEG+C!owdB4s*|BJUp8WB zCXK#kuWkE*>AI@#M*dWJftK%c1O}Crp$CNiQk>xz8u^*$Exb^@tv-JPwv%68j|(zW z%SkVnuXtHbO+F|0GX6{^@0!nYi03ZP(ORz)@-v$P^z zTY{3f2AZ#?4rU`KVUa9vy7<6aI$tgjxa)*MJ)Y(P8y;c&#o4eBym(nOPpn(i8Xp7E8D-^z5^*x9MkM2V`eydWvNZJdx-e_J|#CfNQcd> zPjr5t>v1H0^9$OIlqDshO5Mosx6u1|y^3iX4wPCqQGGouwuN-~zNCA4?dJSTMaIXs zT;1_WHutREyDOv;jcP7*{s_5o#@Y2C!Cj#`cwe2>gnl#x$=j#So0i;%>t5P4n)xM~ zmHPWi0-Gb{Jcfig0Skp5k>y#s0zwAZI~_Eo4O!t)%Q)zXnJi8q8V>2LZ#-8&rh~I_j>X;tacY% zca&dmMt-kP>p5A=&zZVd_u~|J#IC5%{k{2EtX1K!`+SaK(otN813=A3Bh9IDBnlVnVI5K zV>_(`=xD2fsBE8(+vkhYcQzaITJIHer3aBJH@!M_&(^nePD~Vv~g2#eH6ms$_ttE$>Y#O zr*h{}IJSuB1gmP(NI0^eZ6<5fQsB+`(uf`4k!T$fk>Df@auM2>w1A(MTMsy zwvl!Mq=i?$s2_UTjP;vMCJx7jBbRH*RKKpbyO`{H==rK%Wcdn1@3pxpNBbCEA1*Da z(mn}M+JW`jY9oiRDokBl)A~B|ro?JzO8o9G(e*)WQ++XUG5St}j?2os+;KWI_#}91 z&Ppz&d5-A?(#Y~KGbZ3E{p`)ttM4Tjnl{m&i6{xJ?QOwa#C6-{w>ViQ`CQD~zV1DL z512D2L$OVK&5grP=i?KK1Z^fyOcbWT6ymz~ynHZ~e>AdoOb+=v(|;mwxi&LUxCFYB zwbZ-3IBj$xZa&7nW3JY9%$WVQv_Ev0tsojsZRk|j&E$;7iPvTaI$90=6&waPukZ&z z0Grpg5_WzK-V&FIop!x{TrU2Gdc9cbxp%>l+dXD8sDI8m(Wm(ECGj!H*H^H2+iS$p zx0MT{Ov*!HlJ?MDZIZA;vGjk>f~K;&DamR$e?)&h*Fa?xHPhBPIUYjgQ{>8hJD+=w ztnKBrF@8LFZ@#93{2Sx$cULAr_ON&WEQ1L_^RAu*2nJ^0Do^g*yfsta#3n00M5Si9 zpS@pCW9urj@9O^P9Y3nyCR$+tZ+O-&-N_&Bz|YG?mMSY_p31w+P(yzzU1b-lqA8o$ zVUeXU(Tc-+%D>Wq-B{2t&dn>g{Z+CMWc6t!E`OEbAbO)uT!nJEooioDG4+#jnbdv6VDum65lDt;RghZ&E*bD&pGzS*9YxU39q$sy{{5 z?Dg?I6UF& zTdZkQBHp*jUQb*ET+T6tJ66MFx^^Y2?@Ri(?KNLH9_0I$$=G>h zEZ=Cq_4?ypk{_;8*vRtQeKmWVjV?SLBUV2g^o-hTRqLCluQ8dNpJHvCpZ9rhvstrI z5O?V}cw9{;)_Vx`eo*jBj?!)1!HXpjbhyS)2o1ja1q4$jml5kvS{JMM$Z}|wR zK6olJuJi~dQH-@GT;^5vZde7ndZlK?T8}h`Z}ZB;W$oaxdLH8^uBu&4Efu@%!&d%n z<0s(D?`$07(hay0!`=4quTxN>RPNc783MPMSrccVO@AJ8h)5DQ&K}EVFnf7o~H$qFy;6IQWrqhvR zZ^f4Ua|rI*4ucSi$8-l4IXpUrMPlP+$!w*!Kf)Wwy|MjI*Ba?S&gfxu=POc_x^SDaR15@#A-4YEqF<-vO=RT zfP1obwfv&hM>YGF6z}eanPWV3t-Bt%eIGPe@^#+6YcDRimG08JsG*WnB5!F;Ei~id z+`Svr-n>oxVsGBu#n3V-hLKd}ch=7KRfX8YDXsd=6-n$o$^SjCHGYh7FxmZ-G^>8C z>1W`9$K7!)B@b;nc!08E$C;VoTf4ocYy2tjTAjWGbkd%uTbOT4g6*+P&EfD1evJX- zAZiHJUwe`7Chy$*@!5C`<*;OsXJNUBl$2D%P0uvJ-C^0V?*{Pnx^oUM?3Lt};pR23 z_LQ?1lSlmwYX!PB{UI}a_~T36RKK@>(9EZ^S+Yj|GAzg@UMOZw6Yg6Fv6gomOG!u| z;Pa=|{4^{*{`FHRLAq;Xv*hN(r=rn9cq2O+Fl&x&(Bf(qsboAcpyB7q$LwqwUW=Yb z#2{V}VcRv4dVYQmUTT`Av8%-?z2q|)-$nM-KG^)3l%|!5!b`No*DyMV4|}S%{nRJ) zw7xd|O@dxEsw!?&>r&Y^y^r;MVRr>oFr_0!)q>rrXe|9s5jgGdI^GUD7HxJAOKXHS z(c51byFb-INu{Xk(r4YqYYysSG9P~I9b7@lPVl>M3z)tNp0p#<^Dg>RA4k%g)UaiV z)v!6CcPXlOB%i*7?_ly#VOg{4Q}FDE*JHL;;XcZut3c*GB2=xFZ0M0VI^&TmbF&)E zW77g{?re2`X*jNXPY}l(+l$vmtLsr)>F|-W_${$gK13%nil=OTVHQ}C$#JaN<;%kR!d{r^bwO$&N090-^xpOGkBMi(EyciMU*+@em%0e}m9(JgK7HQkI+@ zVn5c5emGY;HFy*;QbL)8I+1d@Z2(RjO(pu)19=lbBIHMfqEsB9qLV&1;BHMUBMnDYK*Ew#Qu)0J?>cmiahKBO63@Z<2R ze1!^X)!ce;9XMqU6-;JWAvM^JFe>r)|3<7v@1oUb;xQUE$6)vVT|o~9y-`|%8NqkZ z8z}EUsX`1w(`%v*95p41vm;3&9}NxE3&8U;pXmexCm9Z|k#MNO`t{@4!{@~Yzk7Nh z2=-V-1_l+Wsf`Yn35@Wb(jn%kVGDz5ecvEdX~ov6VIEP6MA-Kks68aCIQ3W+V?xJ^ zV;LqMMclrZCKOo0_Sb{K8R=4?GBA-iXp<#TP1%F+o?yPyf+~^*$+#$O%OUCJuuw>` z7v}>oOnJsPxXby{X^up*7s5k12EQTC3w}QM)JD)@use<&m0Cl2zjF-OCim=BjG~Nk z{5PZq|NI?lGi?;CWex!Y0g+I(XUj?A5bq{JfjLo3yNct`f|UEAs+&%OVaZ>Chlc)- z{{T9WoRj~|s0XQEjA`$k1g=5EVeW$mVPXscOO1GrgBr;dtcs2br(CTs<}TkySn0B??KYt2=;#v zwu3~LjC)S4L}=9qklyH}XV3?brD@SD24H#ocY4aC84!-u_Tu34FzDmsNl-ZAbDr?z z1BU|fB5_Gr`$$->bWk;Lim^%BEaXNKMykC-K_b+5Z$2Th13!x9*?akoz-eQVUQu5W zqu`{v@hB4Z^$H5~V(tY@*F9a(8IEA9>z(glhWVWD9 zL^2KTb4Lq??~B7EIK#dn9a3zdk13!|BNaZ+-xEICIzrWp=bRKFyFg7vp@q2XQ-4ll zsb>Ic*Q$y~-*F4z@sW+34@ULEl^0hJxqf5sAP+KgQLxX?UU2v4jQ26^s@>5u?DPKG?G<=oi7MMtMBK}y!Fu^1qVqBje3 zZ+Ks@7fg_8)G~kwNtHK!FjN82;KOY>e@|I14AorW)q-HJL|kWuOczggTZfEBt&C6l z6?*RlBvbDP1x`s7Bo2pn7GOnUMq!}k>hM?8Lxfafl}{7px5@s+OC6^^tm8I(QJA+`KbY;&~~me*HSSh9G$u33pB;Jqpyg) z$DqpxavpM>9|806%h-A*NeO#1Is!djLSQOfp2Kfym?Bv}%b4HW2XQn6;q z={~=a3zOZK#0G`S#^gQ>zF;G(OM>`UG>qSzBI$4cICSKf`9(m0dqjq0ui}`E{s1l7Y-oBPWuoI z+E}eTNU7phvbVz#I(-+WKgwqTLemD<5Zk2)nX4Myeaau4Tv1e?fO4@2w{ zO_nUEz)cDwGos8TxCov1Ved~ST1K|7GcZiX=t8LE$)iX@@Q1{{2h`M`@Bl7C1P3%u zz>a9q`AK9BC-sKV8i1Ly*$6S&EGQI~(Ms8q31qEY-rREEYmO^3Te82C7jUTGGYBHR--)g^GE2(s*)jPOB4T&{B!>C05Fg`S>+mHy)w=^)b8{*;K%Uw_(PJm1<<96M?Tmrux7 z>5h=GoVZXggq&RH^DN2pRmKa8$N~Y1wIL}1m^g|5FrC12sD|jj%$?j>zcix2wDn`9 z9SKZ}h;Y8X;;a@*BEUMO(Bv6q@PY?;l}T{@9;7E<&6oL#Pc&O!gv;sE#GAur*C8EO zC=Fdb$wl^I!U&LMu(xFGbdGPQ4t6sE*YYot_E}p7788>w<6v?}-$dbU59?VhiT*u+ zUN+<4uEfCJzoT)X>x^p2TE7=D!-L8CS^KTT5k2$9Be4TD67x1Mz0fnjriV0jjFToT zaoqCGwK|0GyIoYbWqCo zMO4+oT8iN+NQ-MNoEpDw+xltSJbWys@(p+owM`w}nP^WBNrlZ}Btt?u&MCeI2ad_A z_mRehSdVKf^zRFo^$)aJ0?C=970AU%LT>&LEN({c%b_~hFSU#6gF7SAfN}30F9aZR zcwqb>3(=WAVcb8}|3ym+{;NIr<>C}Y^KK4Y5mnBaPC0#>^`iApxUUi;Ubp2x4Pk-N z_mUnmx4B8eHf!n>4Tz08cShXQ&5WONHtk9V9y0{o@e@D^5Qt9@-{n2UtS@%}nIFNd7&rMEVV=AFr zx~SrvkYg|bKzTqtlz(*U={ zVE=}JOQRfBT1qb5poxy#-$w^Miv%|PA8U{&@Dt7H-yUR~4{ck3{EVdI{9h-vCgr+B zhOEFG$Re;c@s7;Sj4&}G(ncStpJ@CQ3fY}OVPa2;%lRJTO4c$hA`!j?17Zb=lEypf zA@+pgUs=>VY)H4}nDm$(j{ev+;RQyiA)%2=*d{vgc9m^T(@+*X`&KALn#nA71c(pD zln4P6g_&SIFt8HkV%25j*#G(&p9NR?>cR`JXogDSPSOce)!e{SpCN@JkY~?A3N(F_ zo>Rtmd7?0-&BbZ6X*X1zvPN8lfn)|3D-p3)fBdQ&NA`&cTL6mMy9763^xaJDGF9-F z2n=JWesIe(`*dIE?P$ZXnbgN*wdlek)PV>Lk#PusKb$!19SH%8%Jhl2B`yIXbY=VK z){OJbbm>M3=|d`m5t(xD$nV%>BYm2%QkBP88DaO-{?~yFxD)+WDA?sB;>GCf0A==u z$Y9I2d7dvR9>w2)2cH&^F;w?&A{n%1iv9rU;cqOt&9XOZ1ikblgSwS8n2&evcwV9! z&>WkxzaJXHg(mvkzfJh%aA!S$p0soTci;F?Nd$=5iVh;R+!hyp~02r(m)_LneUx zV9w%^lT3oIFxvP$yZMQ_%6s|?KX=0rf$$Wcw`#n62_=|lN}YG5rMrBCjusN(SNJv& zqU`Zl!sAA^f&(;$n`aG_ZJ2&stL4?y$lYtUkmql@1^O{qsgQ73wq7oEL79IijTdcX z4r)`7z(Z!(m)K0XTbpu73jZoc9`@_(1>wKehuGnyC)lvI-3N7^Nax`^!~36$`M!~s zQ{?`WE5O`BZ;skQ)EvL8`|eCLJ|@U_!MYepW|GxN`3aGi5Ju||(tw4j_R&}u&_=R4~5}NmnB&3zZf8NyoCH)Q@ zc{n60temS~9`QEoH>gNk=_9H|lb=8j&T+N74pSV_NeYkr>jQ%{^bavwGJv*J>G#}OW#qsw z!wS|br9eEHM27qJ?*B?Xn|y`jL5zV*6~>aQ6bdvrSj+0h6tB|&GYSGR#UxWkF6*LR z{{jSkL}t*@D}?5S84Mz=SAMM|acqr7C}L)bD`{rFZQkQ(+s|b~hWc>{f;E!gjE8oQ z)B=?cMt4IgUUYBT_wo&3Xr4OmP+qi#Dk~Ao76mC6EnGhOsCb|oQ(vuaPupQb#3)gZ zLn~9PB-rR6{KNh#T{NU5_~BseBszop5ZTfcqUF>vhmKh&`UCRXm^l6Q_^}W;0PR5X zY3O+TV94{UE0(w3&k1K>>NB75f@V87stIYbit^S?K&WG2#GM3rgHCbKgcBY3lqYm< zA=O+NY2`aQVyq8%;2d3F}9(m&4Xa)l@PbnQ;2S2rsP>EN#-X)V0Z7 z7%vqLX1Vv~2e=9!9_mU_P;xvi>TYoG9PK3`WuN{T%Mc}bh30-eS%n#N-z4mmS8W7E z$(^`c`5cNQTfC8#Lo%u$7>f}O&0lOt1;$1+=82PrkSIn~{3($JTiVdmmwgl=`lCBV zE`@Fg%onI>d8qlX2wWOW1}+4_fXqFfrR?|JQMppD;2Mkv zI@U>?N8~WZ7cczVckCR|{olKw7=Bjxac-U;JM)><;Hk_prvP!$v&^u3NyQ2@mv3~B z3P~+tRE&4Pdp#u`zYx^_=c3B__fnVC1(Do`76%g!3Yjx)dydaqkQFc>_mKrg!SWJ$ zYH3Bv7lmA3@@9aG>;9cjef>bh|5^plrQu5T;{SENL081Ygd-rRq4H1QV_gHN8xJV> zRPSH`2wmv02y}@Gkclr$mz71QL09dR_w|vU-uh@)gJN#oC}OjBX*ncB{0kOn1j)#Zx+ zf1IN>=zmt)8-0UDVV2!j{VTS`QQt4;_ diff --git a/wireguide.egg-info/PKG-INFO b/wireguide.egg-info/PKG-INFO deleted file mode 100644 index f55e21c..0000000 --- a/wireguide.egg-info/PKG-INFO +++ /dev/null @@ -1,41 +0,0 @@ -Metadata-Version: 2.1 -Name: wireguide -Version: 0.0.1 -Summary: A WireGuard GUI for GNU/Linux -Home-page: https://github.com/mickenordin/wireguide -Author: Mikael Nordin -Author-email: mik@elnord.in -License: UNKNOWN -Description: # WireGUIde - WireGUIde is a graphical user interface for WireGuard: https://www.wireguard.com/ - - It makes use of: - * libnm (https://developer.gnome.org/libnm/stable/usage.html) - * wxPython (https://wxpython.org/) - * GObject Introspection (https://gi.readthedocs.io/en/latest/) - - For packaging a debian package you can use these dependencies: - * libnm0 - * wxpython - * gir1.2-nm-1.0 - - Thanks to Jan Bodnar of zetcode.com for the valuable tutorial on wxPython dialogs: - * http://zetcode.com/wxpython/dialogs/ - - ## Installation - ``` - pip install wireguide - ``` - ## Screenshots - ![No config](https://raw.githubusercontent.com/mickenordin/wireguide/main/screenshots/scrot0.png) - ![Open dialog](https://raw.githubusercontent.com/mickenordin/wireguide/main/screenshots/scrot1.png) - ![Activate](https://raw.githubusercontent.com/mickenordin/wireguide/main/screenshots/scrot2.png) - ![Deactivate](https://raw.githubusercontent.com/mickenordin/wireguide/main/screenshots/scrot3.png) - -Platform: UNKNOWN -Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) -Classifier: Environment :: X11 Applications -Classifier: Operating System :: POSIX :: Linux -Requires-Python: >=3.6 -Description-Content-Type: text/markdown diff --git a/wireguide.egg-info/SOURCES.txt b/wireguide.egg-info/SOURCES.txt deleted file mode 100644 index d44b329..0000000 --- a/wireguide.egg-info/SOURCES.txt +++ /dev/null @@ -1,10 +0,0 @@ -MANIFEST.in -README.md -setup.py -wireguide/__init__.py -wireguide/logo.png -wireguide/wireguide -wireguide.egg-info/PKG-INFO -wireguide.egg-info/SOURCES.txt -wireguide.egg-info/dependency_links.txt -wireguide.egg-info/top_level.txt \ No newline at end of file diff --git a/wireguide.egg-info/dependency_links.txt b/wireguide.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/wireguide.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/wireguide.egg-info/top_level.txt b/wireguide.egg-info/top_level.txt deleted file mode 100644 index a2cdbed..0000000 --- a/wireguide.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -wireguide