4 Commits

37 changed files with 69 additions and 75 deletions

View File

@ -6,11 +6,26 @@ My standard System: Linux Mint 22 Cinnamon
- os import in common_tools.py replaced by other methods - os import in common_tools.py replaced by other methods
- If Wire-Py already runs, prevent further start - If Wire-Py already runs, prevent further start
- for loops with lists replaced by List Comprehensions - for loops with lists replaced by List Comprehensions
- Tunnel in tk.canvas for modern look
- Replace Download Button with Lx Tools installer
### Added ### Added
03-06-2025 14-06-2025
- replace msg_window with MassageDialog
- vpn stop icon corrected
### Added
07-06-2025
- ssl_decrypt now directly checks whether encrypted files are located in the specified directory.
- This method has been removed from common_tools. The path has been adjusted ssl_decrypt likely
had an incorrect path. No files were decrypted. This has been fixed.
- Key generation has been removed from ssl_decrypt, as it is only needed in ssl_encrypt.
- Logviewer now in the settings menu. Moduls now as libs in share_libs.
- The Lx Tools installer is there to ensure that everything required for the selected app is installed.
-
### Added ### Added
13-04-20255 13-04-20255
@ -49,12 +64,14 @@ My standard System: Linux Mint 22 Cinnamon
- Tunnels are now read from the directory to view them in the list. - Tunnels are now read from the directory to view them in the list.
To display only own tunnels, and read errors are minimized. To display only own tunnels, and read errors are minimized.
### Added ### Added
10-11-2024 10-11-2024
- Fix Checkbutton Autostart when first install Wire-Py - Fix Checkbutton Autostart when first install Wire-Py
- Update Translate Files - Update Translate Files
### Added ### Added
10-11-2024 10-11-2024

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
lx-icons/128/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
lx-icons/256/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 20 KiB

BIN
lx-icons/32/Lunix_Tools.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
lx-icons/32/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
lx-icons/32/wg_vpn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
lx-icons/48/Lunix_Tools.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
lx-icons/48/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
lx-icons/64/Lunix_Tools.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
lx-icons/64/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -5,53 +5,32 @@ from pathlib import Path
import pwd import pwd
import shutil import shutil
from subprocess import CompletedProcess, run from subprocess import CompletedProcess, run
from shared_libs.wp_app_config import AppConfig, logging from shared_libs.wp_app_config import AppConfig
from shared_libs.common_tools import LxTools
from shared_libs.message import MessageDialog
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--user", required=True, help="Username of the target file system") parser.add_argument("--user", required=True, help="Username of the target file system")
args = parser.parse_args() args = parser.parse_args()
_ = AppConfig.setup_translations()
try: try:
# Retrieve UID and GID # Retrieve UID and GID
user_info = pwd.getpwnam(args.user) user_info = pwd.getpwnam(args.user)
uid = user_info.pw_uid # User ID (e.g., 1000) uid = user_info.pw_uid # User ID (e.g., 1000)
gid = user_info.pw_gid # Group ID (e.g., 1000) gid = user_info.pw_gid # Group ID (e.g., 1000)
except KeyError: except KeyError:
logging.error(f"User '{args.user}' not found.", exc_info=True) MessageDialog("error", _(f"User '{args.user}' not found."), title="Error decrypt")
exit(1) exit(1)
keyfile: Path = Path(f"/home/{args.user}/.config/wire_py/pbwgk.pem") crypted_tunnel: Path = Path(f"/home/{args.user}/.config/wire_py")
path_of_crypted_tunnel: Path = Path(f"/home/{args.user}/.config/wire_py")
if not keyfile.is_file(): if len([str(file) for file in crypted_tunnel.glob("*.dat")]) == 0:
process: CompletedProcess[str] = run( pass
[ else:
"openssl", crypted__tunnel = [str(file) for file in crypted_tunnel.glob("*.dat")]
"rsa",
"-in",
AppConfig.SYSTEM_PATHS["pkey_path"],
"-out",
keyfile,
"-outform",
"PEM",
"-pubout",
],
capture_output=True,
text=True,
check=False,
)
if process.returncode == 0:
logging.info("Public key generated successfully.", exc_info=True)
else:
logging.error(
f"Error with the following code... {process.returncode}", exc_info=True
)
shutil.chown(keyfile, uid, gid)
if AppConfig.PUBLICKEY.exists():
crypted__tunnel = [str(file) for file in path_of_crypted_tunnel.glob("*.dat")]
for tunnel_path in crypted__tunnel: for tunnel_path in crypted__tunnel:
@ -74,11 +53,13 @@ if AppConfig.PUBLICKEY.exists():
check=False, check=False,
) )
shutil.chown(f"{AppConfig.TEMP_DIR}/{base_name}.conf", uid, gid) shutil.chown(f"{AppConfig.TEMP_DIR}/{base_name}.conf", uid, gid)
logging.info(f"Processing of the file: {tunnel_path}", exc_info=True)
# Output from Openssl Error # Output from Openssl Error
if process.stderr: if process.stderr:
logging.error( MessageDialog(
f"{process.stderr} Error by [{tunnel_path}] Code: {process.returncode}", "erro",
exc_info=True, _(
f"{process.stderr} Error by [{tunnel_path}] Code: {process.returncode}"
),
title="Error decrypt",
) )

View File

@ -2,16 +2,19 @@
""" This Script encrypt Wireguardfiles for Wirepy users for more Security """ """ This Script encrypt Wireguardfiles for Wirepy users for more Security """
import argparse import argparse
import logging
from pathlib import Path from pathlib import Path
import pwd import pwd
import shutil import shutil
from subprocess import CompletedProcess, run from subprocess import CompletedProcess, run
from shared_libs.wp_app_config import AppConfig, logging from shared_libs.wp_app_config import AppConfig
from shared_libs.common_tools import LogConfig
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--user", required=True, help="Username of the target file system") parser.add_argument("--user", required=True, help="Username of the target file system")
args = parser.parse_args() args = parser.parse_args()
LogConfig.logger(f"/home/{args.user}/.local/share/lxlogs/wirepy.log")
try: try:
# Retrieve UID and GID # Retrieve UID and GID
user_info = pwd.getpwnam(args.user) user_info = pwd.getpwnam(args.user)

View File

@ -9,6 +9,7 @@ from subprocess import run, CompletedProcess
import secrets import secrets
from shared_libs.wp_app_config import AppConfig, Msg from shared_libs.wp_app_config import AppConfig, Msg
from shared_libs.common_tools import LxTools, CryptoUtil from shared_libs.common_tools import LxTools, CryptoUtil
from shared_libs.message import MessageDialog
# Translate # Translate
_ = AppConfig.setup_translations() _ = AppConfig.setup_translations()
@ -172,12 +173,8 @@ class Tunnel:
CryptoUtil.decrypt(getpass.getuser()) CryptoUtil.decrypt(getpass.getuser())
if len([file.name for file in AppConfig.TEMP_DIR.glob("*.conf")]) == 0: if len([file.name for file in AppConfig.TEMP_DIR.glob("*.conf")]) == 0:
LxTools.msg_window( MessageDialog("info", Msg.STR["tl_first"], title=Msg.STR["sel_tl"])
AppConfig.IMAGE_PATHS["icon_info"],
AppConfig.IMAGE_PATHS["icon_msg"],
Msg.STR["sel_tl"],
Msg.STR["tl_first"],
)
return False return False
else: else:
wg_tar: str = f"{AppConfig.BASE_DIR}/{now_datetime}" wg_tar: str = f"{AppConfig.BASE_DIR}/{now_datetime}"
@ -186,22 +183,20 @@ class Tunnel:
with zipfile.ZipFile(f"{wg_tar}.zip", "r") as zf: with zipfile.ZipFile(f"{wg_tar}.zip", "r") as zf:
if zf.namelist(): if zf.namelist():
LxTools.msg_window( MessageDialog(
AppConfig.IMAGE_PATHS["icon_info"], "info",
AppConfig.IMAGE_PATHS["icon_vpn"],
Msg.STR["exp_succ"],
Msg.STR["exp_in_home"], Msg.STR["exp_in_home"],
title=Msg.STR["exp_succ"],
) )
else: else:
logging.error( logging.error(
"There was a mistake at creating the Zip file. File is empty." "There was a mistake at creating the Zip file. File is empty."
) )
LxTools.msg_window( MessageDialog(
AppConfig.IMAGE_PATHS["icon_error"], "error", Msg.STR["exp_zip"], title=Msg.STR["exp_err"]
AppConfig.IMAGE_PATHS["icon_msg"],
Msg.STR["exp_err"],
Msg.STR["exp_zip"],
) )
return False return False
return True return True
except PermissionError: except PermissionError:
@ -217,12 +212,7 @@ class Tunnel:
pass pass
except Exception as e: except Exception as e:
logging.error(f"Export failed: {str(e)}") logging.error(f"Export failed: {str(e)}")
LxTools.msg_window( MessageDialog("error", Msg.STR["exp_try"], title=Msg.STR["exp_err"])
AppConfig.IMAGE_PATHS["icon_error"],
AppConfig.IMAGE_PATHS["icon_msg"],
Msg.STR["exp_err"],
Msg.STR["exp_try"],
)
return False return False
finally: finally:

View File

@ -8,11 +8,12 @@ import shutil
import sys import sys
import tkinter as tk import tkinter as tk
import webbrowser import webbrowser
from functools import partial
from pathlib import Path from pathlib import Path
from subprocess import CompletedProcess, run from subprocess import CompletedProcess, run
from tkinter import TclError, filedialog, ttk from tkinter import TclError, filedialog, ttk
from tunnel import Tunnel from tunnel import Tunnel
from shared_libs.message import MessageDialog
from shared_libs.gitea import GiteaUpdate from shared_libs.gitea import GiteaUpdate
from shared_libs.common_tools import ( from shared_libs.common_tools import (
LxTools, LxTools,
@ -462,10 +463,6 @@ class FrameWidgets(ttk.Frame):
""" """
a tk.Toplevel window a tk.Toplevel window
""" """
def link_btn() -> None:
webbrowser.open("https://git.ilunix.de/punix/Wire-Py")
msg_t = _( msg_t = _(
"Wire-Py a simple Wireguard Gui for Linux systems.\n\n" "Wire-Py a simple Wireguard Gui for Linux systems.\n\n"
"Wire-Py is open source software written in Python.\n\n" "Wire-Py is open source software written in Python.\n\n"
@ -473,13 +470,17 @@ class FrameWidgets(ttk.Frame):
"Use without warranty!\n" "Use without warranty!\n"
) )
LxTools.msg_window( MessageDialog(
AppConfig.IMAGE_PATHS["icon_vpn"], "info",
AppConfig.IMAGE_PATHS["icon_vpn"],
_("Info"),
msg_t, msg_t,
_("Go to Wire-Py git"), buttons=["OK", _("Go to Wire-Py git")],
link_btn, title=_("Info"),
commands=[
None,
partial(webbrowser.open, "https://git.ilunix.de/punix/Wire-Py"),
],
icon=AppConfig.IMAGE_PATHS["icon_vpn"],
wraplength=420,
) )
def update_setting(self, update_res) -> None: def update_setting(self, update_res) -> None:
@ -848,6 +849,7 @@ class FrameWidgets(ttk.Frame):
self.selected_option.set(1) self.selected_option.set(1)
self.autoconnect_var.set("") self.autoconnect_var.set("")
self.auto_con = ConfigManager.get("autostart") self.auto_con = ConfigManager.get("autostart")
AppConfig.get_autostart_content()
else: else:
self.selected_option.set(0) self.selected_option.set(0)
@ -1144,10 +1146,9 @@ class FrameWidgets(ttk.Frame):
if __name__ == "__main__": if __name__ == "__main__":
AppConfig.ensure_directories() AppConfig.ensure_directories()
AppConfig.create_default_settings() AppConfig.create_default_settings()
CryptoUtil.decrypt(getpass.getuser(), AppConfig.CONFIG_DIR)
_ = AppConfig.setup_translations() _ = AppConfig.setup_translations()
LxTools.sigi(AppConfig.TEMP_DIR) LxTools.sigi(AppConfig.TEMP_DIR)
CryptoUtil.decrypt(getpass.getuser())
window = Wirepy() window = Wirepy()
LogConfig.logger(ConfigManager.get("logfile")) LogConfig.logger(ConfigManager.get("logfile"))
""" """

View File

@ -57,7 +57,7 @@ class AppConfig:
# Updates # Updates
# 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year # 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year
VERSION: str = "v. 2.04.1725" VERSION: str = "v. 2.06.0725"
UPDATE_URL: str = "https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases" UPDATE_URL: str = "https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases"
DOWNLOAD_URL: str = "https://git.ilunix.de/punix/Wire-Py/archive" DOWNLOAD_URL: str = "https://git.ilunix.de/punix/Wire-Py/archive"
@ -153,6 +153,8 @@ class AppConfig:
text=True, text=True,
check=False, check=False,
) )
if process.returncode == 0:
logging.info(process.stdout, exc_info=True)
if process.stderr: if process.stderr:
logging.error(f"{process.stderr} Code: {process.returncode}", exc_info=True) logging.error(f"{process.stderr} Code: {process.returncode}", exc_info=True)