punix
0c8627fe97
for Buttons and Listbox with Scrollbar. all Widgets new format delete works now of disable checkbox when Listbox empty (part two) add Menu widget with one Button
259 lines
10 KiB
Python
Executable File
259 lines
10 KiB
Python
Executable File
#!/usr/bin/python3
|
|
import os
|
|
import tkinter as tk
|
|
from tkinter import ttk
|
|
|
|
from wg_func import (TunnelActiv, ListTunnels, ImportTunnel, ConToDict, GreenLabel, StartStopBTN, ShowAddress,
|
|
FileHandle, ExportTunnels, OnOff)
|
|
|
|
font_color = '#4011a7'
|
|
replacement = ''
|
|
|
|
|
|
class MainWindow(tk.Tk):
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.switch_on = None
|
|
self.switch_off = None
|
|
self.x_width = 600
|
|
self.y_height = 340
|
|
self.monitor_center_x = self.winfo_screenwidth() / 2 - (self.x_width / 2)
|
|
self.monitor_center_y = self.winfo_screenheight() / 2 - (self.y_height / 2)
|
|
self.resizable(width=False, height=False)
|
|
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(0, weight=1)
|
|
self.rowconfigure(0, weight=1)
|
|
self.style = ttk.Style(self)
|
|
self.style.theme_use('clam')
|
|
# Load the image file from disk.
|
|
self.wg_icon = tk.PhotoImage(file=r'icons/wg-vpn-48.png')
|
|
# Set it as the window icon.
|
|
self.iconphoto(True, self.wg_icon)
|
|
|
|
# App Menu
|
|
self.app_menu = tk.Menu(self, borderwidth=0)
|
|
for item in self.app_menu.keys():
|
|
print(item, ': ', self.app_menu[item])
|
|
self.configure(menu=self.app_menu)
|
|
self.app_menu.add_cascade(label='?')
|
|
|
|
FrameWidgets(self).grid()
|
|
|
|
|
|
class FrameWidgets(ttk.Frame):
|
|
def __init__(self, container, **kwargs):
|
|
super().__init__(container, **kwargs)
|
|
|
|
self.enp = None
|
|
self.DNS = None
|
|
self.add = None
|
|
self.data = None
|
|
self.peer = None
|
|
self.lb_tunnel = None
|
|
self.wg_read = None
|
|
self.wg_vpn_start = tk.PhotoImage(file=r'icons/wg-vpn-start-48.png')
|
|
self.wg_vpn_stop = tk.PhotoImage(file=r'icons/wg-vpn-stop-48.png')
|
|
self.imp_pic = tk.PhotoImage(file=r'icons/wg-import.png')
|
|
self.tr_pic = tk.PhotoImage(file=r'icons/wg-trash-48.png')
|
|
self.exp_pic = tk.PhotoImage(file=r'icons/wg-export-48.png')
|
|
self.warning_pic = tk.PhotoImage(file=r'icons/warning_64.png')
|
|
|
|
# Show active Tunnel
|
|
self.a = TunnelActiv.active()
|
|
# Label Frame 1
|
|
self.lb_frame = ttk.Frame(self)
|
|
self.lb_frame.configure(relief='solid')
|
|
self.lb_frame.grid(column=2, row=1, sticky='snew', padx=20, pady=5)
|
|
self.columnconfigure(2, weight=1)
|
|
self.rowconfigure(1, weight=1)
|
|
# Label Frame 2
|
|
self.lb_frame2 = ttk.Frame(self)
|
|
self.lb_frame2.configure(relief='solid')
|
|
self.lb_frame2.grid(column=2, row=2, sticky='snew', padx=20, pady=5)
|
|
self.columnconfigure(2, weight=1)
|
|
self.rowconfigure(2, weight=1)
|
|
# Label Frame 3
|
|
self.lb_frame_buttons = ttk.Frame(self)
|
|
self.lb_frame_buttons.configure(relief='flat')
|
|
self.lb_frame_buttons.grid(column=0, rowspan=4, row=0)
|
|
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=0, padx=15, sticky='w')
|
|
self.columnconfigure(2, weight=1)
|
|
self.rowconfigure(0, weight=1)
|
|
# 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=font_color)
|
|
self.interface.grid(column=0, row=2, sticky='we', padx=120)
|
|
self.interface.config(font=('Ubuntu', 9))
|
|
|
|
# Peer Label
|
|
self.peer = tk.Label(self.lb_frame2, text='Peer', fg=font_color)
|
|
self.peer.config(font=('Ubuntu', 9))
|
|
self.peer.grid(column=0, row=3, 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.l_box = tk.Listbox(self.lb_frame_buttons, fg='#606060', selectmode='single')
|
|
self.l_box.config(highlightthickness=0, relief='ridge')
|
|
self.l_box.config(font=('Ubuntu', 12, 'bold'))
|
|
self.l_box.grid(column=1, rowspan=4, row=0, sticky='ns')
|
|
self.l_box.event_add('<<ClickEvent>>', '<Button-1>')
|
|
self.l_box.bind('<<ClickEvent>>', enable_check_box)
|
|
self.scrollbar = ttk.Scrollbar(self.lb_frame_buttons, orient='vertical', command=self.l_box.yview)
|
|
self.scrollbar.grid(column=1, rowspan=4, row=0, sticky='nse')
|
|
self.l_box.configure(yscrollcommand=self.scrollbar.set)
|
|
self.rowconfigure(0, weight=1)
|
|
|
|
# Tunnel List
|
|
self.tl = ListTunnels.tl_list()
|
|
for tunnels in self.tl:
|
|
self.l_box.insert("end", tunnels)
|
|
self.l_box.update()
|
|
# Button Vpn
|
|
if self.a != '':
|
|
StartStopBTN.button_stop(self)
|
|
wg_read = os.environ['HOME'] + '/tester/' + str(self.a) + '.conf'
|
|
file = open(wg_read, 'r')
|
|
data = ConToDict.covert_to_dict(file)
|
|
# Address Label
|
|
ShowAddress.init_and_report(self, data)
|
|
ShowAddress.show_data(self)
|
|
file.close()
|
|
else:
|
|
StartStopBTN.button_start(self)
|
|
# Address Label
|
|
self.add = tk.StringVar()
|
|
self.DNS = tk.StringVar()
|
|
self.enp = tk.StringVar()
|
|
ShowAddress.label_empty(self)
|
|
ShowAddress.show_data(self)
|
|
# Button Import
|
|
self.btn_i = tk.Button(self.lb_frame_buttons,
|
|
image=self.imp_pic, bd=0,
|
|
command=lambda: ImportTunnel.wg_import_select(self))
|
|
self.btn_i.grid(column=0, row=1, padx=15, pady=8)
|
|
|
|
def delete():
|
|
try:
|
|
self.select_tunnel = self.l_box.curselection()
|
|
select_tl = self.l_box.get(self.select_tunnel[0])
|
|
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')
|
|
|
|
del_tl_read = open('wg_py.xml', 'r')
|
|
if 'false ' in del_tl_read:
|
|
first_word = 'false '
|
|
else:
|
|
first_word = 'true '
|
|
|
|
word_replace = ''
|
|
# using the for loop
|
|
for line in del_tl_read:
|
|
line = line.strip()
|
|
changes = line.replace(first_word + select_tl, '')
|
|
word_replace = word_replace + changes + "\n"
|
|
|
|
del_tl_read.close()
|
|
del_tl = open('wg_py.xml', 'w')
|
|
del_tl.write(word_replace)
|
|
del_tl.close()
|
|
# for disable checkbox when Listbox empty
|
|
tl = ListTunnels.tl_list()
|
|
if len(tl) == 0:
|
|
self.wg_autostart.configure(state='disabled')
|
|
|
|
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.lb_frame_buttons, image=self.tr_pic, bd=0, command=delete)
|
|
self.btn_tr.grid(column=0, row=2, padx=15, pady=8)
|
|
|
|
# Button Export
|
|
self.btn_exp = tk.Button(self.lb_frame_buttons, image=self.exp_pic, bd=0, command=ExportTunnels.wg_export)
|
|
self.btn_exp.grid(column=0, row=3, padx=15, pady=8)
|
|
|
|
# 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.selected_option = tk.IntVar()
|
|
|
|
self.wg_autostart = tk.Checkbutton(self,
|
|
text='Autoconnect on:',
|
|
variable=self.selected_option,
|
|
command=lambda: FileHandle.box_set(self))
|
|
self.wg_autostart.grid(column=0, row=4, pady=19, padx=15, sticky='nw')
|
|
|
|
OnOff.on_off(self)
|
|
|
|
#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])
|
|
os.system('nmcli connection up ' + str(select_tl))
|
|
wg_read = os.environ['HOME'] + '/tester/' + str(select_tl) + '.conf'
|
|
file = open(wg_read, 'r')
|
|
data = ConToDict.covert_to_dict(file)
|
|
# Address Label
|
|
ShowAddress.init_and_report(self, data)
|
|
ShowAddress.show_data(self)
|
|
file.close()
|
|
# Button Start/Stop
|
|
StartStopBTN.button_stop(self)
|
|
self.a = TunnelActiv.active()
|
|
self.StrVar = tk.StringVar()
|
|
self.StrVar.set(self.a)
|
|
GreenLabel.green_show_label(self)
|
|
elif self.a != '':
|
|
# Button Start/Stop
|
|
StartStopBTN.button_stop(self)
|
|
os.system('nmcli connection down ' + str(self.a))
|
|
# Button Start/Stop
|
|
StartStopBTN.button_start(self)
|
|
self.a = TunnelActiv.active()
|
|
self.StrVar.set('')
|
|
GreenLabel.green_show_label(self)
|
|
# Address Label
|
|
ShowAddress.label_empty(self)
|
|
ShowAddress.show_data(self)
|
|
except IndexError:
|
|
pass
|
|
|
|
|
|
if __name__ == '__main__':
|
|
window = MainWindow()
|
|
window.mainloop()
|