commit 138ea21fd3dfe97bb58f79a947de77ce51f2417a Author: yann Date: Sat Jan 25 14:31:51 2025 +0100 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..da16333 --- /dev/null +++ b/README.md @@ -0,0 +1,161 @@ +## NordVPN systray + +### Développement + +Prérequis, l'application nordvpn est installée + +* Le **dossier développement** qui contient tous les modules nécessaire ainsi que les binaires +`/srv/media/dplus/python-dev/nordvpntray` +* Le **dossier final après installation** +$HOME/.local/share/nordvpntray + +Créer un projet python `nordvpntray` + +```bash +# Crée le dossier si inexistant +mkdir $HOME/media/dplus/python-dev/nordvpntray +# aller dans le dossier +cd $HOME/media/dplus/python-dev/nordvpntray +``` + +Pour créer un environnement, utilisez la commande `python -m venv ` +Créer un environnement pour l'application + + python3 -m venv venv + +activer l'environnement virtuel + + source venv/bin/activate + +On arrive sur un prompt : `(venv) [yann@PC1 nordvpntray]$` + +Mettre à jour pip dans l'environnement + + pip install --upgrade pip + +Les modules à installer + +fichier requirements.txt + +``` +pystray +pillow +ping3 +plyer +desktop-notifier +dbus-python +wheel +urllib3 +PyGObject +``` + +Installer les modules supplémentaires + + pip install -r requirements.txt + +Projet sur éditeur python "Wing Personal 10" +$HOME/media/dplus/python-dev/nordvpntray.wpr + +Créer les scripts + +Aller dans le dossier développement + + cd /srv/media/dplus/python-dev/nordvpntray + +Créer un script de lancement : `nordvpntray.sh` + +```bash +# Lancement nordvpntray +# Dossier travail +cd $HOME/.local/share/nordvpntray +# Chemin +export PATH="$HOME/.local/share/nordvpntray/venv/bin:$PATH" +# Exécution script +python nordvpntray.py +``` + +Le rendre exécutable + + chmod +x nordvpntray.sh + +Créer icône bureau `nordvpntray.desktop` + +``` +[Desktop Entry] +Version=1.0 +Type=Application +Name=NordVPN Graphique +Comment=Etat du service nordvpn +Icon=nordvpn +Exec=nordvpntray +``` + +Le script d'installation `install.sh` + +```bash +# copie dossier +cp -r ../nordvpntray $HOME/.local/share/ +# Icône bureau +mkdir -p $HOME/.local/share/applications/ +cp nordvpntray.desktop $HOME/.local/share/applications/ +# on met le script en lien dans /usr/local/bin/ +sudo ln -s $HOME/.local/share/nordvpntray/nordvpntray.sh /usr/local/bin/nordvpntray +``` + +## Installer NordVPN systray + +### Prérequis + +L'application NordVPN doit être installée, suivre la procédure : [Application NordVPN](https://static.rnmkcy.eu/2024/11/23/NordVPN.html) + +Les paramètres à activer ou désactiver + +```bash +nordvpn set autoconnect disabled +nordvpn set tray disabled +nordvpn set notify disabled +nordvpn set ipv6 enabled +nordvpn set lan-discovery enabled +``` + +Paramétrage : `nordvpn settings` + +``` +Technology: NORDLYNX +Firewall: enabled +Firewall Mark: 0xe1f1 +Routing: enabled +Analytics: enabled +Kill Switch: disabled +Threat Protection Lite: disabled +Notify: disabled +Tray: disabled +Auto-connect: disabled +IPv6: enabled +Meshnet: disabled +DNS: disabled +LAN Discovery: enabled +Virtual Location: enabled +Post-quantum VPN: disabled +``` + +### nordvpntray + +Cloner le dépot + + git clone https://gitea.rnmkcy.eu/yann/nordvpntray + + cd nordvpntray + ./install.sh + +Lancement en début de session XFCE + +* Paramètres --> Gestionnaire de Paramètres --> Session et démarrage +* Démarrage automatique d'application + * +Ajouter + * Nom: nordvpntray + * Description : NordVPN Graphique + * Commande: nordvpntray + * Déclencher à la connexion + * OK +* Fermer diff --git a/img/dns-logo.png b/img/dns-logo.png new file mode 100755 index 0000000..3e3b0d2 Binary files /dev/null and b/img/dns-logo.png differ diff --git a/img/nord-logo-rouge.png b/img/nord-logo-rouge.png new file mode 100644 index 0000000..6da60c4 Binary files /dev/null and b/img/nord-logo-rouge.png differ diff --git a/img/nord-logo-vert.png b/img/nord-logo-vert.png new file mode 100644 index 0000000..8fe1da8 Binary files /dev/null and b/img/nord-logo-vert.png differ diff --git a/img/nord-logo.png b/img/nord-logo.png new file mode 100644 index 0000000..fe0a462 Binary files /dev/null and b/img/nord-logo.png differ diff --git a/img/nordvpn.jpg b/img/nordvpn.jpg new file mode 100644 index 0000000..a04fc8b Binary files /dev/null and b/img/nordvpn.jpg differ diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..7a5b8cd --- /dev/null +++ b/install.sh @@ -0,0 +1,8 @@ +# copie dossier +cp -r ../nordvpntray $HOME/.local/share/ +# Icône bureau +mkdir -p $HOME/.local/share/applications/ +cp nordvpntray.desktop $HOME/.local/share/applications/ +# on met le script en lien dans /usr/local/bin/ +sudo ln -s $HOME/.local/share/nordvpntray/nordvpntray.sh /usr/local/bin/nordvpntray + diff --git a/nord-logo.png b/nord-logo.png new file mode 100644 index 0000000..fe0a462 Binary files /dev/null and b/nord-logo.png differ diff --git a/nordvpntray.desktop b/nordvpntray.desktop new file mode 100644 index 0000000..4ce48f3 --- /dev/null +++ b/nordvpntray.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=NordVPN Graphique +Comment=Etat du service nordvpn +Icon=nordvpn +Exec=nordvpn sh $HOME/.local/share/nordvpntray/nordvpntray.sh diff --git a/nordvpntray.py b/nordvpntray.py new file mode 100755 index 0000000..414609c --- /dev/null +++ b/nordvpntray.py @@ -0,0 +1,304 @@ +import pystray +from PIL import Image +import threading # Import the threading module for creating threads + +from desktop_notifier import DesktopNotifier, Urgency, Button, ReplyField, DEFAULT_SOUND +from plyer import notification + +from urllib.request import Request +from urllib.request import urlopen +from urllib.request import URLError +import sys,os +import gobject +import json +import signal +import subprocess +from random import randint +from platform import system as system_name +from subprocess import call as system_call + +def ping(host): + fn = open(os.devnull, 'w') + param = '-n' if system_name().lower() == 'windows' else '-c' + command = ['ping', param, '1', host] + retcode = system_call(command, stdout=fn, stderr=subprocess.STDOUT) + fn.close() + return retcode == 0 + +def desktop_notifier(title, message, timeout=10, app_icon=None): + notification.notify( + title=title, + message=message, + timeout=timeout, + app_icon=app_icon, + ) + +def dns_leak(): + # Test fuites DNS + leak_id = randint(1000000, 9999999) + for x in range(0, 10): + ping('.'.join([str(x), str(leak_id), "bash.ws"])) + + response = urlopen("https://bash.ws/dnsleak/test/"+str(leak_id)+"?json") + dnsleak = "https://bash.ws/dnsleak/test/"+str(leak_id)+"?json" + '\n ' + data = response.read().decode("utf-8") + parsed_data = json.loads(data) + + dnsleak = dnsleak + '\n ' + "Votre IP " + for dns_server in parsed_data: + if dns_server['type'] == "ip": + if dns_server['country_name']: + if dns_server['asn']: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + " [" + dns_server['country_name'] + ", " + dns_server['asn'] + "]" + '\n ' + else: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + " [" + dns_server['country_name'] +" ]" + '\n ' + else: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + + servers = 0 + for dns_server in parsed_data: + if dns_server['type'] == "dns": + servers = servers + 1 + + if servers == 0: + dnsleak = dnsleak + "No DNS servers found" + else: + dnsleak = dnsleak + '\n ' + "Vous utilisez " + str(servers) + " serveur(s) DNS " + for dns_server in parsed_data: + if dns_server['type'] == "dns": + if dns_server['country_name']: + if dns_server['asn']: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + " [" + dns_server['country_name'] + ", " + dns_server['asn'] + "]" + '\n ' + else: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + " [" + dns_server['country_name'] + "]" + '\n ' + else: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + + dnsleak = dnsleak + '\n ' + "Conclusion:" + for dns_server in parsed_data: + if dns_server['type'] == "conclusion": + if dns_server['ip']: + dnsleak = dnsleak + dns_server['ip'] + # Retour dnsleak + # print(dnsleak) + return dnsleak + +def NordVPN(commande, option=""): + global connexion, stest + match commande: + case "status": + sortie=os.popen("nordvpn status", "r").read() + titre="Statut VPN" + case "settings": + sortie=os.popen("nordvpn settings", "r").read() + titre="Paramètres VPN" + case "test": + sortie="Pour les tests" + titre="TESTS" + #desktop_notifier(titre, "Ceci est test",10,images + "nordvpn.jpg") + if stest: + stest = False + icon.icon = connected_img + else: + stest = True + icon.icon = disconnected_img + case "connect": + titre="Connexion VPN" + if not connexion: + sortie=os.popen("nordvpn connect", "r").read() + connexion = True + print(sortie) + icon.icon = connected_img + cmdcli=os.popen("nordvpn status", "r").read() + if not "Disconnected" in cmdcli: + # VPN actif + for line in cmdcli.split('\n'): + if "Server:" in line: + # Extraire le serveur avec suppression espaces début fin + serveur=line[len("Server:"):].strip() + icon.title=serveur + else: + print(sortie) + sortie="Connexion VPN active" + case "disconnect": + titre="Déconnexion VPN" + sortie=os.popen("nordvpn disconnect", "r").read() + if "You are not connected to NordVPN" in sortie: + sortie="Vous n'êtes pas connecté à NordVPN" + print(sortie) + connexion = False + print(sortie) + icon.icon = disconnected_img + icon.title="Déconnecté" + case "login": + titre="Connexion Compte" + if not connexion: + sortie=os.popen("nordvpn login", "r").read() + else: + sortie=os.popen("nordvpn account", "r").read() + case "dnsleak": + # appel fonction et affichage + titre="DNS Leak test (fuites)" + sortie=dns_leak() + case "countries": + # groupes de serveur + titre="Groupes de serveur" + sortie=os.popen("nordvpn countries", "r").read() + case "groups": + # groupes de serveur + titre="Groupes de serveur" + sortie=os.popen("nordvpn groups", "r").read() + case "version": + titre="Version NordVPN" + sortie=os.popen("nordvpn version", "r").read() + case "_": + print("Oops, quelque chose s'est mal passé 🤯") + + # analyse résultat des commandes bash nordvpn + print(sortie) + message = sortie.replace("Server", "Serveur") + message = message.replace("Hostname", "Nom hôte") + message = message.replace("Country", "Pays") + message = message.replace("City", "Ville") + message = message.replace("Current technology", "Technologie actuelle") + message = message.replace("Current protocol", "Protocole actuel") + message = message.replace("Transfer", "Transfert") + message = message.replace("Uptime", "Temps de fonction") + message = message.replace("Connected", "Connecté") + message = message.replace("Disconnected", "Déconnecté") + message = message.replace("second", "seconde") + message = message.replace("Disabled", "Inactif") + message = message.replace("Enabled", "Actif") + message = message.replace("disabled", "Inactif") + message = message.replace("enabled", "Actif") + message = message.replace("Connecting to", "Se connecter à") + message = message.replace("You are connected to", "Vous êtes connecté à") + if commande=="disconnect": + message="Vous êtes déconnecté de NordVPN" + desktop_notifier(titre, message,10,images + "nordvpn.jpg") + #print(message) + + +def after_click(icon, query): + match str(query): + case "Status": + NordVPN("status") + case "Paramètres": + NordVPN("settings") + case "Connexion VPN rapide": + NordVPN("connect") + case "Déconnexion VPN": + NordVPN("disconnect") + case "Fuites DNS": + NordVPN("dnsleak") + case "Connexion/Infos Compte": + NordVPN("login") + case "TEST": + NordVPN("test") + case "Groupes de serveurs": + NordVPN("groups") + case "Pays": + NordVPN("countries") + case "Version": + NordVPN("version") + case "Quitter": + icon.stop() + +def vpnactif(): + # Tester si la connexion VPN est active + cmdcli=os.popen("nordvpn status", "r").read() + print(cmdcli) + if not "Disconnected" in cmdcli: + # VPN actif + for line in cmdcli.split('\n'): + if "Server:" in line: + # Extraire le serveur avec suppression espaces début fin + serveur=line[len("Server:"):].strip() + icon.title=serveur + return True + else: + # VPN inactif + icon.title="VPN inactif" + return False + +def on_clicked(icon, item): + global state + state = not item.checked + +''' +# Départ programme +On regarde si le service nordvpnd est actif +''' + +# récupérer le chemin du répertoire courant +chemin_courant = os.getcwd() + "/" +print("Le répertoire courant est : " + chemin_courant ) +images = chemin_courant + "img/" +print("Le répertoire images est : " + images ) + +state = False + +# on regarde si le service nordvpnd est actif pour afficher la couleur du bouton +etat=os.popen("systemctl is-active nordvpnd.service").read() +if 'inactive' in etat: + # nordvpnd inactif + print("Service nordvpnd inactif") + desktop_notifier("Service nordvpnd", "Le service NordVPN daemon est inactif",10,images + "nordvpn.jpg") + # On arrête le script + sys.exit("Service nordvpnd inactif") +else: + print("Service nordvpnd actif") + +# Définir les images pour le systray +connected_img = Image.open(images + "nord-logo-vert.png") # image connexion NordVPN active +disconnected_img = Image.open(images + "nord-logo-rouge.png") # image connexion NordVPN inactive + +stest = True + +icon = pystray.Icon("VPN") + +# Test si connexion active +if vpnactif(): + # VPN actif + connexion = True + icon.icon = connected_img + print("VPN actif") +else: + # VPN inactif + connexion = False + icon.icon = disconnected_img + icon.title="Déconnecté" + print("VPN inactif") + +icon.menu= pystray.Menu( + pystray.MenuItem("Status", + after_click), + pystray.MenuItem("Paramètres", + after_click), + pystray.MenuItem("Fuites DNS", + after_click), + pystray.MenuItem("Connexion VPN rapide", + after_click), + pystray.MenuItem("Déconnexion VPN", + after_click), + pystray.MenuItem("Connexion/Infos Compte", + after_click), + pystray.MenuItem("TEST", + after_click), + pystray.MenuItem("Listes", + pystray.Menu( + pystray.MenuItem('Groupes de serveurs', + after_click), + pystray.MenuItem('Pays', + after_click), + pystray.MenuItem('On/Off', + on_clicked,checked=lambda item: state), + pystray.MenuItem('Version', + after_click) + + )), + pystray.MenuItem("Quitter", + after_click) + ) + +icon.run() diff --git a/nordvpntray.sh b/nordvpntray.sh new file mode 100755 index 0000000..aa8febe --- /dev/null +++ b/nordvpntray.sh @@ -0,0 +1,7 @@ +# Lancement nordvpntray +# Dossier travail +cd $HOME/.local/share/nordvpntray +# Chemin +export PATH="$HOME/.local/share/nordvpntray/venv/bin:$PATH" +# Exécution script +python nordvpntray.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..df26192 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +pystray +pillow +ping3 +plyer +desktop-notifier +dbus-python +wheel +urllib3 +PyGObject