diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3af9204..e22a54e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,8 +5,12 @@ - + + + + + - { + "keyToString": { + "ASKED_ADD_EXTERNAL_FILES": "true", + "Python.INSTALL.executor": "Run", + "Python.cls_mth_fc.executor": "Run", + "Python.install.executor": "Run", + "Python.main.executor": "Run", + "Python.messagebox.executor": "Run", + "Python.start_wg.executor": "Run", + "Python.testtheme.executor": "Run", + "Python.wg_func.executor": "Run", + "Python.wg_main.executor": "Run", + "Python.wirepy.executor": "Run", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.git.unshallow": "true", + "Shell Script.install.executor": "Run", + "Shell Script.run_as.executor": "Run", + "git-widget-placeholder": "28-04-2025-more-methods-and-optimize-methods", + "last_opened_file_path": "/home/punix/Pyapps/wire-py", + "settings.editor.selected.configurable": "ml.llm.LLMConfigurable" } -}]]> +} diff --git a/__pycache__/cls_mth_fc.cpython-312.pyc b/__pycache__/cls_mth_fc.cpython-312.pyc index 3e3e5a9..b250738 100644 Binary files a/__pycache__/cls_mth_fc.cpython-312.pyc and b/__pycache__/cls_mth_fc.cpython-312.pyc differ diff --git a/__pycache__/manage_tunnel.cpython-312.pyc b/__pycache__/manage_tunnel.cpython-312.pyc new file mode 100644 index 0000000..50273d0 Binary files /dev/null and b/__pycache__/manage_tunnel.cpython-312.pyc differ diff --git a/__pycache__/wp_app_config.cpython-312.pyc b/__pycache__/wp_app_config.cpython-312.pyc index 92aa7ca..a42c96c 100644 Binary files a/__pycache__/wp_app_config.cpython-312.pyc and b/__pycache__/wp_app_config.cpython-312.pyc differ diff --git a/cls_mth_fc.py b/cls_mth_fc.py index 6869907..cb89a1d 100755 --- a/cls_mth_fc.py +++ b/cls_mth_fc.py @@ -180,24 +180,15 @@ class LxTools(tk.Tk): else: tip = True return tip - - - def theme_change(self) -> None: - - lines = AppConfig.SETTINGS_FILE.read_text() - if "light\n" in lines: - self.tk.call("set_theme", "light") - else: - self.tk.call("set_theme", "dark") @staticmethod - def msg_window(img_w: str, img_i: str, w_title: str, w_txt: str, txt2: Optional[str] = None, + def msg_window(image_path: Path, image_path2: Path, w_title: str, w_txt: str, txt2: Optional[str] = None, com: Optional[str] = None) -> None: """ Creates message windows - :argument img_w = Image for TK window which is displayed to the left of the text - :argument img_i = Image for Task Icon + :argument AppConfig.IMAGE_PATHS["icon_info"] = Image for TK window which is displayed to the left of the text + :argument AppConfig.IMAGE_PATHS["icon_vpn"] = Image for Task Icon :argument w_title = Windows Title :argument w_txt = Text for Tk Window :argument txt2 = Text for Button two @@ -207,7 +198,7 @@ class LxTools(tk.Tk): msg.resizable(width=False, height=False) msg.title(w_title) msg.configure(pady=15, padx=15) - msg.img = tk.PhotoImage(file=img_w) + msg.img = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_info"]) msg.i_window = tk.Label(msg, image=msg.img) label: tk.Label = tk.Label(msg, text=w_txt) @@ -228,8 +219,8 @@ class LxTools(tk.Tk): button: ttk.Button = ttk.Button(msg, text="OK", command=msg.destroy, padding=4) button.grid(column=0, columnspan=2, row=1) - img_i: tk.PhotoImage = tk.PhotoImage(file=img_i) - msg.iconphoto(True, img_i) + AppConfig.IMAGE_PATHS["icon_vpn"]: tk.PhotoImage = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_vpn"]) + msg.iconphoto(True, AppConfig.IMAGE_PATHS["icon_vpn"]) msg.columnconfigure(0, weight=1) msg.rowconfigure(0, weight=1) msg.winfo_toplevel() @@ -278,85 +269,10 @@ class LxTools(tk.Tk): signal.signal(signal.SIGHUP, signal_handler) -class GiteaUpdate: - """ - Calling download requests the download URL of the running script, - 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: str, version: str, file: Optional[Path] = None) -> str: - """ - Checks for updates via API - - Args: - update_api_url: Update API URL - version: Current version - file: Optional - Configuration file - - Returns: - New version or status message - """ - try: - response: requests.Response = requests.get(update_api_url, timeout=10) - response_dict: Any = response.json() - response_dict: Dict[str, Any] = response_dict[0] - with open(file, "r", encoding="utf-8") as set_f: - set_f = set_f.read() - if "on\n" in set_f: - if version[3:] != response_dict["tag_name"]: - req: str = response_dict["tag_name"] - else: - req: str = "No Updates" - else: - req: str = "False" - return req - except requests.exceptions.RequestException: - req: str = "No Internet Connection!" - return req - - @staticmethod - def download(urld: str, res: str, img_w: str = None, img_i: str = None, img_w2: str = None, img_i2: str = None) -> None: - """ - Downloads new version of wirepy - - Args: - urld: Download URL - res: Result filename - img_w: Image for TK window which is displayed to the left of the text - img_i: Image for Task Icon - img_w2: Image for TK window which is displayed to the left of the text - img_i2: Image for Task Icon - """ - try: - to_down: str = f"wget -qP {Path.home()} {" "} {urld}" - result: int = subprocess.call(to_down, shell=True) - if result == 0: - shutil.chown(f"{Path.home()}/{res}.zip", 1000, 1000) - - wt: str = _("Download Successful") - msg_t: str = _("Your zip file is in home directory") - LxTools.msg_window(img_w, img_i, wt, msg_t) - - else: - - wt: str = _("Download error") - msg_t: str = _("Download failed! Please try again") - LxTools.msg_window(img_w2, img_i2, wt, msg_t) - - except subprocess.CalledProcessError: - - wt: str = _("Download error") - msg_t: str = _("Download failed! No internet connection!") - LxTools.msg_window(img_w2, img_i2, wt, msg_t) - - class Tunnel: """ Class of Methods for Wire-Py - """ - + """ @classmethod def con_to_dict(cls, file: TextIO) -> Tuple[str, str, str, Optional[str]]: """ @@ -426,16 +342,17 @@ class Tunnel: return wg_s @staticmethod - def export(img_w: str = None, img_i: str = None, img_w2: str = None, img_i2: str = None, sl: str = None, pfit:str = None) -> None: + def export(image_path: Path = None, image_path2: Path = None, image_path3: Path = None, image_path4: Path = None, + title: Dict = None, window_msg: Dict = None) -> None: """ This will export the tunnels. A zipfile with the current date and time is created in the user's home directory with the correct right Args: - img_w: Image for TK window which is displayed to the left of the text - img_i: Image for Task Icon - img_w2: Image for TK window which is displayed to the left of the text - img_i2: Image for Task Icon + AppConfig.IMAGE_PATHS["icon_info"]: Image for TK window which is displayed to the left of the text + AppConfig.IMAGE_PATHS["icon_vpn"]: Image for Task Icon + AppConfig.IMAGE_PATHS["icon_error"]: Image for TK window which is displayed to the left of the text + AppConfig.IMAGE_PATHS["icon_msg"]: Image for Task Icon """ now_time: datetime = datetime.now() now_datetime: str = now_time.strftime("wg-exp-%m-%d-%Y-%H:%M") @@ -451,20 +368,95 @@ class Tunnel: with zipfile.ZipFile(f"{wg_tar}.zip", "r") as zf: if len(zf.namelist()) != 0: - LxTools.msg_window(img_w, img_i, Msg.STR["exp_succ"], Msg.STR["exp_in_home"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_vpn"], Msg.STR["exp_succ"], Msg.STR["exp_in_home"]) else: - LxTools.msg_window(img_w2, img_i2, Msg.STR["exp_err"], Msg.STR["exp_try"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["exp_err"], Msg.STR["exp_try"]) else: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["tl_first"]) except TypeError: pass +class GiteaUpdate: + """ + Calling download requests the download URL of the running script, + 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: str, version: str, file: Optional[Path] = None) -> str: + """ + Checks for updates via API + + Args: + update_api_url: Update API URL + version: Current version + file: Optional - Configuration file + + Returns: + New version or status message + """ + try: + response: requests.Response = requests.get(update_api_url, timeout=10) + response_dict: Any = response.json() + response_dict: Dict[str, Any] = response_dict[0] + with open(file, "r", encoding="utf-8") as set_f: + set_f = set_f.read() + if "on\n" in set_f: + if version[3:] != response_dict["tag_name"]: + req: str = response_dict["tag_name"] + else: + req: str = "No Updates" + else: + req: str = "False" + return req + except requests.exceptions.RequestException: + req: str = "No Internet Connection!" + return req + + @staticmethod + def download(urld: str, res: str, image_path: Path = None, image_path2: Path = None, image_path3: Path = None, + image_path4: Path = None) -> None: + """ + Downloads new version of wirepy + + Args: + urld: Download URL + res: Result filename + AppConfig.IMAGE_PATHS["icon_info"]: Image for TK window which is displayed to the left of the text + AppConfig.IMAGE_PATHS["icon_vpn"]: Image for Task Icon + AppConfig.IMAGE_PATHS["icon_error"]: Image for TK window which is displayed to the left of the text + AppConfig.IMAGE_PATHS["icon_msg"]: Image for Task Icon + """ + try: + to_down: str = f"wget -qP {Path.home()} {" "} {urld}" + result: int = subprocess.call(to_down, shell=True) + if result == 0: + shutil.chown(f"{Path.home()}/{res}.zip", 1000, 1000) + + wt: str = _("Download Successful") + msg_t: str = _("Your zip file is in home directory") + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_vpn"], wt, msg_t) + + else: + + wt: str = _("Download error") + msg_t: str = _("Download failed! Please try again") + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], wt, msg_t) + + except subprocess.CalledProcessError: + + wt: str = _("Download error") + msg_t: str = _("Download failed! No internet connection!") + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], wt, msg_t) + + class Tooltip: """ class for Tooltip diff --git a/manage_tunnel.py b/manage_tunnel.py new file mode 100644 index 0000000..04cdcb2 --- /dev/null +++ b/manage_tunnel.py @@ -0,0 +1,15 @@ +#!/usr/bin/python3 +from pathlib import Path +from subprocess import check_call +from tkinter import filedialog, ttk +from cls_mth_fc import Create, LxTools +from wp_app_config import AppConfig, Msg +import gettext +import locale +import os +import shutil +import subprocess +from typing import Optional, Dict, Any, NoReturn, TextIO, Tuple, List +# Translate +_ = AppConfig.setup_translations() + diff --git a/ssl_decrypt.py b/ssl_decrypt.py index 42015fd..66c5902 100755 --- a/ssl_decrypt.py +++ b/ssl_decrypt.py @@ -12,11 +12,11 @@ uname: Path = Path("/tmp/.log_user") log_name = Path(uname).read_text(encoding="utf-8") keyfile: Path = Path(f"/home/{log_name}/.config/wire_py/pbwgk.pem") -PKEYFILE: Path = "/usr/local/etc/ssl/pwgk.pem" +#PKEYFILE: Path = "/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", AppConfig.SYSTEM_PATHS["pkey_path"], "-out", keyfile, "-outform", "PEM", "-pubout"]) shutil.chown(keyfile, 1000, 1000) AppConfig.TEMP_DIR2 = f"/home/{log_name}/.config/wire_py/" @@ -29,6 +29,6 @@ if os.path.exists(f"{AppConfig.TEMP_DIR2}pbwgk.pem"): for detunnels in detl: tlname2 = f"{detunnels[:-4]}.conf" extpath = f"{AppConfig.TEMP_DIR}/{tlname2}" - check_call(["openssl", "pkeyutl", "-decrypt", "-inkey", PKEYFILE, "-in", detunnels, + check_call(["openssl", "pkeyutl", "-decrypt", "-inkey", AppConfig.SYSTEM_PATHS["pkey_path"], "-in", detunnels, "-out", extpath]) shutil.chown(extpath, 1000, 1000) diff --git a/ssl_encrypt.py b/ssl_encrypt.py index 2505a59..df62157 100755 --- a/ssl_encrypt.py +++ b/ssl_encrypt.py @@ -5,23 +5,22 @@ import os import shutil from pathlib import Path from subprocess import check_call - +from cls_mth_fc import LxTools from wp_app_config import AppConfig -uname: Path = Path("/tmp/.log_user") +#uname: Path = Path("/tmp/.log_user") -log_name = Path(uname).read_text(encoding="utf-8") +#log_name = AppConfig.USER_FILE.read_text(encoding="utf-8") -keyfile: Path = Path(f"/home/{log_name}/.config/wire_py/pbwgk.pem") -PKEYFILE = "/usr/local/etc/ssl/pwgk.pem" +keyfile: Path = Path(f"/home/{AppConfig.USER_FILE.read_text(encoding="utf-8")}/.config/wire_py/pbwgk.pem") if not keyfile.is_file(): - check_call(["openssl", "rsa", "-in", PKEYFILE, "-out", keyfile, "-outform", "PEM", "-pubout"]) + check_call(["openssl", "rsa", "-in", AppConfig.SYSTEM_PATHS["pkey_path"], "-out", keyfile, "-outform", "PEM", "-pubout"]) shutil.chown(keyfile, 1000, 1000) if AppConfig.TEMP_DIR.exists(): - tl = os.listdir(f"{AppConfig.TEMP_DIR}") + tl = LxTools.get_file_name(AppConfig.TEMP_DIR) CPTH: str = f"{keyfile}" CRYPTFILES: str = CPTH[:-9] diff --git a/wirepy.py b/wirepy.py index 144ac7e..101e3f8 100755 --- a/wirepy.py +++ b/wirepy.py @@ -14,31 +14,18 @@ from pathlib import Path from subprocess import check_call from tkinter import TclError, filedialog, ttk -from cls_mth_fc import (Create, GiteaUpdate, Tooltip, Tunnel, LxTools) +from cls_mth_fc import (Create, GiteaUpdate, Tunnel, Tooltip, LxTools) from wp_app_config import AppConfig, Msg LxTools.uos() Create.dir_and_files() Create.make_dir() Create.decrypt() - -tips = LxTools.if_tip(AppConfig.SETTINGS_FILE) - # 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year VERSION: str = "v. 2.04.1725" res = GiteaUpdate.api_down("https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases", VERSION, AppConfig.SETTINGS_FILE) -# Translate -_ = AppConfig.setup_translations() - -img_w: str = r"/usr/share/icons/lx-icons/64/info.png" -img_i: str = r"/usr/share/icons/lx-icons/48/wg_vpn.png" -img_w2: str = r"/usr/share/icons/lx-icons/64/error.png" -img_i2: str = r"/usr/share/icons/lx-icons/48/wg_msg.png" - -LxTools.sigi(AppConfig.TEMP_DIR, AppConfig.USER_FILE) - class Wirepy(tk.Tk): """ Class Wirepy this is the Main Window of wirepy @@ -58,7 +45,11 @@ class Wirepy(tk.Tk): self.rowconfigure(0, weight=1) self.style = ttk.Style(self) self.tk.call("source", f"{AppConfig.SYSTEM_PATHS["tcl_path"]}/water.tcl") - LxTools.theme_change(self) + lines = AppConfig.SETTINGS_FILE.read_text() + if "light\n" in lines: + self.tk.call("set_theme", "light") + else: + self.tk.call("set_theme", "dark") # Load the image file from the disk self.wg_icon = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_vpn"]) @@ -66,16 +57,18 @@ class Wirepy(tk.Tk): # Set it as the window icon self.iconphoto(True, self.wg_icon) - FrameWidgets(self).grid() + tips = LxTools.if_tip(AppConfig.SETTINGS_FILE) + FrameWidgets(self, tips_enabled=tips).grid() class FrameWidgets(ttk.Frame): """ ttk frame class for better structure """ - def __init__(self, container, **kwargs): + def __init__(self, container, tips_enabled=None, **kwargs): super().__init__(container, **kwargs) + self.tunnel = Tunnel() self.lb_tunnel = None self.btn_stst = None self.endpoint = None @@ -88,7 +81,7 @@ class FrameWidgets(ttk.Frame): self.tr_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_trash"]) self.exp_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_export"]) self.warning_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_error"]) - + self.tips_enabled = tips_enabled if tips_enabled is not None else LxTools.if_tip(AppConfig.SETTINGS_FILE) # Frame for Menu self.menu_frame = ttk.Frame(self) self.menu_frame.configure(relief="flat") @@ -99,12 +92,12 @@ class FrameWidgets(ttk.Frame): self.version_lb.config(font=("Ubuntu", 11), foreground="#00c4ff") self.version_lb.grid(column=0, row=0, rowspan=4, padx=10) - Tooltip(self.version_lb, f"Version: {VERSION[2:]}", tips) + Tooltip(self.version_lb, f"Version: {VERSION[2:]}", self.tips_enabled) self.options_btn = ttk.Menubutton(self.menu_frame, text=_("Options")) self.options_btn.grid(column=1, columnspan=1, row=0) - Tooltip(self.options_btn, _("Click for Settings"), tips) + Tooltip(self.options_btn, _("Click for Settings"), self.tips_enabled) set_update = tk.IntVar() set_tip = tk.BooleanVar() @@ -138,14 +131,14 @@ class FrameWidgets(ttk.Frame): set_update.set(value=1) self.updates_lb.configure(text=_("Update search off")) - Tooltip(self.updates_lb, _("Updates you have disabled"), tips) + Tooltip(self.updates_lb, _("Updates you have disabled"), self.tips_enabled) 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")) - Tooltip(self.updates_lb, _("Congratulations! Wire-Py is up to date"), tips) + Tooltip(self.updates_lb, _("Congratulations! Wire-Py is up to date"), self.tips_enabled) else: set_update.set(value=0) @@ -155,7 +148,7 @@ class FrameWidgets(ttk.Frame): self.update_btn = ttk.Menubutton(self.menu_frame, text=text) self.update_btn.grid(column=4, columnspan=3, row=0, padx=0) - Tooltip(self.update_btn, _("Click to download new version"), tips) + Tooltip(self.update_btn, _("Click to download new version"), self.tips_enabled) self.download = tk.Menu(self, relief="flat") @@ -163,7 +156,7 @@ class FrameWidgets(ttk.Frame): self.download.add_command( label=_("Download"), command=lambda: GiteaUpdate.download(f"https://git.ilunix.de/punix/Wire-Py/archive/{res}.zip", - res, img_w, img_i, img_w2, img_i2)) + res, AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_vpn"], AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"])) # Show active Tunnel self.a = Tunnel.active() @@ -224,9 +217,9 @@ class FrameWidgets(ttk.Frame): self.l_box.configure(yscrollcommand=self.scrollbar.set) # Tunnel List - self.tl = Tunnel.list() + self.tl = LxTools.get_file_name(AppConfig.TEMP_DIR) for tunnels in self.tl: - self.l_box.insert("end", tunnels[:-5]) + self.l_box.insert("end", tunnels) self.l_box.update() # Button Vpn @@ -247,7 +240,7 @@ class FrameWidgets(ttk.Frame): 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) - Tooltip(self.btn_i, _("Click to import a Wireguard Tunnel"), tips) + Tooltip(self.btn_i, _("Click to import a Wireguard Tunnel"), self.tips_enabled) # Button Trash self.btn_tr = ttk.Button(self.lb_frame_btn_lbox, image=self.tr_pic, command=self.delete, padding=0, @@ -255,20 +248,20 @@ class FrameWidgets(ttk.Frame): self.btn_tr.grid(column=0, row=2, padx=15, pady=8) if self.l_box.size() == 0: - Tooltip(self.btn_tr, _("No tunnels to delete in the list"), tips) + Tooltip(self.btn_tr, _("No tunnels to delete in the list"), self.tips_enabled) else: - Tooltip(self.btn_tr, _("Click to delete a Wireguard Tunnel\nSelect from the list!"), tips) + Tooltip(self.btn_tr, _("Click to delete a Wireguard Tunnel\nSelect from the list!"), self.tips_enabled) # Button Export self.btn_exp = ttk.Button(self.lb_frame_btn_lbox, image=self.exp_pic, - command=lambda: Tunnel.export(img_w, img_i, img_w2, img_i2, + command=lambda: Tunnel.export(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_vpn"], AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["tl_first"]), padding=0) self.btn_exp.grid(column=0, row=3, padx=15, pady=8) if self.l_box.size() == 0: - Tooltip(self.btn_exp, _("No Tunnels in List for Export"), tips) + Tooltip(self.btn_exp, _("No Tunnels in List for Export"), self.tips_enabled) else: - Tooltip(self.btn_exp, _("Click to export all\nWireguard Tunnel to Zipfile"), tips) + Tooltip(self.btn_exp, _("Click to export all\nWireguard Tunnel to Zipfile"), self.tips_enabled) # Label Entry self.lb_rename = ttk.Entry(self.lb_frame4, width=20) @@ -277,9 +270,9 @@ class FrameWidgets(ttk.Frame): self.lb_rename.config(state="disable") if self.l_box.size() != 0: - Tooltip(self.lb_rename, _("To rename a tunnel, you need to\nselect a tunnel from the list"), tips) + Tooltip(self.lb_rename, _("To rename a tunnel, you need to\nselect a tunnel from the list"), self.tips_enabled) else: - Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), tips) + Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), self.tips_enabled) # Button Rename self.btn_rename = ttk.Button(self.lb_frame4, text=_("Rename"), state="disable", command=self.tl_rename, @@ -300,53 +293,17 @@ class FrameWidgets(ttk.Frame): self.wg_autostart.grid(column=0, row=0, pady=15, padx=15, sticky="nw") if self.l_box.size() >= 1 and len(self.l_box.curselection()) >= 1: - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips) + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tself.tips_enabled) if self.l_box.size() == 0: - Tooltip(self.wg_autostart, Msg.TTIP["autostart_info"], tips) + Tooltip(self.wg_autostart, Msg.TTIP["autostart_info"], self.tips_enabled) else: - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips) + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tips_enabled) self.on_off() - @staticmethod - def about() -> None: - """ - a tk.Toplevel window - """ - def link_btn() -> str | None: - webbrowser.open("https://git.ilunix.de/punix/Wire-Py") - - 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") - - LxTools.msg_window(img_i, img_i, _("Info"), msg_t, _("Go to Wire-Py git"), link_btn) - - def theme_change_light(self) -> None: - """ - Set a light theme - """ - if self.tk.call("ttk::style", "theme", "use") == "water-dark": - self.tk.call("set_theme", "light") - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) # (keepends=True) = not changed - lines[3] = 'light\n' - Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - self.color_label() - - def theme_change_dark(self) -> None: - """ - Set a dark theme - """ - if not self.tk.call("ttk::style", "theme", "use") == "water-dark": - self.tk.call("set_theme", "dark") - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) - lines[3] = 'dark\n' - Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - self.color_label() @staticmethod def update_setting(update_res) -> None: @@ -382,17 +339,197 @@ class FrameWidgets(ttk.Frame): lines[5] = 'True\n' Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - def enable_check_box(self, _) -> None: + @staticmethod + def about() -> None: """ - checkbox for enable autostart Tunnel + a tk.Toplevel window """ - Create.files_for_autostart() - if self.l_box.size() != 0: - 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") + def link_btn() -> str | None: + webbrowser.open("https://git.ilunix.de/punix/Wire-Py") + + 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") + + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_vpn"], AppConfig.IMAGE_PATHS["icon_vpn"], _("Info"), msg_t, _("Go to Wire-Py git"), link_btn) + + def theme_change_light(self) -> None: + """ + Set a light theme + """ + if self.tk.call("ttk::style", "theme", "use") == "water-dark": + self.tk.call("set_theme", "light") + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) # (keepends=True) = not changed + lines[3] = 'light\n' + Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") + self.color_label() + + def theme_change_dark(self) -> None: + """ + Set a dark theme + """ + if not self.tk.call("ttk::style", "theme", "use") == "water-dark": + self.tk.call("set_theme", "dark") + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) + lines[3] = 'dark\n' + Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") + self.color_label() + + def start(self) -> None: + """ + Start Button + """ + self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_start, + command=lambda: self.wg_switch("start"), padding=0) + self.btn_stst.grid(column=0, row=0, padx=5, pady=8) + + tl = LxTools.get_file_name(AppConfig.TEMP_DIR) + if len(self.tl) == 0: + Tooltip(self.btn_stst, Msg.TTIP["empty_list"], self.tips_enabled) + else: + Tooltip(self.btn_stst, Msg.TTIP["start_tl"], self.tips_enabled) + + def handle_tunnel_data(self, tunnel_name: str) -> tuple[str, str, str, str | None]: + """_summary_ + + Args: + tunnel_name (str): name of a tunnel + + Returns: + tuple[str, str]: tuple with tunnel data + """ + wg_read = f"/tmp/tlecdcwg/{tunnel_name}.conf" + with open(wg_read, "r", encoding="utf-8") as file: + data = Tunnel.con_to_dict(file) + self.init_and_report(data) + self.show_data() + return data + + def color_label(self) -> None: + """ + View activ Tunnel in the color green or yellow + """ + lines = AppConfig.SETTINGS_FILE.read_text() + if "light\n" in lines: + self.lb_tunnel = ttk.Label(self, textvariable=self.str_var, foreground="green") + + else: + self.lb_tunnel = ttk.Label(self, textvariable=self.str_var, foreground="yellow") + + self.lb_tunnel.config(font=("Ubuntu", 11, "bold")) + self.lb_tunnel.grid(column=2, padx=10, row=1) + + def stop(self) -> None: + """ + Stop Button + """ + self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_stop, + command=lambda: self.wg_switch("stop"), padding=0) + self.btn_stst.grid(column=0, row=0, padx=5, pady=8) + + Tooltip(self.btn_stst, Msg.TTIP["stop_tl"], self.tips_enabled) + + def reset_fields(self) -> None: + """ + reset data from labels + """ + fields = [self.add, self.DNS, self.enp] + for field in fields: + field.set("") + + def import_sl(self) -> None: + """validity check of wireguard config files""" + + Create.dir_and_files() + try: + filepath = filedialog.askopenfilename( + initialdir=f"{Path.home()}", + title=_("Select Wireguard config File"), + filetypes=[(_("WG config files"), "*.conf")] + ) + + # Überprüfe, ob der Benutzer den Dialog abgebrochen hat + if not filepath: + print("File import: abort by user...") + return + with open(filepath, "r", encoding="utf-8") as file: + read = file.read() + + path_split = filepath.split("/") + path_split1 = path_split[-1] + + if "PrivateKey = " in read and "PublicKey = " in read and "Endpoint =" in read: + with open(filepath, "r", encoding="utf-8") as file: + key = Tunnel.con_to_dict(file) + pre_key = key[3] + + if len(pre_key) != 0: + p_key = AppConfig.KEYS_FILE.read_text(encoding="utf-8") + + if pre_key in p_key or f"{pre_key}\n" in p_key: + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["imp_err"], Msg.STR["tl_exist"]) + else: + with open(AppConfig.KEYS_FILE, "a", encoding="utf-8") as keyfile: + keyfile.write(f"{pre_key}\r") + + if len(path_split1) > 17: + p1 = shutil.copy(filepath, AppConfig.TEMP_DIR) + path_split = path_split1[len(path_split1) - 17:] + os.rename(p1, f"{AppConfig.TEMP_DIR}/{path_split}") + new_conf = f"{AppConfig.TEMP_DIR}/{path_split}" + + if self.a != "": + check_call(["nmcli", "connection", "down", self.a]) + self.reset_fields() + + subprocess.check_output(["nmcli", "connection", "import", "type", "wireguard", "file", new_conf], text=True) + Create.encrypt() + else: + shutil.copy(filepath, f"{AppConfig.TEMP_DIR}/") + + if self.a != "": + check_call(["nmcli", "connection", "down", self.a]) + self.reset_fields() + + subprocess.check_output(["nmcli", "connection", "import", "type", "wireguard", "file", filepath], text=True) + Create.encrypt() + + self.str_var.set("") + self.a = Tunnel.active() + self.l_box.insert(0, self.a) + self.wg_autostart.configure(state="normal") + self.l_box.selection_clear(0, tk.END) + self.l_box.update() + self.l_box.selection_set(0) + + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tips_enabled) + Tooltip(self.btn_tr, Msg.TTIP["trash_tl"], self.tips_enabled) + Tooltip(self.btn_exp, Msg.TTIP["export_tl"], self.tips_enabled) + Tooltip(self.btn_rename, Msg.TTIP["rename_tl"], self.tips_enabled) + + self.lb_rename.insert(0, "Max. 12 characters!") + self.str_var = tk.StringVar() + self.str_var.set(self.a) + self.color_label() + self.stop() + data = self.handle_tunnel_data(self.a) + check_call(["nmcli", "con", "mod", self.a, "connection.autoconnect", "no"]) + elif ("PrivateKey = " in read) and ("Endpoint = " in read): + pass + else: + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["imp_err"], Msg.STR["no_valid_file"]) + + except EOFError as e: + print(e) + except TypeError: + print("File import: abort by user...") + except FileNotFoundError: + print("File import: abort by user...") + except subprocess.CalledProcessError: + print("Tunnel exist!") + def delete(self) -> None: """ delete Wireguard Tunnel @@ -433,10 +570,10 @@ class FrameWidgets(ttk.Frame): self.wg_autostart.configure(state="disabled") self.lb_rename.configure(state="disabled") Tooltip(self.wg_autostart, _("You must have at least one\ntunnel in the list,to use the autostart") - , tips) + , self.tips_enabled) - Tooltip(self.btn_exp, _("No Tunnels in List for Export"), tips) - Tooltip(self.btn_stst, _("No tunnels to start in the list"), tips) + Tooltip(self.btn_exp, _("No Tunnels in List for Export"), self.tips_enabled) + Tooltip(self.btn_stst, _("No tunnels to start in the list"), self.tips_enabled) Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), tips, ) self.lb_rename.insert(0, _("Max. 12 characters!")) @@ -450,11 +587,83 @@ class FrameWidgets(ttk.Frame): if self.l_box.size() != 0: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["sel_list"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["sel_list"]) else: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["tl_first"]) + + def enable_check_box(self, _) -> None: + """ + checkbox for enable autostart Tunnel + """ + Create.files_for_autostart() + if self.l_box.size() != 0: + 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") + + def on_off(self) -> None: + """ + Here it is checked whether the path to the file is there, if not, it is created. + Set (on), the selected tunnel is displayed in the label. + At (off) the label is first emptied then filled with No Autoconnect + """ + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) + + if lines[7] != "off\n": + print(f"{lines[7]} starts automatically when the system starts.") + self.selected_option.set(1) + self.autoconnect_var.set("") + self.auto_con = lines[7] + + else: + self.selected_option.set(0) + self.auto_con = _("no Autoconnect") + print("Autostart disabled.") + 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) + + def box_set(self) -> None: + """ + Configures the autostart for a selected tunnel. + + This method is called when the user changes the autostart checkbox. + It saves the selected tunnel in the configuration file so that it + will be automatically connected at system startup. + + If the checkbox is deactivated, 'off' is written to the configuration file + to disable the autostart. + """ + try: + select_tunnel = self.l_box.curselection() + select_tl = self.l_box.get(select_tunnel[0]) + + if self.selected_option.get() == 0: + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) + lines[7] = 'off\n' + Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") + + tl = LxTools.get_file_name(AppConfig.TEMP_DIR) + + if len(tl) == 0: + self.wg_autostart.configure(state="disabled") + + if self.selected_option.get() >= 1: + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) + lines[7] = select_tl + Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") + + except IndexError: + self.selected_option.set(1) + + self.on_off() def tl_rename(self) -> None: """ @@ -465,19 +674,19 @@ class FrameWidgets(ttk.Frame): if len(self.lb_rename.get()) > 12: - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["sign_len"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["sign_len"]) elif len(self.lb_rename.get()) == 0: - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["zero_signs"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["zero_signs"]) elif any(ch in special_characters for ch in self.lb_rename.get()): - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["false_signs"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["false_signs"]) elif self.lb_rename.get() in name_of_file: - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["is_in_use"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["is_in_use"]) else: @@ -510,7 +719,7 @@ class FrameWidgets(ttk.Frame): except IndexError: - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["sel_list"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["sel_list"]) except subprocess.CalledProcessError: pass @@ -518,170 +727,53 @@ class FrameWidgets(ttk.Frame): except EOFError as e: print(e) - def import_sl(self) -> None: - """ - validity check of wireguard config files - """ - Create.dir_and_files() - + def activate_tunnel(self, tunnel_name): + """Activates a tunnel after a delay""" try: - filepath = filedialog.askopenfilename(initialdir=f"{Path.home()}", title=_("Select Wireguard config File"), - filetypes=[(_("WG config files"), "*.conf")]) - - with open(filepath, "r", encoding="utf-8") as file: - read = file.read() - path_split = filepath.split("/") - path_split1 = path_split[-1] - - if "PrivateKey = " in read and "PublicKey = " in read and "Endpoint =" in read: - with open(filepath, "r", encoding="utf-8") as file: - key = Tunnel.con_to_dict(file) - pre_key = key[3] - if len(pre_key) != 0: - p_key = AppConfig.KEYS_FILE.read_text(encoding="utf-8") - if pre_key in p_key or f"{pre_key}\n" in p_key: - - LxTools.msg_window(img_w2, img_i2, Msg.STR["imp_err"], Msg.STR["tl_exist"]) - - else: - - with open(AppConfig.KEYS_FILE, "a", encoding="utf-8") as keyfile: - keyfile.write(f"{pre_key}\r") - if len(path_split1) > 17: - p1 = shutil.copy(filepath, AppConfig.TEMP_DIR) - path_split = path_split1[len(path_split1) - 17:] - os.rename(p1, f"{AppConfig.TEMP_DIR}/{path_split}") - new_conf = f"{AppConfig.TEMP_DIR}/{path_split}" - if self.a != "": - check_call(["nmcli", "connection", "down", self.a]) - self.reset_fields() - - subprocess.check_output(["nmcli", "connection", "import", "type", - "wireguard", "file", new_conf], text=True) - - Create.encrypt() - - else: - shutil.copy(filepath, f"{AppConfig.TEMP_DIR}/") - if self.a != "": - check_call(["nmcli", "connection", "down", self.a]) - self.reset_fields() - - subprocess.check_output(["nmcli", "connection", "import", "type", - "wireguard", "file", filepath], text=True) - - Create.encrypt() - - self.str_var.set("") - self.a = Tunnel.active() - self.l_box.insert(0, self.a) - self.wg_autostart.configure(state="normal") - self.l_box.selection_clear(0, tk.END) - self.l_box.update() - self.l_box.selection_set(0) - - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips) - - Tooltip(self.btn_tr, Msg.TTIP["trash_tl"], tips) - - Tooltip(self.btn_exp, Msg.TTIP["export_tl"], tips) - - Tooltip(self.btn_rename, Msg.TTIP["rename_tl"], tips) - - self.lb_rename.insert(0, "Max. 12 characters!") - self.str_var = tk.StringVar() - self.str_var.set(self.a) - self.color_label() - self.stop() - data = self.handle_tunnel_data(self.a) - check_call(["nmcli", "con", "mod", self.a, "connection.autoconnect", "no"]) - - if ("PrivateKey = " in read) and ("Endpoint = " in read): - pass + # First check if the tunnel exists in NetworkManager + nm_connections = subprocess.run( + ["nmcli", "-t", "-f", "NAME", "connection", "show"], + check=True, + stdout=subprocess.PIPE, + text=True + ).stdout.strip().split('\n') + + # Find the actual connection name (it might have been modified) + actual_name = None + for conn in nm_connections: + if tunnel_name in conn: + actual_name = conn + break + + if actual_name: + # Use the actual connection name + subprocess.run(["nmcli", "connection", "up", actual_name], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) else: - - LxTools.msg_window(img_w2, img_i2, Msg.STR["imp_err"], Msg.STR["no_valid_file"]) - - except EOFError as e: - print(e) - except TypeError: - print("File import: abort by user...") - except FileNotFoundError: - print("File import: abort by user...") - except subprocess.CalledProcessError: - print("Tunnel exist!") - - def handle_tunnel_data(self, tunnel_name: str) -> tuple[str, str, str, str | None]: - """_summary_ - - Args: - tunnel_name (str): name of a tunnel - - Returns: - tuple[str, str]: tuple with tunnel data - """ - wg_read = f"/tmp/tlecdcwg/{tunnel_name}.conf" - with open(wg_read, "r", encoding="utf-8") as file: - data = Tunnel.con_to_dict(file) - self.init_and_report(data) - self.show_data() - return data - - def box_set(self) -> None: - """ - This Method will display the autostarted label which - Tunnel is automatically started regardless of the active tunnel. - The selected tunnel is written into a file to read it after the start of the system. - """ - try: - select_tunnel = self.l_box.curselection() - select_tl = self.l_box.get(select_tunnel[0]) - - if self.selected_option.get() == 0: - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) - lines[7] = 'off\n' - Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - - tl = Tunnel.list() - - if len(tl) == 0: - self.wg_autostart.configure(state="disabled") - - if self.selected_option.get() >= 1: - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) - lines[7] = select_tl - Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - - except IndexError: - self.selected_option.set(1) - - self.on_off() - - def on_off(self) -> None: - """ - Here it is checked whether the path to the file is there, if not, it is created. - Set (on), the selected tunnel is displayed in the label. - At (off) the label is first emptied then filled with No Autoconnect - """ - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) - - if lines[7] != "off\n": - print(f"{lines[7]} starts automatically when the system starts.") - self.selected_option.set(1) - self.autoconnect_var.set("") - self.auto_con = lines[7] - - else: - self.selected_option.set(0) - self.auto_con = _("no Autoconnect") - print("Autostart disabled.") - 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) + # Use the original name as fallback + subprocess.run(["nmcli", "connection", "up", tunnel_name], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + # After successful activation, update the display + self.a = Tunnel.active() + self.str_var.set(self.a) + self.color_label() + + # Try to load the tunnel data + try: + data = self.handle_tunnel_data(self.a) + self.init_and_report(data) + self.show_data() + self.stop() + except Exception as e: + print(f"Error loading tunnel data: {e}") + + except subprocess.CalledProcessError as e: + print(f"Error activating tunnel: {e}", "hier simma") def init_and_report(self, data=None) -> None: """ @@ -696,14 +788,6 @@ class FrameWidgets(ttk.Frame): self.enp = tk.StringVar() self.enp.set(f"{_("Endpoint: ")}{data[2]}") - def reset_fields(self) -> None: - """ - reset data from labels - """ - fields = [self.add, self.DNS, self.enp] - for field in fields: - field.set("") - def show_data(self) -> None: """ shows data in the label @@ -723,44 +807,6 @@ class FrameWidgets(ttk.Frame): self.endpoint.grid(column=0, row=8, sticky="w", padx=10, pady=20) self.endpoint.config(font=("Ubuntu", 9)) - def stop(self) -> None: - """ - Stop Button - """ - self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_stop, - command=lambda: self.wg_switch("stop"), padding=0) - self.btn_stst.grid(column=0, row=0, padx=5, pady=8) - - Tooltip(self.btn_stst, Msg.TTIP["stop_tl"], tips) - - def start(self) -> None: - """ - Start Button - """ - self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_start, - command=lambda: self.wg_switch("start"), padding=0) - self.btn_stst.grid(column=0, row=0, padx=5, pady=8) - - tl = Tunnel.list() - if len(tl) == 0: - Tooltip(self.btn_stst, Msg.TTIP["empty_list"], tips) - else: - Tooltip(self.btn_stst, Msg.TTIP["start_tl"], tips) - - def color_label(self) -> None: - """ - View activ Tunnel in the color green or yellow - """ - lines = AppConfig.SETTINGS_FILE.read_text() - if "light\n" in lines: - self.lb_tunnel = ttk.Label(self, textvariable=self.str_var, foreground="green") - - else: - self.lb_tunnel = ttk.Label(self, textvariable=self.str_var, foreground="yellow") - - self.lb_tunnel.config(font=("Ubuntu", 11, "bold")) - self.lb_tunnel.grid(column=2, padx=10, row=1) - def wg_switch(self, event=None) -> None: """ Deals with switching the VPN connection @@ -782,11 +828,11 @@ class FrameWidgets(ttk.Frame): if self.l_box.size() != 0: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["sel_list"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["sel_list"]) else: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["tl_first"]) def handle_connection_state(self, action: str, tunnel_name: str = None) -> None: """ @@ -833,6 +879,10 @@ class FrameWidgets(ttk.Frame): if __name__ == "__main__": + + _ = AppConfig.setup_translations() + tips = LxTools.if_tip(AppConfig.SETTINGS_FILE) + LxTools.sigi(AppConfig.TEMP_DIR, AppConfig.USER_FILE) window = Wirepy() """ the hidden files are hidden in Filedialog diff --git a/wp_app_config.py b/wp_app_config.py index fc6dbc5..26cc313 100644 --- a/wp_app_config.py +++ b/wp_app_config.py @@ -46,6 +46,7 @@ class AppConfig: "ssl_decrypt": "/usr/local/bin/ssl_decrypt.py", "ssl_encrypt": "/usr/local/bin/ssl_encrypt.py", "tcl_path": "/usr/share/TK-Themes", + "pkey_path": "/usr/local/etc/ssl/pwgk.pem" }