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