04-06-2025_large_update #35
							
								
								
									
										48
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										48
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							@@ -5,8 +5,12 @@
 | 
			
		||||
  </component>
 | 
			
		||||
  <component name="ChangeListManager">
 | 
			
		||||
    <list default="true" id="940e1630-c825-4d4c-be80-bc11f543c122" name="Changes" comment=" - Update Translate Files">
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
 | 
			
		||||
      <change afterPath="$PROJECT_DIR$/.vscode/settings.json" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/cls_mth_fc.py" beforeDir="false" afterPath="$PROJECT_DIR$/cls_mth_fc.py" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/ssl_decrypt.py" beforeDir="false" afterPath="$PROJECT_DIR$/ssl_decrypt.py" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/ssl_encrypt.py" beforeDir="false" afterPath="$PROJECT_DIR$/ssl_encrypt.py" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/wirepy.py" beforeDir="false" afterPath="$PROJECT_DIR$/wirepy.py" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/wp_app_config.py" beforeDir="false" afterPath="$PROJECT_DIR$/wp_app_config.py" afterDir="false" />
 | 
			
		||||
    </list>
 | 
			
		||||
    <option name="SHOW_DIALOG" value="false" />
 | 
			
		||||
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
 | 
			
		||||
@@ -43,28 +47,28 @@
 | 
			
		||||
    <option name="hideEmptyMiddlePackages" value="true" />
 | 
			
		||||
    <option name="showLibraryContents" value="true" />
 | 
			
		||||
  </component>
 | 
			
		||||
  <component name="PropertiesComponent"><![CDATA[{
 | 
			
		||||
  "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"
 | 
			
		||||
  <component name="PropertiesComponent">{
 | 
			
		||||
  "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"
 | 
			
		||||
  }
 | 
			
		||||
}]]></component>
 | 
			
		||||
}</component>
 | 
			
		||||
  <component name="RecentsManager">
 | 
			
		||||
    <key name="CopyFile.RECENT_KEYS">
 | 
			
		||||
      <recent name="$PROJECT_DIR$/lx-icons" />
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								__pycache__/manage_tunnel.cpython-312.pyc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								__pycache__/manage_tunnel.cpython-312.pyc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										188
									
								
								cls_mth_fc.py
									
									
									
									
									
								
							
							
						
						
									
										188
									
								
								cls_mth_fc.py
									
									
									
									
									
								
							@@ -181,23 +181,14 @@ class LxTools(tk.Tk):
 | 
			
		||||
            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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								manage_tunnel.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								manage_tunnel.py
									
									
									
									
									
										Normal file
									
								
							@@ -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()
 | 
			
		||||
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										630
									
								
								wirepy.py
									
									
									
									
									
								
							
							
						
						
									
										630
									
								
								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,16 +339,196 @@ 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:
 | 
			
		||||
        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.lb_rename.config(state="normal")
 | 
			
		||||
            self.lb_rename.delete(0, tk.END)
 | 
			
		||||
            self.btn_rename.config(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:
 | 
			
		||||
        """
 | 
			
		||||
@@ -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")])
 | 
			
		||||
            # 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')
 | 
			
		||||
            
 | 
			
		||||
            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"])
 | 
			
		||||
            # 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:
 | 
			
		||||
                # Use the original name as fallback
 | 
			
		||||
                subprocess.run(["nmcli", "connection", "up", tunnel_name], 
 | 
			
		||||
                            check=True, 
 | 
			
		||||
                            stdout=subprocess.PIPE, 
 | 
			
		||||
                            stderr=subprocess.PIPE)
 | 
			
		||||
            
 | 
			
		||||
                            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("")
 | 
			
		||||
            # After successful activation, update the display
 | 
			
		||||
            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()
 | 
			
		||||
            
 | 
			
		||||
            # Try to load the tunnel data
 | 
			
		||||
            try:
 | 
			
		||||
                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
 | 
			
		||||
            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
 | 
			
		||||
                self.stop()
 | 
			
		||||
            except Exception as e:
 | 
			
		||||
                print(f"Error loading tunnel data: {e}")
 | 
			
		||||
        
 | 
			
		||||
    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)
 | 
			
		||||
        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
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user