From 582ef21042f7a75708996e29362f286eaf689c43 Mon Sep 17 00:00:00 2001 From: punix Date: Fri, 18 Apr 2025 15:04:22 +0200 Subject: [PATCH] reformat files --- cls_mth_fc.py | 230 ++++---- ssl_decrypt.py | 67 ++- ssl_encrypt.py | 76 ++- start_wg.py | 11 +- wirepy.py | 1362 ++++++++++++++++++++++++++++-------------------- 5 files changed, 1042 insertions(+), 704 deletions(-) diff --git a/cls_mth_fc.py b/cls_mth_fc.py index 9f15ca0..3eec3b6 100755 --- a/cls_mth_fc.py +++ b/cls_mth_fc.py @@ -1,49 +1,52 @@ -''' Classes Method and functions for lx apps ''' +""" Classes Method and functions for lx apps """ import gettext import locale import os import shutil -from subprocess import check_call import subprocess import tkinter as tk import zipfile from datetime import datetime from pathlib import Path +from subprocess import check_call from tkinter import ttk + import requests - -APP = 'wirepy' -LOCALE_DIR = '/usr/share/locale/' +APP = "wirepy" +LOCALE_DIR = "/usr/share/locale/" locale.bindtextdomain(APP, LOCALE_DIR) gettext.bindtextdomain(APP, LOCALE_DIR) gettext.textdomain(APP) _ = gettext.gettext -wg_set = Path(Path.home() / '.config/wire_py/settings') +wg_set = Path(Path.home() / ".config/wire_py/settings") -class Create(): + +class Create: """ This class is for the creation of the folders and files required by Wire-Py, as well as for decryption - the tunnel from the user's home directory + the tunnel from the user's home directory """ - @staticmethod + @staticmethod def dir_and_files(): - pth = Path.home() / '.config/wire_py' + pth = Path.home() / ".config/wire_py" pth.mkdir(parents=True, exist_ok=True) - sett = Path.home() / '.config/wire_py/settings' - ks = Path.home() / '.config/wire_py/keys' + sett = Path.home() / ".config/wire_py/settings" + ks = Path.home() / ".config/wire_py/keys" if sett.exists(): pass else: sett.touch() - sett.write_text('[UPDATES]\non\n[THEME]\nlight\n[TOOLTIP]\nTrue\n[AUTOSTART ON]\noff\n') + sett.write_text( + "[UPDATES]\non\n[THEME]\nlight\n[TOOLTIP]\nTrue\n[AUTOSTART ON]\noff\n" + ) if ks.exists(): pass @@ -54,25 +57,27 @@ class Create(): @staticmethod def files_for_autostart(): - pth2 = Path.home() / '.config/systemd/user' + pth2 = Path.home() / ".config/systemd/user" pth2.mkdir(parents=True, exist_ok=True) - wg_ser = Path.home() / '.config/systemd/user/wg_start.service' + wg_ser = Path.home() / ".config/systemd/user/wg_start.service" if wg_ser.exists(): pass else: wg_ser.touch() - wg_ser.write_text('[Unit]\nDescription=Automatic Tunnel Start\nAfter=network-online.target' - '\n\n[Service]\nType=oneshot\nExecStartPre=/bin/sleep 5\nExecStart=/usr/' - 'local/bin/start_wg.py\n[Install]\nWantedBy=default.target') - check_call(['systemctl', '--user', 'enable', 'wg_start.service']) + wg_ser.write_text( + "[Unit]\nDescription=Automatic Tunnel Start\nAfter=network-online.target" + "\n\n[Service]\nType=oneshot\nExecStartPre=/bin/sleep 5\nExecStart=/usr/" + "local/bin/start_wg.py\n[Install]\nWantedBy=default.target" + ) + check_call(["systemctl", "--user", "enable", "wg_start.service"]) @staticmethod def make_dir(): - ''' Dirname "tlecdewg" = Tunnel Encrypt Decrypt Wireguard ''' + """Dirname "tlecdewg" = Tunnel Encrypt Decrypt Wireguard""" - dirname = Path('/tmp/tlecdcwg/') + dirname = Path("/tmp/tlecdcwg/") if dirname.exists(): pass else: @@ -80,41 +85,50 @@ class Create(): @staticmethod def decrypt(): - process = subprocess.run(['pkexec', '/usr/local/bin/ssl_decrypt.py'], stdout=subprocess.PIPE, text=True) - #print(process.stdout) + process = subprocess.run( + ["pkexec", "/usr/local/bin/ssl_decrypt.py"], + stdout=subprocess.PIPE, + text=True, + ) + # print(process.stdout) if process.returncode == 0: - print('File successfully decrypted...') + print("File successfully decrypted...") else: - print(f'Error with the following code... {process.returncode}') - + print(f"Error with the following code... {process.returncode}") + @staticmethod def encrypt(): - process = subprocess.run(['pkexec', '/usr/local/bin/ssl_encrypt.py'], stdout=subprocess.PIPE, text=True) + process = subprocess.run( + ["pkexec", "/usr/local/bin/ssl_encrypt.py"], + stdout=subprocess.PIPE, + text=True, + ) print(process.stdout) if process.returncode == 0: - print('All Files successfully encrypted...') + print("All Files successfully encrypted...") else: - print(f'Error with the following code... {process.returncode}') - + print(f"Error with the following code... {process.returncode}") + + class UOS: - """ - The class is only for unixoidal systems "UOS" = UnixOS - """ - + The class is only for unixoidal systems "UOS" = UnixOS + + """ + """ This method displays the user name of the logged-in user, even if you are rooted in a shell """ + @staticmethod def username(): logname = str(Path.home())[6:] - file = Path.home() / '/tmp/.loguser' - with open(file, 'w') as f: + file = Path.home() / "/tmp/.loguser" + with open(file, "w") as f: f.write(logname) - class GiteaUpdate: """ Calling api_down requests the URL and the version of the running script. @@ -124,51 +138,52 @@ class GiteaUpdate: the taskbar image for the “Download OK” window, the taskbar image for the “Download error” window and the variable res """ + @staticmethod def api_down(update_api_url, version): try: response = requests.get(update_api_url) response_dict = response.json() response_dict = response_dict[0] - with open(wg_set, 'r') as set_file: + with open(wg_set, "r") as set_file: set_file = set_file.read() - if 'on\n' in set_file: - if version[3:] != response_dict['tag_name']: - return response_dict['tag_name'] + if "on\n" in set_file: + if version[3:] != response_dict["tag_name"]: + return response_dict["tag_name"] else: - return 'No Updates' + return "No Updates" else: - return 'False' + return "False" except requests.exceptions.ConnectionError: - return 'No Internet Connection!' + return "No Internet Connection!" @staticmethod def download(urld, down_ok_image, down_not_ok_image, res): try: - to_down = 'wget -qP ' + str(Path.home()) + ' ' + urld + to_down = "wget -qP " + str(Path.home()) + " " + urld result = subprocess.call(to_down, shell=True) if result == 0: - shutil.chown(str(Path.home()) + f'/{res}.zip', 1000, 1000) + shutil.chown(str(Path.home()) + f"/{res}.zip", 1000, 1000) """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' + iw = r"/usr/share/icons/lx-icons/64/info.png" ii = down_ok_image - wt = _('Download Successful') - msg_t = _('Your zip file is in home directory') + wt = _("Download Successful") + msg_t = _("Your zip file is in home directory") msg_window(iw, ii, wt, msg_t) else: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/error.png' + iw = r"/usr/share/icons/lx-icons/64/error.png" ii = down_not_ok_image - wt = _('Download error') - msg_t = _('Download failed! Please try again') + wt = _("Download error") + msg_t = _("Download failed! Please try again") msg_window(iw, ii, wt, msg_t) except subprocess.CalledProcessError: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/error.png' + iw = r"/usr/share/icons/lx-icons/64/error.png" ii = down_not_ok_image - wt = _('Download error') - msg_t = _('Download failed! No internet connection!') + wt = _("Download error") + msg_t = _("Download failed! No internet connection!") msg_window(iw, ii, wt, msg_t) @@ -196,17 +211,17 @@ def msg_window(img_w, img_i, w_title, w_txt, txt2=None, com=None): label.grid(column=1, row=0) if txt2 is not None and com is not None: - label.config(font=('Ubuntu', 11), padx=15, justify='left') - msg.i_window.grid(column=0, row=0, sticky='nw') - button2 = ttk.Button(msg, text=f'{txt2}', command=com, padding=4) - button2.grid(column=0, row=1, sticky='e', columnspan=2) - button = ttk.Button(msg, text='OK', command=msg.destroy, padding=4) - button.grid(column=0, row=1, sticky='w', columnspan=2) + label.config(font=("Ubuntu", 11), padx=15, justify="left") + msg.i_window.grid(column=0, row=0, sticky="nw") + button2 = ttk.Button(msg, text=f"{txt2}", command=com, padding=4) + button2.grid(column=0, row=1, sticky="e", columnspan=2) + button = ttk.Button(msg, text="OK", command=msg.destroy, padding=4) + button.grid(column=0, row=1, sticky="w", columnspan=2) else: - label.config(font=('Ubuntu', 11), padx=15) + label.config(font=("Ubuntu", 11), padx=15) msg.i_window.grid(column=0, row=0) - button = ttk.Button(msg, text='OK', command=msg.destroy, padding=4) + button = ttk.Button(msg, text="OK", command=msg.destroy, padding=4) button.grid(column=0, columnspan=2, row=1) img_i = tk.PhotoImage(file=img_i) @@ -225,6 +240,7 @@ class Tunnel: The config file is packed into a dictionary, to display the values Address , DNS and Peer in the labels """ + @classmethod def con_to_dict(cls, file): @@ -232,15 +248,15 @@ class Tunnel: for lines in file.readlines(): line_plit = lines.split() dictlist = dictlist + line_plit - dictlist.remove('[Interface]') - dictlist.remove('[Peer]') + dictlist.remove("[Interface]") + dictlist.remove("[Peer]") for items in dictlist: - if items == '=': + if items == "=": + dictlist.remove(items) + if items == "::/0": dictlist.remove(items) - if items == '::/0': - dictlist.remove(items) - ''' Here is the beginning (Loop) of convert List to Dictionary ''' + """ Here is the beginning (Loop) of convert List to Dictionary """ for _ in dictlist: a = [dictlist[0], dictlist[1]] b = [dictlist[2], dictlist[3]] @@ -255,28 +271,33 @@ class Tunnel: for elements in new_list: final_dict[elements[0]] = elements[1] - ''' end... result a Dictionary ''' + """ end... result a Dictionary """ - address = final_dict['Address'] - dns = final_dict['DNS'] - if ',' in dns: + address = final_dict["Address"] + dns = final_dict["DNS"] + if "," in dns: dns = dns[:-1] - endpoint = final_dict['Endpoint'] - if 'PresharedKey' in final_dict: - pre_key = final_dict['PresharedKey'] + endpoint = final_dict["Endpoint"] + if "PresharedKey" in final_dict: + pre_key = final_dict["PresharedKey"] else: - pre_key = final_dict['PreSharedKey'] + pre_key = final_dict["PreSharedKey"] return address, dns, endpoint, pre_key """ Shows the Active Tunnel """ + @staticmethod def active(): - active = os.popen('nmcli con show --active | grep -iPo "(.*)(wireguard)"').read().split() + active = ( + os.popen('nmcli con show --active | grep -iPo "(.*)(wireguard)"') + .read() + .split() + ) if not active: - active = '' + active = "" else: active = active[0] @@ -285,60 +306,61 @@ class Tunnel: """ Shows all existing Wireguard tunnels a login user """ + @staticmethod def list(): - - dirname = Path('/tmp/tlecdcwg/') + + dirname = Path("/tmp/tlecdcwg/") wg_s = os.listdir(dirname) return wg_s - """ This will export the tunnels. A zipfile with current date and time is created in the user's home directory with correct right """ + @staticmethod def export(): now_time = datetime.now() - now_datetime = now_time.strftime('wg-exp-' + '%m-%d-%Y' + '-' + '%H:%M') + now_datetime = now_time.strftime("wg-exp-" + "%m-%d-%Y" + "-" + "%H:%M") tl = Tunnel.list() try: if len(tl) != 0: - wg_tar = str(Path.home()) + '/' + now_datetime - shutil.copytree('/tmp/tlecdcwg/', '/tmp/wire_py', dirs_exist_ok=True) - source = Path('/tmp/wire_py') - shutil.make_archive(wg_tar, 'zip', source) - #shutil.chown(wg_tar + '.zip', 1000, 1000) + wg_tar = str(Path.home()) + "/" + now_datetime + shutil.copytree("/tmp/tlecdcwg/", "/tmp/wire_py", dirs_exist_ok=True) + source = Path("/tmp/wire_py") + shutil.make_archive(wg_tar, "zip", source) + # shutil.chown(wg_tar + '.zip', 1000, 1000) shutil.rmtree(source) - with zipfile.ZipFile((wg_tar + '.zip'), 'r') as zf: + with zipfile.ZipFile((wg_tar + ".zip"), "r") as zf: if len(zf.namelist()) != 0: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_vpn.png' - wt = _('Export Successful') - msg_t = _('Your zip file is in home directory') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_vpn.png" + wt = _("Export Successful") + msg_t = _("Your zip file is in home directory") msg_window(iw, ii, wt, msg_t) else: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/error.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Export error') - msg_t = _('Export failed! Please try again') + iw = r"/usr/share/icons/lx-icons/64/error.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Export error") + msg_t = _("Export failed! Please try again") msg_window(iw, ii, wt, msg_t) else: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Select tunnel') - msg_t = _('Please first import tunnel') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Select tunnel") + msg_t = _("Please first import tunnel") msg_window(iw, ii, wt, msg_t) except TypeError: @@ -350,12 +372,12 @@ class Tipi: Class for Tooltip setting write in File Calling request path to file """ + @staticmethod def if_tip(path): - with open(path, 'r') as set_file2: + with open(path, "r") as set_file2: lines2 = set_file2.readlines() - if 'False\n' in lines2: + if "False\n" in lines2: return False else: return True - diff --git a/ssl_decrypt.py b/ssl_decrypt.py index db42587..6098525 100755 --- a/ssl_decrypt.py +++ b/ssl_decrypt.py @@ -1,34 +1,59 @@ #!/usr/bin/python3 -''' This Script decrypt Wireguardfiles for Wirepy users ''' +""" This Script decrypt Wireguardfiles for Wirepy users """ import os -from subprocess import check_call -from pathlib import Path import shutil -uname = Path('/tmp/.loguser') +from pathlib import Path +from subprocess import check_call -with open(uname, 'r') as f: +uname = Path("/tmp/.loguser") + +with open(uname, "r") as f: logname = f.readline() - -''' Dirname "tlecdewg" = Tunnel Encrypt Decrypt Wireguard ''' -dirname = Path('/tmp/tlecdcwg/') -keyfile = Path(f'/home/{logname}/.config/wire_py/pbwgk.pem') -pkeyfile = '/usr/local/etc/ssl/pwgk.pem' + +""" Dirname "tlecdewg" = Tunnel Encrypt Decrypt Wireguard """ +dirname = Path("/tmp/tlecdcwg/") +keyfile = Path(f"/home/{logname}/.config/wire_py/pbwgk.pem") +pkeyfile = "/usr/local/etc/ssl/pwgk.pem" if not keyfile.is_file(): - - check_call(['openssl', 'rsa', '-in', pkeyfile, '-out', keyfile, '-outform', 'PEM', '-pubout']) + + check_call( + [ + "openssl", + "rsa", + "-in", + pkeyfile, + "-out", + keyfile, + "-outform", + "PEM", + "-pubout", + ] + ) shutil.chown(keyfile, 1000, 1000) -dirname2 = ('/home/' + logname + '/.config/wire_py/') +dirname2 = "/home/" + logname + "/.config/wire_py/" detl = os.listdir(dirname2) os.chdir(dirname2) -detl.remove('keys') -detl.remove('settings') -if os.path.exists(dirname2 + 'pbwgk.pem'): - detl.remove('pbwgk.pem') +detl.remove("keys") +detl.remove("settings") +if os.path.exists(dirname2 + "pbwgk.pem"): + detl.remove("pbwgk.pem") for detunnels in detl: - tlname2 = detunnels[:-4] + '.conf' - extpath = str(dirname) + '/' + tlname2 - check_call(['openssl', 'pkeyutl', '-decrypt', '-inkey', pkeyfile, '-in', detunnels, '-out', extpath]) - shutil.chown(extpath, 1000, 1000) \ No newline at end of file + tlname2 = detunnels[:-4] + ".conf" + extpath = str(dirname) + "/" + tlname2 + check_call( + [ + "openssl", + "pkeyutl", + "-decrypt", + "-inkey", + pkeyfile, + "-in", + detunnels, + "-out", + extpath, + ] + ) + shutil.chown(extpath, 1000, 1000) diff --git a/ssl_encrypt.py b/ssl_encrypt.py index 5c46e50..083020e 100755 --- a/ssl_encrypt.py +++ b/ssl_encrypt.py @@ -1,25 +1,37 @@ #!/usr/bin/python3 -''' This Script encrypt Wireguardfiles for Wirepy users for more Security''' +""" This Script encrypt Wireguardfiles for Wirepy users for more Security""" import os -from subprocess import check_call -from pathlib import Path import shutil +from pathlib import Path +from subprocess import check_call -uname = Path('/tmp/.loguser') +uname = Path("/tmp/.loguser") -with open(uname, 'r') as f: +with open(uname, "r") as f: logname = f.readline() -keyfile = Path(f'/home/{logname}/.config/wire_py/pbwgk.pem') -dirname = Path('/tmp/tlecdcwg/') -pkeyfile = '/usr/local/etc/ssl/pwgk.pem' +keyfile = Path(f"/home/{logname}/.config/wire_py/pbwgk.pem") +dirname = Path("/tmp/tlecdcwg/") +pkeyfile = "/usr/local/etc/ssl/pwgk.pem" if not keyfile.is_file(): - - check_call(['openssl', 'rsa', '-in', pkeyfile, '-out', keyfile, '-outform', 'PEM', '-pubout']) + + check_call( + [ + "openssl", + "rsa", + "-in", + pkeyfile, + "-out", + keyfile, + "-outform", + "PEM", + "-pubout", + ] + ) shutil.chown(keyfile, 1000, 1000) - + if dirname.exists(): tl = os.listdir(str(dirname)) cpth = str(keyfile) @@ -27,9 +39,22 @@ if not keyfile.is_file(): if keyfile.exists() and len(tl) != 0: for tunnels in tl: - sourcetl = str(dirname) + '/' + tunnels - tlname = cryptfiles + tunnels[:-5] + '.dat' - check_call(['openssl', 'pkeyutl', '-encrypt', '-inkey', keyfile, '-pubin', '-in', sourcetl, '-out', tlname]) + sourcetl = str(dirname) + "/" + tunnels + tlname = cryptfiles + tunnels[:-5] + ".dat" + check_call( + [ + "openssl", + "pkeyutl", + "-encrypt", + "-inkey", + keyfile, + "-pubin", + "-in", + sourcetl, + "-out", + tlname, + ] + ) else: @@ -40,10 +65,19 @@ else: if keyfile.exists() and len(tl) != 0: for tunnels in tl: - sourcetl = str(dirname) + '/' + tunnels - tlname = cryptfiles + tunnels[:-5] + '.dat' - check_call(['openssl', 'pkeyutl', '-encrypt', '-inkey', keyfile, '-pubin', '-in', sourcetl, '-out', tlname]) - - - - + sourcetl = str(dirname) + "/" + tunnels + tlname = cryptfiles + tunnels[:-5] + ".dat" + check_call( + [ + "openssl", + "pkeyutl", + "-encrypt", + "-inkey", + keyfile, + "-pubin", + "-in", + sourcetl, + "-out", + tlname, + ] + ) diff --git a/start_wg.py b/start_wg.py index b11f828..527fafc 100755 --- a/start_wg.py +++ b/start_wg.py @@ -1,14 +1,13 @@ #!/usr/bin/python3 -from subprocess import check_call from pathlib import Path +from subprocess import check_call -path_to_file = Path(Path.home() / '.config/wire_py/settings') +path_to_file = Path(Path.home() / ".config/wire_py/settings") -with open(path_to_file, 'r') as a_con: +with open(path_to_file, "r") as a_con: lines = a_con.readlines() a_con = lines[7].strip() - if a_con != 'off': - check_call(['nmcli', 'connection', 'up', a_con]) + if a_con != "off": + check_call(["nmcli", "connection", "up", a_con]) else: pass - diff --git a/wirepy.py b/wirepy.py index d8029f4..756d743 100755 --- a/wirepy.py +++ b/wirepy.py @@ -12,56 +12,68 @@ import tkinter as tk from pathlib import Path from subprocess import check_call from tkinter import filedialog, ttk, TclError -from cls_mth_fc import (Tunnel, Create, msg_window, Tipi, GiteaUpdate, UOS) +from cls_mth_fc import Tunnel, Create, msg_window, Tipi, GiteaUpdate, UOS UOS.username() Create.dir_and_files() Create.make_dir() Create.decrypt() -tcl_path = Path('/usr/share/TK-Themes') -wg_set = Path(Path.home() / '.config/wire_py/settings') +tcl_path = Path("/usr/share/TK-Themes") +wg_set = Path(Path.home() / ".config/wire_py/settings") wg_tips = Tipi.if_tip(wg_set) -dirname = Path('/tmp/tlecdcwg/') +dirname = Path("/tmp/tlecdcwg/") -''' 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year ''' -version = 'v. 2.04.1725' +""" 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year """ +version = "v. 2.04.1725" -res = GiteaUpdate.api_down('https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases', version) +res = GiteaUpdate.api_down( + "https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases", version +) -''' Translate ''' -APP = 'wirepy' -LOCALE_DIR = '/usr/share/locale/' +""" Translate """ +APP = "wirepy" +LOCALE_DIR = "/usr/share/locale/" locale.bindtextdomain(APP, LOCALE_DIR) gettext.bindtextdomain(APP, LOCALE_DIR) gettext.textdomain(APP) _ = gettext.gettext + def signalHandler(signum, frame): - ''' Determine clear text names for signal numbers ''' - SIGNALS_TO_NAMES_DICT = dict((getattr(signal, n), n) \ - for n in dir(signal) if n.startswith('SIG') and '_' not in n ) + """Determine clear text names for signal numbers""" + SIGNALS_TO_NAMES_DICT = dict( + (getattr(signal, n), n) + for n in dir(signal) + if n.startswith("SIG") and "_" not in n + ) signame = SIGNALS_TO_NAMES_DICT.get(signum, "Unnamed signal: %d" % signum) - - ''' + + """ End program for certain signals, report to others only reception - ''' + """ if signum in (signal.SIGINT, signal.SIGTERM): exitCode = 1 - print("\nSignal '%s' (%d) received. => Aborting with exit code %d." % (signame, signum, exitCode)) + print( + "\nSignal '%s' (%d) received. => Aborting with exit code %d." + % (signame, signum, exitCode) + ) shutil.rmtree(dirname) - Path.unlink('/tmp/.loguser') - print('Breakdown by user...') + Path.unlink("/tmp/.loguser") + print("Breakdown by user...") sys.exit(exitCode) else: print("Signal %d received and ignored." % signum) shutil.rmtree(dirname) - Path.unlink('/tmp/.loguser') - print('Process unexpectedly ended...') -signal.signal(signal.SIGINT, signalHandler) + Path.unlink("/tmp/.loguser") + print("Process unexpectedly ended...") + + +signal.signal(signal.SIGINT, signalHandler) signal.signal(signal.SIGTERM, signalHandler) -signal.signal(signal.SIGHUP, signalHandler) +signal.signal(signal.SIGHUP, signalHandler) + class Wirepy(tk.Tk): @@ -74,29 +86,37 @@ class Wirepy(tk.Tk): self.monitor_center_x = self.winfo_screenwidth() / 2 - (self.x_width / 2) self.monitor_center_y = self.winfo_screenheight() / 2 - (self.y_height / 2) self.resizable(width=False, height=False) - self.title('Wire-Py') - self.geometry('%dx%d+%d+%d' % (self.x_width, self.y_height, self.monitor_center_x, self.monitor_center_y)) + self.title("Wire-Py") + self.geometry( + "%dx%d+%d+%d" + % ( + self.x_width, + self.y_height, + self.monitor_center_x, + self.monitor_center_y, + ) + ) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.style = ttk.Style(self) - self.tk.call('source', str(tcl_path) + '/water.tcl') - ''' self.tk.call('source', 'TK-Themes/water.tcl') ''' - with open(wg_set, 'r') as read_file: + self.tk.call("source", str(tcl_path) + "/water.tcl") + """ self.tk.call('source', 'TK-Themes/water.tcl') """ + with open(wg_set, "r") as read_file: lines = read_file.readlines() - if 'light\n' in lines: - self.tk.call('set_theme', 'light') + if "light\n" in lines: + self.tk.call("set_theme", "light") else: - self.tk.call('set_theme', 'dark') + self.tk.call("set_theme", "dark") - ''' Load the image file from disk. ''' - self.wg_icon = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/48/wg_vpn.png') + """ Load the image file from disk. """ + self.wg_icon = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_vpn.png") - ''' Set it as the window icon ''' + """ Set it as the window icon """ self.iconphoto(True, self.wg_icon) - + FrameWidgets(self).grid() - + class FrameWidgets(ttk.Frame): def __init__(self, container, **kwargs): @@ -108,417 +128,472 @@ class FrameWidgets(ttk.Frame): self.dns = None self.address = None self.auto_con = None - self.wg_vpn_start = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/48/wg_vpn-start.png') - self.wg_vpn_stop = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/48/wg_vpn-stop.png') - self.imp_pic = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/48/wg_import.png') - self.tr_pic = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/48/wg_trash.png') - self.exp_pic = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/48/wg_export.png') - self.warning_pic = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/64/error.png') - self.wg_vpn_start = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/48/wg_vpn-start.png') - self.wg_vpn_stop = tk.PhotoImage(file=r'/usr/share/icons/lx-icons/48/wg_vpn-stop.png') + self.wg_vpn_start = tk.PhotoImage( + file=r"/usr/share/icons/lx-icons/48/wg_vpn-start.png" + ) + self.wg_vpn_stop = tk.PhotoImage( + file=r"/usr/share/icons/lx-icons/48/wg_vpn-stop.png" + ) + self.imp_pic = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_import.png") + self.tr_pic = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_trash.png") + self.exp_pic = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_export.png") + self.warning_pic = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/64/error.png") + self.wg_vpn_start = tk.PhotoImage( + file=r"/usr/share/icons/lx-icons/48/wg_vpn-start.png" + ) + self.wg_vpn_stop = tk.PhotoImage( + file=r"/usr/share/icons/lx-icons/48/wg_vpn-stop.png" + ) - ''' Set on or off in file ''' + """ Set on or off in file """ def update(): if set_update.get() == 1: - with open(wg_set, 'r') as set_file2: + with open(wg_set, "r") as set_file2: lines2 = set_file2.readlines() - lines2[1] = 'off\n' - with open(wg_set, 'w') as set_file2: + lines2[1] = "off\n" + with open(wg_set, "w") as set_file2: set_file2.writelines(lines2) if set_update.get() == 0: - with open(wg_set, 'r') as set_file2: + with open(wg_set, "r") as set_file2: lines2 = set_file2.readlines() - lines2[1] = 'on\n' - with open(wg_set, 'w') as set_file2: + lines2[1] = "on\n" + with open(wg_set, "w") as set_file2: set_file2.writelines(lines2) - ''' Set True or False in file ''' + """ Set True or False in file """ def tooltip(): if set_tip.get(): - with open(wg_set, 'r') as set_file2: + with open(wg_set, "r") as set_file2: lines2 = set_file2.readlines() - lines2[5] = 'False\n' - with open(wg_set, 'w') as set_file2: + lines2[5] = "False\n" + with open(wg_set, "w") as set_file2: set_file2.writelines(lines2) else: - with open(wg_set, 'r') as set_file2: + with open(wg_set, "r") as set_file2: lines2 = set_file2.readlines() - lines2[5] = 'True\n' - with open(wg_set, 'w') as set_file2: + lines2[5] = "True\n" + with open(wg_set, "w") as set_file2: set_file2.writelines(lines2) - ''' Set dark or light ''' + """ Set dark or light """ def theme_change_light(): - if self.tk.call('ttk::style', 'theme', 'use') == 'water-dark': - ''' Set light theme ''' - self.tk.call('set_theme', 'light') - with open(wg_set, 'r') as theme_set2: + if self.tk.call("ttk::style", "theme", "use") == "water-dark": + """Set light theme""" + self.tk.call("set_theme", "light") + with open(wg_set, "r") as theme_set2: lines3 = theme_set2.readlines() - lines3[3] = 'light\n' - with open(wg_set, 'w') as theme_set2: + lines3[3] = "light\n" + with open(wg_set, "w") as theme_set2: theme_set2.writelines(lines3) self.color_label() def theme_change_dark(): - if not self.tk.call('ttk::style', 'theme', 'use') == 'water-dark': - ''' Set dark theme ''' - self.tk.call('set_theme', 'dark') - with open(wg_set, 'r') as theme_set2: + if not self.tk.call("ttk::style", "theme", "use") == "water-dark": + """Set dark theme""" + self.tk.call("set_theme", "dark") + with open(wg_set, "r") as theme_set2: lines4 = theme_set2.readlines() - lines4[3] = 'dark\n' - with open(wg_set, 'w') as theme_set2: + lines4[3] = "dark\n" + with open(wg_set, "w") as theme_set2: theme_set2.writelines(lines4) self.color_label() def info(): def link_btn(): - webbrowser.open('https://git.ilunix.de/punix/Wire-Py') + webbrowser.open("https://git.ilunix.de/punix/Wire-Py") - ''' img_w, img_i, w_title, w_txt , txt2, com hand over ''' - iw = r'/usr/share/icons/lx-icons/48/wg_vpn.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Info') - msg_t = (_('Wire-Py a simple Wireguard Gui for Linux systems.\n\n' - 'Wire-Py is open source software written in Python.\n\n' - 'Email: polunga40@unity-mail.de also likes for donation.\n\n' - 'Use without warranty!\n')) - txt2 = _('Go to Wire-Py git') + """ img_w, img_i, w_title, w_txt , txt2, com hand over """ + iw = r"/usr/share/icons/lx-icons/48/wg_vpn.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Info") + msg_t = _( + "Wire-Py a simple Wireguard Gui for Linux systems.\n\n" + "Wire-Py is open source software written in Python.\n\n" + "Email: polunga40@unity-mail.de also likes for donation.\n\n" + "Use without warranty!\n" + ) + txt2 = _("Go to Wire-Py git") com = link_btn msg_window(iw, ii, wt, msg_t, txt2, com) - ''' Frame for Menu ''' + """ Frame for Menu """ self.menu_frame = ttk.Frame(self) - self.menu_frame.configure(relief='flat') - self.menu_frame.grid(column=0, row=0, columnspan=4, sticky='w') + self.menu_frame.configure(relief="flat") + self.menu_frame.grid(column=0, row=0, columnspan=4, sticky="w") - ''' App Menu ''' + """ App Menu """ self.version_lb = ttk.Label(self.menu_frame, text=version) - self.version_lb.config(font=('Ubuntu', 11), foreground='#00c4ff') + self.version_lb.config(font=("Ubuntu", 11), foreground="#00c4ff") self.version_lb.grid(column=0, row=0, rowspan=4, padx=10) def version_enter(event): - ''' The mouse moves into the Version widget ''' - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, f'Version: {version[2:]}') + """The mouse moves into the Version widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, f"Version: {version[2:]}" + ) def version_leave(_): - ''' The mouse moves from the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves from the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.options_btn = ttk.Menubutton(self.menu_frame, text=_('Options')) + self.options_btn = ttk.Menubutton(self.menu_frame, text=_("Options")) self.options_btn.grid(column=1, columnspan=1, row=0) def sets_enter(event): - ''' The mouse moves into the entry widget ''' - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('Click for Settings')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("Click for Settings") + ) def sets_leave(_): - ''' The mouse moves from the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves from the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.version_lb.bind('', version_enter) - self.version_lb.bind('', version_leave) - self.options_btn.bind('', sets_enter) - self.options_btn.bind('', sets_leave) + self.version_lb.bind("", version_enter) + self.version_lb.bind("", version_leave) + self.options_btn.bind("", sets_enter) + self.options_btn.bind("", sets_leave) set_update = tk.IntVar() set_tip = tk.BooleanVar() - self.settings = tk.Menu(self, relief='flat') - self.options_btn.configure(menu=self.settings, style='Toolbutton') - self.settings.add_checkbutton(label=_('Disable Updates'), command=update, variable=set_update) - self.settings.add_checkbutton(label=_('Disable Tooltips'), command=tooltip, variable=set_tip) - self.settings.add_command(label=_('Light'), command=theme_change_light) - self.settings.add_command(label=_('Dark'), command=theme_change_dark) + self.settings = tk.Menu(self, relief="flat") + self.options_btn.configure(menu=self.settings, style="Toolbutton") + self.settings.add_checkbutton( + label=_("Disable Updates"), command=update, variable=set_update + ) + self.settings.add_checkbutton( + label=_("Disable Tooltips"), command=tooltip, variable=set_tip + ) + self.settings.add_command(label=_("Light"), command=theme_change_light) + self.settings.add_command(label=_("Dark"), command=theme_change_dark) - ''' About BTN Menu / Label ''' - self.about_btn = ttk.Button(self.menu_frame, text=_('About'), style='Toolbutton', command=info) + """ About BTN Menu / Label """ + self.about_btn = ttk.Button( + self.menu_frame, text=_("About"), style="Toolbutton", command=info + ) self.about_btn.grid(column=2, columnspan=2, row=0) self.readme = tk.Menu(self) - ''' Update and Tooltip Label ''' + """ Update and Tooltip Label """ self.updates_lb = ttk.Label(self.menu_frame) self.updates_lb.grid(column=4, columnspan=3, row=0, padx=10) - '''View Checkbox for enable or disable Tooltip ''' + """View Checkbox for enable or disable Tooltip """ if wg_tips: set_tip.set(value=False) else: set_tip.set(value=True) - '''View Checkbox for enable or disable Updates ''' - if res == 'False': + """View Checkbox for enable or disable Updates """ + if res == "False": set_update.set(value=1) - self.updates_lb.configure(text=_('Update search off')) + self.updates_lb.configure(text=_("Update search off")) def disable_enter(event): - ''' The mouse moves into the entry widget ''' - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('Updates you have disabled')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("Updates you have disabled") + ) def disable_leave(_): - ''' The mouse moves from the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves from the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.updates_lb.bind('', disable_enter) - self.updates_lb.bind('', disable_leave) - elif res == 'No Internet Connection!': - self.updates_lb.configure(text=_('No Server Connection!'), foreground='red') - elif res == 'No Updates': - self.updates_lb.configure(text=_('No Updates')) + self.updates_lb.bind("", disable_enter) + self.updates_lb.bind("", disable_leave) + elif res == "No Internet Connection!": + self.updates_lb.configure(text=_("No Server Connection!"), foreground="red") + elif res == "No Updates": + self.updates_lb.configure(text=_("No Updates")) def congratulations_enter(event): - ''' The mouse moves into the entry widget ''' - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('Congratulations! Wire-Py is up to date')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("Congratulations! Wire-Py is up to date"), + ) def congratulations_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.updates_lb.bind('', congratulations_enter) - self.updates_lb.bind('', congratulations_leave) + self.updates_lb.bind("", congratulations_enter) + self.updates_lb.bind("", congratulations_leave) else: set_update.set(value=0) - text = f'Update {res} ' + _('available!') + text = f"Update {res} " + _("available!") - ''' Update BTN Menu''' + """ Update BTN Menu""" self.update_btn = ttk.Menubutton(self.menu_frame, text=text) self.update_btn.grid(column=4, columnspan=3, row=0, padx=0) def download_enter(event): - ''' The mouse moves into the entry widget ''' - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('Click to download new version')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("Click to download new version") + ) def download_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.update_btn.bind('', download_enter) - self.update_btn.bind('', download_leave) + self.update_btn.bind("", download_enter) + self.update_btn.bind("", download_leave) - self.download = tk.Menu(self, relief='flat') + self.download = tk.Menu(self, relief="flat") - self.update_btn.configure(menu=self.download, style='Toolbutton') - self.download.add_command(label=_('Download'), - command=lambda: GiteaUpdate.download(f'https://git.ilunix.de/punix' - f'/Wire-Py/archive/' - f'{res}.zip', r'/usr/' - r'share/icons/lx-icons' - r'/48/wg_vpn.png', - r'/usr/share/icons/lx-icons' - r'/48/wg_msg.png', res)) + self.update_btn.configure(menu=self.download, style="Toolbutton") + self.download.add_command( + label=_("Download"), + command=lambda: GiteaUpdate.download( + f"https://git.ilunix.de/punix" f"/Wire-Py/archive/" f"{res}.zip", + r"/usr/" r"share/icons/lx-icons" r"/48/wg_vpn.png", + r"/usr/share/icons/lx-icons" r"/48/wg_msg.png", + res, + ), + ) - ''' Show active Tunnel ''' + """ Show active Tunnel """ self.a = Tunnel.active() - ''' Label Frame 1 ''' + """ Label Frame 1 """ self.lb_frame_btn_lbox = ttk.Frame(self) - self.lb_frame_btn_lbox.configure(relief='flat') + self.lb_frame_btn_lbox.configure(relief="flat") self.lb_frame_btn_lbox.grid(column=0, rowspan=3, row=1) - ''' Label Frame 2 ''' + """ Label Frame 2 """ self.lb_frame = ttk.Frame(self) - self.lb_frame.configure(relief='solid') - self.lb_frame.grid(column=2, row=2, sticky='snew', padx=20, pady=5) + self.lb_frame.configure(relief="solid") + self.lb_frame.grid(column=2, row=2, sticky="snew", padx=20, pady=5) - ''' Label Frame 3 ''' + """ Label Frame 3 """ self.lb_frame2 = ttk.Frame(self) - self.lb_frame2.configure(relief='solid') - self.lb_frame2.grid(column=2, row=3, sticky='snew', padx=20, pady=5) + self.lb_frame2.configure(relief="solid") + self.lb_frame2.grid(column=2, row=3, sticky="snew", padx=20, pady=5) - ''' Bottom Frame 4 ''' + """ Bottom Frame 4 """ self.lb_frame3 = ttk.Frame(self) - self.lb_frame3.configure(relief='flat') - self.lb_frame3.grid(column=0, row=5, columnspan=4, sticky='snew', padx=2, pady=2) + self.lb_frame3.configure(relief="flat") + self.lb_frame3.grid( + column=0, row=5, columnspan=4, sticky="snew", padx=2, pady=2 + ) - ''' Bottom Frame 5 ''' + """ Bottom Frame 5 """ self.lb_frame4 = ttk.Frame(self) - self.lb_frame4.configure(relief='flat') - self.lb_frame4.grid(column=2, row=5, columnspan=3, sticky='e', padx=15) + self.lb_frame4.configure(relief="flat") + self.lb_frame4.grid(column=2, row=5, columnspan=3, sticky="e", padx=15) - ''' Show active Label ''' + """ Show active Label """ self.select_tunnel = None - self.lb = ttk.Label(self, text=_('Active: ')) - self.lb.config(font=('Ubuntu', 11, 'bold')) - self.lb.grid(column=2, row=1, padx=15, pady=4, sticky='w') + self.lb = ttk.Label(self, text=_("Active: ")) + self.lb.config(font=("Ubuntu", 11, "bold")) + self.lb.grid(column=2, row=1, padx=15, pady=4, sticky="w") - ''' Label to Show active Tunnel ''' + """ Label to Show active Tunnel """ self.StrVar = tk.StringVar(value=self.a) self.color_label() - ''' Interface Label ''' - self.interface = ttk.Label(self.lb_frame, text=_('Interface')) - self.interface.grid(column=0, row=3, sticky='we', padx=120) - self.interface.config(font=('Ubuntu', 9)) + """ Interface Label """ + self.interface = ttk.Label(self.lb_frame, text=_("Interface")) + self.interface.grid(column=0, row=3, sticky="we", padx=120) + self.interface.config(font=("Ubuntu", 9)) - ''' Peer Label ''' - self.peer = ttk.Label(self.lb_frame2, text=_('Peer')) - self.peer.config(font=('Ubuntu', 9)) - self.peer.grid(column=0, row=4, sticky='we', padx=130) + """ Peer Label """ + self.peer = ttk.Label(self.lb_frame2, text=_("Peer")) + self.peer.config(font=("Ubuntu", 9)) + self.peer.grid(column=0, row=4, sticky="we", padx=130) - ''' Listbox with Scrollbar ''' + """ Listbox with Scrollbar """ def enable_check_box(_): - Create.files_for_autostart() + Create.files_for_autostart() if self.l_box.size() != 0: - self.wg_autostart.configure(state='normal') - self.lb_rename.config(state='normal') + self.wg_autostart.configure(state="normal") + self.lb_rename.config(state="normal") self.lb_rename.delete(0, tk.END) - self.btn_rename.config(state='normal') + self.btn_rename.config(state="normal") - self.l_box = tk.Listbox(self.lb_frame_btn_lbox, selectmode='single') - self.l_box.config(relief='ridge', font=('Ubuntu', 12, 'bold')) - self.l_box.grid(column=1, rowspan=4, row=0, sticky='ns') - self.l_box.event_add('<>', '') - self.l_box.bind('<>', enable_check_box) - self.scrollbar = ttk.Scrollbar(self.lb_frame_btn_lbox, orient='vertical', command=self.l_box.yview) - self.scrollbar.grid(column=1, rowspan=4, row=0, sticky='nse') + self.l_box = tk.Listbox(self.lb_frame_btn_lbox, selectmode="single") + self.l_box.config(relief="ridge", font=("Ubuntu", 12, "bold")) + self.l_box.grid(column=1, rowspan=4, row=0, sticky="ns") + self.l_box.event_add("<>", "") + self.l_box.bind("<>", enable_check_box) + self.scrollbar = ttk.Scrollbar( + self.lb_frame_btn_lbox, orient="vertical", command=self.l_box.yview + ) + self.scrollbar.grid(column=1, rowspan=4, row=0, sticky="nse") self.l_box.configure(yscrollcommand=self.scrollbar.set) - ''' Tunnel List ''' - + """ Tunnel List """ + self.tl = Tunnel.list() for tunnels in self.tl: self.l_box.insert("end", tunnels[:-5]) self.l_box.update() def list_empty_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('You must first import\na Wireguard tunnel')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("You must first import\na Wireguard tunnel"), + ) def list_empty_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def list_not_empty_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('Select a Tunnel')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("Select a Tunnel") + ) def list_not_empty_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() if self.l_box.size() == 0: - self.l_box.bind('', list_empty_enter) - self.l_box.bind('', list_empty_leave) + self.l_box.bind("", list_empty_enter) + self.l_box.bind("", list_empty_leave) else: - self.l_box.bind('', list_not_empty_enter) - self.l_box.bind('', list_not_empty_leave) + self.l_box.bind("", list_not_empty_enter) + self.l_box.bind("", list_not_empty_leave) - ''' Button Vpn ''' - if self.a != '': + """ Button Vpn """ + if self.a != "": self.stop() - wg_read = '/tmp/tlecdcwg/' + str(self.a + '.conf') - with open(wg_read, 'r') as file: + wg_read = "/tmp/tlecdcwg/" + str(self.a + ".conf") + with open(wg_read, "r") as file: data = Tunnel.con_to_dict(file) - ''' Address Label ''' + """ Address Label """ self.init_and_report(data) self.show_data() else: self.start() - ''' Address Label ''' + """ Address Label """ self.add = tk.StringVar() self.DNS = tk.StringVar() self.enp = tk.StringVar() self.label_empty() self.show_data() - ''' Button Import ''' - self.btn_i = ttk.Button(self.lb_frame_btn_lbox, image=self.imp_pic, command=self.import_sl, padding=0) + """ Button Import """ + self.btn_i = ttk.Button( + self.lb_frame_btn_lbox, + image=self.imp_pic, + command=self.import_sl, + padding=0, + ) self.btn_i.grid(column=0, row=1, padx=15, pady=8) def imp_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('Click to import a Wireguard Tunnel')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("Click to import a Wireguard Tunnel") + ) def imp_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.btn_i.bind('', imp_enter) - self.btn_i.bind('', imp_leave) + self.btn_i.bind("", imp_enter) + self.btn_i.bind("", imp_leave) def delete(): try: self.select_tunnel = self.l_box.curselection() select_tl = self.l_box.get(self.select_tunnel[0]) - with open('/tmp/tlecdcwg/' + select_tl + '.conf', 'r+') as file2: + with open("/tmp/tlecdcwg/" + select_tl + ".conf", "r+") as file2: key = Tunnel.con_to_dict(file2) pre_key = key[3] - check_call(['nmcli', 'connection', 'delete', select_tl]) + check_call(["nmcli", "connection", "delete", select_tl]) self.l_box.delete(self.select_tunnel[0]) - with open(wg_set, 'r') as set_file6: + with open(wg_set, "r") as set_file6: lines6 = set_file6.readlines() - if select_tl == lines6[7].strip() and 'off\n' not in lines6[7].strip(): - lines6[7] = 'off\n' - with open(wg_set, 'w') as set_file7: + if ( + select_tl == lines6[7].strip() + and "off\n" not in lines6[7].strip() + ): + lines6[7] = "off\n" + with open(wg_set, "w") as set_file7: set_file7.writelines(lines6) self.selected_option.set(0) - self.autoconnect_var.set(_('no Autoconnect')) - is_encrypt = Path.home() / '.config/wire_py' / str(select_tl + '.dat') + self.autoconnect_var.set(_("no Autoconnect")) + is_encrypt = Path.home() / ".config/wire_py" / str(select_tl + ".dat") if is_encrypt.is_file(): - Path.unlink(str(Path.home()) + '/.config/wire_py/' + str(select_tl + '.dat')) - Path.unlink(Path('/tmp/tlecdcwg') / str(select_tl + '.conf')) - with open(str(Path.home()) + '/.config/wire_py/keys', 'r') as readfile: - with open(str(Path.home()) + '/.config/wire_py/keys2', 'w') as writefile: + Path.unlink( + str(Path.home()) + "/.config/wire_py/" + str(select_tl + ".dat") + ) + Path.unlink(Path("/tmp/tlecdcwg") / str(select_tl + ".conf")) + with open(str(Path.home()) + "/.config/wire_py/keys", "r") as readfile: + with open( + str(Path.home()) + "/.config/wire_py/keys2", "w" + ) as writefile: for line in readfile: if pre_key not in line.strip("\n"): writefile.write(line) - file_one = Path(str(Path.home()) + '/.config/wire_py/keys2') - file_two = file_one.with_name('keys') + file_one = Path(str(Path.home()) + "/.config/wire_py/keys2") + file_two = file_one.with_name("keys") file_one.replace(file_two) - self.wg_autostart.configure(state='disabled') + self.wg_autostart.configure(state="disabled") - ''' for disable checkbox when Listbox empty ''' + """ for disable checkbox when Listbox empty """ def empty_list_start_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('No tunnels to start in the list')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("No tunnels to start in the list") + ) def empty_list_start_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() if self.l_box.size() == 0: - self.wg_autostart.configure(state='disabled') - self.lb_rename.configure(state='disabled') - self.l_box.bind('', list_empty_enter) - self.l_box.bind('', list_empty_leave) - self.wg_autostart.bind('', chk_enter) - self.wg_autostart.bind('', chk_leave) - self.btn_tr.bind('', empty_list_enter) - self.btn_tr.bind('', empty_list_leave) - self.btn_exp.bind('', empty_list_enter) - self.btn_exp.bind('', empty_list_leave) - self.btn_stst.bind('', empty_list_start_enter) - self.btn_stst.bind('', empty_list_start_leave) - self.lb_rename.bind('', rename_no_active_enter) - self.lb_rename.bind('', rename_no_active_leave) - self.lb_rename.insert(0, _('Max. 12 characters!')) + self.wg_autostart.configure(state="disabled") + self.lb_rename.configure(state="disabled") + self.l_box.bind("", list_empty_enter) + self.l_box.bind("", list_empty_leave) + self.wg_autostart.bind("", chk_enter) + self.wg_autostart.bind("", chk_leave) + self.btn_tr.bind("", empty_list_enter) + self.btn_tr.bind("", empty_list_leave) + self.btn_exp.bind("", empty_list_enter) + self.btn_exp.bind("", empty_list_leave) + self.btn_stst.bind("", empty_list_start_enter) + self.btn_stst.bind("", empty_list_start_leave) + self.lb_rename.bind("", rename_no_active_enter) + self.lb_rename.bind("", rename_no_active_leave) + self.lb_rename.insert(0, _("Max. 12 characters!")) - if self.a != '' and self.a == select_tl: - self.StrVar.set(value='') + if self.a != "" and self.a == select_tl: + self.StrVar.set(value="") self.start() self.l_box.update() - ''' Address Label ''' - self.add.set('') - self.DNS.set('') - self.enp.set('') + """ Address Label """ + self.add.set("") + self.DNS.set("") + self.enp.set("") return select_tl except IndexError: @@ -526,143 +601,168 @@ class FrameWidgets(ttk.Frame): if self.l_box.size() != 0: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Select tunnel') - msg_t = _('Please select a tunnel from the list') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Select tunnel") + msg_t = _("Please select a tunnel from the list") msg_window(iw, ii, wt, msg_t) else: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Select tunnel') - msg_t = _('Please first import tunnel') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Select tunnel") + msg_t = _("Please first import tunnel") msg_window(iw, ii, wt, msg_t) - ''' Button Trash ''' - self.btn_tr = ttk.Button(self.lb_frame_btn_lbox, image=self.tr_pic, command=delete, padding=0, - style='CButton.TButton') + """ Button Trash """ + self.btn_tr = ttk.Button( + self.lb_frame_btn_lbox, + image=self.tr_pic, + command=delete, + padding=0, + style="CButton.TButton", + ) self.btn_tr.grid(column=0, row=2, padx=15, pady=8) def empty_list_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('No tunnels to delete in the list')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("No tunnels to delete in the list") + ) def empty_list_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def del_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('Click to delete a Wireguard Tunnel\nSelect from the list!')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("Click to delete a Wireguard Tunnel\nSelect from the list!"), + ) def del_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() if self.l_box.size() == 0: - self.btn_tr.bind('', empty_list_enter) - self.btn_tr.bind('', empty_list_leave) + self.btn_tr.bind("", empty_list_enter) + self.btn_tr.bind("", empty_list_leave) else: - self.btn_tr.bind('', del_enter) - self.btn_tr.bind('', del_leave) + self.btn_tr.bind("", del_enter) + self.btn_tr.bind("", del_leave) - ''' Button Export ''' - self.btn_exp = ttk.Button(self.lb_frame_btn_lbox, image=self.exp_pic, command=Tunnel.export, padding=0) + """ Button Export """ + self.btn_exp = ttk.Button( + self.lb_frame_btn_lbox, image=self.exp_pic, command=Tunnel.export, padding=0 + ) self.btn_exp.grid(column=0, row=3, padx=15, pady=8) def empty_list_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('No Tunnels in List for Export')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("No Tunnels in List for Export") + ) def empty_list_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def exp_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _(' Click to export all\nWireguard Tunnel to Zipfile')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _(" Click to export all\nWireguard Tunnel to Zipfile"), + ) def exp_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() if self.l_box.size() == 0: - self.btn_exp.bind('', empty_list_enter) - self.btn_exp.bind('', empty_list_leave) + self.btn_exp.bind("", empty_list_enter) + self.btn_exp.bind("", empty_list_leave) else: - self.btn_exp.bind('', exp_enter) - self.btn_exp.bind('', exp_leave) + self.btn_exp.bind("", exp_enter) + self.btn_exp.bind("", exp_leave) - ''' Label Entry ''' + """ Label Entry """ self.lb_rename = ttk.Entry(self.lb_frame4, width=20) - self.lb_rename.grid(column=2, row=0, padx=8, pady=10, sticky='ne') - self.lb_rename.insert(0, _('Max. 12 characters!')) - self.lb_rename.config(state='disable') + self.lb_rename.grid(column=2, row=0, padx=8, pady=10, sticky="ne") + self.lb_rename.insert(0, _("Max. 12 characters!")) + self.lb_rename.config(state="disable") def rename_no_active_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def rename_no_active_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('To rename a tunnel, at least one must be in the list')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("To rename a tunnel, at least one must be in the list"), + ) def rename_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('To rename a tunnel, you need to\nselect a tunnel from the list')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("To rename a tunnel, you need to\nselect a tunnel from the list"), + ) def rename_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() if self.l_box.size() != 0: - self.lb_rename.bind('', rename_enter) - self.lb_rename.bind('', rename_leave) + self.lb_rename.bind("", rename_enter) + self.lb_rename.bind("", rename_leave) else: - self.lb_rename.bind('', rename_no_active_enter) - self.lb_rename.bind('', rename_no_active_leave) + self.lb_rename.bind("", rename_no_active_enter) + self.lb_rename.bind("", rename_no_active_leave) def tl_rename(): - special_characters = ['\\', '/', '{', '}', ' '] + special_characters = ["\\", "/", "{", "}", " "] if len(self.lb_rename.get()) > 12: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Renaming not possible') - msg_t = _('The new name may contain only 12 characters') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Renaming not possible") + msg_t = _("The new name may contain only 12 characters") msg_window(iw, ii, wt, msg_t) elif len(self.lb_rename.get()) == 0: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Renaming not possible') - msg_t = _('At least one character must be entered') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Renaming not possible") + msg_t = _("At least one character must be entered") msg_window(iw, ii, wt, msg_t) elif any(ch in special_characters for ch in self.lb_rename.get()): """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Renaming not possible') - msg_t = _('No valid sign. These must not be used.\nBlank, Slash, Backslash and { }\n') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Renaming not possible") + msg_t = _( + "No valid sign. These must not be used.\nBlank, Slash, Backslash and { }\n" + ) msg_window(iw, ii, wt, msg_t) else: @@ -671,28 +771,42 @@ class FrameWidgets(ttk.Frame): self.select_tunnel = self.l_box.curselection() select_tl = self.l_box.get(self.select_tunnel[0]) - ''' nmcli connection modify old connection.id iphone ''' - check_call(['nmcli', 'connection', 'modify', select_tl, 'connection.id', self.lb_rename.get()]) - source = Path('/tmp/tlecdcwg') / str(select_tl + '.conf') - destination = source.with_name(str(self.lb_rename.get() + '.conf')) + """ nmcli connection modify old connection.id iphone """ + check_call( + [ + "nmcli", + "connection", + "modify", + select_tl, + "connection.id", + self.lb_rename.get(), + ] + ) + source = Path("/tmp/tlecdcwg") / str(select_tl + ".conf") + destination = source.with_name(str(self.lb_rename.get() + ".conf")) source.replace(destination) - Path.unlink(str(Path.home()) + '/.config/wire_py/' + str(select_tl + '.dat')) + Path.unlink( + str(Path.home()) + "/.config/wire_py/" + str(select_tl + ".dat") + ) self.l_box.delete(self.select_tunnel[0]) self.l_box.insert("end", self.lb_rename.get()) self.l_box.update() new_a_connect = self.lb_rename.get() self.lb_rename.delete(0, tk.END) - if self.a != '' and self.a == select_tl: + if self.a != "" and self.a == select_tl: self.a = Tunnel.active() self.StrVar.set(value=self.a) - with open(wg_set, 'r') as set_file5: + with open(wg_set, "r") as set_file5: lines5 = set_file5.readlines() - if select_tl == lines5[7].strip() and 'off\n' not in lines5[7].strip(): + if ( + select_tl == lines5[7].strip() + and "off\n" not in lines5[7].strip() + ): lines5[7] = new_a_connect - with open(wg_set, 'w') as theme_set5: + with open(wg_set, "w") as theme_set5: theme_set5.writelines(lines5) self.autoconnect_var.set(value=new_a_connect) - + Create.encrypt() return select_tl @@ -700,70 +814,95 @@ class FrameWidgets(ttk.Frame): except IndexError: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Renaming not possible') - msg_t = _('Please select a tunnel from the list') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Renaming not possible") + msg_t = _("Please select a tunnel from the list") msg_window(iw, ii, wt, msg_t) - ''' Button Rename ''' - self.btn_rename = ttk.Button(self.lb_frame4, text=_('Rename'), state='disable', command=tl_rename, padding=4, - style='RnButton.TButton') - self.btn_rename.grid(column=3, row=0, padx=5, pady=10, sticky='ne') + """ Button Rename """ + self.btn_rename = ttk.Button( + self.lb_frame4, + text=_("Rename"), + state="disable", + command=tl_rename, + padding=4, + style="RnButton.TButton", + ) + self.btn_rename.grid(column=3, row=0, padx=5, pady=10, sticky="ne") - ''' Check Buttons ''' + """ Check Buttons """ self.selected_option = tk.IntVar() self.autoconnect_var = tk.StringVar() self.autoconnect_var.set(self.auto_con) - ''' Frame for Labels, Entry and Button''' - self.autoconnect = ttk.Label(self.lb_frame3, textvariable=self.autoconnect_var, width=15) - self.autoconnect.config(font=('Ubuntu', 11)) - self.autoconnect.grid(column=1, row=0, sticky='e', pady=19) - self.wg_autostart = ttk.Checkbutton(self.lb_frame3, text=_('Autoconnect on:'), variable=self.selected_option, - command=self.box_set) - self.wg_autostart.grid(column=0, row=0, pady=15, padx=15, sticky='nw') + """ Frame for Labels, Entry and Button""" + self.autoconnect = ttk.Label( + self.lb_frame3, textvariable=self.autoconnect_var, width=15 + ) + self.autoconnect.config(font=("Ubuntu", 11)) + self.autoconnect.grid(column=1, row=0, sticky="e", pady=19) + self.wg_autostart = ttk.Checkbutton( + self.lb_frame3, + text=_("Autoconnect on:"), + variable=self.selected_option, + command=self.box_set, + ) + self.wg_autostart.grid(column=0, row=0, pady=15, padx=15, sticky="nw") def chk_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('You must have at least one\n' - 'tunnel in the list,to use the autostart')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _( + "You must have at least one\n" + "tunnel in the list,to use the autostart" + ), + ) def chk_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() if self.l_box.size() >= 1 and len(self.l_box.curselection()) >= 1: + def chk_a_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('To use the autostart, enable this Checkbox')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("To use the autostart, enable this Checkbox"), + ) def chk_a_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.wg_autostart.bind('', chk_a_enter) - self.wg_autostart.bind('', chk_a_leave) + self.wg_autostart.bind("", chk_a_enter) + self.wg_autostart.bind("", chk_a_leave) if self.l_box.size() == 0: - self.wg_autostart.bind('', chk_enter) - self.wg_autostart.bind('', chk_leave) + self.wg_autostart.bind("", chk_enter) + self.wg_autostart.bind("", chk_leave) else: + def chk_a_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('To use the autostart, a tunnel must be selected from the list')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("To use the autostart, a tunnel must be selected from the list"), + ) def chk_a_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.wg_autostart.bind('', chk_a_enter) - self.wg_autostart.bind('', chk_a_leave) + self.wg_autostart.bind("", chk_a_enter) + self.wg_autostart.bind("", chk_a_leave) self.on_off() @@ -782,152 +921,237 @@ class FrameWidgets(ttk.Frame): Create.dir_and_files() try: - filepath = filedialog.askopenfilename(initialdir=str(Path.home()), title=_('Select Wireguard config File'), - filetypes=[(_('WG config files'), '*.conf')], ) + filepath = filedialog.askopenfilename( + initialdir=str(Path.home()), + title=_("Select Wireguard config File"), + filetypes=[(_("WG config files"), "*.conf")], + ) - with open(filepath, 'r') as file: + with open(filepath, "r") as file: read = file.read() - path_split = filepath.split('/') + path_split = filepath.split("/") path_split1 = path_split[-1] self.a = Tunnel.active() - if 'PrivateKey = ' in read and 'PublicKey = ' in read and 'Endpoint =' in read: - with open(filepath, 'r') as file: + if ( + "PrivateKey = " in read + and "PublicKey = " in read + and "Endpoint =" in read + ): + with open(filepath, "r") as file: key = Tunnel.con_to_dict(file) pre_key = key[3] if len(pre_key) != 0: - with open(str(Path.home()) + '/.config/wire_py/keys', 'r') as readfile: + with open( + str(Path.home()) + "/.config/wire_py/keys", "r" + ) as readfile: p_key = readfile.readlines() - if pre_key in p_key or pre_key + '\n' in p_key: + if pre_key in p_key or pre_key + "\n" in p_key: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/error.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Import Error') - msg_t = _('Tunnel already available!\nPlease use another file for import') + iw = r"/usr/share/icons/lx-icons/64/error.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Import Error") + msg_t = _( + "Tunnel already available!\nPlease use another file for import" + ) msg_window(iw, ii, wt, msg_t) else: - with open(str(Path.home()) + '/.config/wire_py/keys', 'a') as keyfile: - keyfile.write(pre_key + '\r') + with open( + str(Path.home()) + "/.config/wire_py/keys", "a" + ) as keyfile: + keyfile.write(pre_key + "\r") if len(path_split1) > 17: - p1 = shutil.copy(filepath, '/tmp/tlecdcwg/') - path_split = path_split1[len(path_split1) - 17:] - os.rename(p1, '/tmp/tlecdcwg/' + str(path_split)) - new_conf = '/tmp/tlecdcwg/' + path_split - if self.a != '': - check_call(['nmcli', 'connection', 'down', Tunnel.active()]) + p1 = shutil.copy(filepath, "/tmp/tlecdcwg/") + path_split = path_split1[ + len(path_split1) - 17 : + ] + os.rename( + p1, "/tmp/tlecdcwg/" + str(path_split) + ) + new_conf = "/tmp/tlecdcwg/" + path_split + if self.a != "": + check_call( + [ + "nmcli", + "connection", + "down", + Tunnel.active(), + ] + ) self.label_empty() - subprocess.check_output(['nmcli', 'connection', 'import', 'type', - 'wireguard', 'file', new_conf], text=True) - - Create.encrypt() - - else: - shutil.copy(filepath, '/tmp/tlecdcwg/') - if self.a != '': - check_call(['nmcli', 'connection', 'down', Tunnel.active()]) - self.label_empty() - - subprocess.check_output(['nmcli', 'connection', 'import', 'type', - 'wireguard', 'file', filepath], text=True) + subprocess.check_output( + [ + "nmcli", + "connection", + "import", + "type", + "wireguard", + "file", + new_conf, + ], + text=True, + ) Create.encrypt() - self.StrVar.set('') + else: + shutil.copy(filepath, "/tmp/tlecdcwg/") + if self.a != "": + check_call( + [ + "nmcli", + "connection", + "down", + Tunnel.active(), + ] + ) + self.label_empty() + + subprocess.check_output( + [ + "nmcli", + "connection", + "import", + "type", + "wireguard", + "file", + filepath, + ], + text=True, + ) + + Create.encrypt() + + self.StrVar.set("") self.a = Tunnel.active() self.l_box.insert(0, self.a) - self.wg_autostart.configure(state='normal') + self.wg_autostart.configure(state="normal") self.l_box.selection_clear(0, tk.END) self.l_box.update() self.l_box.selection_set(0) def chk_a_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('To use the autostart, enable this ' - 'Checkbox')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _( + "To use the autostart, enable this " + "Checkbox" + ), + ) def chk_a_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def list_info_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('List of available tunnels')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("List of available tunnels"), + ) def list_info_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def del_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('Click to delete a Wireguard ' - 'Tunnel\nSelect from the list!')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _( + "Click to delete a Wireguard " + "Tunnel\nSelect from the list!" + ), + ) def del_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def exp_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _(' Click to export ' - 'all\nWireguard Tunnel to Zipfile')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _( + " Click to export " + "all\nWireguard Tunnel to Zipfile" + ), + ) def exp_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def rename_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, - _('To rename a tunnel, you need to\n' - 'select a tunnel from the list')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _( + "To rename a tunnel, you need to\n" + "select a tunnel from the list" + ), + ) def rename_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.wg_autostart.bind('', chk_a_enter) - self.wg_autostart.bind('', chk_a_leave) - self.l_box.bind('', list_info_enter) - self.l_box.bind('', list_info_leave) - self.btn_tr.bind('', del_enter) - self.btn_tr.bind('', del_leave) - self.btn_exp.bind('', exp_enter) - self.btn_exp.bind('', exp_leave) - self.lb_rename.bind('', rename_enter) - self.lb_rename.bind('', rename_leave) - self.lb_rename.insert(0, 'Max. 12 characters!') + self.wg_autostart.bind("", chk_a_enter) + self.wg_autostart.bind("", chk_a_leave) + self.l_box.bind("", list_info_enter) + self.l_box.bind("", list_info_leave) + self.btn_tr.bind("", del_enter) + self.btn_tr.bind("", del_leave) + self.btn_exp.bind("", exp_enter) + self.btn_exp.bind("", exp_leave) + self.lb_rename.bind("", rename_enter) + self.lb_rename.bind("", rename_leave) + self.lb_rename.insert(0, "Max. 12 characters!") self.StrVar = tk.StringVar() self.StrVar.set(self.a) self.color_label() self.stop() - wg_read = '/tmp/tlecdcwg/' + str(self.a + '.conf') - with open(wg_read, 'r') as file_for_key: + wg_read = "/tmp/tlecdcwg/" + str(self.a + ".conf") + with open(wg_read, "r") as file_for_key: data = Tunnel.con_to_dict(file_for_key) - ''' Address Label ''' + """ Address Label """ self.init_and_report(data) self.show_data() - check_call(['nmcli', 'con', 'mod', self.a, 'connection.autoconnect', 'no']) + check_call( + [ + "nmcli", + "con", + "mod", + self.a, + "connection.autoconnect", + "no", + ] + ) Path.chmod(wg_read, 0o600) - if 'PrivateKey = ' and 'Endpoint = ' not in read: + if "PrivateKey = " and "Endpoint = " not in read: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/error.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Import Error') - msg_t = _('Oh... no valid Wireguard File!\nPlease select a valid Wireguard File') + iw = r"/usr/share/icons/lx-icons/64/error.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Import Error") + msg_t = _( + "Oh... no valid Wireguard File!\nPlease select a valid Wireguard File" + ) msg_window(iw, ii, wt, msg_t) except EOFError: @@ -938,8 +1162,8 @@ class FrameWidgets(ttk.Frame): pass except subprocess.CalledProcessError: - print('Tunnel exist!') - + print("Tunnel exist!") + def box_set(self): """ This Method will display the autostart label which @@ -951,22 +1175,22 @@ class FrameWidgets(ttk.Frame): select_tl = self.l_box.get(select_tunnel[0]) if self.selected_option.get() == 0: - with open(wg_set, 'r') as set_file3: + with open(wg_set, "r") as set_file3: lines3 = set_file3.readlines() - lines3[7] = 'off\n' - with open(wg_set, 'w') as set_file3: + lines3[7] = "off\n" + with open(wg_set, "w") as set_file3: set_file3.writelines(lines3) tl = Tunnel.list() if len(tl) == 0: - self.wg_autostart.configure(state='disabled') + self.wg_autostart.configure(state="disabled") if self.selected_option.get() >= 1: - with open(wg_set, 'r') as set_file3: + with open(wg_set, "r") as set_file3: lines3 = set_file3.readlines() lines3[7] = select_tl - with open(wg_set, 'w') as set_file3: + with open(wg_set, "w") as set_file3: set_file3.writelines(lines3) except IndexError: @@ -980,26 +1204,31 @@ class FrameWidgets(ttk.Frame): Set (on), the selected tunnel is displayed in the label. At (off) the label is first emptied then filled with No Autoconnect """ - with open(wg_set, 'r') as set_file4: + with open(wg_set, "r") as set_file4: lines4 = set_file4.readlines() - if lines4[7] != 'off\n': + if lines4[7] != "off\n": print(lines4[7]) self.selected_option.set(1) - self.autoconnect_var.set('') + self.autoconnect_var.set("") self.auto_con = lines4[7] else: self.selected_option.set(0) - self.auto_con = _('no Autoconnect') + self.auto_con = _("no Autoconnect") - self.autoconnect_var.set('') + self.autoconnect_var.set("") self.autoconnect_var = tk.StringVar() self.autoconnect_var.set(self.auto_con) - self.autoconnect = ttk.Label(self.lb_frame3, textvariable=self.autoconnect_var, foreground='#0071ff', width=15) - self.autoconnect.config(font=('Ubuntu', 11)) - self.autoconnect.grid(column=1, row=0, sticky='e', pady=19) + self.autoconnect = ttk.Label( + self.lb_frame3, + textvariable=self.autoconnect_var, + foreground="#0071ff", + width=15, + ) + self.autoconnect.config(font=("Ubuntu", 11)) + self.autoconnect.grid(column=1, row=0, sticky="e", pady=19) def init_and_report(self, data=None): """ @@ -1009,136 +1238,162 @@ class FrameWidgets(ttk.Frame): """ Address Label """ self.add = tk.StringVar() - self.add.set(_('Address: ') + data[0]) + self.add.set(_("Address: ") + data[0]) self.DNS = tk.StringVar() - self.DNS.set(' DNS: ' + data[1]) + self.DNS.set(" DNS: " + data[1]) self.enp = tk.StringVar() - self.enp.set(_('Endpoint: ') + data[2]) + self.enp.set(_("Endpoint: ") + data[2]) def label_empty(self): - self.add.set('') - self.DNS.set('') - self.enp.set('') + self.add.set("") + self.DNS.set("") + self.enp.set("") def show_data(self): - """ Address Label """ - self.address = ttk.Label(self.lb_frame, textvariable=self.add, foreground='#0071ff') - self.address.grid(column=0, row=5, sticky='w', padx=10, pady=6) - self.address.config(font=('Ubuntu', 9)) + """Address Label""" + self.address = ttk.Label( + self.lb_frame, textvariable=self.add, foreground="#0071ff" + ) + self.address.grid(column=0, row=5, sticky="w", padx=10, pady=6) + self.address.config(font=("Ubuntu", 9)) - ''' DNS Label ''' - self.dns = ttk.Label(self.lb_frame, textvariable=self.DNS, foreground='#0071ff') - self.dns.grid(column=0, row=7, sticky='w', padx=10, pady=6) - self.dns.config(font=('Ubuntu', 9)) + """ DNS Label """ + self.dns = ttk.Label(self.lb_frame, textvariable=self.DNS, foreground="#0071ff") + self.dns.grid(column=0, row=7, sticky="w", padx=10, pady=6) + self.dns.config(font=("Ubuntu", 9)) - ''' Endpoint Label ''' - self.endpoint = ttk.Label(self.lb_frame2, textvariable=self.enp, foreground='#0071ff') - self.endpoint.grid(column=0, row=8, sticky='w', padx=10, pady=20) - self.endpoint.config(font=('Ubuntu', 9)) + """ Endpoint Label """ + self.endpoint = ttk.Label( + self.lb_frame2, textvariable=self.enp, foreground="#0071ff" + ) + self.endpoint.grid(column=0, row=8, sticky="w", padx=10, pady=20) + self.endpoint.config(font=("Ubuntu", 9)) def stop(self): - """ Stop Button """ - self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_stop, command=self.wg_switch, padding=0) + """Stop Button""" + self.btn_stst = ttk.Button( + self.lb_frame_btn_lbox, + image=self.wg_vpn_stop, + command=self.wg_switch, + padding=0, + ) self.btn_stst.grid(column=0, row=0, padx=5, pady=8) def stop_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('Click to stop selected Wireguard Tunnel')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("Click to stop selected Wireguard Tunnel") + ) def stop_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() - self.btn_stst.bind('', stop_enter) - self.btn_stst.bind('', stop_leave) + self.btn_stst.bind("", stop_enter) + self.btn_stst.bind("", stop_leave) def start(self): - """ Start Button """ - self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_start, command=self.wg_switch, padding=0) + """Start Button""" + self.btn_stst = ttk.Button( + self.lb_frame_btn_lbox, + image=self.wg_vpn_start, + command=self.wg_switch, + padding=0, + ) self.btn_stst.grid(column=0, row=0, padx=5, pady=8) def empty_list_start_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('No tunnels to start in the list')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, event.y_root, _("No tunnels to start in the list") + ) def empty_list_start_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() def start_enter(event): - """ The mouse moves into the entry widget """ - window.my_tool_tip = MyToolTip(event.x_root, event.y_root, _('Click to start selected Wireguard Tunnel')) + """The mouse moves into the entry widget""" + window.my_tool_tip = MyToolTip( + event.x_root, + event.y_root, + _("Click to start selected Wireguard Tunnel"), + ) def start_leave(_): - ''' The mouse moves into the entry widget ''' - ''' Remove Tool-Tip ''' + """The mouse moves into the entry widget""" + """ Remove Tool-Tip """ window.my_tool_tip.destroy() tl = Tunnel.list() if len(tl) == 0: - self.btn_stst.bind('', empty_list_start_enter) - self.btn_stst.bind('', empty_list_start_leave) + self.btn_stst.bind("", empty_list_start_enter) + self.btn_stst.bind("", empty_list_start_leave) else: - self.btn_stst.bind('', start_enter) - self.btn_stst.bind('', start_leave) + self.btn_stst.bind("", start_enter) + self.btn_stst.bind("", start_leave) def color_label(self): - """ View activ Tunnel in color green or yellow """ + """View activ Tunnel in color green or yellow""" - with open(wg_set, 'r') as read_file: + with open(wg_set, "r") as read_file: lines = read_file.readlines() - if 'light\n' in lines: - self.lb_tunnel = ttk.Label(self, textvariable=self.StrVar, foreground='green') + if "light\n" in lines: + self.lb_tunnel = ttk.Label( + self, textvariable=self.StrVar, foreground="green" + ) else: - self.lb_tunnel = ttk.Label(self, textvariable=self.StrVar, foreground='yellow') + self.lb_tunnel = ttk.Label( + self, textvariable=self.StrVar, foreground="yellow" + ) - self.lb_tunnel.config(font=('Ubuntu', 11, 'bold')) + self.lb_tunnel.config(font=("Ubuntu", 11, "bold")) self.lb_tunnel.grid(column=2, padx=10, row=1) def wg_switch(self): self.a = Tunnel.active() try: - if self.a == '': + if self.a == "": self.start() self.select_tunnel = self.l_box.curselection() select_tl = self.l_box.get(self.select_tunnel[0]) - check_call(['nmcli', 'connection', 'up', select_tl]) - wg_read = '/tmp/tlecdcwg/' + str(select_tl + '.conf') - with open(wg_read, 'r') as file: + check_call(["nmcli", "connection", "up", select_tl]) + wg_read = "/tmp/tlecdcwg/" + str(select_tl + ".conf") + with open(wg_read, "r") as file: data = Tunnel.con_to_dict(file) - ''' Address Label ''' + """ Address Label """ self.init_and_report(data) self.show_data() - ''' Button Start/Stop ''' + """ Button Start/Stop """ self.stop() self.a = Tunnel.active() self.StrVar = tk.StringVar() self.StrVar.set(self.a) self.color_label() - elif self.a != '': + elif self.a != "": - ''' Button Start/Stop ''' + """Button Start/Stop""" self.stop() - check_call(['nmcli', 'connection', 'down', self.a]) + check_call(["nmcli", "connection", "down", self.a]) - ''' Button Start/Stop ''' + """ Button Start/Stop """ self.start() self.a = Tunnel.active() - self.StrVar.set('') + self.StrVar.set("") self.color_label() - ''' Address Label ''' - self.add.set('') - self.DNS.set('') - self.enp.set('') + """ Address Label """ + self.add.set("") + self.DNS.set("") + self.enp.set("") self.show_data() except IndexError: @@ -1146,19 +1401,19 @@ class FrameWidgets(ttk.Frame): if self.l_box.size() != 0: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Select tunnel') - msg_t = _('Please select a tunnel from the list') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Select tunnel") + msg_t = _("Please select a tunnel from the list") msg_window(iw, ii, wt, msg_t) else: """img_w, img_i, w_title, w_txt hand over""" - iw = r'/usr/share/icons/lx-icons/64/info.png' - ii = r'/usr/share/icons/lx-icons/48/wg_msg.png' - wt = _('Select tunnel') - msg_t = _('Please first import tunnel') + iw = r"/usr/share/icons/lx-icons/64/info.png" + ii = r"/usr/share/icons/lx-icons/48/wg_msg.png" + wt = _("Select tunnel") + msg_t = _("Please first import tunnel") msg_window(iw, ii, wt, msg_t) @@ -1179,11 +1434,14 @@ class MyToolTip(tk.Toplevel): tk.Toplevel.__init__(self) self.overrideredirect(True) - self.message_label = ttk.Label(self, compound='left', text=self.message, padding=6) + self.message_label = ttk.Label( + self, compound="left", text=self.message, padding=6 + ) self.message_label.pack() - self.geometry("+%d+%d" % (self.x_pos + self.TIP_X_OFFSET, - self.y_pos + self.TIP_X_OFFSET)) + self.geometry( + "+%d+%d" % (self.x_pos + self.TIP_X_OFFSET, self.y_pos + self.TIP_X_OFFSET) + ) if self.auto_clear: self.after(self.AUTO_CLEAR_TIME, self.clear_tip) @@ -1191,22 +1449,22 @@ class MyToolTip(tk.Toplevel): def clear_tip(self): """Remove Tool-Tip""" self.destroy() - -if __name__ == '__main__': + +if __name__ == "__main__": window = Wirepy() """ the hidden files are hidden in Filedialog """ try: - window.tk.call('tk_getOpenFile', '-foobarbaz') + window.tk.call("tk_getOpenFile", "-foobarbaz") except TclError: pass - window.tk.call('set', '::tk::dialog::file::showHiddenBtn', '0') - window.tk.call('set', '::tk::dialog::file::showHiddenVar', '0') + window.tk.call("set", "::tk::dialog::file::showHiddenBtn", "0") + window.tk.call("set", "::tk::dialog::file::showHiddenVar", "0") window.mainloop() shutil.rmtree(dirname) -Path.unlink('/tmp/.loguser') -sys.exit(0) \ No newline at end of file +Path.unlink("/tmp/.loguser") +sys.exit(0)