korreckturen throughout code

This commit is contained in:
Désiré Werner Menrath 2025-04-26 00:28:34 +02:00
parent f6204c9071
commit 1a853d4ff1
6 changed files with 255 additions and 222 deletions

51
.idea/workspace.xml generated
View File

@ -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">{
&quot;associatedIndex&quot;: 3 &quot;associatedIndex&quot;: 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": { &quot;keyToString&quot;: {
"ASKED_ADD_EXTERNAL_FILES": "true", &quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
"Python.INSTALL.executor": "Run", &quot;Python.INSTALL.executor&quot;: &quot;Run&quot;,
"Python.cls_mth_fc.executor": "Run", &quot;Python.cls_mth_fc.executor&quot;: &quot;Run&quot;,
"Python.install.executor": "Run", &quot;Python.install.executor&quot;: &quot;Run&quot;,
"Python.main.executor": "Run", &quot;Python.main.executor&quot;: &quot;Run&quot;,
"Python.messagebox.executor": "Run", &quot;Python.messagebox.executor&quot;: &quot;Run&quot;,
"Python.start_wg.executor": "Run", &quot;Python.start_wg.executor&quot;: &quot;Run&quot;,
"Python.testtheme.executor": "Run", &quot;Python.testtheme.executor&quot;: &quot;Run&quot;,
"Python.wg_func.executor": "Run", &quot;Python.wg_func.executor&quot;: &quot;Run&quot;,
"Python.wg_main.executor": "Run", &quot;Python.wg_main.executor&quot;: &quot;Run&quot;,
"Python.wirepy.executor": "Run", &quot;Python.wirepy.executor&quot;: &quot;Run&quot;,
"RunOnceActivity.ShowReadmeOnStart": "true", &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
"RunOnceActivity.git.unshallow": "true", &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
"Shell Script.install.executor": "Run", &quot;Shell Script.install.executor&quot;: &quot;Run&quot;,
"Shell Script.run_as.executor": "Run", &quot;Shell Script.run_as.executor&quot;: &quot;Run&quot;,
"git-widget-placeholder": "21-04-2025-new-tooltip", &quot;git-widget-placeholder&quot;: &quot;21-04-2025-new-tooltip&quot;,
"last_opened_file_path": "/home/punix/Pyapps/wire-py", &quot;last_opened_file_path&quot;: &quot;/home/punix/Pyapps/wire-py&quot;,
"settings.editor.selected.configurable": "ml.llm.LLMConfigurable" &quot;settings.editor.selected.configurable&quot;: &quot;ml.llm.LLMConfigurable&quot;
} }
}]]></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>

View File

@ -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 username 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()

View File

@ -6,30 +6,30 @@ 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)

View File

@ -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])

View File

@ -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)