04-06-2025_large_update #35
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -14,16 +14,11 @@ from datetime import datetime
 | 
				
			|||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from subprocess import check_call, CompletedProcess
 | 
					from subprocess import check_call, CompletedProcess
 | 
				
			||||||
from tkinter import ttk, Toplevel
 | 
					from tkinter import ttk, Toplevel
 | 
				
			||||||
from wp_app_config import AppConfig
 | 
					from wp_app_config import AppConfig, Msg
 | 
				
			||||||
import requests
 | 
					import requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Translate
 | 
					# Translate
 | 
				
			||||||
AppConfig.APP_NAME
 | 
					_ = AppConfig.setup_translations()
 | 
				
			||||||
locale.bindtextdomain(AppConfig.APP_NAME, AppConfig.LOCALE_DIR)
 | 
					 | 
				
			||||||
gettext.bindtextdomain(AppConfig.APP_NAME, AppConfig.LOCALE_DIR)
 | 
					 | 
				
			||||||
gettext.textdomain(AppConfig.APP_NAME)
 | 
					 | 
				
			||||||
_ = gettext.gettext
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Create:
 | 
					class Create:
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
@@ -80,7 +75,6 @@ class Create:
 | 
				
			|||||||
    def make_dir() -> None:
 | 
					    def make_dir() -> None:
 | 
				
			||||||
        """Folder Name "tlecdewg" = Tunnel Encrypt Decrypt Wireguard"""
 | 
					        """Folder Name "tlecdewg" = Tunnel Encrypt Decrypt Wireguard"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        AppConfig.TEMP_DIR: Path = Path("/tmp/tlecdcwg/")
 | 
					 | 
				
			||||||
        if AppConfig.TEMP_DIR.exists():
 | 
					        if AppConfig.TEMP_DIR.exists():
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
@@ -125,6 +119,31 @@ class LxTools(tk.Tk):
 | 
				
			|||||||
    def __init__(self, *args: Any, **kwargs: Any) -> None:
 | 
					    def __init__(self, *args: Any, **kwargs: Any) -> None:
 | 
				
			||||||
        super().__init__(*args, **kwargs)
 | 
					        super().__init__(*args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_file_name(path: Path, i: int = 5) -> List[str]:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Recursively searches the specified path for files and returns a list of filenames,
 | 
				
			||||||
 | 
					        with the last 'i' characters of each filename removed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        This method is useful for obtaining filenames without specific file extensions,
 | 
				
			||||||
 | 
					        e.g., to remove '.conf' from Wireguard configuration files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Args:
 | 
				
			||||||
 | 
					            path (Path): The directory path to search
 | 
				
			||||||
 | 
					            i (int, optional): Number of characters to remove from the end of each filename.
 | 
				
			||||||
 | 
					                            Default is 5, which typically corresponds to the length of '.conf'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					            List[str]: A list of filenames without the last 'i' characters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Example:
 | 
				
			||||||
 | 
					            If path contains files like 'tunnel1.conf', 'tunnel2.conf' and i=5,
 | 
				
			||||||
 | 
					            the method returns ['tunnel1', 'tunnel2'].
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        lists_file = list(path.rglob("*"))
 | 
				
			||||||
 | 
					        lists_file = [conf_file.name[:-i] for conf_file in lists_file]
 | 
				
			||||||
 | 
					        return lists_file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def uos() -> None:
 | 
					    def uos() -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -432,17 +451,15 @@ class Tunnel:
 | 
				
			|||||||
                with zipfile.ZipFile(f"{wg_tar}.zip", "r") as zf:
 | 
					                with zipfile.ZipFile(f"{wg_tar}.zip", "r") as zf:
 | 
				
			||||||
                    if len(zf.namelist()) != 0:
 | 
					                    if len(zf.namelist()) != 0:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        msg_t: str = _("Your zip file is in home directory")
 | 
					                        LxTools.msg_window(img_w, img_i, Msg.STR["exp_succ"], Msg.STR["exp_in_home"])
 | 
				
			||||||
                        LxTools.msg_window(img_w, img_i, _("Export Successful"), msg_t)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        msg_t: str = _("Export failed! Please try again")
 | 
					                        LxTools.msg_window(img_w2, img_i2, Msg.STR["exp_err"], Msg.STR["exp_try"])
 | 
				
			||||||
                        LxTools.msg_window(img_w2, img_i2, _("Export error"), msg_t)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                LxTools.msg_window(img_w, img_i2, sl, pfit)
 | 
					                LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        except TypeError:
 | 
					        except TypeError:
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
@@ -492,6 +509,7 @@ class Tooltip:
 | 
				
			|||||||
        label: tk.Label = tk.Label(tw, text=self.text, background="lightgreen", foreground="black", relief="solid",
 | 
					        label: tk.Label = tk.Label(tw, text=self.text, background="lightgreen", foreground="black", relief="solid",
 | 
				
			||||||
                                   borderwidth=1, padx=5, pady=5)
 | 
					                                   borderwidth=1, padx=5, pady=5)
 | 
				
			||||||
        label.grid()
 | 
					        label.grid()
 | 
				
			||||||
 | 
					        self.tooltip_window.after(2200, lambda: tw.destroy())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def hide_tooltip(self, event: Optional[Any] = None) -> None:
 | 
					    def hide_tooltip(self, event: Optional[Any] = None) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										95
									
								
								wirepy.py
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								wirepy.py
									
									
									
									
									
								
							@@ -15,7 +15,7 @@ from subprocess import check_call
 | 
				
			|||||||
from tkinter import TclError, filedialog, ttk
 | 
					from tkinter import TclError, filedialog, ttk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cls_mth_fc import (Create, GiteaUpdate, Tooltip, Tunnel, LxTools)
 | 
					from cls_mth_fc import (Create, GiteaUpdate, Tooltip, Tunnel, LxTools)
 | 
				
			||||||
from wp_app_config import AppConfig
 | 
					from wp_app_config import AppConfig, Msg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LxTools.uos()
 | 
					LxTools.uos()
 | 
				
			||||||
Create.dir_and_files()
 | 
					Create.dir_and_files()
 | 
				
			||||||
@@ -24,28 +24,18 @@ Create.decrypt()
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
tips = LxTools.if_tip(AppConfig.SETTINGS_FILE)
 | 
					tips = LxTools.if_tip(AppConfig.SETTINGS_FILE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
# 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year
 | 
					# 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year
 | 
				
			||||||
VERSION: str = "v. 2.04.1725"
 | 
					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)
 | 
					res = GiteaUpdate.api_down("https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases", VERSION, AppConfig.SETTINGS_FILE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Translate
 | 
					# Translate
 | 
				
			||||||
AppConfig.APP_NAME
 | 
					_ = AppConfig.setup_translations()
 | 
				
			||||||
locale.bindtextdomain(AppConfig.APP_NAME, AppConfig.LOCALE_DIR)
 | 
					 | 
				
			||||||
gettext.bindtextdomain(AppConfig.APP_NAME, AppConfig.LOCALE_DIR)
 | 
					 | 
				
			||||||
gettext.textdomain(AppConfig.APP_NAME)
 | 
					 | 
				
			||||||
_ = gettext.gettext
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
img_w: str = r"/usr/share/icons/lx-icons/64/info.png"
 | 
					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_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_w2: str = r"/usr/share/icons/lx-icons/64/error.png"
 | 
				
			||||||
img_i2: str = r"/usr/share/icons/lx-icons/48/wg_msg.png"
 | 
					img_i2: str = r"/usr/share/icons/lx-icons/48/wg_msg.png"
 | 
				
			||||||
sl: str = _("Select tunnel")
 | 
					 | 
				
			||||||
rnp: str = _("Renaming not possible")
 | 
					 | 
				
			||||||
ie:str = _("Import Error")
 | 
					 | 
				
			||||||
pfit: str = _("Please first import tunnel")
 | 
					 | 
				
			||||||
pstl: str = _("Please select a tunnel from the list")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
LxTools.sigi(AppConfig.TEMP_DIR, AppConfig.USER_FILE)
 | 
					LxTools.sigi(AppConfig.TEMP_DIR, AppConfig.USER_FILE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -71,7 +61,7 @@ class Wirepy(tk.Tk):
 | 
				
			|||||||
        LxTools.theme_change(self)
 | 
					        LxTools.theme_change(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Load the image file from the disk
 | 
					        # Load the image file from the disk
 | 
				
			||||||
        self.wg_icon = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_vpn.png")
 | 
					        self.wg_icon = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_vpn"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Set it as the window icon
 | 
					        # Set it as the window icon
 | 
				
			||||||
        self.iconphoto(True, self.wg_icon)
 | 
					        self.iconphoto(True, self.wg_icon)
 | 
				
			||||||
@@ -92,12 +82,12 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        self.dns = None
 | 
					        self.dns = None
 | 
				
			||||||
        self.address = None
 | 
					        self.address = None
 | 
				
			||||||
        self.auto_con = 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_start = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_start"])
 | 
				
			||||||
        self.wg_vpn_stop = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_vpn-stop.png")
 | 
					        self.wg_vpn_stop = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_stop"])
 | 
				
			||||||
        self.imp_pic = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_import.png")
 | 
					        self.imp_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_import"])
 | 
				
			||||||
        self.tr_pic = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_trash.png")
 | 
					        self.tr_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_trash"])
 | 
				
			||||||
        self.exp_pic = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/48/wg_export.png")
 | 
					        self.exp_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_export"])
 | 
				
			||||||
        self.warning_pic = tk.PhotoImage(file=r"/usr/share/icons/lx-icons/64/error.png")
 | 
					        self.warning_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_error"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Frame for Menu
 | 
					        # Frame for Menu
 | 
				
			||||||
        self.menu_frame = ttk.Frame(self)
 | 
					        self.menu_frame = ttk.Frame(self)
 | 
				
			||||||
@@ -271,7 +261,8 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # Button Export
 | 
					        # Button Export
 | 
				
			||||||
        self.btn_exp = ttk.Button(self.lb_frame_btn_lbox, image=self.exp_pic,
 | 
					        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, sl, pfit), padding=0)
 | 
					                                  command=lambda: Tunnel.export(img_w, img_i, img_w2, img_i2,
 | 
				
			||||||
 | 
					                                  Msg.STR["sel_tl"], Msg.STR["tl_first"]), padding=0)
 | 
				
			||||||
        self.btn_exp.grid(column=0, row=3, padx=15, pady=8)
 | 
					        self.btn_exp.grid(column=0, row=3, padx=15, pady=8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self.l_box.size() == 0:
 | 
					        if self.l_box.size() == 0:
 | 
				
			||||||
@@ -309,14 +300,14 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
        self.wg_autostart.grid(column=0, row=0, pady=15, padx=15, sticky="nw")
 | 
					        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:
 | 
					        if self.l_box.size() >= 1 and len(self.l_box.curselection()) >= 1:
 | 
				
			||||||
            Tooltip(self.wg_autostart, _("To use the autostart, enable this Checkbox"), tips)
 | 
					            Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self.l_box.size() == 0:
 | 
					        if self.l_box.size() == 0:
 | 
				
			||||||
            Tooltip(self.wg_autostart, _("You must have at least one\ntunnel in the list,to use the autostart"), tips)
 | 
					            Tooltip(self.wg_autostart, Msg.TTIP["autostart_info"], tips)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Tooltip(self.wg_autostart, _("To use the autostart, a tunnel must be selected from the list"), tips)
 | 
					            Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.on_off()
 | 
					        self.on_off()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -459,30 +450,34 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            if self.l_box.size() != 0:
 | 
					            if self.l_box.size() != 0:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                LxTools.msg_window(img_w, img_i2, sl, pstl)
 | 
					                LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["sel_list"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                LxTools.msg_window(img_w, img_i2, sl, pfit)
 | 
					                LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def tl_rename(self) -> None:
 | 
					    def tl_rename(self) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        method to rename a tunnel
 | 
					        method to rename a tunnel
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					        name_of_file = LxTools.get_file_name(AppConfig.TEMP_DIR)
 | 
				
			||||||
        special_characters = ["\\", "/", "{", "}", " "]
 | 
					        special_characters = ["\\", "/", "{", "}", " "]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if len(self.lb_rename.get()) > 12:
 | 
					        if len(self.lb_rename.get()) > 12:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            LxTools.msg_window(img_w, img_i2, rnp, _("The new name may contain only 12 characters"))
 | 
					            LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["sign_len"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif len(self.lb_rename.get()) == 0:
 | 
					        elif len(self.lb_rename.get()) == 0:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            LxTools.msg_window(img_w, img_i2, rnp, _("At least one character must be entered"))
 | 
					            LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["zero_signs"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif any(ch in special_characters for ch in self.lb_rename.get()):
 | 
					        elif any(ch in special_characters for ch in self.lb_rename.get()):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            msg_t = _("No valid sign. These must not be used.\nBlank, Slash, Backslash and { }\n")
 | 
					            LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["false_signs"])
 | 
				
			||||||
            LxTools.msg_window(img_w, img_i2, rnp, msg_t)
 | 
					
 | 
				
			||||||
 | 
					        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"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -491,7 +486,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
                select_tl = self.l_box.get(self.select_tunnel[0])
 | 
					                select_tl = self.l_box.get(self.select_tunnel[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # nmcli connection modify old connection.id iphone
 | 
					                # nmcli connection modify old connection.id iphone
 | 
				
			||||||
                check_call(["nmcli", "connection", "modify", select_tl, "connection.id", self.lb_rename.get()])
 | 
					                subprocess.check_output(["nmcli", "connection", "modify", select_tl, "connection.id", self.lb_rename.get()], text=True)
 | 
				
			||||||
                source = Path(f"/tmp/tlecdcwg/{select_tl}.conf")
 | 
					                source = Path(f"/tmp/tlecdcwg/{select_tl}.conf")
 | 
				
			||||||
                destination = source.with_name(f"{self.lb_rename.get()}.conf")
 | 
					                destination = source.with_name(f"{self.lb_rename.get()}.conf")
 | 
				
			||||||
                source.replace(destination)
 | 
					                source.replace(destination)
 | 
				
			||||||
@@ -515,11 +510,14 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            except IndexError:
 | 
					            except IndexError:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                LxTools.msg_window(img_w, img_i2, rnp, pstl)
 | 
					                LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["sel_list"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            except subprocess.CalledProcessError:
 | 
					            except subprocess.CalledProcessError:
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            except EOFError as e:
 | 
				
			||||||
 | 
					                print(e)
 | 
				
			||||||
 | 
					                  
 | 
				
			||||||
    def import_sl(self) -> None:
 | 
					    def import_sl(self) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        validity check of wireguard config files
 | 
					        validity check of wireguard config files
 | 
				
			||||||
@@ -543,18 +541,17 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
                        p_key = AppConfig.KEYS_FILE.read_text(encoding="utf-8")
 | 
					                        p_key = AppConfig.KEYS_FILE.read_text(encoding="utf-8")
 | 
				
			||||||
                        if pre_key in p_key or f"{pre_key}\n" in p_key:
 | 
					                        if pre_key in p_key or f"{pre_key}\n" in p_key:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            msg_t = _("Tunnel already available!\nPlease use another file for import")
 | 
					                            LxTools.msg_window(img_w2, img_i2, Msg.STR["imp_err"], Msg.STR["tl_exist"])
 | 
				
			||||||
                            LxTools.msg_window(img_w2, img_i2, ie, msg_t)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        else:
 | 
					                        else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            with open(AppConfig.KEYS_FILE, "a", encoding="utf-8") as keyfile:
 | 
					                            with open(AppConfig.KEYS_FILE, "a", encoding="utf-8") as keyfile:
 | 
				
			||||||
                                keyfile.write(f"{pre_key}\r")
 | 
					                                keyfile.write(f"{pre_key}\r")
 | 
				
			||||||
                                if len(path_split1) > 17:
 | 
					                                if len(path_split1) > 17:
 | 
				
			||||||
                                    p1 = shutil.copy(filepath, "/tmp/tlecdcwg/")
 | 
					                                    p1 = shutil.copy(filepath, AppConfig.TEMP_DIR)
 | 
				
			||||||
                                    path_split = path_split1[len(path_split1) - 17:]
 | 
					                                    path_split = path_split1[len(path_split1) - 17:]
 | 
				
			||||||
                                    os.rename(p1, f"/tmp/tlecdcwg/{path_split}")
 | 
					                                    os.rename(p1, f"{AppConfig.TEMP_DIR}/{path_split}")
 | 
				
			||||||
                                    new_conf = f"/tmp/tlecdcwg/{path_split}"
 | 
					                                    new_conf = f"{AppConfig.TEMP_DIR}/{path_split}"
 | 
				
			||||||
                                    if self.a != "":
 | 
					                                    if self.a != "":
 | 
				
			||||||
                                        check_call(["nmcli", "connection", "down", self.a])
 | 
					                                        check_call(["nmcli", "connection", "down", self.a])
 | 
				
			||||||
                                        self.reset_fields()
 | 
					                                        self.reset_fields()
 | 
				
			||||||
@@ -565,7 +562,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
                                    Create.encrypt()
 | 
					                                    Create.encrypt()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                else:
 | 
					                                else:
 | 
				
			||||||
                                    shutil.copy(filepath, "/tmp/tlecdcwg/")
 | 
					                                    shutil.copy(filepath, f"{AppConfig.TEMP_DIR}/")
 | 
				
			||||||
                                    if self.a != "":
 | 
					                                    if self.a != "":
 | 
				
			||||||
                                        check_call(["nmcli", "connection", "down", self.a])
 | 
					                                        check_call(["nmcli", "connection", "down", self.a])
 | 
				
			||||||
                                        self.reset_fields()
 | 
					                                        self.reset_fields()
 | 
				
			||||||
@@ -583,16 +580,13 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
                                self.l_box.update()
 | 
					                                self.l_box.update()
 | 
				
			||||||
                                self.l_box.selection_set(0)
 | 
					                                self.l_box.selection_set(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                Tooltip(self.wg_autostart, _("To use the autostart, enable this Checkbox"), tips)
 | 
					                                Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                Tooltip(self.btn_tr, _("Click to delete a Wireguard Tunnel\nSelect from the list!")
 | 
					                                Tooltip(self.btn_tr, Msg.TTIP["trash_tl"], tips)
 | 
				
			||||||
                                        , tips,)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                Tooltip(self.btn_exp, _("         Click to export all\nWireguard Tunnel to Zipfile")
 | 
					                                Tooltip(self.btn_exp, Msg.TTIP["export_tl"], tips)
 | 
				
			||||||
                                        , tips)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                Tooltip(self.btn_rename, _("To rename a tunnel, you need to\nselect a tunnel from"
 | 
					                                Tooltip(self.btn_rename, Msg.TTIP["rename_tl"], tips)
 | 
				
			||||||
                                                            " the list"), tips)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                self.lb_rename.insert(0, "Max. 12 characters!")
 | 
					                                self.lb_rename.insert(0, "Max. 12 characters!")
 | 
				
			||||||
                                self.str_var = tk.StringVar()
 | 
					                                self.str_var = tk.StringVar()
 | 
				
			||||||
@@ -606,8 +600,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
                pass
 | 
					                pass
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                msg_t = _("Oh... no valid Wireguard File!\nPlease select a valid Wireguard File")
 | 
					                LxTools.msg_window(img_w2, img_i2, Msg.STR["imp_err"], Msg.STR["no_valid_file"])
 | 
				
			||||||
                LxTools.msg_window(img_w2, img_i2, ie, msg_t)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        except EOFError as e:
 | 
					        except EOFError as e:
 | 
				
			||||||
            print(e)
 | 
					            print(e)
 | 
				
			||||||
@@ -738,7 +731,7 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
                                   command=lambda: self.wg_switch("stop"), padding=0)
 | 
					                                   command=lambda: self.wg_switch("stop"), padding=0)
 | 
				
			||||||
        self.btn_stst.grid(column=0, row=0, padx=5, pady=8)
 | 
					        self.btn_stst.grid(column=0, row=0, padx=5, pady=8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Tooltip(self.btn_stst, _("Click to stop selected Wireguard Tunnel"), tips)
 | 
					        Tooltip(self.btn_stst, Msg.TTIP["stop_tl"], tips)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def start(self) -> None:
 | 
					    def start(self) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -750,9 +743,9 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        tl = Tunnel.list()
 | 
					        tl = Tunnel.list()
 | 
				
			||||||
        if len(tl) == 0:
 | 
					        if len(tl) == 0:
 | 
				
			||||||
            Tooltip(self.btn_stst, _("No tunnels to start in the list"), tips)
 | 
					            Tooltip(self.btn_stst, Msg.TTIP["empty_list"], tips)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            Tooltip(self.btn_stst, _("Click to start selected Wireguard Tunnel"), tips)
 | 
					            Tooltip(self.btn_stst, Msg.TTIP["start_tl"], tips)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def color_label(self) -> None:
 | 
					    def color_label(self) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -789,11 +782,11 @@ class FrameWidgets(ttk.Frame):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            if self.l_box.size() != 0:
 | 
					            if self.l_box.size() != 0:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                LxTools.msg_window(img_w, img_i2, sl, pstl)
 | 
					                LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["sel_list"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                LxTools.msg_window(img_w, img_i2, sl, pfit)
 | 
					                LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def handle_connection_state(self, action: str, tunnel_name: str = None) -> None:
 | 
					    def handle_connection_state(self, action: str, tunnel_name: str = None) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										134
									
								
								wp_app_config.py
									
									
									
									
									
								
							
							
						
						
									
										134
									
								
								wp_app_config.py
									
									
									
									
									
								
							@@ -1,26 +1,31 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/python3
 | 
				
			||||||
 | 
					"""App configuration for Wire-Py"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import gettext
 | 
				
			||||||
 | 
					import locale
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from typing import Dict, Any
 | 
					from typing import Dict, Any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AppConfig:
 | 
					class AppConfig:
 | 
				
			||||||
    """Central configuration class for the application"""
 | 
					    """Central configuration class for Wire-Py application"""
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    # Base paths
 | 
					 | 
				
			||||||
    BASE_DIR = Path.home()
 | 
					 | 
				
			||||||
    CONFIG_DIR = BASE_DIR / ".config/wire_py"
 | 
					 | 
				
			||||||
    TEMP_DIR = Path("/tmp/tlecdcwg")
 | 
					 | 
				
			||||||
    USER_FILE = Path("/tmp/.log_user")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Configuration files
 | 
					 | 
				
			||||||
    SETTINGS_FILE = CONFIG_DIR / "settings"
 | 
					 | 
				
			||||||
    KEYS_FILE = CONFIG_DIR / "keys"
 | 
					 | 
				
			||||||
    AUTOSTART_SERVICE = Path.home() / ".config/systemd/user/wg_start.service"
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # Localization
 | 
					    # Localization
 | 
				
			||||||
    APP_NAME = "wirepy"
 | 
					    APP_NAME: str = "wirepy"
 | 
				
			||||||
    LOCALE_DIR = "/usr/share/locale/"
 | 
					    LOCALE_DIR: Path = Path("/usr/share/locale/")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Base paths
 | 
				
			||||||
 | 
					    BASE_DIR: Path = Path.home()
 | 
				
			||||||
 | 
					    CONFIG_DIR: Path = BASE_DIR / ".config/wire_py"
 | 
				
			||||||
 | 
					    TEMP_DIR: Path = Path("/tmp/tlecdcwg")
 | 
				
			||||||
 | 
					    USER_FILE: Path = Path("/tmp/.log_user")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configuration files
 | 
				
			||||||
 | 
					    SETTINGS_FILE: Path = CONFIG_DIR / "settings"
 | 
				
			||||||
 | 
					    KEYS_FILE: Path = CONFIG_DIR / "keys"
 | 
				
			||||||
 | 
					    AUTOSTART_SERVICE: Path = Path.home() / ".config/systemd/user/wg_start.service"
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # Default settings
 | 
					    # Default settings
 | 
				
			||||||
    DEFAULT_SETTINGS = {
 | 
					    DEFAULT_SETTINGS: Dict[str, Any] = {
 | 
				
			||||||
        "updates": "on",
 | 
					        "updates": "on",
 | 
				
			||||||
        "theme": "light",
 | 
					        "theme": "light",
 | 
				
			||||||
        "tooltip": True,
 | 
					        "tooltip": True,
 | 
				
			||||||
@@ -28,7 +33,7 @@ class AppConfig:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # UI configuration
 | 
					    # UI configuration
 | 
				
			||||||
    UI_CONFIG = {
 | 
					    UI_CONFIG: Dict[str, Any] = {
 | 
				
			||||||
        "window_title": "Wire-Py",
 | 
					        "window_title": "Wire-Py",
 | 
				
			||||||
        "window_size": (600, 383),
 | 
					        "window_size": (600, 383),
 | 
				
			||||||
        "font_family": "Ubuntu",
 | 
					        "font_family": "Ubuntu",
 | 
				
			||||||
@@ -37,12 +42,41 @@ class AppConfig:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # System-dependent paths
 | 
					    # System-dependent paths
 | 
				
			||||||
    SYSTEM_PATHS = {
 | 
					    SYSTEM_PATHS: Dict[str, str]= {
 | 
				
			||||||
        "ssl_decrypt": "/usr/local/bin/ssl_decrypt.py",
 | 
					        "ssl_decrypt": "/usr/local/bin/ssl_decrypt.py",
 | 
				
			||||||
        "ssl_encrypt": "/usr/local/bin/ssl_encrypt.py",
 | 
					        "ssl_encrypt": "/usr/local/bin/ssl_encrypt.py",
 | 
				
			||||||
        "tcl_path": "/usr/share/TK-Themes"
 | 
					        "tcl_path": "/usr/share/TK-Themes",
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    # Images and icons paths
 | 
				
			||||||
 | 
					    IMAGE_PATHS: Dict[str, str] = {
 | 
				
			||||||
 | 
					        "icon_vpn": "/usr/share/icons/lx-icons/48/wg_vpn.png",
 | 
				
			||||||
 | 
					        "icon_msg": "/usr/share/icons/lx-icons/48/wg_msg.png",
 | 
				
			||||||
 | 
					        "icon_import": "/usr/share/icons/lx-icons/48/wg_import.png",
 | 
				
			||||||
 | 
					        "icon_export": "/usr/share/icons/lx-icons/48/wg_export.png",
 | 
				
			||||||
 | 
					        "icon_trash": "/usr/share/icons/lx-icons/48/wg_trash.png",
 | 
				
			||||||
 | 
					        "icon_start": "/usr/share/icons/lx-icons/48/wg_vpn-start.png",
 | 
				
			||||||
 | 
					        "icon_stop": "/usr/share/icons/lx-icons/48/wg_vpn-stop.png",
 | 
				
			||||||
 | 
					        "icon_info": "/usr/share/icons/lx-icons/64/info.png",
 | 
				
			||||||
 | 
					        "icon_error": "/usr/share/icons/lx-icons/64/error.png"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def setup_translations() -> gettext.gettext:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Initialize translations and set the translation function
 | 
				
			||||||
 | 
					        Special method for translating strings in this file
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					            The gettext translation function
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        locale.bindtextdomain(AppConfig.APP_NAME, AppConfig.LOCALE_DIR)
 | 
				
			||||||
 | 
					        gettext.bindtextdomain(AppConfig.APP_NAME, AppConfig.LOCALE_DIR)
 | 
				
			||||||
 | 
					        gettext.textdomain(AppConfig.APP_NAME)
 | 
				
			||||||
 | 
					        return gettext.gettext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def ensure_directories(cls) -> None:
 | 
					    def ensure_directories(cls) -> None:
 | 
				
			||||||
        """Ensures that all required directories exist"""
 | 
					        """Ensures that all required directories exist"""
 | 
				
			||||||
@@ -60,7 +94,7 @@ class AppConfig:
 | 
				
			|||||||
    def get_image_paths(cls) -> Dict[str, Path]:
 | 
					    def get_image_paths(cls) -> Dict[str, Path]:
 | 
				
			||||||
        """Returns paths to UI images"""
 | 
					        """Returns paths to UI images"""
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            "main_icon": cls.CONFIG_DIR / "images/main.png",
 | 
					            "main_icon": cls.SYSTEM_PATHS["image_path"] / "48/wg_vpn.png",
 | 
				
			||||||
            "warning": cls.CONFIG_DIR / "images/warning.png",
 | 
					            "warning": cls.CONFIG_DIR / "images/warning.png",
 | 
				
			||||||
            "success": cls.CONFIG_DIR / "images/success.png",
 | 
					            "success": cls.CONFIG_DIR / "images/success.png",
 | 
				
			||||||
            "error": cls.CONFIG_DIR / "images/error.png"
 | 
					            "error": cls.CONFIG_DIR / "images/error.png"
 | 
				
			||||||
@@ -79,3 +113,65 @@ ExecStartPre=/bin/sleep 5
 | 
				
			|||||||
ExecStart=/usr/local/bin/start_wg.py
 | 
					ExecStart=/usr/local/bin/start_wg.py
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=default.target"""
 | 
					WantedBy=default.target"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# here is inizialize the class for translate strrings
 | 
				
			||||||
 | 
					_ = AppConfig.setup_translations()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Msg:
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    A utility class that provides centralized access to translated message strings.
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    This class contains a dictionary of message strings used throughout the Wire-Py application.
 | 
				
			||||||
 | 
					    All strings are prepared for translation using gettext. The short key names make the code
 | 
				
			||||||
 | 
					    more concise while maintaining readability.
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    Attributes:
 | 
				
			||||||
 | 
					        STR (dict): A dictionary mapping short keys to translated message strings.
 | 
				
			||||||
 | 
					                   Keys are abbreviated for brevity but remain descriptive.
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    Usage:
 | 
				
			||||||
 | 
					        Import this class and access messages using the dictionary:
 | 
				
			||||||
 | 
					        `Msg.STR["sel_tl"]` returns the translated "Select tunnel" message.
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    Note:
 | 
				
			||||||
 | 
					        Ensure that gettext translation is properly initialized before
 | 
				
			||||||
 | 
					        accessing these strings to ensure correct localization.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    STR: Dict[str, str] = {
 | 
				
			||||||
 | 
					        # Strings for messages
 | 
				
			||||||
 | 
					        "sel_tl": _("Select tunnel"),
 | 
				
			||||||
 | 
					        "ren_err": _("Renaming not possible"),
 | 
				
			||||||
 | 
					        "exp_succ": _("Export successful"),
 | 
				
			||||||
 | 
					        "exp_in_home": _("Your zip file is in home directory"),
 | 
				
			||||||
 | 
					        "imp_err": _("Import Error"),
 | 
				
			||||||
 | 
					        "exp_err": _("Export Error"),
 | 
				
			||||||
 | 
					        "exp_try": _("Export failed! Please try again"),
 | 
				
			||||||
 | 
					        "tl_first": _("Please first import tunnel"),
 | 
				
			||||||
 | 
					        "sel_list": _("Please select a tunnel from the list"),
 | 
				
			||||||
 | 
					        "sign_len": _("The new name may contain only 12 characters"),
 | 
				
			||||||
 | 
					        "zero_signs": _("At least one character must be entered"),
 | 
				
			||||||
 | 
					        "false signs": _("No valid sign. These must not be used.\nBlank, Slash, Backslash and { }\n"),
 | 
				
			||||||
 | 
					        "is_in_use": _("The tunnel is already in use"),
 | 
				
			||||||
 | 
					        "no_valid_file": _("Oh... no valid Wireguard File!\nPlease select a valid Wireguard File"),
 | 
				
			||||||
 | 
					        "tl_exist": _("Tunnel already available!\nPlease use another file for import")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }    
 | 
				
			||||||
 | 
					    TTIP: Dict[str, str] = {
 | 
				
			||||||
 | 
					        #Strings for Tooltips
 | 
				
			||||||
 | 
					        "start_tl": _("Click to start selected Wireguard Tunnel"),
 | 
				
			||||||
 | 
					        "empty_list": _("No tunnels to start in the list"),
 | 
				
			||||||
 | 
					        "stop_tl": _("Click to stop selected Wireguard Tunnel"),
 | 
				
			||||||
 | 
					        "del_tl": _("Click to delete selected Wireguard Tunnel"),
 | 
				
			||||||
 | 
					        "rename_tl": _("To rename a tunnel, you need to\nselect a tunnel from the list"),
 | 
				
			||||||
 | 
					        "export_tl": _("         Click to export all\nWireguard Tunnel to Zipfile"),
 | 
				
			||||||
 | 
					        "trash_tl": _("Click to delete a Wireguard Tunnel\nSelect from the list!"),
 | 
				
			||||||
 | 
					        "autostart": _("To use the autostart, enable this Checkbox"),
 | 
				
			||||||
 | 
					        "autostart_info": _("You must have at least one\ntunnel in the list,to use the autostart"),
 | 
				
			||||||
 | 
					        "export_tl_info": _("No Tunnels in List for Export"),
 | 
				
			||||||
 | 
					        "start_tl_info": _("Click to start selected Wireguard Tunnel"),
 | 
				
			||||||
 | 
					        "rename_tl_info": _("To rename a tunnel, at least one must be in the list"),
 | 
				
			||||||
 | 
					        "trash_tl_info": _("No tunnels to delete in the list"),
 | 
				
			||||||
 | 
					        "list_auto_info": _("To use the autostart, a tunnel must be selected from the list")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
		Reference in New Issue
	
	Block a user