diff --git a/wireguide b/wireguide
index 91f6481..5e85216 100755
--- a/wireguide
+++ b/wireguide
@@ -46,7 +46,7 @@ class WireFrame(wx.Frame): # pylint: disable=too-many-ancestors,too-many-instan
self.make_menu_bar()
# and a status bar
- self.statusbar = self.CreateStatusBar(style = wx.BORDER_NONE)
+ self.statusbar = self.CreateStatusBar(style=wx.BORDER_NONE)
self.set_status()
self.timer = wx.Timer(self)
@@ -56,90 +56,60 @@ class WireFrame(wx.Frame): # pylint: disable=too-many-ancestors,too-many-instan
self.Bind(wx.EVT_PAINT, self.timing)
self.Show()
- def set_status(self):
- status = str(len(self.active_conns)) + " active connection(s)"
- self.statusbar.SetStatusText(status)
+ 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.
- def timing(self, event): # pylint: disable=unused-argument
- """
- Start a timer
- """
- self.timer.Start(20)
+ 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.
- 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
+ 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')
- def write_to_sizer(self):
+ wx.adv.AboutBox(info)
+
+ def activate_button_clicked(self, event, conn): # pylint: disable=unused-argument
"""
- We use the BoxSizer to hold our configs
- This method redraws the sizer
+ This activates an imported config
"""
- 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: self.deactivate_button_clicked(event, conn), 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: self.activate_button_clicked(event, conn), 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()
+ print(conn.get_id())
+ self.client.add_connection_async(conn, False, None, self.add_callback,
+ None)
+ self.remove_inactive(conn)
- def get_next_int_name(self):
+ def add_callback(self, client, result, data): # pylint: disable=unused-argument
"""
- Determins what we should call the next interface
+ This is here to let us know if the connection was successful or not
"""
- 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)
+ 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):
"""
@@ -185,47 +155,6 @@ class WireFrame(wx.Frame): # pylint: disable=too-many-ancestors,too-many-instan
wx.LogError("Cannot open file '%s'." % filename)
return None
- 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 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 remove_inactive(self,conn):
- for i in range(len(self.inactive_conns)):
- print(i, self.inactive_conns[i].get_id(), conn.get_id())
- if self.inactive_conns[i].get_id() == conn.get_id():
- self.inactive_conns.pop(i)
-
def deactivate_button_clicked(self, event, conn): # pylint: disable=unused-argument
"""
This deactivates an active config
@@ -250,20 +179,19 @@ class WireFrame(wx.Frame): # pylint: disable=too-many-ancestors,too-many-instan
self.conns = self.get_wg_conns()
self.write_to_sizer()
- def add_callback(self, client, result, data): # pylint: disable=unused-argument
+ def do_on_timer(self, event): # pylint: disable=unused-argument
"""
- This is here to let us know if the connection was successful or not
+ Do stuff to redraw the window when the timer times out
+ Ths is because connections might change outside of WireGUIde
"""
- 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()
+ 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
"""
@@ -290,6 +218,23 @@ class WireFrame(wx.Frame): # pylint: disable=too-many-ancestors,too-many-instan
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
@@ -314,36 +259,111 @@ class WireFrame(wx.Frame): # pylint: disable=too-many-ancestors,too-many-instan
mconns.append(conn)
return mconns
- 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.
+ 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.
+ """
- 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.
+ 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)
- 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')
+ help_menu = wx.Menu()
+ about_item = help_menu.Append(wx.ID_ABOUT)
- wx.adv.AboutBox(info)
+ 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):
@@ -363,15 +383,6 @@ def get_info_as_text(aconn):
return info
-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
-
-
if __name__ == '__main__':
# When this module is run (not imported) then create the app, the
# frame, show it, and start the event loop.