; ────────────────────────────────────────────── ; WGSecure (WGS) — Script Inno Setup ; Installeur Windows complet : WGSecure + WireGuard + ; Visual C++ Redistributable, chacun installé en silence si absent. ; ────────────────────────────────────────────── #define MyAppName "WGSecure" #define MyAppVersion "0.7.16" #define MyAppPublisher "WGSecure" #define MyAppExeName "wgsecure.exe" [Setup] AppId={{8F3B2C1A-7D4E-4A9B-9C6F-1E2D3F4A5B6C} AppName={#MyAppName} AppVersion={#MyAppVersion} AppPublisher={#MyAppPublisher} DefaultDirName={autopf}\{#MyAppName} DefaultGroupName={#MyAppName} DisableProgramGroupPage=yes OutputDir=dist OutputBaseFilename=wgsecure-{#MyAppVersion}-setup Compression=lzma2 SolidCompression=yes ArchitecturesAllowed=x64compatible ArchitecturesInstallIn64BitMode=x64compatible PrivilegesRequired=admin [Languages] Name: "french"; MessagesFile: "compiler:Languages\French.isl" [Files] Source: "dist\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion ; Service privilégié optionnel (cf. app/service/, `make helper`) : installe/ ; désinstalle le tunnel et pose/retire les règles NRPT (split-DNS) en ; LocalSystem, pour éviter une invite d'authentification à chaque connexion/ ; déconnexion. skipifsourcedoesntexist : le build peut être absent (composant ; optionnel, pas encore généré sur toutes les machines de build) — dans ce ; cas l'app retombe simplement sur son chemin élevé existant. Source: "dist\wgsecure-helper.exe"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist ; VC++ Redistributable x64 — téléchargé automatiquement par `make installer-deps` : ; https://aka.ms/vs/17/release/vc_redist.x64.exe → installer\VC_redist.x64.exe Source: "installer\VC_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall ; WireGuard pour Windows — prérequis à WGSecure (fournit wg.exe, le pilote ; tunnel et le service WireGuardTunnel$ que wireguard.py pilote). Téléchargé ; automatiquement par `make installer-deps` : ; https://download.wireguard.com/windows-client/wireguard-installer.exe ; → installer\wireguard-installer.exe Source: "installer\wireguard-installer.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall [Icons] Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" [Run] ; Installation silencieuse du VC++ Redistributable si absent (corrige "Failed to load Python DLL: python312.dll") Filename: "{tmp}\VC_redist.x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "Installation du composant Visual C++ Redistributable…"; Check: VCRedistNeedsInstall ; L'installeur officiel WireGuard s'exécute déjà sans assistant (juste une ; fenêtre de progression) : notre propre installeur tourne en admin ; (PrivilegesRequired=admin ci-dessus), donc pas d'UAC supplémentaire non plus. ; `waituntilterminated` : l'app ne doit pas démarrer avant que wg.exe existe. Filename: "{tmp}\wireguard-installer.exe"; StatusMsg: "Installation de WireGuard…"; Check: WireGuardNeedsInstall; Flags: waituntilterminated Filename: "{app}\{#MyAppExeName}"; Description: "Lancer {#MyAppName}"; Flags: nowait postinstall skipifsilent [Code] function VCRedistNeedsInstall: Boolean; var Version: String; begin // Clé présente si VC++ 2015-2022 x64 (v14+) déjà installé Result := not RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\X64', 'Version', Version); end; function WireGuardNeedsInstall: Boolean; begin // WireGuard s'installe toujours dans le Program Files 64 bits, quelle que // soit l'architecture de WGSecure : {pf} y pointe bien puisque // ArchitecturesInstallIn64BitMode=x64compatible ci-dessus. Result := not FileExists(ExpandConstant('{pf}\WireGuard\wireguard.exe')); end; // Enregistre et démarre le service privilégié (cf. app/service/) via // Exec()+AddQuotes plutôt que des entrées [Run] à guillemets échappés // ("" imbriqués) : une tentative précédente basée sur l'échappement de // chaîne Inno Setup produisait une commande sc.exe invalide (silencieuse, // aucune erreur visible pendant l'installation) alors que la même commande // fonctionnait telle quelle lancée à la main — AddQuotes() gère le // guillemetage de façon fiable, sans juggler des niveaux d'échappement // imbriqués à la main. procedure InstallHelperService; var ResultCode: Integer; ExePath, Params: String; begin ExePath := ExpandConstant('{app}\wgsecure-helper.exe'); // Optionnel (skipifsourcedoesntexist dans [Files]) : n'enregistrer le // service que si le binaire a bien été copié. if not FileExists(ExePath) then exit; Params := 'create WGSecureHelper binPath= ' + AddQuotes(ExePath) + ' start= auto DisplayName= ' + AddQuotes('WGSecure Helper'); Exec(ExpandConstant('{sys}\sc.exe'), Params, '', SW_HIDE, ewWaitUntilTerminated, ResultCode); Exec(ExpandConstant('{sys}\sc.exe'), 'start WGSecureHelper', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); end; // sc.exe ignore silencieusement une commande sur un service déjà absent // (ex. installeur généré sans le composant service) : pas besoin de tester // son existence avant d'arrêter/supprimer. procedure UninstallHelperService; var ResultCode: Integer; begin Exec(ExpandConstant('{sys}\sc.exe'), 'stop WGSecureHelper', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); Exec(ExpandConstant('{sys}\sc.exe'), 'delete WGSecureHelper', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); end; procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssPostInstall then InstallHelperService; end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if CurUninstallStep = usUninstall then UninstallHelperService; end;