# ============================================================ # Omika - Test de disponibilite d'un port TCP loopback # ============================================================ # Repond a UNE question : « puis-je utiliser ce port, oui ou non ? » # # A executer SUR LE SERVEUR (SRV-OMIKA), en PowerShell ADMINISTRATEUR : # sans elevation, la verification des plages reservees par Windows # (Hyper-V / WSL / Docker) ne peut pas etre faite et le resultat est INCOMPLET. # # Ce script NE MODIFIE RIEN : il lit, puis reserve brievement le port sur # 127.0.0.1 pour le relacher aussitot. # # Quatre causes de refus sont detectees : # 1. un processus ecoute deja sur ce port ; # 2. le port est dans une plage RESERVEE par Windows ; # 3. le port est dans la plage EPHEMERE (une connexion sortante peut le prendre) ; # 4. la reservation reelle sur 127.0.0.1 echoue. # # Le port n'est PAS choisi ici : il se decide contre le plan de ports Apache # (voir docs\DEPLOIEMENT_API_LANGUES.md §6bis). # # EXEMPLES : # .\Test-PortDisponible.ps1 -Port 5099 # .\Test-PortDisponible.ps1 -Port 5099 -EssayerSuivants 5 # # Codes de sortie : 0 = un port disponible trouve, 1 = aucun. # ============================================================ [CmdletBinding()] param( [Parameter(Mandatory = $true)] [ValidateRange(1, 65535)] [int]$Port, # Nombre de ports consecutifs a tester en plus (ballotage). [ValidateRange(0, 50)] [int]$EssayerSuivants = 0 ) $ErrorActionPreference = 'Stop' # La logique de test vit dans le module commun : une seule implementation, # partagee avec Install-OmikaLanguesApi.ps1 (-Port). $moduleCommun = Join-Path $PSScriptRoot 'Omika.Deploy.Common.psm1' if (-not (Test-Path -LiteralPath $moduleCommun)) { Write-Host "ERREUR : module introuvable : $moduleCommun" -ForegroundColor Red Write-Host "Copiez Omika.Deploy.Common.psm1 dans le meme dossier que ce script." -ForegroundColor Red exit 1 } Import-Module $moduleCommun -Force function Test-EstAdministrateur { try { $identite = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object Security.Principal.WindowsPrincipal($identite) return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } catch { return $false } } # --- En-tete ----------------------------------------------------------------- Write-Host '' Write-Host '=== Test de disponibilite d''un port TCP ===' -ForegroundColor Cyan Write-Host "Machine : $env:COMPUTERNAME" Write-Host "Utilisateur : $env:USERNAME" $estAdmin = Test-EstAdministrateur if ($estAdmin) { Write-Host 'Mode : ADMINISTRATEUR (test complet)' -ForegroundColor Green } else { Write-Host 'Mode : NON administrateur' -ForegroundColor Yellow Write-Host ' -> les plages reservees par Windows ne sont PAS verifiables.' -ForegroundColor Yellow Write-Host ' -> relancez ce script en tant qu''administrateur.' -ForegroundColor Yellow } Write-Host ("Plage ephemere Windows : a partir de {0}" -f (Get-OmikaDebutPlageEphemere)) if ($estAdmin) { $plages = @(Get-OmikaPlagesReservees) Write-Host ("Plages reservees : {0} plage(s)" -f $plages.Count) foreach ($plage in $plages) { Write-Host (" {0} - {1}" -f $plage.Debut, $plage.Fin) } } else { Write-Host 'Plages reservees : NON VERIFIE (droits insuffisants)' } # --- Tests ------------------------------------------------------------------- Write-Host '' $resultats = @() for ($i = 0; $i -le $EssayerSuivants; $i++) { $resultats += Test-OmikaPortLibre -Port ($Port + $i) -VerifierPlagesReservees:$estAdmin } foreach ($resultat in $resultats) { if ($resultat.Libre) { Write-Host (" {0} DISPONIBLE" -f $resultat.Port) -ForegroundColor Green } else { Write-Host (" {0} INDISPONIBLE -> {1}" -f $resultat.Port, $resultat.Raisons) -ForegroundColor Red } } $premier = $resultats | Where-Object { $_.Libre } | Select-Object -First 1 # --- Verdict ----------------------------------------------------------------- Write-Host '' if ($premier) { Write-Host ("RESULTAT : le port {0} est DISPONIBLE sur ce serveur." -f $premier.Port) -ForegroundColor Green Write-Host '' Write-Host 'A poser ensuite en variable MACHINE (variables du service) :' -ForegroundColor Cyan Write-Host '' Write-Host (" [Environment]::SetEnvironmentVariable('ASPNETCORE_URLS', 'http://127.0.0.1:{0}', 'Machine')" -f $premier.Port) Write-Host '' Write-Host 'Puis, dans le vhost Apache, faire pointer le ProxyPass vers CE MEME port.' Write-Host 'Un ecart entre les deux envoie les requetes vers un autre service, en silence.' Write-Host '' } else { Write-Host 'RESULTAT : aucun port disponible dans la plage testee.' -ForegroundColor Red Write-Host 'Relancez avec davantage de candidats, par exemple :' -ForegroundColor Yellow Write-Host (" .\Test-PortDisponible.ps1 -Port {0} -EssayerSuivants 10" -f ($Port + $EssayerSuivants + 1)) Write-Host '' } if (-not $estAdmin) { Write-Host 'RAPPEL : sans droits administrateur, ce resultat est INCOMPLET.' -ForegroundColor Yellow Write-Host 'Un port peut etre dans une plage reservee et echouer au demarrage de Kestrel.' -ForegroundColor Yellow Write-Host '' } if ($premier) { exit 0 } else { exit 1 }