Compare commits

..

No commits in common. "f9d4256679e78f2861f3b45fa646e33b486596bc" and "a0b895438cc9a900fc9bae9a2cbc197cc90c4074" have entirely different histories.

6 changed files with 152 additions and 319 deletions

60
.idea/workspace.xml generated
View File

@ -4,11 +4,9 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="940e1630-c825-4d4c-be80-bc11f543c122" name="Changes" comment="Changelog create When exporting, the folder is now copied to /tmp and the non .conf files are deleted before the zip file is created. In main.py os import removed. Since os have been replaced by pathlib and shutil.&#10;Start with version number 1.4.7&#10;Message window size corrected so text is displayed better">
<change afterPath="$PROJECT_DIR$/wire-py1.10.0424.tar.gz" afterDir="false" />
<list default="true" id="940e1630-c825-4d4c-be80-bc11f543c122" name="Changes" comment="fix installer add .keys file">
<change afterPath="$PROJECT_DIR$/Changelog" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Changelog" beforeDir="false" afterPath="$PROJECT_DIR$/Changelog" afterDir="false" />
<change beforePath="$PROJECT_DIR$/install" beforeDir="false" afterPath="$PROJECT_DIR$/install" afterDir="false" />
<change beforePath="$PROJECT_DIR$/wg_func.py" beforeDir="false" afterPath="$PROJECT_DIR$/wg_func.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/wg_main.py" beforeDir="false" afterPath="$PROJECT_DIR$/wg_main.py" afterDir="false" />
</list>
@ -44,23 +42,23 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
&quot;Python.INSTALL.executor&quot;: &quot;Run&quot;,
&quot;Python.install.executor&quot;: &quot;Run&quot;,
&quot;Python.main.executor&quot;: &quot;Run&quot;,
&quot;Python.messagebox.executor&quot;: &quot;Run&quot;,
&quot;Python.start_wg.executor&quot;: &quot;Run&quot;,
&quot;Python.wg_func.executor&quot;: &quot;Run&quot;,
&quot;Python.wg_main.executor&quot;: &quot;Run&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;Shell Script.install.executor&quot;: &quot;Run&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;last_opened_file_path&quot;: &quot;/home/punix/Pyapps/wire-py&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;preferences.lookFeel&quot;
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"ASKED_ADD_EXTERNAL_FILES": "true",
"Python.INSTALL.executor": "Run",
"Python.install.executor": "Run",
"Python.main.executor": "Run",
"Python.messagebox.executor": "Run",
"Python.start_wg.executor": "Run",
"Python.wg_func.executor": "Run",
"Python.wg_main.executor": "Run",
"RunOnceActivity.ShowReadmeOnStart": "true",
"Shell Script.install.executor": "Run",
"git-widget-placeholder": "main",
"last_opened_file_path": "/home/punix/Pyapps/wire-py",
"settings.editor.selected.configurable": "preferences.lookFeel"
}
}</component>
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$" />
@ -137,6 +135,14 @@
<option name="presentableId" value="Default" />
<updated>1723279982210</updated>
</task>
<task id="LOCAL-00007" summary="add Label Interface and Peer to new FrameWidget one and two. when import Tunnel then add to list works and remove of list when Tunnel delete.(with Label active on and off) &#10;add to class and methods open a avtive Tunnel when Wire-Py open, when import and start a Tunnel">
<option name="closed" value="true" />
<created>1724102937260</created>
<option name="number" value="00007" />
<option name="presentableId" value="LOCAL-00007" />
<option name="project" value="LOCAL" />
<updated>1724102937260</updated>
</task>
<task id="LOCAL-00008" summary="add file dict_to_address for &#10;address a active Tunnel. Label green pack in Class.&#10;add Class to convert fileoutput as String to Dictionary">
<option name="closed" value="true" />
<created>1724233806458</created>
@ -521,15 +527,7 @@
<option name="project" value="LOCAL" />
<updated>1727380793216</updated>
</task>
<task id="LOCAL-00056" summary="Changelog create When exporting, the folder is now copied to /tmp and the non .conf files are deleted before the zip file is created. In main.py os import removed. Since os have been replaced by pathlib and shutil.&#10;Start with version number 1.4.7&#10;Message window size corrected so text is displayed better">
<option name="closed" value="true" />
<created>1727525609727</created>
<option name="number" value="00056" />
<option name="presentableId" value="LOCAL-00056" />
<option name="project" value="LOCAL" />
<updated>1727525609728</updated>
</task>
<option name="localTasksCounter" value="57" />
<option name="localTasksCounter" value="56" />
<servers />
</component>
<component name="UnknownFeatures">
@ -570,6 +568,7 @@
</component>
<component name="VcsManagerConfiguration">
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
<MESSAGE value="in delete replace open with Path&#10;install fixes" />
<MESSAGE value="new format little fixes icons sort add policy add .desktop File install Part 2" />
<MESSAGE value="install fix for set dir right" />
<MESSAGE value="fix checkbox disable and policy rename main.py to wg_main.py" />
@ -594,7 +593,6 @@
<MESSAGE value="little fixes" />
<MESSAGE value="fix msg_boxes when tunnel list = 0 a Start, Delete and Export" />
<MESSAGE value="fix installer add .keys file" />
<MESSAGE value="Changelog create When exporting, the folder is now copied to /tmp and the non .conf files are deleted before the zip file is created. In main.py os import removed. Since os have been replaced by pathlib and shutil.&#10;Start with version number 1.4.7&#10;Message window size corrected so text is displayed better" />
<option name="LAST_COMMIT_MESSAGE" value="Changelog create When exporting, the folder is now copied to /tmp and the non .conf files are deleted before the zip file is created. In main.py os import removed. Since os have been replaced by pathlib and shutil.&#10;Start with version number 1.4.7&#10;Message window size corrected so text is displayed better" />
<option name="LAST_COMMIT_MESSAGE" value="fix installer add .keys file" />
</component>
</project>

View File

@ -1,44 +1,15 @@
Changelog for Wire-Py
My standard System: Linux Mint 22 Cinnamon
## [Unreleased]
- os import in wg_func replaced by other methods
- Autoupdate in Options
- Guide to menu '?' with pictures
- Create file for settings (Autoupdate)
- UID and GID for another Systems (Fedora, Arch, ect.)
- installer optimize for another Systems
- In Gitea Readme enter text, images
- Dark Theme for Wire-Py
- Own filedialog for import
- If Wire-Py already runs, prevent further start
- for loops with lists replaced by List Comprehensions
- Keeping Classes Together
### Added
04-10-2024
- Fix msg_window and remove x , y argument
- Install further adapted and with colored text if user
is not in group sudo or wheel.
- Added to install Opensuse for installation
- Tested on Arch with Mate, Xfce4, Gnome, LXDE Desktop
Open Suse Tumbleweed KDE, Fedora 40 KDE and Debian 12 Mate Desktop
### Added
29-09-2024
- installer optimize for another Systems
- Version number changed to:
1 = 1. Year, 01 = Month of the Year, 0124 = Day and Year of the Year
Example for this version: 1.09.2924
- Comments modified by # description to ''' description '''
and insert empty lines for better readability
### Added
28-09-2024
@ -54,5 +25,3 @@ My standard System: Linux Mint 22 Cinnamon
- Message window size corrected so text is displayed better
- Version lobster assigned to a variable

140
install
View File

@ -1,125 +1,33 @@
#!/bin/bash
NORMAL='\033[0m'
GREEN='\033[1;32m'
RED='\033[31;1;42m'
BLUE='\033[30;1;34m'
install_file_with(){
clear
sudo apt install python3-tk && \
sudo cp -u wg_main.py start_wg.py wg_func.py wirepy.py /usr/bin/ && \
sudo mkdir -p /etc/wire_py && sudo touch /etc/wire_py/.keys && sudo cp -uR wp-icons /usr/share/icons/ && \
sudo chown -R root:root /etc/wire_py && sudo chmod 755 /etc/wire_py && \
sudo ln -sf /usr/bin/wirepy.py /usr/local/bin/wirepy && \
sudo cp -u org.wirepy.policy /usr/share/polkit-1/actions/ && \
sudo cp -u Wire-Py.desktop /usr/share/applications/ && \
sudo cp -u wg_start.service /lib/systemd/system/ && \
sudo systemctl enable wg_start.service
}
install_arch_d(){
clear
sudo pacman -S --noconfirm tk python3 && \
sudo cp -u wg_main.py start_wg.py wg_func.py wirepy.py /usr/bin/ && \
sudo mkdir -p /etc/wire_py && sudo touch /etc/wire_py/.keys && sudo cp -uR wp-icons /usr/share/icons/ && \
sudo chown -R root:root /etc/wire_py && sudo chmod 755 /etc/wire_py && \
sudo ln -sf /usr/bin/wirepy.py /usr/local/bin/wirepy && \
sudo cp -u org.wirepy.policy /usr/share/polkit-1/actions/ && \
sudo cp -u Wire-Py.desktop /usr/share/applications/ && \
sudo cp -u wg_start.service /lib/systemd/system/ && \
sudo systemctl enable wg_start.service
}
if grep -i 'debian' /etc/os-release > /dev/null 2>&1
which sudo >/dev/null
if [ $? -ne 0 ]
then
groups > /tmp/isgroup
if grep 'sudo' /tmp/isgroup
then
install_file_with
su -
apt install python3-tk -y && \
cp wg_main.py start_wg.py wg_func.py wirepy.py /usr/bin/ && \
mkdir -p /etc/wire_py && touch /etc/wire_py/.keys && cp -R wp-icons /usr/share/icons/ && \
chown -R root:root /etc/wire_py && chmod 755 /etc/wire_py && \
ln -sf /usr/bin/wirepy.py /usr/local/bin/wirepy >/dev/null && \
cp org.wirepy.policy /usr/share/polkit-1/actions/ && \
cp Wire-Py.desktop /usr/share/applications/ && \
cp wg_start.services /lib/systemd/system/ && \
systemctl enable wg_start.service
else
echo -e "$BLUE"The installer found that they are not in the group sudo.""
echo -e "with "$RED"su -"$BLUE" "they can enter the root shell in which they then""
echo -e "enter "$GREEN""usermod -aG sudo $USER.""$BLUE""
echo -e ""after logging in from the system, they can then run Wire-Py install again." $NORMAL"
read -n 1 -s -r -p $"To close the Window press a button"
clear
exit 0
fi
elif grep -i 'mint\|ubuntu\|pop|' /etc/os-release > /dev/null 2>&1
then
install_file_with
elif grep -i 'arch' /etc/os-release > /dev/null 2>&1
then
groups > /tmp/isgroup
clear
if grep 'wheel' /tmp/isgroup
then
install_arch_d
else
echo "The installer found that they are not in the group sudo."
echo "The sudoers file must be edited with"
echo -e "$RED""su -""$NORMAL"
echo -e "$GREEN"""EDITOR=nano visudo"""$NORMAL"
echo "Find the line:"
echo "## Uncomment to allow members of group wheel to execute any command"
echo "remove '#' on # %wheel ALL=(ALL) ALL and save the file"
echo -e "then enter "$GREEN"gpasswd -a $USER wheel.""$NORMAL"
echo "after logging in from the system, they can then run Wire-Py install again."
read -n 1 -s -r -p $"To close the Window press a button"
clear
exit 0
fi
elif grep -i '|manjaro\|garuda\|endeavour|' /etc/os-release > /dev/null 2>&1
then
install_arch_d
elif grep -i 'fedora' /etc/os-release > /dev/null 2>&1
then
if ! which python3-tkinter &> /dev/null
then sudo dnf install python3-tkinter -y
sudo cp -u wg_main.py start_wg.py wg_func.py wirepy.py /usr/bin/ && \
sudo mkdir -p /etc/wire_py && sudo touch /etc/wire_py/.keys && sudo cp -uR wp-icons /usr/share/icons/ && \
sudo chown -R root:root /etc/wire_py && sudo chmod 755 /etc/wire_py && \
sudo ln -sf /usr/bin/wirepy.py /usr/local/bin/wirepy && \
sudo cp -u org.wirepy.policy /usr/share/polkit-1/actions/ && \
sudo cp -u Wire-Py.desktop /usr/share/applications/ && \
sudo cp -u wg_start.service /lib/systemd/system/ && \
sudo systemctl enable wg_start.service
fi
elif grep -i 'suse' /etc/os-release > /dev/null 2>&1
then
if ! which python311-tk &> /dev/null
then sudo zypper install python311-tk
sudo cp -u wg_main.py start_wg.py wg_func.py wirepy.py /usr/bin/ && \
sudo mkdir -p /etc/wire_py && sudo touch /etc/wire_py/.keys && sudo cp -uR wp-icons /usr/share/icons/ && \
sudo chown -R root:root /etc/wire_py && sudo chmod 755 /etc/wire_py && \
sudo ln -sf /usr/bin/wirepy.py /usr/local/bin/wirepy && \
sudo cp -u org.wirepy.policy /usr/share/polkit-1/actions/ && \
sudo cp -u Wire-Py.desktop /usr/share/applications/ && \
sudo cp -u wg_start.service /lib/systemd/system/ && \
sudo systemctl enable wg_start.service
fi
else
clear
echo $"Your System could not be determined."
echo
read -n 1 -s -r -p $"To close the window press a button"
clear
exit 0
sudo apt install python3-tk && \
sudo cp wg_main.py start_wg.py wg_func.py wirepy.py /usr/bin/ && \
sudo mkdir -p /etc/wire_py && sudo touch /etc/wire_py/.keys && sudo cp -R wp-icons /usr/share/icons/ && \
sudo chown -R root:root /etc/wire_py && sudo chmod 755 /etc/wire_py && \
sudo ln -sf /usr/bin/wirepy.py /usr/local/bin/wirepy && \
sudo cp org.wirepy.policy /usr/share/polkit-1/actions/ && \
sudo cp Wire-Py.desktop /usr/share/applications/ && \
sudo cp wg_start.service /lib/systemd/system/ && \
sudo systemctl enable wg_start.service
fi
clear
read -n 1 -s -r -p $"To close the Window press a button"
clear

View File

@ -1,5 +1,4 @@
""" Wireguard Classes and Method for Wire-Py """
# Wireguard functions for Wire-Py
import os
import shutil
import subprocess
@ -16,7 +15,7 @@ path_to_file = Path('/etc/wire_py/wg_py')
_u = Path.read_text(Path('/tmp/_u'))
def msg_window(img_w, img_i, w_title, w_txt):
def msg_window(img_w, img_i, w_title, w_txt, x, y):
"""
Function for different message windows for the user. with 4 arguments to be passed.
To create messages with your own images, icons, and titles. As an alternative to Python Messagebox.
@ -25,10 +24,17 @@ def msg_window(img_w, img_i, w_title, w_txt):
img_i = Image for Icon
w_title = Windows Title
w_txt = Text for Tk Window
x = Window width
y = Window height
"""
msg = tk.Toplevel()
msg.resizable(width=False, height=False)
msg.x_width = x
msg.y_height = y
msg.title(w_title)
msg.monitor_center_x = msg.winfo_screenwidth() / 2 - (msg.x_width / 2)
msg.monitor_center_y = msg.winfo_screenheight() / 2 - (msg.y_height / 2)
msg.geometry('%dx%d+%d+%d' % (msg.x_width, msg.y_height, msg.monitor_center_x, msg.monitor_center_y))
msg.configure(pady=15)
msg.img = tk.PhotoImage(file=img_w)
msg.i_window = tk.Label(msg, image=msg.img)
@ -52,12 +58,10 @@ class GreenLabel:
"""
def __init__(self):
self.StrVar = None
self.lb_tunnel = None
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.grid(column=2, padx=10, row=0)
@ -77,7 +81,6 @@ class StartStopBTN:
"""
def __init__(self):
self.lb_frame_btn_lbox = None
self.wg_switch = None
self.btn_stst = None
@ -85,12 +88,10 @@ class StartStopBTN:
self.wg_vpn_stop = tk.PhotoImage(file=r'/usr/share/icons/wp-icons/48/wg_vpn-stop.png')
def button_stop(self):
self.btn_stst = tk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_stop, bd=0, command=self.wg_switch)
self.btn_stst.grid(column=0, row=0, padx=15, pady=8)
def button_start(self):
self.btn_stst = tk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_start, bd=0, command=self.wg_switch)
self.btn_stst.grid(column=0, row=0, padx=15, pady=8)
@ -103,7 +104,6 @@ class ConToDict:
@classmethod
def covert_to_dict(cls, file):
dictlist = []
for lines in file.readlines():
line_plit = lines.split()
@ -113,9 +113,7 @@ class ConToDict:
for items in dictlist:
if items == '=':
dictlist.remove(items)
''' Here is the beginning (Loop) of convert List to Dictionary '''
for _ in dictlist:
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]]
@ -129,8 +127,7 @@ class ConToDict:
for elements in new_list:
final_dict[elements[0]] = elements[1]
''' end... result a Dictionary '''
# end... result a Dictionary
address = final_dict['Address']
dns = final_dict['DNS']
if ',' in dns:
@ -149,8 +146,7 @@ class TunnelActiv:
"""
@staticmethod
def active():
def active(): # Shows the active tunnel
active = os.popen('nmcli con show --active | grep -iPo "(.*)(wireguard)"').read().split()
if not active:
active = ''
@ -167,7 +163,6 @@ class ShowAddress:
"""
def __init__(self):
self.lb_frame2 = None
self.lb_frame = None
self.endpoint = None
@ -178,8 +173,7 @@ class ShowAddress:
self.add = None
def init_and_report(self, data=None):
""" Address Label """
# Address Label
self.add = tk.StringVar()
self.add.set('Address: ' + data[0])
self.DNS = tk.StringVar()
@ -188,24 +182,20 @@ class ShowAddress:
self.enp.set('Endpoint: ' + data[2])
def label_empty(self):
self.add.set('')
self.DNS.set('')
self.enp.set('')
def show_data(self):
""" Address Label """
# Address Label
self.address = tk.Label(self.lb_frame, textvariable=self.add, fg='blue')
self.address.grid(column=0, row=4, sticky='w', padx=10, pady=6)
self.address.config(font=('Ubuntu', 9))
''' DNS Label '''
# 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=6)
self.dns.config(font=('Ubuntu', 9))
''' Endpoint Label '''
# Endpoint Label
self.endpoint = tk.Label(self.lb_frame2, textvariable=self.enp, fg='blue')
self.endpoint.grid(column=0, row=7, sticky='w', padx=10, pady=10)
self.endpoint.config(font=('Ubuntu', 9))
@ -219,9 +209,7 @@ class ListTunnels:
@staticmethod
def tl_list():
wg_s = os.popen('nmcli con show | grep -iPo "(.*)(wireguard)"').read().split()
''' tl = Tunnel list # Show of 4.Element in list '''
tl = wg_s[::3]
tl = wg_s[::3] # tl = Tunnel list # Show of 4.Element in list
return tl
@ -248,7 +236,6 @@ class ImportTunnel:
self.l_box = None
def wg_import_select(self):
try:
filepath = filedialog.askopenfilename(initialdir=str(_u), title='Select Wireguard config File',
filetypes=[('WG config files', '*.conf')], )
@ -258,7 +245,6 @@ class ImportTunnel:
path_split = filepath.split('/')
path_split1 = path_split[-1]
self.a = TunnelActiv.active()
if 'PrivateKey = ' in read and 'PublicKey = ' in read:
with open(filepath, 'r') as file:
key = ConToDict.covert_to_dict(file)
@ -272,10 +258,10 @@ class ImportTunnel:
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Import Error'
msg_t = 'Tunnel already available!\nPlease use another file for import'
msg_window(iw, ii, wt, msg_t)
x = 340 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
else:
with open('/etc/wire_py/.keys', 'a') as keyfile:
keyfile.write(pre_key + '\r')
if len(path_split1) > 17:
@ -310,21 +296,21 @@ class ImportTunnel:
wg_read = Path('/etc/wire_py') / str(self.a + '.conf')
with open(wg_read, 'r') as file_for_key:
data = ConToDict.covert_to_dict(file_for_key)
''' Address Label '''
# Address Label
ShowAddress.init_and_report(self, data)
ShowAddress.show_data(self)
check_call(['nmcli', 'con', 'mod', self.a, 'connection.autoconnect', 'no'])
Path.chmod(wg_read, 0o600)
if 'PrivateKey = ' not in read:
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/error.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Import Error'
msg_t = 'Oh... no valid Wireguard File!\nPlease select a valid Wireguard File'
msg_window(iw, ii, wt, msg_t)
x = 340 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
except EOFError:
pass
except TypeError:
@ -332,7 +318,6 @@ class ImportTunnel:
except FileNotFoundError:
pass
except subprocess.CalledProcessError:
print('Tunnel exist!')
@ -354,21 +339,16 @@ class FileHandle:
self.l_box = None
def box_set(self):
try:
select_tunnel = self.l_box.curselection()
select_tl = self.l_box.get(select_tunnel[0])
if self.selected_option.get() == 0:
Path.unlink(path_to_file)
tl = ListTunnels.tl_list()
if len(tl) == 0:
self.wg_autostart.configure(state='disabled')
if self.selected_option.get() >= 1:
Path.write_text(path_to_file, select_tl)
except IndexError:
self.selected_option.set(1)
@ -383,7 +363,6 @@ class OnOff:
"""
def __init__(self):
self.wg_autostart = None
self.selected_option = None
self.auto_con = None
@ -392,16 +371,13 @@ class OnOff:
self.lb_frame_buttons = None
def on_off(self):
if Path.exists(path_to_file):
self.selected_option.set(1)
self.autoconnect_var.set('')
if not Path.is_dir(Path('/etc/wire_py')):
Path.mkdir(Path('/etc/wire_py'))
self.auto_con = Path.read_text(path_to_file)
else:
self.wg_autostart.configure(state='disabled')
self.auto_con = 'no Autoconnect'
self.autoconnect_var.set('')
@ -425,7 +401,6 @@ class ExportTunnels:
now_time = datetime.now()
now_datetime = now_time.strftime('wg-exp-' + '%m-%d-%Y' + '-' + '%H:%M')
tl = ListTunnels.tl_list()
try:
if len(tl) != 0:
wg_tar = str(_u) + '/' + now_datetime
@ -438,31 +413,34 @@ class ExportTunnels:
shutil.rmtree(source)
with zipfile.ZipFile((wg_tar + '.zip'), 'r') as zf:
if len(zf.namelist()) != 0:
"""img_w, img_i, w_title, w_txt hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_vpn.png'
wt = 'Export Successful'
msg_t = 'Your zip file is in home directory'
msg_window(iw, ii, wt, msg_t)
x = 340 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
else:
"""img_w, img_i, w_title, w_txt hand over"""
iw = r'/usr/share/icons/wp-icons/64/error.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Export error'
msg_t = 'Export failed! Please try again'
msg_window(iw, ii, wt, msg_t)
x = 340 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
else:
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Select tunnel'
msg_t = 'Please first import tunnel.'
msg_window(iw, ii, wt, msg_t)
x = 280 # width
y = 130 # height
msg_window(iw, ii, wt, msg_t, x, y)
except TypeError:
pass

View File

@ -11,8 +11,6 @@ from wg_func import (TunnelActiv, ListTunnels, ImportTunnel, ConToDict, GreenLab
font_color = '#4011a7'
dk_theme = '#2e2e2e'
''' 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year '''
version = 'v. 1.10.0424'
class MainWindow(tk.Tk):
@ -33,8 +31,7 @@ class MainWindow(tk.Tk):
self.rowconfigure(0, weight=1)
self.style = ttk.Style(self)
self.style.theme_use('clam')
''' Load the image file from disk. '''
# Load the image file from disk.
self.wg_icon = tk.PhotoImage(file=r'/usr/share/icons/wp-icons/48/wg_vpn.png')
# Set it as the window icon.
self.iconphoto(True, self.wg_icon)
@ -43,7 +40,7 @@ class MainWindow(tk.Tk):
self.app_menu = tk.Menu(self, borderwidth=0)
self.configure(menu=self.app_menu)
self.app_menu.add_cascade(label=version)
self.app_menu.add_cascade(label='v. 1.4.7')
self.app_menu.add_cascade(label='Options')
self.app_menu.add_cascade(label='?')
@ -69,53 +66,48 @@ class FrameWidgets(ttk.Frame):
self.exp_pic = tk.PhotoImage(file=r'/usr/share/icons/wp-icons/48/wg_export.png')
self.warning_pic = tk.PhotoImage(file=r'/usr/share/icons/wp-icons/64/error.png')
''' Show active Tunnel '''
# Show active Tunnel
self.a = TunnelActiv.active()
''' Label Frame 1 '''
# Label Frame 1
self.lb_frame_btn_lbox = ttk.Frame(self)
self.lb_frame_btn_lbox.configure(relief='flat')
self.lb_frame_btn_lbox.grid(column=0, rowspan=4, row=0)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
''' Label Frame 2 '''
# Label Frame 2
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 3 '''
# Label Frame 3
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)
''' Show active Label '''
# 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 '''
# Label to Show active Tunnel
self.StrVar = tk.StringVar(value=self.a)
GreenLabel.green_show_label(self)
''' Interface Label '''
# 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 '''
# 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 '''
# Listbox with Scrollbar
def enable_check_box(event):
tl = ListTunnels.tl_list()
if len(tl) != 0:
@ -135,33 +127,29 @@ class FrameWidgets(ttk.Frame):
self.l_box.configure(yscrollcommand=self.scrollbar.set)
self.rowconfigure(0, weight=1)
''' Tunnel List '''
# Tunnel List
self.tl = ListTunnels.tl_list()
for tunnels in self.tl:
self.l_box.insert("end", tunnels)
self.l_box.update()
''' Button Vpn '''
# Button Vpn
if self.a != '':
StartStopBTN.button_stop(self)
wg_read = Path('/etc/wire_py') / str(self.a + '.conf')
with open(wg_read, 'r') as file:
data = ConToDict.covert_to_dict(file)
''' Address Label '''
# Address Label
ShowAddress.init_and_report(self, data)
ShowAddress.show_data(self)
else:
StartStopBTN.button_start(self)
''' Address Label '''
# Address Label
self.add = tk.StringVar()
self.DNS = tk.StringVar()
self.enp = tk.StringVar()
ShowAddress.label_empty(self)
ShowAddress.show_data(self)
''' Button Import '''
# Button Import
self.btn_i = tk.Button(self.lb_frame_btn_lbox,
image=self.imp_pic, bd=0,
command=lambda: ImportTunnel.wg_import_select(self))
@ -194,8 +182,7 @@ class FrameWidgets(ttk.Frame):
file_one = Path('/etc/wire_py/.keys2')
file_two = file_one.with_name('.keys')
file_one.replace(file_two)
''' for disable checkbox when Listbox empty '''
# for disable checkbox when Listbox empty
tl = ListTunnels.tl_list()
if len(tl) == 0:
self.wg_autostart.configure(state='disabled')
@ -203,8 +190,7 @@ class FrameWidgets(ttk.Frame):
self.StrVar.set(value='')
StartStopBTN.button_start(self)
self.l_box.update()
''' Address Label '''
# Address Label
self.add.set('')
self.DNS.set('')
self.enp.set('')
@ -212,32 +198,33 @@ class FrameWidgets(ttk.Frame):
except IndexError:
tl = ListTunnels.tl_list()
if len(tl) != 0:
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Select tunnel'
msg_t = 'Please select a tunnel from the list.'
msg_window(iw, ii, wt, msg_t)
x = 340 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
else:
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Select tunnel'
msg_t = 'Please first import tunnel.'
msg_window(iw, ii, wt, msg_t)
x = 280 # width
y = 130 # height
msg_window(iw, ii, wt, msg_t, x, y)
''' Button Trash '''
# Button Trash
self.btn_tr = tk.Button(self.lb_frame_btn_lbox, image=self.tr_pic, bd=0, command=delete)
self.btn_tr.grid(column=0, row=2, padx=15, pady=8)
''' Button Export '''
# Button Export
self.btn_exp = tk.Button(self.lb_frame_btn_lbox, image=self.exp_pic, bd=0, command=ExportTunnels.wg_export)
self.btn_exp.grid(column=0, row=3, padx=15, pady=8)
''' Label Entry '''
# Label Entry
self.lb_rename = ttk.Entry(self, width=20)
self.lb_rename.grid(column=2, row=4, padx=30, pady=5, sticky='w')
self.lb_rename.insert(0, 'Max. 12 characters!')
@ -247,39 +234,39 @@ class FrameWidgets(ttk.Frame):
special_characters = ['\\', '/', '{', '}', ' ']
if len(self.lb_rename.get()) > 12:
"""img_w, img_i, w_title, w_txt hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Renaming not possible'
msg_t = 'The new name may contain only 12 characters.'
msg_window(iw, ii, wt, msg_t)
x = 420 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
elif len(self.lb_rename.get()) == 0:
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Renaming not possible'
msg_t = 'At least one character must be entered.'
msg_window(iw, ii, wt, msg_t)
x = 380 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
elif any(ch in special_characters for ch in self.lb_rename.get()):
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Renaming not possible'
msg_t = 'No valid sign. These must not be used.\nBlank, Slash, Backslash and { }\n'
msg_window(iw, ii, wt, msg_t)
x = 370 # width
y = 130 # height
msg_window(iw, ii, wt, msg_t, x, y)
else:
try:
self.select_tunnel = self.l_box.curselection()
select_tl = self.l_box.get(self.select_tunnel[0])
''' nmcli connection modify old connection.id iphone '''
# nmcli connection modify old connection.id iphone
check_call(['nmcli', 'connection', 'modify', select_tl, 'connection.id', self.lb_rename.get()])
source = Path('/etc/wire_py') / str(select_tl + '.conf')
destination = source.with_name(str(self.lb_rename.get() + '.conf'))
@ -299,21 +286,21 @@ class FrameWidgets(ttk.Frame):
self.autoconnect_var.set(value=new_a_connect)
Path.write_text(path_to_file, new_a_connect)
return select_tl
except IndexError:
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Renaming not possible'
msg_t = 'Please select a tunnel from the list.'
msg_window(iw, ii, wt, msg_t)
x = 340 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
''' Button Rename '''
# Button Rename
self.btn_rename = ttk.Button(self, text='Rename', state='disable', command=tl_rename)
self.btn_rename.grid(column=2, row=4, padx=20, pady=10, sticky='e')
''' Check Buttons '''
# Check Buttons
self.selected_option = tk.IntVar()
self.autoconnect_var = tk.StringVar()
self.autoconnect_var.set(self.auto_con)
@ -343,56 +330,49 @@ class FrameWidgets(ttk.Frame):
wg_read = Path('/etc/wire_py') / str(select_tl + '.conf')
with open(wg_read, 'r') as file:
data = ConToDict.covert_to_dict(file)
''' Address Label '''
# Address Label
ShowAddress.init_and_report(self, data)
ShowAddress.show_data(self)
''' Button Start/Stop '''
# 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 '''
# Button Start/Stop
StartStopBTN.button_stop(self)
check_call(['nmcli', 'connection', 'down', self.a])
''' Button Start/Stop '''
# Button Start/Stop
StartStopBTN.button_start(self)
self.a = TunnelActiv.active()
self.StrVar.set('')
GreenLabel.green_show_label(self)
''' Address Label '''
# Address Label
self.add.set('')
self.DNS.set('')
self.enp.set('')
ShowAddress.show_data(self)
except IndexError:
tl = ListTunnels.tl_list()
if len(tl) != 0:
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Select tunnel'
msg_t = 'Please select a tunnel from the list.'
msg_window(iw, ii, wt, msg_t)
x = 340 # width
y = 140 # height
msg_window(iw, ii, wt, msg_t, x, y)
else:
"""img_w, img_i, w_title, w_txt hand over"""
"""img_w, img_i, w_title, w_txt x, y hand over"""
iw = r'/usr/share/icons/wp-icons/64/info.png'
ii = r'/usr/share/icons/wp-icons/48/wg_msg.png'
wt = 'Select tunnel'
msg_t = 'Please first import tunnel.'
msg_window(iw, ii, wt, msg_t)
x = 280 # width
y = 130 # height
msg_window(iw, ii, wt, msg_t, x, y)
if __name__ == '__main__':

Binary file not shown.