Compare commits

..

5 Commits

Author SHA1 Message Date
6f83fc7162 Merge pull request 'wire-py-reformat-14-08-2024' (#10) from wire-py-reformat-14-08-2024 into main
Reviewed-on: https://git.ilunix.de/punix/Wire-Py/pulls/10
2024-09-04 06:26:30 +02:00
00a9436dad add class FileHandle,
add Label to show autoconnect Tunnel
disable checkbox when Listbox is empty or no select Tunnel
2024-09-03 21:27:36 +02:00
b82bd6d9e7 little fixes a " " to ' ' 2024-08-31 17:50:42 +02:00
e5d86f1f90 columnconfigure on all widgets set 2024-08-27 19:14:49 +02:00
6173a653f9 import datetime for datetime in zip_name a export Tunnel 2024-08-26 19:50:06 +02:00
4 changed files with 210 additions and 59 deletions

View File

@ -4,7 +4,8 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="940e1630-c825-4d4c-be80-bc11f543c122" name="Changes" comment="fix when Filname &gt; 17 first copy file after rename">
<list default="true" id="940e1630-c825-4d4c-be80-bc11f543c122" name="Changes" comment="little fixes a &quot; &quot; to ' '">
<change afterPath="$PROJECT_DIR$/wg_py.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/wg_func.py" beforeDir="false" afterPath="$PROJECT_DIR$/wg_func.py" afterDir="false" />
@ -235,7 +236,31 @@
<option name="project" value="LOCAL" />
<updated>1724593165879</updated>
</task>
<option name="localTasksCounter" value="19" />
<task id="LOCAL-00019" summary="add export Tunnel as zip">
<option name="closed" value="true" />
<created>1724610514657</created>
<option name="number" value="00019" />
<option name="presentableId" value="LOCAL-00019" />
<option name="project" value="LOCAL" />
<updated>1724610514658</updated>
</task>
<task id="LOCAL-00020" summary="columnconfigure on all widgets set">
<option name="closed" value="true" />
<created>1724778892233</created>
<option name="number" value="00020" />
<option name="presentableId" value="LOCAL-00020" />
<option name="project" value="LOCAL" />
<updated>1724778892233</updated>
</task>
<task id="LOCAL-00021" summary="little fixes a &quot; &quot; to ' '">
<option name="closed" value="true" />
<created>1725119445803</created>
<option name="number" value="00021" />
<option name="presentableId" value="LOCAL-00021" />
<option name="project" value="LOCAL" />
<updated>1725119445803</updated>
</task>
<option name="localTasksCounter" value="22" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -280,6 +305,9 @@
<MESSAGE value="fix label when laat Tunnel delete and fix Tuple error in delete and Start/Stop when listbox empty" />
<MESSAGE value="remove a ',' in DNS Name" />
<MESSAGE value="fix when Filname &gt; 17 first copy file after rename" />
<option name="LAST_COMMIT_MESSAGE" value="fix when Filname &gt; 17 first copy file after rename" />
<MESSAGE value="add export Tunnel as zip" />
<MESSAGE value="columnconfigure on all widgets set" />
<MESSAGE value="little fixes a &quot; &quot; to ' '" />
<option name="LAST_COMMIT_MESSAGE" value="little fixes a &quot; &quot; to ' '" />
</component>
</project>

98
main.py
View File

@ -4,9 +4,10 @@ import tkinter as tk
from tkinter import ttk
from wg_func import (TunnelActiv, ListTunnels, ImportTunnel, ConToDict, GreenLabel, StartStopBTN, ShowAddress,
ExportTunnels)
FileHandle, ExportTunnels)
fontcolor = '#4011a7'
font_color = '#4011a7'
replacement = ''
class MainWindow(tk.Tk):
@ -23,7 +24,7 @@ class MainWindow(tk.Tk):
self.title('Wire-Py')
self.configure()
self.geometry('%dx%d+%d+%d' % (self.x_width, self.y_height, self.monitor_center_x, self.monitor_center_y))
self.columnconfigure(2, weight=1)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.style = ttk.Style(self)
self.style.theme_use('clam')
@ -60,37 +61,47 @@ class FrameWidgets(ttk.Frame):
self.lb_frame = ttk.Frame(self)
self.lb_frame.configure(relief='solid')
self.lb_frame.grid(column=2, row=2, sticky='snew', padx=20, pady=5)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
# Label Frame 2
self.lb_frame2 = ttk.Frame(self)
self.lb_frame2.configure(relief='solid')
self.lb_frame2.grid(column=2, row=3, sticky='snew', padx=20, pady=5)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
# Show active Label
self.select_tunnel = None
self.lb = tk.Label(self, text='Active: ')
self.lb.config(font=("Ubuntu", 11, "bold"))
self.lb.grid(column=2, row=1, padx=15, sticky="w")
self.lb.config(font=('Ubuntu', 11, 'bold'))
self.lb.grid(column=2, row=1, padx=15, sticky='w')
# Label to Show active Tunnel
self.StrVar = tk.StringVar(value=self.a)
GreenLabel.green_show_label(self)
# Interface Label
self.interface = tk.Label(self.lb_frame, text='Interface', fg=fontcolor)
self.interface.grid(column=0, row=4, sticky="we", padx=120)
self.interface.config(font=("Ubuntu", 9))
self.interface = tk.Label(self.lb_frame, text='Interface', fg=font_color)
self.interface.grid(column=0, row=4, sticky='we', padx=120)
self.interface.config(font=('Ubuntu', 9))
# Peer Label
self.peer = tk.Label(self.lb_frame2, text='Peer', fg=fontcolor)
self.peer.config(font=("Ubuntu", 9))
self.peer.grid(column=0, row=7, sticky="we", padx=130)
self.peer = tk.Label(self.lb_frame2, text='Peer', fg=font_color)
self.peer.config(font=('Ubuntu', 9))
self.peer.grid(column=0, row=7, sticky='we', padx=130)
# Listbox with Scrollbar
def enable_check_box(event):
tl = ListTunnels.tl_list()
print(len(tl))
if len(tl) != 0:
self.wg_autostart.configure(state='normal')
self.scrollbar = ttk.Scrollbar(self)
self.l_box = tk.Listbox(self, fg='#606060', selectmode='single')
self.l_box.config(highlightthickness=0, relief='flat')
self.scrollbar.config(command=self.l_box.yview)
self.l_box.config(font=("Ubuntu", 12, "bold"))
self.l_box.config(font=('Ubuntu', 12, 'bold'))
self.l_box.grid(column=1, rowspan=3, row=1)
self.l_box.event_add('<<ClickEvent>>', '<Button-1>')
self.l_box.bind('<<ClickEvent>>', enable_check_box)
# Tunnel List
self.tl = ListTunnels.tl_list()
for tunnels in self.tl:
@ -125,31 +136,78 @@ class FrameWidgets(ttk.Frame):
os.system('nmcli connection delete ' + str(select_tl))
self.l_box.delete(self.select_tunnel[0])
os.remove(os.environ['HOME'] + '/tester/' + str(select_tl) + '.conf')
try:
with open('wg_py.xml', 'r') as fr:
lines = fr.readlines()
with open('wg_py.xml_2', 'w') as fw:
for line in lines:
# strip() is used to remove '\n'
# present at the end of each line
if line.strip('\n') != select_tl:
fw.write(line)
print("Deleted")
except:
print("Oops! someting error")
if self.a != '' and self.a == select_tl:
self.StrVar.set(value='')
StartStopBTN.button_start(self)
self.l_box.update()
# Address Label
ShowAddress.label_empty(self)
return select_tl
except IndexError:
pass
# Button Trash
self.btn_tr = tk.Button(self, image=self.tr_pic, bd=0, command=delete)
self.btn_tr.grid(column=0, row=3, padx=15, pady=15)
# Button Export
self.btn_exp = tk.Button(self, image=self.exp_pic, bd=0, command=ExportTunnels.wg_export)
self.btn_exp.grid(column=0, row=4, padx=15, pady=15)
# Button Rename
self.btn_rename = ttk.Button(self, text='Rename')
self.btn_rename.grid(column=2, row=4, padx=20, pady=15, sticky='e')
# Check Buttons
self.wg_autostart = tk.Checkbutton(self, text='Autoconnect on PC Start')
self.wg_autostart.grid(column=1, rowspan=3, row=3)
self.wg_update = tk.Checkbutton(self, text='Search automatically for\nWire-Py updates')
self.wg_update.grid(column=1, rowspan=3, row=4)
self.selected_option = tk.IntVar()
self.wg_autostart = tk.Checkbutton(self,
text='Autoconnect on:',
variable=self.selected_option,
command=lambda: FileHandle.box_set(self))
on_or_off = open('wg_py.xml', 'r')
res = on_or_off.read()
if 'true' in res:
self.selected_option.set(1)
self.auto_con = res
self.auto_con = self.auto_con[5:]
print(self.auto_con)
else:
self.wg_autostart.configure(state='disabled')
self.auto_con = 'no Autoconnect'
on_or_off.close()
self.wg_autostart.grid(column=1, row=4, sticky='nw')
self.autoconnect_var = tk.StringVar()
self.autoconnect_var.set(self.auto_con)
self.autoconnect = tk.Label(self, textvariable=self.autoconnect_var, bd=2, fg='blue', padx=5)
self.autoconnect.config(font=('Ubuntu', 11))
self.autoconnect.grid(column=1, row=4, sticky='we')
#self.wg_update = tk.Checkbutton(self, tex='Search automatically for\nWire-Py updates')
#self.wg_update.grid(column=1, rowspan=3, row=5)
def wg_switch(self):
self.a = TunnelActiv.active()
try:
if self.a == '':
StartStopBTN.button_start(self)
self.select_tunnel = self.l_box.curselection()
select_tl = self.l_box.get(self.select_tunnel[0])

View File

@ -1,11 +1,11 @@
# Wireguard functions for Wire-Py
import os
import shutil
import tarfile
from datetime import datetime
from tkinter import filedialog
import tkinter as tk
fontcolor = '#4011a7'
font_color = '#4011a7'
class Message(tk.Tk):
@ -25,9 +25,9 @@ class Message(tk.Tk):
self.label = tk.Label(self, image=self.warning_pic,
text='Oh... no valid Wireguard File!\nPlease select a valid Wireguard File')
self.label.config(font=("Ubuntu", 11), padx=15, pady=15)
self.label.config(font=('Ubuntu', 11), padx=15, pady=15)
self.label.grid(column=0, row=0)
self.button = tk.Button(self, text="OK", command=self.destroy)
self.button = tk.Button(self, text='OK', command=self.destroy)
self.button.config(padx=15, pady=5)
self.button.grid(column=0, row=1)
@ -40,8 +40,10 @@ class GreenLabel(tk.Tk):
def green_show_label(self):
self.lb_tunnel = tk.Label(self, textvariable=self.StrVar, fg='green')
self.lb_tunnel.config(font=("Ubuntu", 11, "bold"))
self.lb_tunnel.config(font=('Ubuntu', 11, 'bold'))
self.lb_tunnel.grid(column=2, padx=10, row=1)
self.columnconfigure(2, weight=1)
self.rowconfigure(1, weight=1)
class StartStopBTN(tk.Tk):
@ -55,12 +57,14 @@ class StartStopBTN(tk.Tk):
def button_stop(self):
self.btn_stst = tk.Button(self, image=self.wg_vpn_stop, bd=0, command=self.wg_switch)
self.btn_stst.grid(column=0, row=1, padx=15, pady=10, sticky="s")
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
def button_start(self):
self.btn_stst = tk.Button(self, image=self.wg_vpn_start, bd=0, command=self.wg_switch)
self.btn_stst.grid(column=0, row=1, padx=15, pady=10, sticky="s")
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
class ConToDict:
@ -68,14 +72,14 @@ class ConToDict:
def covert_to_dict(cls, file):
dictlist = []
for lines in file.readlines():
lineplit = lines.split()
dictlist = dictlist + lineplit
line_plit = lines.split()
dictlist = dictlist + line_plit
dictlist.remove('[Interface]')
dictlist.remove('[Peer]')
for items in dictlist:
if items == '=':
dictlist.remove(items)
for i in dictlist: # Here is the beginning (Loop) of convert List to Dictionary
for _ in dictlist: # Here is the beginning (Loop) of convert List to Dictionary
a = [dictlist[0], dictlist[1]]
b = [dictlist[2], dictlist[3]]
c = [dictlist[4], dictlist[5]]
@ -84,17 +88,17 @@ class ConToDict:
f = [dictlist[10], dictlist[11]]
g = [dictlist[12], dictlist[13]]
h = [dictlist[14], dictlist[15]]
newlist = [a, b, c, d, e, f, g, h]
finaldict = {}
for elements in newlist:
finaldict[elements[0]] = elements[1]
new_list = [a, b, c, d, e, f, g, h]
final_dict = {}
for elements in new_list:
final_dict[elements[0]] = elements[1]
# end... result a Dictionary
address = finaldict['Address']
dns = finaldict['DNS']
address = final_dict['Address']
dns = final_dict['DNS']
if ',' in dns:
dns = dns[:-1]
endpoint = finaldict['Endpoint']
endpoint = final_dict['Endpoint']
return address, dns, endpoint
@ -139,16 +143,16 @@ class ShowAddress(tk.Tk):
def show_data(self):
# Address Label
self.address = tk.Label(self.lb_frame, textvariable=self.add, fg='blue')
self.address.grid(column=0, row=5, sticky="w", padx=10)
self.address.config(font=("Ubuntu", 9))
self.address.grid(column=0, row=5, sticky='w', padx=10)
self.address.config(font=('Ubuntu', 9))
# DNS Label
self.dns = tk.Label(self.lb_frame, textvariable=self.DNS, fg='blue')
self.dns.grid(column=0, row=6, sticky="w", padx=10, pady=3)
self.dns.config(font=("Ubuntu", 9))
self.dns.grid(column=0, row=6, sticky='w', padx=10, pady=3)
self.dns.config(font=('Ubuntu', 9))
# Endpoint Label
self.endpoint = tk.Label(self.lb_frame2, textvariable=self.enp, fg='blue')
self.endpoint.grid(column=0, row=8, sticky="w", padx=10, pady=5)
self.endpoint.config(font=("Ubuntu", 9))
self.endpoint.grid(column=0, row=8, sticky='w', padx=10, pady=5)
self.endpoint.config(font=('Ubuntu', 9))
class ListTunnels:
@ -174,22 +178,22 @@ class ImportTunnel:
def wg_import_select(self):
try:
filepath = filedialog.askopenfilename(initialdir=os.environ['HOME'], title="Select Wireguard config File",
filetypes=[("WG config files", "*.conf")])
filepath = filedialog.askopenfilename(initialdir=os.environ['HOME'], title='Select Wireguard config File',
filetypes=[('WG config files', '*.conf')])
file = open(filepath, 'r')
read = file.read()
file.close()
pathsplit = filepath.split("/")
pathsplit1 = pathsplit[-1]
if "PrivateKey = " in read and "PublicKey = " in read:
if len(pathsplit1) > 17:
path_split = filepath.split('/')
path_split1 = path_split[-1]
if 'PrivateKey = ' in read and 'PublicKey = ' in read:
if len(path_split1) > 17:
p1 = shutil.copy(filepath, os.environ['HOME'] + '/tester/')
pathsplit = pathsplit1[len(pathsplit1) - 17:]
os.rename(p1, os.environ['HOME'] + '/tester/' + str(pathsplit))
path_split = path_split1[len(path_split1) - 17:]
os.rename(p1, os.environ['HOME'] + '/tester/' + str(path_split))
if self.a != '':
os.system('nmcli connection down ' + str(TunnelActiv.active()))
os.system('nmcli connection import type wireguard file ' + os.environ['HOME'] + '/tester/' +
str(pathsplit))
str(path_split))
else:
shutil.copy(filepath, os.environ['HOME'] + '/tester/')
if self.a != '':
@ -212,7 +216,10 @@ class ImportTunnel:
ShowAddress.show_data(self)
file.close()
os.system('nmcli con mod ' + str(self.a) + ' connection.autoconnect no')
if "PrivateKey = " not in read:
new_tl = open('wg_py.xml', 'a')
new_tl.write('false ' + str(self.a))
new_tl.close()
if 'PrivateKey = ' not in read:
Message()
except EOFError:
pass
@ -222,12 +229,69 @@ class ImportTunnel:
pass
class FileHandle:
def __init__(self):
self.auto_con = None
self.autoconnect_var = None
self.tl = None
self.selected_option = None
self.l_box = None
self.select_tunnel = None
def box_set(self):
global replacement
try:
self.select_tunnel = self.l_box.curselection()
select_tl = self.l_box.get(self.select_tunnel[0])
if self.selected_option.get() == 0:
set_on = open('wg_py.xml', 'r')
replacement = ""
# using the for loop
for line in set_on:
line = line.strip()
changes = line.replace('true ' + select_tl, 'false ' + select_tl)
for tl in self.tl:
os.system('nmcli con mod ' + str(tl) + ' connection.autoconnect no')
replacement = replacement + changes + "\n"
set_on.close()
self.autoconnect_var.set('')
if self.selected_option.get() == 1:
set_on = open('wg_py.xml', 'r')
replacement = ""
# using the for loop
for line in set_on:
line = line.strip()
changes = line.replace('false ' + select_tl, 'true ' + select_tl)
os.system('nmcli con mod ' + str(select_tl) + ' connection.autoconnect yes')
replacement = replacement + changes + "\n"
set_on.close()
set_off = open('wg_py.xml', 'w')
set_off.write(replacement)
set_off.close()
self.autoconnect_var.set(self.auto_con)
except IndexError:
self.selected_option.set(1)
class ExportTunnels:
@staticmethod
def wg_export():
now_time = datetime.now()
now_datetime = now_time.strftime('/wg-exp-' + '%m-%d-%Y' + '-' + '%H:%M')
tl = ListTunnels.tl_list()
try:
wg_tar = os.environ['HOME'] + '/datetime'
if len(tl) != 0:
wg_tar = os.environ['HOME'] + now_datetime
p_to_conf = os.environ['HOME'] + '/tester'
shutil.make_archive(wg_tar, 'zip', p_to_conf)
#if zip_full != 0:
#print('Export erfolgraeich')
#else:
#print('ups etwwas ging schief bitte Export wiederholen')
else:
print('No Tunnel for Export')
except TypeError:
pass

1
wg_py.xml Normal file
View File

@ -0,0 +1 @@
true iphone-wg