## ────────────────────────────────────────────── ## WGSecure (WGS) — Makefile ## Compilation Linux & Windows via PyInstaller ## ────────────────────────────────────────────── APP := wgsecure VERSION := 0.4.0 PYTHON := python3 SRC := main.py DIST := dist BUILD := build ICON := /tmp/wgsecure_icon_build.png # Options PyInstaller communes aux deux plateformes PI_OPTS := \ --noconfirm \ --clean \ --name $(APP) \ --hidden-import pyotp \ --hidden-import qrcode \ --hidden-import qrcode.image.pil \ --hidden-import PIL \ --hidden-import PIL.Image \ --hidden-import cryptography \ --hidden-import cryptography.hazmat.primitives.asymmetric.x25519 \ --collect-submodules PyQt6 .PHONY: all linux windows release install install-gnome uninstall-gnome run run-admin icon reset-password clean help # ── Cible par défaut ──────────────────────────────────────────────────────── all: linux # ── Génération de l'icône PNG (utilisée par PyInstaller) ──────────────────── icon: @$(PYTHON) -c "\ import sys; sys.path.insert(0,'.');\ from PyQt6.QtWidgets import QApplication; app=QApplication(sys.argv);\ from app.ui.icons import icon_app;\ pix=icon_app().pixmap(256,256); pix.save('$(ICON)','PNG');\ print(' Icône générée →', '$(ICON)')" 2>/dev/null @test -f $(ICON) || (echo " ❌ Génération icône échouée"; exit 1) # ── Binaire Linux ──────────────────────────────────────────────────────────── linux: icon @echo "" @echo " 🐧 Compilation Linux (PyInstaller onefile)…" @echo "" $(PYTHON) -m PyInstaller $(PI_OPTS) \ --onefile \ --icon=$(ICON) \ $(SRC) @echo "" @echo " ✅ Binaire Linux → $(DIST)/$(APP)" @echo "" # ── Binaire Windows (via Wine + Python Windows) ────────────────────────────── windows: icon @echo "" @echo " 🪟 Compilation Windows (Wine + PyInstaller)…" @echo "" @which wine > /dev/null 2>&1 \ || (echo " ❌ Wine non installé → sudo apt install wine"; exit 1) @wine python -m PyInstaller $(PI_OPTS) \ --onefile \ --windowed \ --icon=$(ICON) \ $(SRC) \ || (echo ""; \ echo " ❌ Échec : Python Windows introuvable dans Wine."; \ echo " → Installez-le avec : make setup-wine"; \ echo ""; exit 1) @echo "" @echo " ✅ Binaire Windows → $(DIST)/$(APP).exe" @echo "" # ── Installation de Python dans Wine ───────────────────────────────────────── setup-wine: @echo " 📦 Installation Python + pip dans Wine…" winetricks python3 wine pip install -r requirements.txt wine pip install pyinstaller # ── Release (Linux renommé avec version) ───────────────────────────────────── release: clean linux @mv $(DIST)/$(APP) $(DIST)/$(APP)-$(VERSION)-linux-x86_64 @echo " 📦 Release → $(DIST)/$(APP)-$(VERSION)-linux-x86_64" # ── Installation GNOME (utilisateur local, sans sudo) ──────────────────────── INSTALL_BIN := $(HOME)/.local/bin INSTALL_ICON := $(HOME)/.local/share/icons/hicolor/256x256/apps INSTALL_APPS := $(HOME)/.local/share/applications install-gnome: linux @echo "" @echo " 🐧 Installation de WGSecure pour GNOME…" @mkdir -p $(INSTALL_BIN) $(INSTALL_ICON) $(INSTALL_APPS) @cp $(DIST)/$(APP) $(INSTALL_BIN)/$(APP) @chmod +x $(INSTALL_BIN)/$(APP) @echo " ✅ Binaire → $(INSTALL_BIN)/$(APP)" @cp $(ICON) $(INSTALL_ICON)/$(APP).png @echo " ✅ Icône → $(INSTALL_ICON)/$(APP).png" @printf '[Desktop Entry]\nType=Application\nName=WGSecure\nComment=WireGuard GUI avec MFA TOTP\nExec=%s\nIcon=%s\nCategories=Network;Security;\nStartupWMClass=wgsecure\nTerminal=false\n' \ "$(INSTALL_BIN)/$(APP)" "$(APP)" \ > $(INSTALL_APPS)/$(APP).desktop @echo " ✅ Lanceur → $(INSTALL_APPS)/$(APP).desktop" @gtk-update-icon-cache -f -t $(HOME)/.local/share/icons/hicolor 2>/dev/null || true @update-desktop-database $(INSTALL_APPS) 2>/dev/null || true @echo "" @echo " 🎉 Installation terminée. WGSecure est disponible dans le menu GNOME." @echo "" uninstall-gnome: @echo " 🗑️ Désinstallation de WGSecure…" @rm -f $(INSTALL_BIN)/$(APP) @rm -f $(INSTALL_ICON)/$(APP).png @rm -f $(INSTALL_APPS)/$(APP).desktop @gtk-update-icon-cache -f -t $(HOME)/.local/share/icons/hicolor 2>/dev/null || true @update-desktop-database $(INSTALL_APPS) 2>/dev/null || true @echo " ✅ WGSecure désinstallé" # ── Dépendances Python ──────────────────────────────────────────────────────── install: $(PYTHON) -m pip install -r requirements.txt $(PYTHON) -m pip install pyinstaller @echo " ✅ Dépendances installées" # ── Réinitialisation du mot de passe administrateur ────────────────────────── reset-password: @echo "" @echo " ⚠️ Réinitialisation du mot de passe administrateur WGSecure…" @$(PYTHON) -c "\ import sys; sys.path.insert(0,'.');\ from app.core.config import Config;\ cfg = Config();\ cfg.set_admin_password('');\ print(' ✅ Mot de passe supprimé — accès admin sans restriction au prochain démarrage.')" @echo "" # ── Lancer l'application ───────────────────────────────────────────────────── run: DISPLAY=:0 $(PYTHON) $(SRC) run-admin: DISPLAY=:0 $(PYTHON) $(SRC) --admin # ── Nettoyage ──────────────────────────────────────────────────────────────── clean: @echo " 🧹 Nettoyage…" @rm -rf $(BUILD) $(DIST) *.spec @find . -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null; true @find . -name "*.pyc" -delete 2>/dev/null; true @echo " ✅ Artefacts supprimés" # ── Aide ───────────────────────────────────────────────────────────────────── help: @echo "" @echo " ╔══════════════════════════════════════════════╗" @echo " ║ 🛡️ WGSecure v$(VERSION) — Makefile ║" @echo " ╠══════════════════════════════════════════════╣" @echo " ║ make install Installe les dépendances ║" @echo " ║ make linux Binaire Linux (onefile) ║" @echo " ║ make windows Binaire Windows (Wine) ║" @echo " ║ make release Linux + nommage release ║" @echo " ║ make setup-wine Python Windows dans Wine ║" @echo " ║ make install-gnome Installe dans GNOME ║" @echo " ║ make uninstall-gnome Désinstalle de GNOME ║" @echo " ║ make reset-password Supprime le MDP admin ║" @echo " ║ make run Lance l'application ║" @echo " ║ make run-admin Lance en mode admin ║" @echo " ║ make clean Supprime les artefacts ║" @echo " ╚══════════════════════════════════════════════╝" @echo ""