137 lines
5.3 KiB
PowerShell
137 lines
5.3 KiB
PowerShell
# ============================================================
|
|
# 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 }
|