diff --git a/socks-browser.ps1 b/socks-browser.ps1 index b3219ab..4f26ff2 100644 --- a/socks-browser.ps1 +++ b/socks-browser.ps1 @@ -1,26 +1,9 @@ -$config = @{ - # ========================= - # SSH configuration - # ========================= - SshExe = "C:\Windows\System32\OpenSSH\ssh.exe" - AskPassExe = "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git-askpass.exe" - HostAlias = "alamaison" - LocalPort = 33333 - - # ========================= - # Browser configuration - # ========================= - BrowserExe = "C:\Program Files\Mozilla Firefox\firefox.exe" - BrowserProcessName = "firefox" - -} - # ========================= # Configuration du script # ========================= Set-StrictMode -Version Latest $script:DebugEnabled = $false -#$script:ConfigFile = Join-Path $PSScriptRoot "socks-browser.config.psd1" +$script:ConfigFile = Join-Path $PSScriptRoot "socks-browser.config.psd1" $script:LogFile = Join-Path $env:TEMP "socks-browser.log" # ========================= @@ -40,41 +23,41 @@ function Write-DebugLog { $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $logEntry = "[DEBUG $timestamp] $Message" - # Affiche à l'écran + # Affiche à l'écran Write-Host $logEntry -ForegroundColor DarkGray - # Écrit dans le fichier de log (dans %TEMP%) + # Écrit dans le fichier de log (dans %TEMP%) try { $logEntry | Out-File -FilePath $script:LogFile -Encoding UTF8 -Append -ErrorAction SilentlyContinue } catch { - # Ignore les erreurs d'écriture (ex: droits, disque plein) + # Ignore les erreurs d'écriture (ex: droits, disque plein) } } # ========================= # Fonctions principales # ========================= -# -#function Get-Configuration { -# if (-not (Test-Path $script:ConfigFile)) { -# throw "Fichier de configuration introuvable : $script:ConfigFile" -# } -# -# $config = Import-PowerShellDataFile $script:ConfigFile -# -# $requiredKeys = @( -# "SshExe", "AskPassExe", "HostAlias", -# "LocalPort", "BrowserExe", "BrowserProcessName" -# ) -# -# foreach ($key in $requiredKeys) { -# if (-not $config.ContainsKey($key) -or [string]::IsNullOrWhiteSpace($config[$key])) { -# throw "Valeur de configuration manquante ou vide : $key" -# } -# } -# -# return $config -#} + +function Get-Configuration { + if (-not (Test-Path $script:ConfigFile)) { + throw "Fichier de configuration introuvable : $script:ConfigFile" + } + + $config = Import-PowerShellDataFile $script:ConfigFile + + $requiredKeys = @( + "SshExe", "AskPassExe", "HostAlias", + "LocalPort", "BrowserExe", "BrowserProcessName" + ) + + foreach ($key in $requiredKeys) { + if (-not $config.ContainsKey($key) -or [string]::IsNullOrWhiteSpace($config[$key])) { + throw "Valeur de configuration manquante ou vide : $key" + } + } + + return $config +} function Test-PortAvailable { param ([int]$Port) @@ -95,12 +78,12 @@ function Start-SshTunnel { $env:SSH_ASKPASS_REQUIRE = "force" $env:DISPLAY = "dummy" - Write-DebugLog "Démarrage du tunnel SSH : ssh -N -D $LocalPort $HostAlias" + Write-DebugLog "Démarrage du tunnel SSH : ssh -N -D $LocalPort $HostAlias" Start-Process $SshExe -ArgumentList "-N -D $LocalPort $HostAlias" -WindowStyle Hidden for ($attempt = 0; $attempt -lt 10; $attempt++) { if (Get-NetTCPConnection -LocalPort $LocalPort -State Listen -ErrorAction SilentlyContinue) { - Write-DebugLog "Le tunnel SSH écoute sur le port $LocalPort" + Write-DebugLog "Le tunnel SSH écoute sur le port $LocalPort" return $true } Start-Sleep 1 @@ -112,7 +95,7 @@ function Start-SshTunnel { function Stop-SshTunnelByPort { param ([int]$LocalPort) - Write-DebugLog "Arrêt du tunnel SSH sur le port $LocalPort" + Write-DebugLog "Arrêt du tunnel SSH sur le port $LocalPort" $sshProcessIds = Get-NetTCPConnection -LocalPort $LocalPort -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess -Unique @@ -121,7 +104,7 @@ function Stop-SshTunnelByPort { try { $proc = Get-Process -Id $sshPid -ErrorAction Stop if ($proc.ProcessName -eq "ssh") { - Write-DebugLog "Arrêt du processus SSH PID $sshPid" + Write-DebugLog "Arrêt du processus SSH PID $sshPid" Stop-Process -Id $sshPid -ErrorAction SilentlyContinue } } catch {} @@ -206,7 +189,7 @@ user_pref("startup.homepage_welcome_url.additional", ""); "@ Set-Content -Path (Join-Path $tempProfile "user.js") -Value $userJs -Encoding ASCII - Write-DebugLog "Profil temporaire créé : $tempProfile" + Write-DebugLog "Profil temporaire créé : $tempProfile" return $tempProfile } @@ -231,12 +214,12 @@ function Launch-BrowserAndWaitForInstance { $newProcessIds = $currentProcessIds | Where-Object { $_ -notin $existingProcessIds } if ($newProcessIds) { $tempBrowserProcessId = $newProcessIds | Select-Object -First 1 - Write-DebugLog "Instance temporaire détectée (PID $tempBrowserProcessId)" + Write-DebugLog "Instance temporaire détectée (PID $tempBrowserProcessId)" return $tempBrowserProcessId } } - throw "Impossible de détecter l'instance temporaire du navigateur" + throw "Impossible de détecter l'instance temporaire du navigateur" } function Wait-ForProcessExit { @@ -266,7 +249,7 @@ function Remove-TemporaryProfile { # Orchestrateur principal # ========================= try { - # Ajouter une ligne de séparation dans le log à chaque exécution + # Ajouter une ligne de séparation dans le log à chaque exécution if ($script:DebugEnabled) { $separator = "=" * 60 $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" @@ -278,11 +261,11 @@ try { $ownerPid = (Get-NetTCPConnection -LocalPort $config.LocalPort -State Listen).OwningProcess $ownerProc = Get-Process -Id $ownerPid -ErrorAction SilentlyContinue $procName = if ($ownerProc) { "$($ownerProc.Name) (PID $ownerPid)" } else { "PID $ownerPid" } - throw "Le port $($config.LocalPort) est déjà utilisé par $procName" + throw "Le port $($config.LocalPort) est déjà utilisé par $procName" } if (-not (Start-SshTunnel -SshExe $config.SshExe -LocalPort $config.LocalPort -HostAlias $config.HostAlias -AskPassExe $config.AskPassExe)) { - throw "Échec de l'établissement du tunnel SSH" + throw "Échec de l'établissement du tunnel SSH" } Write-Output "Tunnel SSH actif sur 127.0.0.1:$($config.LocalPort)" @@ -290,15 +273,15 @@ try { $tempProfile = Create-TemporaryBrowserProfile -LocalPort $config.LocalPort $browserProcessId = Launch-BrowserAndWaitForInstance -BrowserExe $config.BrowserExe -BrowserProcessName $config.BrowserProcessName -ProfilePath $tempProfile - Write-Output "Instance temporaire du navigateur détectée (PID $browserProcessId)" + Write-Output "Instance temporaire du navigateur détectée (PID $browserProcessId)" Wait-ForProcessExit -ProcessId $browserProcessId - Write-Output "Navigateur temporaire fermé" + Write-Output "Navigateur temporaire fermé" Remove-TemporaryProfile -ProfilePath $tempProfile Stop-SshTunnelByPort -LocalPort $config.LocalPort - Write-Output "Tunnel SSH arrêté proprement" + Write-Output "Tunnel SSH arrêté proprement" } catch { $errorMessage = "ERREUR: $($_.Exception.Message)"