04-06-2025_large_update #35
							
								
								
									
										51
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										51
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							@@ -9,7 +9,6 @@
 | 
				
			|||||||
      <change beforePath="$PROJECT_DIR$/cls_mth_fc.py" beforeDir="false" afterPath="$PROJECT_DIR$/cls_mth_fc.py" 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_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$/ssl_encrypt.py" beforeDir="false" afterPath="$PROJECT_DIR$/ssl_encrypt.py" afterDir="false" />
 | 
				
			||||||
      <change beforePath="$PROJECT_DIR$/start_wg.py" beforeDir="false" afterPath="$PROJECT_DIR$/start_wg.py" afterDir="false" />
 | 
					 | 
				
			||||||
      <change beforePath="$PROJECT_DIR$/wirepy.py" beforeDir="false" afterPath="$PROJECT_DIR$/wirepy.py" afterDir="false" />
 | 
					      <change beforePath="$PROJECT_DIR$/wirepy.py" beforeDir="false" afterPath="$PROJECT_DIR$/wirepy.py" afterDir="false" />
 | 
				
			||||||
    </list>
 | 
					    </list>
 | 
				
			||||||
    <option name="SHOW_DIALOG" value="false" />
 | 
					    <option name="SHOW_DIALOG" value="false" />
 | 
				
			||||||
@@ -34,8 +33,7 @@
 | 
				
			|||||||
    <option name="UPDATE_TYPE" value="REBASE" />
 | 
					    <option name="UPDATE_TYPE" value="REBASE" />
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="HighlightingSettingsPerFile">
 | 
					  <component name="HighlightingSettingsPerFile">
 | 
				
			||||||
    <setting file="file://$PROJECT_DIR$/wg_func.py" root0="SKIP_INSPECTION" />
 | 
					    <setting file="file:///usr/local/bin/ssl_decrypt.py" root0="SKIP_INSPECTION" />
 | 
				
			||||||
    <setting file="file://$PROJECT_DIR$/wg_main.py" root0="FORCE_HIGHLIGHTING" />
 | 
					 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="ProjectColorInfo">{
 | 
					  <component name="ProjectColorInfo">{
 | 
				
			||||||
  "associatedIndex": 3
 | 
					  "associatedIndex": 3
 | 
				
			||||||
@@ -48,28 +46,28 @@
 | 
				
			|||||||
    <option name="hideEmptyMiddlePackages" value="true" />
 | 
					    <option name="hideEmptyMiddlePackages" value="true" />
 | 
				
			||||||
    <option name="showLibraryContents" value="true" />
 | 
					    <option name="showLibraryContents" value="true" />
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="PropertiesComponent"><![CDATA[{
 | 
					  <component name="PropertiesComponent">{
 | 
				
			||||||
  "keyToString": {
 | 
					  "keyToString": {
 | 
				
			||||||
    "ASKED_ADD_EXTERNAL_FILES": "true",
 | 
					    "ASKED_ADD_EXTERNAL_FILES": "true",
 | 
				
			||||||
    "Python.INSTALL.executor": "Run",
 | 
					    "Python.INSTALL.executor": "Run",
 | 
				
			||||||
    "Python.cls_mth_fc.executor": "Run",
 | 
					    "Python.cls_mth_fc.executor": "Run",
 | 
				
			||||||
    "Python.install.executor": "Run",
 | 
					    "Python.install.executor": "Run",
 | 
				
			||||||
    "Python.main.executor": "Run",
 | 
					    "Python.main.executor": "Run",
 | 
				
			||||||
    "Python.messagebox.executor": "Run",
 | 
					    "Python.messagebox.executor": "Run",
 | 
				
			||||||
    "Python.start_wg.executor": "Run",
 | 
					    "Python.start_wg.executor": "Run",
 | 
				
			||||||
    "Python.testtheme.executor": "Run",
 | 
					    "Python.testtheme.executor": "Run",
 | 
				
			||||||
    "Python.wg_func.executor": "Run",
 | 
					    "Python.wg_func.executor": "Run",
 | 
				
			||||||
    "Python.wg_main.executor": "Run",
 | 
					    "Python.wg_main.executor": "Run",
 | 
				
			||||||
    "Python.wirepy.executor": "Run",
 | 
					    "Python.wirepy.executor": "Run",
 | 
				
			||||||
    "RunOnceActivity.ShowReadmeOnStart": "true",
 | 
					    "RunOnceActivity.ShowReadmeOnStart": "true",
 | 
				
			||||||
    "RunOnceActivity.git.unshallow": "true",
 | 
					    "RunOnceActivity.git.unshallow": "true",
 | 
				
			||||||
    "Shell Script.install.executor": "Run",
 | 
					    "Shell Script.install.executor": "Run",
 | 
				
			||||||
    "Shell Script.run_as.executor": "Run",
 | 
					    "Shell Script.run_as.executor": "Run",
 | 
				
			||||||
    "git-widget-placeholder": "21-04-2025-new-tooltip",
 | 
					    "git-widget-placeholder": "21-04-2025-new-tooltip",
 | 
				
			||||||
    "last_opened_file_path": "/home/punix/Pyapps/wire-py",
 | 
					    "last_opened_file_path": "/home/punix/Pyapps/wire-py",
 | 
				
			||||||
    "settings.editor.selected.configurable": "ml.llm.LLMConfigurable"
 | 
					    "settings.editor.selected.configurable": "ml.llm.LLMConfigurable"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}]]></component>
 | 
					}</component>
 | 
				
			||||||
  <component name="RecentsManager">
 | 
					  <component name="RecentsManager">
 | 
				
			||||||
    <key name="CopyFile.RECENT_KEYS">
 | 
					    <key name="CopyFile.RECENT_KEYS">
 | 
				
			||||||
      <recent name="$PROJECT_DIR$/lx-icons" />
 | 
					      <recent name="$PROJECT_DIR$/lx-icons" />
 | 
				
			||||||
@@ -630,6 +628,11 @@
 | 
				
			|||||||
          <line>1128</line>
 | 
					          <line>1128</line>
 | 
				
			||||||
          <option name="timeStamp" value="3" />
 | 
					          <option name="timeStamp" value="3" />
 | 
				
			||||||
        </line-breakpoint>
 | 
					        </line-breakpoint>
 | 
				
			||||||
 | 
					        <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
 | 
				
			||||||
 | 
					          <url>file://$PROJECT_DIR$/ssl_decrypt.py</url>
 | 
				
			||||||
 | 
					          <line>3</line>
 | 
				
			||||||
 | 
					          <option name="timeStamp" value="4" />
 | 
				
			||||||
 | 
					        </line-breakpoint>
 | 
				
			||||||
      </breakpoints>
 | 
					      </breakpoints>
 | 
				
			||||||
    </breakpoint-manager>
 | 
					    </breakpoint-manager>
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
 
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										350
									
								
								cls_mth_fc.py
									
									
									
									
									
								
							
							
						
						
									
										350
									
								
								cls_mth_fc.py
									
									
									
									
									
								
							@@ -8,11 +8,12 @@ import signal
 | 
				
			|||||||
import subprocess
 | 
					import subprocess
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
import tkinter as tk
 | 
					import tkinter as tk
 | 
				
			||||||
 | 
					from typing import Optional, Dict, Any, NoReturn, TextIO, Tuple, List
 | 
				
			||||||
import zipfile
 | 
					import zipfile
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from subprocess import check_call
 | 
					from subprocess import check_call, CompletedProcess
 | 
				
			||||||
from tkinter import ttk
 | 
					from tkinter import ttk, Toplevel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import requests
 | 
					import requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -32,15 +33,15 @@ class Create:
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def dir_and_files():
 | 
					    def dir_and_files() -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        check and create folders and files if not present
 | 
					        check and create folders and files if not present
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pth = Path.home() / ".config/wire_py"
 | 
					        pth: Path = Path.home() / ".config/wire_py"
 | 
				
			||||||
        pth.mkdir(parents=True, exist_ok=True)
 | 
					        pth.mkdir(parents=True, exist_ok=True)
 | 
				
			||||||
        sett = Path.home() / ".config/wire_py/settings"
 | 
					        sett: Path = Path.home() / ".config/wire_py/settings"
 | 
				
			||||||
        ks = Path.home() / ".config/wire_py/keys"
 | 
					        ks: Path = Path.home() / ".config/wire_py/keys"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if sett.exists():
 | 
					        if sett.exists():
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
@@ -56,14 +57,14 @@ class Create:
 | 
				
			|||||||
            ks.touch()
 | 
					            ks.touch()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def files_for_autostart():
 | 
					    def files_for_autostart() -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        check and create file for auto start if not present and enable the service
 | 
					        check and create a file for auto start if not present and enable the service
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pth2 = Path.home() / ".config/systemd/user"
 | 
					        pth2: Path = Path.home() / ".config/systemd/user"
 | 
				
			||||||
        pth2.mkdir(parents=True, exist_ok=True)
 | 
					        pth2.mkdir(parents=True, exist_ok=True)
 | 
				
			||||||
        wg_ser = Path.home() / ".config/systemd/user/wg_start.service"
 | 
					        wg_ser: Path = Path.home() / ".config/systemd/user/wg_start.service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if wg_ser.exists():
 | 
					        if wg_ser.exists():
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
@@ -76,24 +77,24 @@ class Create:
 | 
				
			|||||||
            check_call(["systemctl", "--user", "enable", "wg_start.service"])
 | 
					            check_call(["systemctl", "--user", "enable", "wg_start.service"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def make_dir():
 | 
					    def make_dir() -> None:
 | 
				
			||||||
        """Dirname "tlecdewg" = Tunnel Encrypt Decrypt Wireguard"""
 | 
					        """Folder Name "tlecdewg" = Tunnel Encrypt Decrypt Wireguard"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        dirname = Path("/tmp/tlecdcwg/")
 | 
					        folder_path: Path = Path("/tmp/tlecdcwg/")
 | 
				
			||||||
        if dirname.exists():
 | 
					        if folder_path.exists():
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            dirname.mkdir()
 | 
					            folder_path.mkdir()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def decrypt():
 | 
					    def decrypt() -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        This start ssl_decrypt file
 | 
					        Starts SSL dencrypt
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        process = subprocess.run(["pkexec", "/usr/local/bin/ssl_decrypt.py"], stdout=subprocess.PIPE, text=True,
 | 
					        process: CompletedProcess[str] = subprocess.run(["pkexec", "/usr/local/bin/ssl_decrypt.py"],
 | 
				
			||||||
                                 check=True)
 | 
					                                                        stdout=subprocess.PIPE, text=True, check=True)
 | 
				
			||||||
        path = Path.home() / ".config/wire_py/"
 | 
					        path: Path = Path.home() / ".config/wire_py/"
 | 
				
			||||||
        file_in_path = list(path.rglob("*.dat"))
 | 
					        file_in_path: list[Path] = list(path.rglob("*.dat"))
 | 
				
			||||||
        if file_in_path:
 | 
					        if file_in_path:
 | 
				
			||||||
            if process.returncode == 0:
 | 
					            if process.returncode == 0:
 | 
				
			||||||
                print("File successfully decrypted...")
 | 
					                print("File successfully decrypted...")
 | 
				
			||||||
@@ -103,12 +104,12 @@ class Create:
 | 
				
			|||||||
            print(_("Ready for import"))
 | 
					            print(_("Ready for import"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def encrypt():
 | 
					    def encrypt() -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        this start ssl_encrypt file
 | 
					        Starts SSL encryption
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        process = subprocess.run(["pkexec", "/usr/local/bin/ssl_encrypt.py"], stdout=subprocess.PIPE, text=True,
 | 
					        process: CompletedProcess[str] = subprocess.run(["pkexec", "/usr/local/bin/ssl_encrypt.py"],
 | 
				
			||||||
                                 check=True)
 | 
					                                                        stdout=subprocess.PIPE, text=True, check=True)
 | 
				
			||||||
        print(process.stdout)
 | 
					        print(process.stdout)
 | 
				
			||||||
        if process.returncode == 0:
 | 
					        if process.returncode == 0:
 | 
				
			||||||
            print("All Files successfully encrypted...")
 | 
					            print("All Files successfully encrypted...")
 | 
				
			||||||
@@ -121,38 +122,37 @@ class LxTools(tk.Tk):
 | 
				
			|||||||
    Class LinuxTools methods that can also be used for other apps
 | 
					    Class LinuxTools methods that can also be used for other apps
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, *args, **kwargs):
 | 
					    def __init__(self, *args: Any, **kwargs: Any) -> None:
 | 
				
			||||||
        super().__init__(*args, **kwargs)
 | 
					        super().__init__(*args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def uos():
 | 
					    def uos() -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					 | 
				
			||||||
        uos = LOGIN USERNAME
 | 
					        uos = LOGIN USERNAME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        This method displays the user name of the logged-in user,
 | 
					        This method displays the username of the logged-in user,
 | 
				
			||||||
        even if you are rooted in a shell
 | 
					        even if you are rooted in a shell
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        logname = f"{Path.home()}"[6:]
 | 
					        log_name: str = f"{Path.home()}"[6:]
 | 
				
			||||||
        file = Path.home() / "/tmp/.loguser"
 | 
					        file: Path = Path.home() / "/tmp/.log_user"
 | 
				
			||||||
        with open(file, "w", encoding="utf-8") as f:
 | 
					        with open(file, "w", encoding="utf-8") as f:
 | 
				
			||||||
            f.write(logname)
 | 
					            f.write(log_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def clean_files(dirname=None, file=None):
 | 
					    def clean_files(folder_path: Path = None, file: Path = None) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        method that can be added after need to delete a folder and a file when quitting.
 | 
					        method that can be added after need to delete a folder and a file when quitting.
 | 
				
			||||||
        Args:
 | 
					        Args:
 | 
				
			||||||
            dirname (_folder_, optional): _path to folder_. Defaults to None.
 | 
					            :param file: default None
 | 
				
			||||||
            file (_file_, optional): _path to file_. Defaults to None.
 | 
					            :param folder_path: default None
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if dirname is not None:
 | 
					        if folder_path is not None:
 | 
				
			||||||
            shutil.rmtree(dirname)
 | 
					            shutil.rmtree(folder_path)
 | 
				
			||||||
        if file is not None:
 | 
					        if file is not None:
 | 
				
			||||||
            Path.unlink(file)
 | 
					            Path.unlink(file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def if_tip(path):
 | 
					    def if_tip(path: Path) -> bool:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        method that writes in file whether tooltip is displayed or not
 | 
					        method that writes in file whether tooltip is displayed or not
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -165,83 +165,93 @@ class LxTools(tk.Tk):
 | 
				
			|||||||
            return tip
 | 
					            return tip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def msg_window(img_w, img_i, w_title, w_txt, txt2=None, com=None):
 | 
					    def msg_window(img_w: str, img_i: str, w_title: str, w_txt: str, txt2: Optional[str] = None,
 | 
				
			||||||
 | 
					                   com: Optional[str] = None) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Method for different message windows for the user. with 4 arguments to be passed.
 | 
					        Creates message windows
 | 
				
			||||||
        To create messages with your own images, icons, and titles.
 | 
					
 | 
				
			||||||
        As an alternative to Python Messagebox.
 | 
					        :argument img_w = Image for Tk Window
 | 
				
			||||||
        Paths to images must be specified: r'/usr/share/icons/lx-icons/64/info.png'
 | 
					        :argument img_i = Image for Icon
 | 
				
			||||||
        img_w = Image for Tk Window
 | 
					        :argument w_title = Windows Title
 | 
				
			||||||
        img_i = Image for Icon
 | 
					        :argument w_txt = Text for Tk Window
 | 
				
			||||||
        w_title = Windows Title
 | 
					        :argument txt2 = Text for Button two
 | 
				
			||||||
        w_txt = Text for Tk Window
 | 
					        :argument com = function for Button command
 | 
				
			||||||
        txt2 = Text for Button two
 | 
					 | 
				
			||||||
        com = function for Button command
 | 
					 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        msg = tk.Toplevel()
 | 
					        msg: tk.Toplevel = tk.Toplevel()
 | 
				
			||||||
        msg.resizable(width=False, height=False)
 | 
					        msg.resizable(width=False, height=False)
 | 
				
			||||||
        msg.title(w_title)
 | 
					        msg.title(w_title)
 | 
				
			||||||
        msg.configure(pady=15, padx=15)
 | 
					        msg.configure(pady=15, padx=15)
 | 
				
			||||||
        msg.img = tk.PhotoImage(file=img_w)
 | 
					        msg.img = tk.PhotoImage(file=img_w)
 | 
				
			||||||
        msg.i_window = tk.Label(msg, image=msg.img)
 | 
					        msg.i_window = tk.Label(msg, image=msg.img)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        label = tk.Label(msg, text=w_txt)
 | 
					        label: tk.Label = tk.Label(msg, text=w_txt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        label.grid(column=1, row=0)
 | 
					        label.grid(column=1, row=0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if txt2 is not None and com is not None:
 | 
					        if txt2 is not None and com is not None:
 | 
				
			||||||
            label.config(font=("Ubuntu", 11), padx=15, justify="left")
 | 
					            label.config(font=("Ubuntu", 11), padx=15, justify="left")
 | 
				
			||||||
            msg.i_window.grid(column=0, row=0, sticky="nw")
 | 
					            msg.i_window.grid(column=0, row=0, sticky="nw")
 | 
				
			||||||
            button2 = ttk.Button(msg, text=f"{txt2}", command=com, padding=4)
 | 
					            button2: ttk.Button = ttk.Button(msg, text=f"{txt2}", command=com, padding=4)
 | 
				
			||||||
            button2.grid(column=0, row=1, sticky="e", columnspan=2)
 | 
					            button2.grid(column=0, row=1, sticky="e", columnspan=2)
 | 
				
			||||||
            button = ttk.Button(msg, text="OK", command=msg.destroy, padding=4)
 | 
					            button: ttk.Button = ttk.Button(msg, text="OK", command=msg.destroy, padding=4)
 | 
				
			||||||
            button.grid(column=0, row=1, sticky="w", columnspan=2)
 | 
					            button.grid(column=0, row=1, sticky="w", columnspan=2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            label.config(font=("Ubuntu", 11), padx=15)
 | 
					            label.config(font=("Ubuntu", 11), padx=15)
 | 
				
			||||||
            msg.i_window.grid(column=0, row=0)
 | 
					            msg.i_window.grid(column=0, row=0)
 | 
				
			||||||
            button = ttk.Button(msg, text="OK", command=msg.destroy, padding=4)
 | 
					            button: ttk.Button = ttk.Button(msg, text="OK", command=msg.destroy, padding=4)
 | 
				
			||||||
            button.grid(column=0, columnspan=2, row=1)
 | 
					            button.grid(column=0, columnspan=2, row=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        img_i = tk.PhotoImage(file=img_i)
 | 
					        img_i: tk.PhotoImage = tk.PhotoImage(file=img_i)
 | 
				
			||||||
        msg.iconphoto(True, img_i)
 | 
					        msg.iconphoto(True, img_i)
 | 
				
			||||||
        msg.columnconfigure(0, weight=1)
 | 
					        msg.columnconfigure(0, weight=1)
 | 
				
			||||||
        msg.rowconfigure(0, weight=1)
 | 
					        msg.rowconfigure(0, weight=1)
 | 
				
			||||||
        msg.winfo_toplevel()
 | 
					        msg.winfo_toplevel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def sigi(dirname=None, file=None):
 | 
					    def sigi(file_path: Optional[Path] = None, file: Optional[Path] = None) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        function for clean up after break
 | 
					        Function for cleanup after a program interruption
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :param file: Optional - File to be deleted
 | 
				
			||||||
 | 
					        :param file_path: Optional - Directory to be deleted
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def signal_handler(signum, frame):
 | 
					        def signal_handler(signum: int, frame: Any) -> NoReturn:
 | 
				
			||||||
            """
 | 
					            """
 | 
				
			||||||
            Determine clear text names for signal numbers
 | 
					            Determines clear text names for signal numbers and handles signals
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Args:
 | 
				
			||||||
 | 
					                signum: The signal number
 | 
				
			||||||
 | 
					                frame: The current stack frame
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Returns:
 | 
				
			||||||
 | 
					                NoReturn since the function either exits the program or continues execution
 | 
				
			||||||
            """
 | 
					            """
 | 
				
			||||||
            signals_to_names_dict = dict(
 | 
					
 | 
				
			||||||
                (getattr(signal, n), n)
 | 
					            signals_to_names_dict: Dict[int, str] = dict((getattr(signal, n), n) for n in dir(signal)
 | 
				
			||||||
                for n in dir(signal)
 | 
					                                                         if n.startswith("SIG") and "_" not in n)
 | 
				
			||||||
                if n.startswith("SIG") and "_" not in n
 | 
					
 | 
				
			||||||
            )
 | 
					            signal_name: str = signals_to_names_dict.get(signum, f"Unnamed signal: {signum}")
 | 
				
			||||||
            signame = signals_to_names_dict.get(signum, f"Unnamed signal: {signum}")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # End program for certain signals, report to others only reception
 | 
					            # End program for certain signals, report to others only reception
 | 
				
			||||||
            if signum in (signal.SIGINT, signal.SIGTERM):
 | 
					            if signum in (signal.SIGINT, signal.SIGTERM):
 | 
				
			||||||
                exit_code = 1
 | 
					                exit_code: int = 1
 | 
				
			||||||
                print(f"\nSignal {signame} {(signum)} received. => Aborting with exit code {exit_code}.")
 | 
					                print(f"\nSignal {signal_name} {signum} received. => Aborting with exit code {exit_code}.")
 | 
				
			||||||
                LxTools.clean_files(dirname, file)
 | 
					                LxTools.clean_files(file_path, file)
 | 
				
			||||||
                print("Breakdown by user...")
 | 
					                print("Breakdown by user...")
 | 
				
			||||||
                sys.exit(exit_code)
 | 
					                sys.exit(exit_code)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                print(f"Signal {signum} received and ignored.")
 | 
					                print(f"Signal {signum} received and ignored.")
 | 
				
			||||||
                LxTools.clean_files(dirname, file)
 | 
					                LxTools.clean_files(file_path, file)
 | 
				
			||||||
                print("Process unexpectedly ended...")
 | 
					                print("Process unexpectedly ended...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Register signal handlers for various signals
 | 
				
			||||||
        signal.signal(signal.SIGINT, signal_handler)
 | 
					        signal.signal(signal.SIGINT, signal_handler)
 | 
				
			||||||
        signal.signal(signal.SIGTERM, signal_handler)
 | 
					        signal.signal(signal.SIGTERM, signal_handler)
 | 
				
			||||||
        signal.signal(signal.SIGHUP, signal_handler)
 | 
					        signal.signal(signal.SIGHUP, signal_handler)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GiteaUpdate:
 | 
					class GiteaUpdate:
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Calling download requests the download URL of the running script,
 | 
					    Calling download requests the download URL of the running script,
 | 
				
			||||||
@@ -250,63 +260,76 @@ class GiteaUpdate:
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def api_down(update_api_url, version, file=None):
 | 
					    def api_down(update_api_url: str, version: str, file: Optional[Path] = None) -> str:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Calling api_down requests the URL and the version of the running script.
 | 
					        Checks for updates via API
 | 
				
			||||||
        Example: version = 'v. 1.1.1.1' GiteaUpdate.api_down(http://example.de, version)
 | 
					        
 | 
				
			||||||
 | 
					        Args:
 | 
				
			||||||
 | 
					            update_api_url: Update API URL
 | 
				
			||||||
 | 
					            version: Current version
 | 
				
			||||||
 | 
					            file: Optional - Configuration file
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					            New version or status message
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            response = requests.get(update_api_url, timeout=10)
 | 
					            response: requests.Response = requests.get(update_api_url, timeout=10)
 | 
				
			||||||
            response_dict = response.json()
 | 
					            response_dict: Any = response.json()
 | 
				
			||||||
            response_dict = response_dict[0]
 | 
					            response_dict: Dict[str, Any] = response_dict[0]
 | 
				
			||||||
            with open(file, "r", encoding="utf-8") as set_f:
 | 
					            with open(file, "r", encoding="utf-8") as set_f:
 | 
				
			||||||
                set_f = set_f.read()
 | 
					                set_f = set_f.read()
 | 
				
			||||||
                if "on\n" in set_f:
 | 
					                if "on\n" in set_f:
 | 
				
			||||||
                    if version[3:] != response_dict["tag_name"]:
 | 
					                    if version[3:] != response_dict["tag_name"]:
 | 
				
			||||||
                        req = response_dict["tag_name"]
 | 
					                        req: str = response_dict["tag_name"]
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        req = "No Updates"
 | 
					                        req: str = "No Updates"
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    req = "False"
 | 
					                    req: str = "False"
 | 
				
			||||||
                return req
 | 
					                return req
 | 
				
			||||||
        except requests.exceptions.RequestException:
 | 
					        except requests.exceptions.RequestException:
 | 
				
			||||||
            req = "No Internet Connection!"
 | 
					            req: str = "No Internet Connection!"
 | 
				
			||||||
            return req
 | 
					            return req
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def download(urld, down_ok_image, down_not_ok_image, res):
 | 
					    def download(urld: str, down_ok_image: str, down_not_ok_image: str, res: str) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        this is for download new Version of wirepy
 | 
					        Downloads new version of wirepy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Args:
 | 
				
			||||||
 | 
					            urld: Download URL
 | 
				
			||||||
 | 
					            down_ok_image: Path to success image
 | 
				
			||||||
 | 
					            down_not_ok_image: Path to error image
 | 
				
			||||||
 | 
					            res: Result filename
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            to_down = f"wget -qP {Path.home()} {" "} {urld}"
 | 
					            to_down: str = f"wget -qP {Path.home()} {" "} {urld}"
 | 
				
			||||||
            result = subprocess.call(to_down, shell=True)
 | 
					            result: int = subprocess.call(to_down, shell=True)
 | 
				
			||||||
            if result == 0:
 | 
					            if result == 0:
 | 
				
			||||||
                shutil.chown(f"{Path.home()}/{res}.zip", 1000, 1000)
 | 
					                shutil.chown(f"{Path.home()}/{res}.zip", 1000, 1000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # img_w, img_i, w_title, w_txt hand over
 | 
					                # Message window variables
 | 
				
			||||||
                iw = r"/usr/share/icons/lx-icons/64/info.png"
 | 
					                iw: str = r"/usr/share/icons/lx-icons/64/info.png"
 | 
				
			||||||
                ii = down_ok_image
 | 
					                ii: str = down_ok_image
 | 
				
			||||||
                wt = _("Download Successful")
 | 
					                wt: str = _("Download Successful")
 | 
				
			||||||
                msg_t = _("Your zip file is in home directory")
 | 
					                msg_t: str = _("Your zip file is in home directory")
 | 
				
			||||||
                LxTools.msg_window(iw, ii, wt, msg_t)
 | 
					                LxTools.msg_window(iw, ii, wt, msg_t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # img_w, img_i, w_title, w_txt hand over
 | 
					                # Error message window variables
 | 
				
			||||||
                iw = r"/usr/share/icons/lx-icons/64/error.png"
 | 
					                iw: str = r"/usr/share/icons/lx-icons/64/error.png"
 | 
				
			||||||
                ii = down_not_ok_image
 | 
					                ii: str = down_not_ok_image
 | 
				
			||||||
                wt = _("Download error")
 | 
					                wt: str = _("Download error")
 | 
				
			||||||
                msg_t = _("Download failed! Please try again")
 | 
					                msg_t: str = _("Download failed! Please try again")
 | 
				
			||||||
                LxTools.msg_window(iw, ii, wt, msg_t)
 | 
					                LxTools.msg_window(iw, ii, wt, msg_t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        except subprocess.CalledProcessError:
 | 
					        except subprocess.CalledProcessError:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # img_w, img_i, w_title, w_txt hand over
 | 
					            # Exception message window variables
 | 
				
			||||||
            iw = r"/usr/share/icons/lx-icons/64/error.png"
 | 
					            iw: str = r"/usr/share/icons/lx-icons/64/error.png"
 | 
				
			||||||
            ii = down_not_ok_image
 | 
					            ii: str = down_not_ok_image
 | 
				
			||||||
            wt = _("Download error")
 | 
					            wt: str = _("Download error")
 | 
				
			||||||
            msg_t = _("Download failed! No internet connection!")
 | 
					            msg_t: str = _("Download failed! No internet connection!")
 | 
				
			||||||
            LxTools.msg_window(iw, ii, wt, msg_t)
 | 
					            LxTools.msg_window(iw, ii, wt, msg_t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -316,15 +339,14 @@ class Tunnel:
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def con_to_dict(cls, file):
 | 
					    def con_to_dict(cls, file: TextIO) -> Tuple[str, str, str, Optional[str]]:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        The config file is packed into a dictionary,
 | 
					        Returns tuple of (address, dns, endpoint, pre_key)
 | 
				
			||||||
        to display the values Address , DNS and Peer in the labels
 | 
					 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        dictlist = []
 | 
					        dictlist: List[str] = []
 | 
				
			||||||
        for lines in file.readlines():
 | 
					        for lines in file.readlines():
 | 
				
			||||||
            line_plit = lines.split()
 | 
					            line_plit: List[str] = lines.split()
 | 
				
			||||||
            dictlist = dictlist + line_plit
 | 
					            dictlist = dictlist + line_plit
 | 
				
			||||||
        dictlist.remove("[Interface]")
 | 
					        dictlist.remove("[Interface]")
 | 
				
			||||||
        dictlist.remove("[Peer]")
 | 
					        dictlist.remove("[Peer]")
 | 
				
			||||||
@@ -336,33 +358,33 @@ class Tunnel:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # Here is the beginning (Loop) of convert List to Dictionary
 | 
					        # Here is the beginning (Loop) of convert List to Dictionary
 | 
				
			||||||
        for _ in dictlist:
 | 
					        for _ in dictlist:
 | 
				
			||||||
            a = [dictlist[0], dictlist[1]]
 | 
					            a: List[str] = [dictlist[0], dictlist[1]]
 | 
				
			||||||
            b = [dictlist[2], dictlist[3]]
 | 
					            b: List[str] = [dictlist[2], dictlist[3]]
 | 
				
			||||||
            c = [dictlist[4], dictlist[5]]
 | 
					            c: List[str] = [dictlist[4], dictlist[5]]
 | 
				
			||||||
            d = [dictlist[6], dictlist[7]]
 | 
					            d: List[str] = [dictlist[6], dictlist[7]]
 | 
				
			||||||
            e = [dictlist[8], dictlist[9]]
 | 
					            e: List[str] = [dictlist[8], dictlist[9]]
 | 
				
			||||||
            f = [dictlist[10], dictlist[11]]
 | 
					            f: List[str] = [dictlist[10], dictlist[11]]
 | 
				
			||||||
            g = [dictlist[12], dictlist[13]]
 | 
					            g: List[str] = [dictlist[12], dictlist[13]]
 | 
				
			||||||
            h = [dictlist[14], dictlist[15]]
 | 
					            h: List[str] = [dictlist[14], dictlist[15]]
 | 
				
			||||||
            new_list = [a, b, c, d, e, f, g, h]
 | 
					            new_list: List[List[str]] = [a, b, c, d, e, f, g, h]
 | 
				
			||||||
            final_dict = {}
 | 
					            final_dict: Dict[str, str] = {}
 | 
				
			||||||
            for elements in new_list:
 | 
					            for elements in new_list:
 | 
				
			||||||
                final_dict[elements[0]] = elements[1]
 | 
					                final_dict[elements[0]] = elements[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # end... result a Dictionary
 | 
					            # end... result a Dictionary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        address = final_dict["Address"]
 | 
					        address: str = final_dict["Address"]
 | 
				
			||||||
        dns = final_dict["DNS"]
 | 
					        dns: str = final_dict["DNS"]
 | 
				
			||||||
        if "," in dns:
 | 
					        if "," in dns:
 | 
				
			||||||
            dns = dns[:-1]
 | 
					            dns = dns[:-1]
 | 
				
			||||||
        endpoint = final_dict["Endpoint"]
 | 
					        endpoint: str = final_dict["Endpoint"]
 | 
				
			||||||
        pre_key = final_dict.get("PresharedKey")
 | 
					        pre_key: Optional[str] = final_dict.get("PresharedKey")
 | 
				
			||||||
        if pre_key is None:
 | 
					        if pre_key is None:
 | 
				
			||||||
            pre_key = final_dict.get("PreSharedKey")
 | 
					            pre_key: Optional[str] = final_dict.get("PreSharedKey")
 | 
				
			||||||
        return address, dns, endpoint, pre_key
 | 
					        return address, dns, endpoint, pre_key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def active():
 | 
					    def active() -> str:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Shows the Active Tunnel
 | 
					        Shows the Active Tunnel
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -375,59 +397,59 @@ class Tunnel:
 | 
				
			|||||||
        return active
 | 
					        return active
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def list():
 | 
					    def list() -> List[str]:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Shows all existing Wireguard tunnels a login user
 | 
					        Returns a list of Wireguard tunnel names
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        dirname = Path("/tmp/tlecdcwg/")
 | 
					        folder_path: Path = Path("/tmp/tlecdcwg/")
 | 
				
			||||||
        wg_s = os.listdir(dirname)
 | 
					        wg_s: List[str] = os.listdir(folder_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return wg_s
 | 
					        return wg_s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def export():
 | 
					    def export() -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        This will export the tunnels.
 | 
					        This will export the tunnels.
 | 
				
			||||||
        A zipfile with current date and time is created
 | 
					        A zipfile with the current date and time is created
 | 
				
			||||||
        in the user's home directory with correct right
 | 
					        in the user's home directory with the correct right
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        now_time = datetime.now()
 | 
					        now_time: datetime = datetime.now()
 | 
				
			||||||
        now_datetime = now_time.strftime("wg-exp-%m-%d-%Y-%H:%M")
 | 
					        now_datetime: str = now_time.strftime("wg-exp-%m-%d-%Y-%H:%M")
 | 
				
			||||||
        tl = Tunnel.list()
 | 
					        tl: List[str] = Tunnel.list()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            if len(tl) != 0:
 | 
					            if len(tl) != 0:
 | 
				
			||||||
                wg_tar = f"{Path.home()}/{now_datetime}"
 | 
					                wg_tar: str = f"{Path.home()}/{now_datetime}"
 | 
				
			||||||
                shutil.copytree("/tmp/tlecdcwg/", "/tmp/wire_py", dirs_exist_ok=True)
 | 
					                shutil.copytree("/tmp/tlecdcwg/", "/tmp/wire_py", dirs_exist_ok=True)
 | 
				
			||||||
                source = Path("/tmp/wire_py")
 | 
					                source: Path = Path("/tmp/wire_py")
 | 
				
			||||||
                shutil.make_archive(wg_tar, "zip", source)
 | 
					                shutil.make_archive(wg_tar, "zip", source)
 | 
				
			||||||
                shutil.rmtree(source)
 | 
					                shutil.rmtree(source)
 | 
				
			||||||
                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:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        # img_w, img_i, w_title, w_txt hand over
 | 
					                        # Message window variables
 | 
				
			||||||
                        iw = r"/usr/share/icons/lx-icons/64/info.png"
 | 
					                        iw: str = r"/usr/share/icons/lx-icons/64/info.png"
 | 
				
			||||||
                        ii = r"/usr/share/icons/lx-icons/48/wg_vpn.png"
 | 
					                        ii: str = r"/usr/share/icons/lx-icons/48/wg_vpn.png"
 | 
				
			||||||
                        wt = _("Export Successful")
 | 
					                        wt: str = _("Export Successful")
 | 
				
			||||||
                        msg_t = _("Your zip file is in home directory")
 | 
					                        msg_t: str = _("Your zip file is in home directory")
 | 
				
			||||||
                        LxTools.msg_window(iw, ii, wt, msg_t)
 | 
					                        LxTools.msg_window(iw, ii, wt, msg_t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        # img_w, img_i, w_title, w_txt hand over
 | 
					                        # Error message window variables
 | 
				
			||||||
                        iw = r"/usr/share/icons/lx-icons/64/error.png"
 | 
					                        iw: str = r"/usr/share/icons/lx-icons/64/error.png"
 | 
				
			||||||
                        ii = r"/usr/share/icons/lx-icons/48/wg_msg.png"
 | 
					                        ii: str = r"/usr/share/icons/lx-icons/48/wg_msg.png"
 | 
				
			||||||
                        wt = _("Export error")
 | 
					                        wt: str = _("Export error")
 | 
				
			||||||
                        msg_t = _("Export failed! Please try again")
 | 
					                        msg_t: str = _("Export failed! Please try again")
 | 
				
			||||||
                        LxTools.msg_window(iw, ii, wt, msg_t)
 | 
					                        LxTools.msg_window(iw, ii, wt, msg_t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # img_w, img_i, w_title, w_txt hand over
 | 
					                # Message window variables
 | 
				
			||||||
                iw = r"/usr/share/icons/lx-icons/64/info.png"
 | 
					                iw: str = r"/usr/share/icons/lx-icons/64/info.png"
 | 
				
			||||||
                ii = r"/usr/share/icons/lx-icons/48/wg_msg.png"
 | 
					                ii: str = r"/usr/share/icons/lx-icons/48/wg_msg.png"
 | 
				
			||||||
                wt = _("Select tunnel")
 | 
					                wt: str = _("Select tunnel")
 | 
				
			||||||
                msg_t = _("Please first import tunnel")
 | 
					                msg_t: str = _("Please first import tunnel")
 | 
				
			||||||
                LxTools.msg_window(iw, ii, wt, msg_t)
 | 
					                LxTools.msg_window(iw, ii, wt, msg_t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        except TypeError:
 | 
					        except TypeError:
 | 
				
			||||||
@@ -438,42 +460,50 @@ class Tooltip:
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    class for Tooltip
 | 
					    class for Tooltip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    imoprt Tooltip
 | 
					    import Tooltip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    example: Tooltip(label, "Show tooltip on label")
 | 
					    example: Tooltip(label, "Show tooltip on label")
 | 
				
			||||||
    examble: Tooltip(button, "Show tooltip on button")
 | 
					    example: Tooltip(button, "Show tooltip on button")
 | 
				
			||||||
    info: label and button is parrent.
 | 
					    info: label and button are parent.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, widget, text, tips=None):
 | 
					    def __init__(self, widget: Any, text: str, tips: Optional[bool] = None) -> None:
 | 
				
			||||||
        self.widget = widget
 | 
					        """
 | 
				
			||||||
        self.text = text
 | 
					        Tooltip Class
 | 
				
			||||||
        self.tooltip_window = None
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.widget: Any = widget
 | 
				
			||||||
 | 
					        self.text: str = text
 | 
				
			||||||
 | 
					        self.tooltip_window: Optional[Toplevel] = None
 | 
				
			||||||
        if tips:
 | 
					        if tips:
 | 
				
			||||||
            self.widget.bind("<Enter>", self.show_tooltip)
 | 
					            self.widget.bind("<Enter>", self.show_tooltip)
 | 
				
			||||||
            self.widget.bind("<Leave>", self.hide_tooltip)
 | 
					            self.widget.bind("<Leave>", self.hide_tooltip)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def show_tooltip(self, event=None):
 | 
					    def show_tooltip(self, event: Optional[Any] = None) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        shows the tooltip
 | 
					        Shows the tooltip
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if self.tooltip_window or not self.text:
 | 
					        if self.tooltip_window or not self.text:
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        x, y, _, _ = self.widget.bbox("insert")
 | 
					        x: int
 | 
				
			||||||
 | 
					        y: int
 | 
				
			||||||
 | 
					        cx: int
 | 
				
			||||||
 | 
					        cy: int
 | 
				
			||||||
 | 
					        x, y, cx, cy = self.widget.bbox("insert")
 | 
				
			||||||
        x += self.widget.winfo_rootx() + 65
 | 
					        x += self.widget.winfo_rootx() + 65
 | 
				
			||||||
        y += self.widget.winfo_rooty() + 40
 | 
					        y += self.widget.winfo_rooty() + 40
 | 
				
			||||||
        self.tooltip_window = tw = tk.Toplevel(self.widget)
 | 
					        self.tooltip_window = tw = tk.Toplevel(self.widget)
 | 
				
			||||||
        tw.wm_overrideredirect(True)
 | 
					        tw.wm_overrideredirect(True)
 | 
				
			||||||
        tw.wm_geometry(f"+{x}+{y}")
 | 
					        tw.wm_geometry(f"+{x}+{y}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        label = tk.Label(tw, text=self.text, background="lightgreen", foreground="black", relief="solid", borderwidth=1,
 | 
					        label: tk.Label = tk.Label(tw, text=self.text, background="lightgreen", foreground="black", relief="solid",
 | 
				
			||||||
                         padx=5, pady=5)
 | 
					                                   borderwidth=1, padx=5, pady=5)
 | 
				
			||||||
        label.grid()
 | 
					        label.grid()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def hide_tooltip(self, event=None):
 | 
					    def hide_tooltip(self, event: Optional[Any] = None) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        hide the tooltip
 | 
					        Hides the tooltip
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if self.tooltip_window:
 | 
					        if self.tooltip_window:
 | 
				
			||||||
            self.tooltip_window.destroy()
 | 
					            self.tooltip_window.destroy()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,35 +1,35 @@
 | 
				
			|||||||
#!/usr/bin/python3
 | 
					#!/usr/bin/python3
 | 
				
			||||||
""" This Script decrypt Wireguardfiles for Wirepy users """
 | 
					""" This Script decrypt Wireguard files for Wirepy users """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from subprocess import check_call
 | 
					from subprocess import check_call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uname = Path("/tmp/.loguser")
 | 
					uname: Path = Path("/tmp/.log_user")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
with open(uname, "r", encoding="utf-8") as f:
 | 
					with open(uname, "r", encoding="utf-8") as f:
 | 
				
			||||||
    logname = f.readline()
 | 
					    log_name = f.readline()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Dirname "tlecdewg" = Tunnel Encrypt Decrypt Wireguard
 | 
					# Folder Name "tlecdewg" = Tunnel Encrypt Decrypt Wireguard
 | 
				
			||||||
dirname = Path("/tmp/tlecdcwg/")
 | 
					folder_path: Path = Path("/tmp/tlecdcwg/")
 | 
				
			||||||
keyfile = Path(f"/home/{logname}/.config/wire_py/pbwgk.pem")
 | 
					keyfile: Path = Path(f"/home/{log_name}/.config/wire_py/pbwgk.pem")
 | 
				
			||||||
PKEYFILE = "/usr/local/etc/ssl/pwgk.pem"
 | 
					PKEYFILE: Path = "/usr/local/etc/ssl/pwgk.pem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if not keyfile.is_file():
 | 
					if not keyfile.is_file():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    check_call(["openssl", "rsa", "-in", PKEYFILE, "-out", keyfile, "-outform", "PEM", "-pubout"])
 | 
					    check_call(["openssl", "rsa", "-in", PKEYFILE, "-out", keyfile, "-outform", "PEM", "-pubout"])
 | 
				
			||||||
    shutil.chown(keyfile, 1000, 1000)
 | 
					    shutil.chown(keyfile, 1000, 1000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dirname2 = f"/home/{logname}/.config/wire_py/"
 | 
					folder_path2 = f"/home/{log_name}/.config/wire_py/"
 | 
				
			||||||
detl = os.listdir(dirname2)
 | 
					detl: list[str] = os.listdir(folder_path2)
 | 
				
			||||||
os.chdir(dirname2)
 | 
					os.chdir(folder_path2)
 | 
				
			||||||
detl.remove("keys")
 | 
					detl.remove("keys")
 | 
				
			||||||
detl.remove("settings")
 | 
					detl.remove("settings")
 | 
				
			||||||
if os.path.exists(f"{dirname2}pbwgk.pem"):
 | 
					if os.path.exists(f"{folder_path2}pbwgk.pem"):
 | 
				
			||||||
    detl.remove("pbwgk.pem")
 | 
					    detl.remove("pbwgk.pem")
 | 
				
			||||||
    for detunnels in detl:
 | 
					    for detunnels in detl:
 | 
				
			||||||
        tlname2 = f"{detunnels[:-4]}.conf"
 | 
					        tlname2 = f"{detunnels[:-4]}.conf"
 | 
				
			||||||
        extpath = f"{dirname}/{tlname2}"
 | 
					        extpath = f"{folder_path}/{tlname2}"
 | 
				
			||||||
        check_call(["openssl", "pkeyutl", "-decrypt", "-inkey", PKEYFILE, "-in", detunnels, "-out", extpath])
 | 
					        check_call(["openssl", "pkeyutl", "-decrypt", "-inkey", PKEYFILE, "-in", detunnels, "-out", extpath])
 | 
				
			||||||
        shutil.chown(extpath, 1000, 1000)
 | 
					        shutil.chown(extpath, 1000, 1000)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,13 +6,13 @@ import shutil
 | 
				
			|||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from subprocess import check_call
 | 
					from subprocess import check_call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uname = Path("/tmp/.loguser")
 | 
					uname: Path = Path("/tmp/.log_user")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
with open(uname, "r", encoding="utf-8") as f:
 | 
					with open(uname, "r", encoding="utf-8") as f:
 | 
				
			||||||
    logname = f.readline()
 | 
					    log_name: str = f.readline()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
keyfile = Path(f"/home/{logname}/.config/wire_py/pbwgk.pem")
 | 
					keyfile: Path = Path(f"/home/{log_name}/.config/wire_py/pbwgk.pem")
 | 
				
			||||||
dirname = Path("/tmp/tlecdcwg/")
 | 
					folder_path: Path = Path("/tmp/tlecdcwg/")
 | 
				
			||||||
PKEYFILE = "/usr/local/etc/ssl/pwgk.pem"
 | 
					PKEYFILE = "/usr/local/etc/ssl/pwgk.pem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if not keyfile.is_file():
 | 
					if not keyfile.is_file():
 | 
				
			||||||
@@ -20,28 +20,28 @@ if not keyfile.is_file():
 | 
				
			|||||||
    check_call(["openssl", "rsa", "-in", PKEYFILE, "-out", keyfile, "-outform", "PEM", "-pubout"])
 | 
					    check_call(["openssl", "rsa", "-in", PKEYFILE, "-out", keyfile, "-outform", "PEM", "-pubout"])
 | 
				
			||||||
    shutil.chown(keyfile, 1000, 1000)
 | 
					    shutil.chown(keyfile, 1000, 1000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if dirname.exists():
 | 
					    if folder_path.exists():
 | 
				
			||||||
        tl = os.listdir(f"{dirname}")
 | 
					        tl = os.listdir(f"{folder_path}")
 | 
				
			||||||
        CPTH = f"{keyfile}"
 | 
					        CPTH: str = f"{keyfile}"
 | 
				
			||||||
        CRYPTFILES = CPTH[:-9]
 | 
					        CRYPTFILES: str = CPTH[:-9]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if keyfile.exists() and len(tl) != 0:
 | 
					        if keyfile.exists() and len(tl) != 0:
 | 
				
			||||||
            for tunnels in tl:
 | 
					            for tunnels in tl:
 | 
				
			||||||
                sourcetl = f"{dirname}/{tunnels}"
 | 
					                sourcetl: str = f"{folder_path}/{tunnels}"
 | 
				
			||||||
                tlname = f"{CRYPTFILES}{tunnels[:-5]}.dat"
 | 
					                tlname: str = f"{CRYPTFILES}{tunnels[:-5]}.dat"
 | 
				
			||||||
                check_call(["openssl", "pkeyutl", "-encrypt", "-inkey", keyfile, "-pubin", "-in", sourcetl, "-out",
 | 
					                check_call(["openssl", "pkeyutl", "-encrypt", "-inkey", keyfile, "-pubin", "-in", sourcetl, "-out",
 | 
				
			||||||
                            tlname,])
 | 
					                            tlname,])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
else:
 | 
					else:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if dirname.exists():
 | 
					    if folder_path.exists():
 | 
				
			||||||
        tl = os.listdir(f"{dirname}")
 | 
					        tl: list[str] = os.listdir(f"{folder_path}")
 | 
				
			||||||
        CPTH = f"{keyfile}"
 | 
					        CPTH: str = f"{keyfile}"
 | 
				
			||||||
        CRYPTFILES = CPTH[:-9]
 | 
					        CRYPTFILES: str = CPTH[:-9]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if keyfile.exists() and len(tl) != 0:
 | 
					        if keyfile.exists() and len(tl) != 0:
 | 
				
			||||||
            for tunnels in tl:
 | 
					            for tunnels in tl:
 | 
				
			||||||
                sourcetl = f"{dirname}/{tunnels}"
 | 
					                sourcetl: str = f"{folder_path}/{tunnels}"
 | 
				
			||||||
                tlname = f"{CRYPTFILES}{tunnels[:-5]}.dat"
 | 
					                tlname: str = f"{CRYPTFILES}{tunnels[:-5]}.dat"
 | 
				
			||||||
                check_call(
 | 
					                check_call(["openssl", "pkeyutl", "-encrypt", "-inkey", keyfile, "-pubin", "-in", sourcetl, "-out",
 | 
				
			||||||
                    ["openssl", "pkeyutl", "-encrypt", "-inkey", keyfile, "-pubin", "-in", sourcetl, "-out", tlname])
 | 
					                            tlname])
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								wirepy.py
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								wirepy.py
									
									
									
									
									
								
							@@ -21,14 +21,14 @@ Create.dir_and_files()
 | 
				
			|||||||
Create.make_dir()
 | 
					Create.make_dir()
 | 
				
			||||||
Create.decrypt()
 | 
					Create.decrypt()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tcl_path = Path("/usr/share/TK-Themes")
 | 
					tcl_path: Path = Path("/usr/share/TK-Themes")
 | 
				
			||||||
set_file = Path(Path.home() / ".config/wire_py/settings")
 | 
					set_file: Path = Path(Path.home() / ".config/wire_py/settings")
 | 
				
			||||||
tips = LxTools.if_tip(set_file)
 | 
					tips = LxTools.if_tip(set_file)
 | 
				
			||||||
dirname = Path("/tmp/tlecdcwg/")
 | 
					folder_path: Path = Path("/tmp/tlecdcwg/")
 | 
				
			||||||
userfile = Path("/tmp/.loguser")
 | 
					userfile = Path("/tmp/.log_user")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# 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 = "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, set_file)
 | 
					res = GiteaUpdate.api_down("https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases", VERSION, set_file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,7 +40,7 @@ gettext.bindtextdomain(APP, LOCALE_DIR)
 | 
				
			|||||||
gettext.textdomain(APP)
 | 
					gettext.textdomain(APP)
 | 
				
			||||||
_ = gettext.gettext
 | 
					_ = gettext.gettext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LxTools.sigi(dirname, userfile)
 | 
					LxTools.sigi(folder_path, userfile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Wirepy(tk.Tk):
 | 
					class Wirepy(tk.Tk):
 | 
				
			||||||
@@ -917,5 +917,5 @@ if __name__ == "__main__":
 | 
				
			|||||||
    window.tk.call("set", "::tk::dialog::file::showHiddenVar", "0")
 | 
					    window.tk.call("set", "::tk::dialog::file::showHiddenVar", "0")
 | 
				
			||||||
    window.mainloop()
 | 
					    window.mainloop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LxTools.clean_files(dirname, userfile)
 | 
					LxTools.clean_files(folder_path, userfile)
 | 
				
			||||||
sys.exit(0)
 | 
					sys.exit(0)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user