Merge pull request 'Fix msg_window and remove x , y argument' (#16) from 1.10.0424 into main
Reviewed-on: https://git.ilunix.de/punix/Wire-Py/pulls/16
This commit is contained in:
commit
f9d4256679
@ -4,9 +4,11 @@
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="940e1630-c825-4d4c-be80-bc11f543c122" name="Changes" comment="fix installer add .keys file">
|
||||
<change afterPath="$PROJECT_DIR$/Changelog" afterDir="false" />
|
||||
<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. Start with version number 1.4.7 Message window size corrected so text is displayed better">
|
||||
<change afterPath="$PROJECT_DIR$/wire-py1.10.0424.tar.gz" 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>
|
||||
@ -42,23 +44,23 @@
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<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 name="PropertiesComponent">{
|
||||
"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$" />
|
||||
@ -135,14 +137,6 @@
|
||||
<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) 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 address a active Tunnel. Label green pack in Class. add Class to convert fileoutput as String to Dictionary">
|
||||
<option name="closed" value="true" />
|
||||
<created>1724233806458</created>
|
||||
@ -527,7 +521,15 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1727380793216</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="56" />
|
||||
<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. Start with version number 1.4.7 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" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="UnknownFeatures">
|
||||
@ -568,7 +570,6 @@
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
|
||||
<MESSAGE value="in delete replace open with Path 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" />
|
||||
@ -593,6 +594,7 @@
|
||||
<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" />
|
||||
<option name="LAST_COMMIT_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. Start with version number 1.4.7 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. Start with version number 1.4.7 Message window size corrected so text is displayed better" />
|
||||
</component>
|
||||
</project>
|
35
Changelog
35
Changelog
@ -1,15 +1,44 @@
|
||||
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
|
||||
@ -25,3 +54,5 @@ Changelog for Wire-Py
|
||||
|
||||
- Message window size corrected so text is displayed better
|
||||
|
||||
- Version lobster assigned to a variable
|
||||
|
||||
|
140
install
140
install
@ -1,33 +1,125 @@
|
||||
#!/bin/bash
|
||||
NORMAL='\033[0m'
|
||||
GREEN='\033[1;32m'
|
||||
RED='\033[31;1;42m'
|
||||
BLUE='\033[30;1;34m'
|
||||
|
||||
which sudo >/dev/null
|
||||
if [ $? -ne 0 ]
|
||||
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
|
||||
then
|
||||
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
|
||||
groups > /tmp/isgroup
|
||||
if grep 'sudo' /tmp/isgroup
|
||||
then
|
||||
install_file_with
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
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
|
||||
fi
|
||||
clear
|
||||
read -n 1 -s -r -p $"To close the Window press a button"
|
||||
|
||||
|
||||
clear
|
||||
|
||||
|
||||
|
96
wg_func.py
96
wg_func.py
@ -1,4 +1,5 @@
|
||||
# Wireguard functions for Wire-Py
|
||||
""" Wireguard Classes and Method for Wire-Py """
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
@ -15,7 +16,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, x, y):
|
||||
def msg_window(img_w, img_i, w_title, w_txt):
|
||||
"""
|
||||
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.
|
||||
@ -24,17 +25,10 @@ def msg_window(img_w, img_i, w_title, w_txt, x, y):
|
||||
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)
|
||||
@ -58,10 +52,12 @@ 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)
|
||||
@ -81,6 +77,7 @@ class StartStopBTN:
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.lb_frame_btn_lbox = None
|
||||
self.wg_switch = None
|
||||
self.btn_stst = None
|
||||
@ -88,10 +85,12 @@ 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)
|
||||
|
||||
@ -104,6 +103,7 @@ class ConToDict:
|
||||
|
||||
@classmethod
|
||||
def covert_to_dict(cls, file):
|
||||
|
||||
dictlist = []
|
||||
for lines in file.readlines():
|
||||
line_plit = lines.split()
|
||||
@ -113,7 +113,9 @@ class ConToDict:
|
||||
for items in dictlist:
|
||||
if items == '=':
|
||||
dictlist.remove(items)
|
||||
for _ in dictlist: # Here is the beginning (Loop) of convert List to Dictionary
|
||||
|
||||
''' Here is the beginning (Loop) of convert List to Dictionary '''
|
||||
for _ in dictlist:
|
||||
a = [dictlist[0], dictlist[1]]
|
||||
b = [dictlist[2], dictlist[3]]
|
||||
c = [dictlist[4], dictlist[5]]
|
||||
@ -127,7 +129,8 @@ 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:
|
||||
@ -146,7 +149,8 @@ class TunnelActiv:
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def active(): # Shows the active tunnel
|
||||
def active():
|
||||
|
||||
active = os.popen('nmcli con show --active | grep -iPo "(.*)(wireguard)"').read().split()
|
||||
if not active:
|
||||
active = ''
|
||||
@ -163,6 +167,7 @@ class ShowAddress:
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.lb_frame2 = None
|
||||
self.lb_frame = None
|
||||
self.endpoint = None
|
||||
@ -173,7 +178,8 @@ 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()
|
||||
@ -182,20 +188,24 @@ 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))
|
||||
@ -209,7 +219,9 @@ class ListTunnels:
|
||||
@staticmethod
|
||||
def tl_list():
|
||||
wg_s = os.popen('nmcli con show | grep -iPo "(.*)(wireguard)"').read().split()
|
||||
tl = wg_s[::3] # tl = Tunnel list # Show of 4.Element in list
|
||||
|
||||
''' tl = Tunnel list # Show of 4.Element in list '''
|
||||
tl = wg_s[::3]
|
||||
return tl
|
||||
|
||||
|
||||
@ -236,6 +248,7 @@ 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')], )
|
||||
@ -245,6 +258,7 @@ 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)
|
||||
@ -258,10 +272,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'
|
||||
x = 340 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
else:
|
||||
|
||||
with open('/etc/wire_py/.keys', 'a') as keyfile:
|
||||
keyfile.write(pre_key + '\r')
|
||||
if len(path_split1) > 17:
|
||||
@ -296,21 +310,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 x, y hand over"""
|
||||
"""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 = 'Import Error'
|
||||
msg_t = 'Oh... no valid Wireguard File!\nPlease select a valid Wireguard File'
|
||||
x = 340 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
except EOFError:
|
||||
pass
|
||||
except TypeError:
|
||||
@ -318,6 +332,7 @@ class ImportTunnel:
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
except subprocess.CalledProcessError:
|
||||
|
||||
print('Tunnel exist!')
|
||||
|
||||
|
||||
@ -339,16 +354,21 @@ 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)
|
||||
|
||||
@ -363,6 +383,7 @@ class OnOff:
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
|
||||
self.wg_autostart = None
|
||||
self.selected_option = None
|
||||
self.auto_con = None
|
||||
@ -371,13 +392,16 @@ 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('')
|
||||
@ -401,6 +425,7 @@ 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
|
||||
@ -413,34 +438,31 @@ 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'
|
||||
x = 340 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
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'
|
||||
x = 340 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
else:
|
||||
"""img_w, img_i, w_title, w_txt x, y hand over"""
|
||||
|
||||
"""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 = 'Select tunnel'
|
||||
msg_t = 'Please first import tunnel.'
|
||||
x = 280 # width
|
||||
y = 130 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
|
||||
|
140
wg_main.py
140
wg_main.py
@ -11,6 +11,8 @@ 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):
|
||||
@ -31,7 +33,8 @@ 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)
|
||||
@ -40,7 +43,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='v. 1.4.7')
|
||||
self.app_menu.add_cascade(label=version)
|
||||
self.app_menu.add_cascade(label='Options')
|
||||
self.app_menu.add_cascade(label='?')
|
||||
|
||||
@ -66,48 +69,53 @@ 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:
|
||||
@ -127,29 +135,33 @@ 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))
|
||||
@ -182,7 +194,8 @@ 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')
|
||||
@ -190,7 +203,8 @@ 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('')
|
||||
@ -198,33 +212,32 @@ class FrameWidgets(ttk.Frame):
|
||||
except IndexError:
|
||||
tl = ListTunnels.tl_list()
|
||||
if len(tl) != 0:
|
||||
"""img_w, img_i, w_title, w_txt x, y hand over"""
|
||||
|
||||
"""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 = 'Select tunnel'
|
||||
msg_t = 'Please select a tunnel from the list.'
|
||||
x = 340 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
else:
|
||||
"""img_w, img_i, w_title, w_txt x, y hand over"""
|
||||
|
||||
"""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 = 'Select tunnel'
|
||||
msg_t = 'Please first import tunnel.'
|
||||
x = 280 # width
|
||||
y = 130 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
# 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!')
|
||||
@ -234,39 +247,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.'
|
||||
x = 420 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
elif len(self.lb_rename.get()) == 0:
|
||||
"""img_w, img_i, w_title, w_txt x, y hand over"""
|
||||
|
||||
"""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 = 'At least one character must be entered.'
|
||||
x = 380 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
elif any(ch in special_characters for ch in self.lb_rename.get()):
|
||||
"""img_w, img_i, w_title, w_txt x, y hand over"""
|
||||
|
||||
"""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 = 'No valid sign. These must not be used.\nBlank, Slash, Backslash and { }\n'
|
||||
x = 370 # width
|
||||
y = 130 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
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'))
|
||||
@ -286,21 +299,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 x, y hand over"""
|
||||
|
||||
"""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 = 'Please select a tunnel from the list.'
|
||||
x = 340 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
# 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)
|
||||
@ -330,49 +343,56 @@ 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 x, y hand over"""
|
||||
|
||||
"""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 = 'Select tunnel'
|
||||
msg_t = 'Please select a tunnel from the list.'
|
||||
x = 340 # width
|
||||
y = 140 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
else:
|
||||
"""img_w, img_i, w_title, w_txt x, y hand over"""
|
||||
|
||||
"""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 = 'Select tunnel'
|
||||
msg_t = 'Please first import tunnel.'
|
||||
x = 280 # width
|
||||
y = 130 # height
|
||||
msg_window(iw, ii, wt, msg_t, x, y)
|
||||
msg_window(iw, ii, wt, msg_t)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
BIN
wire-py1.10.0424.tar.gz
Normal file
BIN
wire-py1.10.0424.tar.gz
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user