Update cybersecurity/Network Reputation Service/script-nrs.ps1
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# Script d'Audit Firewall - Network Reputation Service
|
# Script d'Audit Firewall - Network Reputation Service
|
||||||
# Auteur: Hubert Cornet
|
# Auteur: Hubert Cornet
|
||||||
# Date: 03/09/2025
|
# Date: 03/09/2025
|
||||||
# Version: 1.1
|
# Version: 1.2
|
||||||
|
|
||||||
Clear-Host
|
Clear-Host
|
||||||
|
|
||||||
@@ -27,14 +27,14 @@ $GradeColors = @{
|
|||||||
|
|
||||||
### Functions ###
|
### Functions ###
|
||||||
|
|
||||||
## Function Write-ColorOutput
|
## Function Write-ColorOutput : pour afficher du texte en couleur
|
||||||
Function Write-ColorOutput {
|
Function Write-ColorOutput {
|
||||||
Param(
|
Param(
|
||||||
[string]$Text,
|
[string]$Text,
|
||||||
[string]$Color = "White"
|
[string]$Color = "White"
|
||||||
)
|
)
|
||||||
|
|
||||||
Try {
|
Try{
|
||||||
Write-Host $Text -ForegroundColor $Color
|
Write-Host $Text -ForegroundColor $Color
|
||||||
}
|
}
|
||||||
Catch {
|
Catch {
|
||||||
@@ -42,9 +42,9 @@ Function Write-ColorOutput {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
## Function Prerequisites
|
## Function Prerequisites : vérifie les prérequis
|
||||||
Function Prerequisites {
|
Function Prerequisites {
|
||||||
Write-ColorOutput "`n=== Vérification des prérequis ===" "Cyan"
|
Write-ColorOutput "`n === Vérification des prérequis ===" "Cyan"
|
||||||
|
|
||||||
# Vérification du fichier JSON
|
# Vérification du fichier JSON
|
||||||
$JsonFile = Join-Path $PSScriptRoot "file-nrs.json"
|
$JsonFile = Join-Path $PSScriptRoot "file-nrs.json"
|
||||||
@@ -52,7 +52,7 @@ Function Prerequisites {
|
|||||||
If(-not (Test-Path $JsonFile)) {
|
If(-not (Test-Path $JsonFile)) {
|
||||||
Write-ColorOutput "ERREUR: Le fichier 'file-nrs.json' n'existe pas!" "Red"
|
Write-ColorOutput "ERREUR: Le fichier 'file-nrs.json' n'existe pas!" "Red"
|
||||||
Write-ColorOutput "Veuillez télécharger ou créer le fichier depuis:" "Yellow"
|
Write-ColorOutput "Veuillez télécharger ou créer le fichier depuis:" "Yellow"
|
||||||
Write-ColorOutput "https://github.com/your-repo/file-nrs.json" "Blue"
|
Write-ColorOutput "https://gitea.tips-of-mine.com/Tips-Of-Mine/Powershell/src/branch/main/cybersecurity/Network%20Reputation%20Service/file-nrs.json" "Blue"
|
||||||
Write-ColorOutput "Le fichier doit être placé dans le même dossier que ce script." "Yellow"
|
Write-ColorOutput "Le fichier doit être placé dans le même dossier que ce script." "Yellow"
|
||||||
|
|
||||||
Return $false
|
Return $false
|
||||||
@@ -63,11 +63,11 @@ Function Prerequisites {
|
|||||||
# Vérification/Installation des modules requis
|
# Vérification/Installation des modules requis
|
||||||
$RequiredModules = @('PSWriteHTML', 'PSWriteColor')
|
$RequiredModules = @('PSWriteHTML', 'PSWriteColor')
|
||||||
|
|
||||||
Foreach ($Module in $RequiredModules) {
|
Foreach($Module in $RequiredModules) {
|
||||||
If(-not (Get-Module -ListAvailable -Name $Module)) {
|
If(-not (Get-Module -ListAvailable -Name $Module)) {
|
||||||
Write-ColorOutput "Installation du module $Module..." "Yellow"
|
Write-ColorOutput "Installation du module $Module..." "Yellow"
|
||||||
|
|
||||||
Try {
|
Try{
|
||||||
Install-Module -Name $Module -Force -Scope CurrentUser -AllowClobber
|
Install-Module -Name $Module -Force -Scope CurrentUser -AllowClobber
|
||||||
|
|
||||||
Write-ColorOutput "✓ Module $Module installé" "Green"
|
Write-ColorOutput "✓ Module $Module installé" "Green"
|
||||||
@@ -85,10 +85,10 @@ Function Prerequisites {
|
|||||||
Import-Module $Module -Force
|
Import-Module $Module -Force
|
||||||
}
|
}
|
||||||
|
|
||||||
return $true
|
Return $True
|
||||||
}
|
}
|
||||||
|
|
||||||
## Function Check-Categories
|
## Function Check-Categories : pour tester les catégories et URLs
|
||||||
Function Check-Categories {
|
Function Check-Categories {
|
||||||
Param(
|
Param(
|
||||||
[array]$Categories,
|
[array]$Categories,
|
||||||
@@ -102,21 +102,21 @@ Function Check-Categories {
|
|||||||
|
|
||||||
$BlockKeywors = @("site bloqué", "access denied", "filtrage web", "Access Denied", "Site Blocked") # Définir les mots-clés des page des blocage
|
$BlockKeywors = @("site bloqué", "access denied", "filtrage web", "Access Denied", "Site Blocked") # Définir les mots-clés des page des blocage
|
||||||
|
|
||||||
Foreach ($Category in $Categories.Categorie) {
|
Foreach($Category in $Categories.Categorie) {
|
||||||
$CategoryCount++
|
$CategoryCount++
|
||||||
|
|
||||||
Show-ProgressBar -Current $CategoryCount -Total $Categories.Categorie.Count -Activity "Test des catégories" -Status "Catégorie: $($category.Categorie.nom)"
|
Show-ProgressBar -Id 1 -Current $CategoryCount -Total $Categories.Categorie.Count -Activity "Test des catégories" -Status "Catégorie: $($category.Categorie.nom)"
|
||||||
|
|
||||||
Write-ColorOutput "`n=== Test de la catégorie: $($Category.nom) ===" "Cyan"
|
Write-ColorOutput "`n === Test de la catégorie: $($Category.nom) ===" "Cyan"
|
||||||
#Write-ColorOutput "Description: $($category.description)" "Gray"
|
#Write-ColorOutput "`nDescription: $($Category.description)" "Gray"
|
||||||
|
|
||||||
$CategoryResults = @()
|
$CategoryResults = @()
|
||||||
$UrlCount = 0
|
$UrlCount = 0
|
||||||
|
|
||||||
Foreach ($UrlObj in $Category.urls) {
|
Foreach($UrlObj in $Category.urls) {
|
||||||
$UrlCount++
|
$UrlCount++
|
||||||
|
|
||||||
Show-ProgressBar -Current $UrlCount -Total $Category.urls.Count -Activity "Test des URLs de '$($Category.nom)'" -Status $UrlObj.url
|
Show-ProgressBar -Id 2 -Current $UrlCount -Total $Category.urls.Count -Activity "Test des URLs de '$($Category.nom)'" -Status $UrlObj.url
|
||||||
|
|
||||||
Write-ColorOutput "Test de: $($UrlObj.url)" "Yellow"
|
Write-ColorOutput "Test de: $($UrlObj.url)" "Yellow"
|
||||||
|
|
||||||
@@ -138,40 +138,41 @@ Function Check-Categories {
|
|||||||
IsCorrect = (($TestResult.Status -eq "Bloqué" -and $UrlObj.expected_action -eq "block") -or ($TestResult.Status -eq "Autorisé" -and $UrlObj.expected_action -eq "allow"))
|
IsCorrect = (($TestResult.Status -eq "Bloqué" -and $UrlObj.expected_action -eq "block") -or ($TestResult.Status -eq "Autorisé" -and $UrlObj.expected_action -eq "allow"))
|
||||||
}
|
}
|
||||||
|
|
||||||
$StatusColor = If($testResult.IsCorrect) { "Green" } Else { "Red" }
|
$StatusColor = If($TestResult.IsCorrect) { "Green" } Else { "Red" }
|
||||||
Write-ColorOutput " → Résultat: $($TestResult.Status) | Attendu: $($TestResult.ExpectedAction) | Correct: $($TestResult.IsCorrect)" $statusColor
|
Write-ColorOutput " → Résultat: $($TestResult.Status) | Attendu: $($TestResult.ExpectedAction) | Correct: $($TestResult.IsCorrect)" $statusColor
|
||||||
|
|
||||||
$categoryResults += $testResult
|
$CategoryResults += $TestResult
|
||||||
$allResults += $testResult
|
$AllResults += $TestResult
|
||||||
}
|
}
|
||||||
|
|
||||||
$CategoryScore = Calculate-CategoryScore -Results $categoryResults
|
$CategoryScore = Calculate-CategoryScore -Results $CategoryResults
|
||||||
$CategoryGrade = Convert-ScoreToGrade -Score $categoryScore
|
$CategoryGrade = Convert-ScoreToGrade -Score $CategoryScore
|
||||||
|
|
||||||
Write-ColorOutput "Score de la catégorie '$($Category.nom)': $categoryScore% (Note: $CategoryGrade)" "Magenta"
|
Write-ColorOutput "Score de la catégorie '$($Category.nom)': $CategoryScore% (Note: $CategoryGrade)" "Magenta"
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Progress -Activity "Test des catégories" -Completed
|
Write-Progress -Id 1 -Activity "Test des catégories" -Completed
|
||||||
Write-Progress -Activity "Test des URLs" -Completed
|
Write-Progress -Id 2 -Activity "Test des URLs" -Completed
|
||||||
|
|
||||||
return $allResults
|
return $AllResults
|
||||||
}
|
}
|
||||||
|
|
||||||
## Function Show-ProgressBar
|
## Function Show-ProgressBar : affiche une barre de progression
|
||||||
Function Show-ProgressBar {
|
Function Show-ProgressBar {
|
||||||
Param(
|
Param(
|
||||||
[int]$Current,
|
[int]$Current,
|
||||||
[int]$Total,
|
[int]$Total,
|
||||||
|
[int]$Id,
|
||||||
[string]$Activity,
|
[string]$Activity,
|
||||||
[string]$Status = ""
|
[string]$Status = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
$Percent = [math]::Round(($Current / $Total) * 100, 1)
|
$Percent = [math]::Round(($Current / $Total) * 100, 1)
|
||||||
|
|
||||||
Write-Progress -Activity $Activity -Status "$Status ($Current/$Total)" -PercentComplete $Percent
|
Write-Progress -Id $Id -Activity $Activity -Status "$Status ($Current/$Total)" -PercentComplete $Percent
|
||||||
}
|
}
|
||||||
|
|
||||||
## FunctionCalculate-CategoryScore
|
## FunctionCalculate-CategoryScore : calcule le score d'une catégorie
|
||||||
Function Calculate-CategoryScore {
|
Function Calculate-CategoryScore {
|
||||||
Param(
|
Param(
|
||||||
[array]$Results
|
[array]$Results
|
||||||
@@ -180,7 +181,7 @@ Function Calculate-CategoryScore {
|
|||||||
$TotalUrls = $Results.Count
|
$TotalUrls = $Results.Count
|
||||||
$CorrectResults = 0
|
$CorrectResults = 0
|
||||||
|
|
||||||
Foreach ($Result in $Results) {
|
Foreach($Result in $Results) {
|
||||||
$IsBlocked = $Result.Status -eq "Bloqué"
|
$IsBlocked = $Result.Status -eq "Bloqué"
|
||||||
$ShouldBeBlocked = $result.ExpectedAction -eq "block"
|
$ShouldBeBlocked = $result.ExpectedAction -eq "block"
|
||||||
|
|
||||||
@@ -196,7 +197,7 @@ Function Calculate-CategoryScore {
|
|||||||
Return [math]::Round(($CorrectResults / $TotalUrls) * 100, 2)
|
Return [math]::Round(($CorrectResults / $TotalUrls) * 100, 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
## Function Convert-ScoreToGrade
|
## Function Convert-ScoreToGrade : convertit un score en une note
|
||||||
Function Convert-ScoreToGrade {
|
Function Convert-ScoreToGrade {
|
||||||
Param([double]$Score)
|
Param([double]$Score)
|
||||||
|
|
||||||
@@ -216,7 +217,7 @@ Function Convert-ScoreToGrade {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
## Function Get-UrlStatus
|
## Function Get-UrlStatus : teste une URL et détermine si elle est bloquée ou autorisée
|
||||||
Function Get-UrlStatus {
|
Function Get-UrlStatus {
|
||||||
Param(
|
Param(
|
||||||
[string]$Url,
|
[string]$Url,
|
||||||
@@ -249,10 +250,10 @@ Function Get-UrlStatus {
|
|||||||
$Response = $Null
|
$Response = $Null
|
||||||
|
|
||||||
# Ajout des paramètres du proxy s'ils sont fournis
|
# Ajout des paramètres du proxy s'ils sont fournis
|
||||||
If (-not [string]::IsNullOrEmpty($ProxyAddress)) {
|
If(-not [string]::IsNullOrEmpty($ProxyAddress)) {
|
||||||
$IWRParams.Add('Proxy', $ProxyAddress)
|
$IWRParams.Add('Proxy', $ProxyAddress)
|
||||||
|
|
||||||
If ($ProxyUseAuthentication) {
|
If($ProxyUseAuthentication) {
|
||||||
# Demande les identifiants de manière sécurisée et les ajoute à la commande
|
# Demande les identifiants de manière sécurisée et les ajoute à la commande
|
||||||
$Creds = Get-Credential -Message "Veuillez saisir les identifiants pour le proxy $ProxyAddress"
|
$Creds = Get-Credential -Message "Veuillez saisir les identifiants pour le proxy $ProxyAddress"
|
||||||
$IWRParams.Add('ProxyCredential', $Creds)
|
$IWRParams.Add('ProxyCredential', $Creds)
|
||||||
@@ -260,48 +261,41 @@ Function Get-UrlStatus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# -- Exécution du test --
|
# -- Exécution du test --
|
||||||
Try {
|
Try{
|
||||||
# Exécution de la requête en utilisant les paramètres définis dans la hashtable
|
# Exécution de la requête en utilisant les paramètres définis dans la hashtable
|
||||||
$Response = Invoke-WebRequest @IWRParams
|
$Response = Invoke-WebRequest @IWRParams
|
||||||
|
|
||||||
# On vérifie si la réponse contient des mots-clés de la page de blocage
|
# On vérifie si la réponse contient des mots-clés de la page de blocage
|
||||||
$KeywordFound = $False
|
$KeywordFound = $False
|
||||||
|
|
||||||
Foreach ($Keyword in $BlockPageKeywords) {
|
Foreach($Keyword in $BlockPageKeywords) {
|
||||||
If ($Response.Content -match $Keyword) {
|
If($Response.Content -match $Keyword) {
|
||||||
$KeywordFound = $True
|
$KeywordFound = $True
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
If ($KeywordFound) {
|
If($KeywordFound) {
|
||||||
$Result.ActualResult = "Bloqué"
|
$Result.ActualResult = "Bloqué"
|
||||||
# $Result.Score = 1
|
|
||||||
$Result.Details = "Page de blocage détectée."
|
$Result.Details = "Page de blocage détectée."
|
||||||
$Result.StatusCode = $Response.StatusCode
|
$Result.StatusCode = $Response.StatusCode
|
||||||
}
|
}
|
||||||
Else {
|
Else {
|
||||||
$Result.ActualResult = "Autorisé"
|
$Result.ActualResult = "Autorisé"
|
||||||
# $Result.Score = 0
|
|
||||||
$Result.Details = "Le site a été atteint sans blocage."
|
$Result.Details = "Le site a été atteint sans blocage."
|
||||||
$Result.StatusCode = $Response.StatusCode
|
$Result.StatusCode = $Response.StatusCode
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Catch [System.Net.WebException] {
|
Catch [System.Net.WebException] {
|
||||||
If ($_.Exception.Status -eq 'Timeout') {
|
If($_.Exception.Status -eq 'Timeout') {
|
||||||
$Result.ActualResult = "Bloqué (Timeout)"
|
$Result.ActualResult = "Bloqué (Timeout)"
|
||||||
# $Result.Score = 1
|
|
||||||
$Result.Details = "La requête a expiré, indiquant un blocage probable par le pare-feu ou le proxy."
|
$Result.Details = "La requête a expiré, indiquant un blocage probable par le pare-feu ou le proxy."
|
||||||
$Result.StatusCode = $Response.StatusCode
|
$Result.StatusCode = $Response.StatusCode
|
||||||
$Result.ResponseTime = "$Timeout"
|
$Result.ResponseTime = "$Timeout"
|
||||||
}
|
}
|
||||||
# Elseif ($_.Exception.Response) {
|
|
||||||
# $Result.Status = "Bloqué (Erreur HTTP)"
|
|
||||||
# $Result.Score = 1
|
|
||||||
# $Result.Details = "Réponse HTTP non-200 reçue : $($_.Exception.Response.StatusCode)"
|
|
||||||
# }
|
|
||||||
Else {
|
Else {
|
||||||
# On considère les autres erreurs réseau comme un blocage aussi
|
# On considère les autres erreurs réseau comme un blocage aussi
|
||||||
$Result.ActualResult = "Erreur de Connexion"
|
$Result.ActualResult = "Erreur de Connexion"
|
||||||
@@ -313,15 +307,12 @@ Function Get-UrlStatus {
|
|||||||
$Result.ActualResult = "Erreur Script"
|
$Result.ActualResult = "Erreur Script"
|
||||||
$Result.Details = "Erreur inattendue: $($_.Exception.Message)"
|
$Result.Details = "Erreur inattendue: $($_.Exception.Message)"
|
||||||
|
|
||||||
#$Result.StatusCode = 0 <= A trouver
|
|
||||||
#$Result.ResponseTime = 0 <= A trouver
|
|
||||||
|
|
||||||
# Un test en erreur ne doit pas donner de point
|
# Un test en erreur ne doit pas donner de point
|
||||||
return $result
|
return $result
|
||||||
}
|
}
|
||||||
|
|
||||||
# Le test est réussi si l'action attendue correspond au résultat réel.
|
# Le test est réussi si l'action attendue correspond au résultat réel.
|
||||||
If (($Result.Expected -eq 'block' -and $Result.ActualResult -eq 'Bloqué') -or ($Result.Expected -eq 'allow' -and $Result.ActualResult -eq 'Autorisé')) {
|
If(($Result.Expected -eq 'block' -and $Result.ActualResult -eq 'Bloqué') -or ($Result.Expected -eq 'allow' -and $Result.ActualResult -eq 'Autorisé')) {
|
||||||
$Result.TestStatus = "Conforme"
|
$Result.TestStatus = "Conforme"
|
||||||
$Result.Score = 1 # Le test est un succès !
|
$Result.Score = 1 # Le test est un succès !
|
||||||
$Result.Details += " (Résultat conforme à l'attendu)"
|
$Result.Details += " (Résultat conforme à l'attendu)"
|
||||||
@@ -335,7 +326,7 @@ Function Get-UrlStatus {
|
|||||||
Return $Result
|
Return $Result
|
||||||
}
|
}
|
||||||
|
|
||||||
## Function Generate-HtmlReport
|
## Function Generate-HtmlReport : génère le rapport HTML
|
||||||
Function Generate-HtmlReport {
|
Function Generate-HtmlReport {
|
||||||
Param(
|
Param(
|
||||||
[array]$Results,
|
[array]$Results,
|
||||||
@@ -348,7 +339,7 @@ Function Generate-HtmlReport {
|
|||||||
$Categories = $Results | Group-Object Category
|
$Categories = $Results | Group-Object Category
|
||||||
$CategoryScores = @()
|
$CategoryScores = @()
|
||||||
|
|
||||||
Foreach ($Cat in $Categories) {
|
Foreach($Cat in $Categories) {
|
||||||
$Score = Calculate-CategoryScore -Results $Cat.Group
|
$Score = Calculate-CategoryScore -Results $Cat.Group
|
||||||
$Grade = Convert-ScoreToGrade -Score $Score
|
$Grade = Convert-ScoreToGrade -Score $Score
|
||||||
|
|
||||||
@@ -366,7 +357,7 @@ Function Generate-HtmlReport {
|
|||||||
# Score global
|
# Score global
|
||||||
$GlobalScore = Calculate-CategoryScore -Results $Results
|
$GlobalScore = Calculate-CategoryScore -Results $Results
|
||||||
$GlobalGrade = Convert-ScoreToGrade -Score $GlobalScore
|
$GlobalGrade = Convert-ScoreToGrade -Score $GlobalScore
|
||||||
$GlobalColor = $GradeColors[$globalGrade]
|
$GlobalColor = $GradeColors[$GlobalGrade]
|
||||||
|
|
||||||
# Génération du HTML
|
# Génération du HTML
|
||||||
$HtmlContent = @"
|
$HtmlContent = @"
|
||||||
@@ -478,8 +469,8 @@ Function Generate-HtmlReport {
|
|||||||
"@
|
"@
|
||||||
|
|
||||||
# Ajout des lignes du tableau
|
# Ajout des lignes du tableau
|
||||||
Foreach ($CatScore in $CategoryScores) {
|
Foreach($CatScore in $CategoryScores) {
|
||||||
$htmlContent += @"
|
$HtmlContent += @"
|
||||||
<tr>
|
<tr>
|
||||||
<td><strong>$($catScore.Category)</strong></td>
|
<td><strong>$($catScore.Category)</strong></td>
|
||||||
<td>$($catScore.Score)%</td>
|
<td>$($catScore.Score)%</td>
|
||||||
@@ -502,17 +493,17 @@ Function Generate-HtmlReport {
|
|||||||
"@
|
"@
|
||||||
|
|
||||||
# Ajout des catégories
|
# Ajout des catégories
|
||||||
$categoryIndex = 0
|
$CategoryIndex = 0
|
||||||
|
|
||||||
Foreach ($CatScore in $CategoryScores) {
|
Foreach($CatScore in $CategoryScores) {
|
||||||
$CategoryIndex++
|
$CategoryIndex++
|
||||||
$HtmlContent += @"
|
$HtmlContent += @"
|
||||||
<div class="category-item">
|
<div class="category-item">
|
||||||
<div class="category-header" onclick="toggleCategory('cat-$categoryIndex')">
|
<div class="category-header" onclick="toggleCategory('cat-$CategoryIndex')">
|
||||||
<div class="category-title">$($catScore.Category) <span class="toggle-btn" id="btn-cat-$categoryIndex">▼</span></div>
|
<div class="category-title">$($CatScore.Category) <span class="toggle-btn" id="btn-cat-$CategoryIndex">▼</span></div>
|
||||||
<span class="category-score" style="background-color: $($catScore.Color);">$($catScore.Grade) - $($catScore.Score)%</span>
|
<span class="category-score" style="background-color: $($CatScore.Color);">$($CatScore.Grade) - $($CatScore.Score)%</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="category-content" id="cat-$categoryIndex">
|
<div class="category-content" id="cat-$CategoryIndex">
|
||||||
<table class="detail-table">
|
<table class="detail-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -527,22 +518,22 @@ Function Generate-HtmlReport {
|
|||||||
"@
|
"@
|
||||||
|
|
||||||
# Ajout des résultats de chaque URL
|
# Ajout des résultats de chaque URL
|
||||||
Foreach ($result in $catScore.Results) {
|
Foreach($Result in $CatScore.Results) {
|
||||||
$rowClass = if ($result.IsCorrect) { "correct" } else { "incorrect" }
|
$RowClass = if($Result.IsCorrect) { "correct" } else { "incorrect" }
|
||||||
$correctText = if ($result.IsCorrect) { "✅ Oui" } else { "❌ Non" }
|
$CorrectText = if($Result.IsCorrect) { "✅ Oui" } else { "❌ Non" }
|
||||||
|
|
||||||
$htmlContent += @"
|
$HtmlContent += @"
|
||||||
<tr class="$rowClass">
|
<tr class="$RowClass">
|
||||||
<td title="$($result.Url)">$($result.Url.Substring(0, [Math]::Min(30, $result.Url.Length)))$(if($result.Url.Length -gt 30){"..."})</td>
|
<td title="$($Result.Url)">$($result.Url.Substring(0, [Math]::Min(30, $Result.Url.Length)))$(if($Result.Url.Length -gt 30){"..."})</td>
|
||||||
<td>$($result.Reputation)</td>
|
<td>$($Result.Reputation)</td>
|
||||||
<td>$($result.ExpectedAction)</td>
|
<td>$($Result.ExpectedAction)</td>
|
||||||
<td>$($result.Status)</td>
|
<td>$($Result.Status)</td>
|
||||||
<td>$correctText</td>
|
<td>$CorrectText</td>
|
||||||
</tr>
|
</tr>
|
||||||
"@
|
"@
|
||||||
}
|
}
|
||||||
|
|
||||||
$htmlContent += @"
|
$HtmlContent += @"
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@@ -550,7 +541,7 @@ Function Generate-HtmlReport {
|
|||||||
"@
|
"@
|
||||||
}
|
}
|
||||||
|
|
||||||
$htmlContent += @"
|
$HtmlContent += @"
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -576,19 +567,19 @@ Function Generate-HtmlReport {
|
|||||||
@{Grade='F'; Score='0-45%'; Interpretation='Très faible, action immédiate requise'; Color='#dc3545'}
|
@{Grade='F'; Score='0-45%'; Interpretation='Très faible, action immédiate requise'; Color='#dc3545'}
|
||||||
)
|
)
|
||||||
|
|
||||||
Foreach ($gradeInfo in $gradingScale) {
|
Foreach($GradeInfo in $GradingScale) {
|
||||||
$htmlContent += @"
|
$HtmlContent += @"
|
||||||
<div class="grade-item">
|
<div class="grade-item">
|
||||||
<div class="grade-badge" style="background-color: $($gradeInfo.Color);">$($gradeInfo.Grade)</div>
|
<div class="grade-badge" style="background-color: $($GradeInfo.Color);">$($GradeInfo.Grade)</div>
|
||||||
<div>
|
<div>
|
||||||
<strong>$($gradeInfo.Score)</strong><br>
|
<strong>$($GradeInfo.Score)</strong><br>
|
||||||
<span style="color: #666;">$($gradeInfo.Interpretation)</span>
|
<span style="color: #666;">$($GradeInfo.Interpretation)</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
"@
|
"@
|
||||||
}
|
}
|
||||||
|
|
||||||
$htmlContent += @"
|
$HtmlContent += @"
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -598,11 +589,12 @@ Function Generate-HtmlReport {
|
|||||||
const content = document.getElementById(categoryId);
|
const content = document.getElementById(categoryId);
|
||||||
const btn = document.getElementById('btn-' + categoryId);
|
const btn = document.getElementById('btn-' + categoryId);
|
||||||
|
|
||||||
if (content.classList.contains('active')) {
|
If(content.classList.contains('active')) {
|
||||||
content.classList.remove('active');
|
content.classList.remove('active');
|
||||||
btn.classList.remove('active');
|
btn.classList.remove('active');
|
||||||
content.style.display = 'none';
|
content.style.display = 'none';
|
||||||
} else {
|
}
|
||||||
|
Else {
|
||||||
content.classList.add('active');
|
content.classList.add('active');
|
||||||
btn.classList.add('active');
|
btn.classList.add('active');
|
||||||
content.style.display = 'block';
|
content.style.display = 'block';
|
||||||
@@ -625,8 +617,8 @@ Function Generate-HtmlReport {
|
|||||||
"@
|
"@
|
||||||
|
|
||||||
# Écriture du fichier HTML
|
# Écriture du fichier HTML
|
||||||
Try {
|
Try{
|
||||||
$htmlContent | Out-File -FilePath $OutputPath -Encoding UTF8
|
$HtmlContent | Out-File -FilePath $OutputPath -Encoding UTF8
|
||||||
Write-ColorOutput "✓ Rapport généré: $OutputPath" "Green"
|
Write-ColorOutput "✓ Rapport généré: $OutputPath" "Green"
|
||||||
}
|
}
|
||||||
Catch {
|
Catch {
|
||||||
@@ -634,7 +626,7 @@ Function Generate-HtmlReport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
## Function Main
|
## Function Main : fonction principale
|
||||||
Function Main {
|
Function Main {
|
||||||
Write-ColorOutput @"
|
Write-ColorOutput @"
|
||||||
╔══════════════════════════════════════════════════════════════════════════════╗
|
╔══════════════════════════════════════════════════════════════════════════════╗
|
||||||
@@ -651,7 +643,7 @@ Function Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Chargement du fichier JSON
|
# Chargement du fichier JSON
|
||||||
Try {
|
Try{
|
||||||
$JsonFile = Join-Path $PSScriptRoot "file-nrs.json"
|
$JsonFile = Join-Path $PSScriptRoot "file-nrs.json"
|
||||||
$Categories = Get-Content $JsonFile -Raw -Encoding UTF8 | ConvertFrom-Json
|
$Categories = Get-Content $JsonFile -Raw -Encoding UTF8 | ConvertFrom-Json
|
||||||
|
|
||||||
@@ -668,11 +660,11 @@ Function Main {
|
|||||||
$ReportsDir = Join-Path $PSScriptRoot "Rapports"
|
$ReportsDir = Join-Path $PSScriptRoot "Rapports"
|
||||||
$OutputDir = Join-Path $ReportsDir $ReportDate
|
$OutputDir = Join-Path $ReportsDir $ReportDate
|
||||||
|
|
||||||
If (-not (Test-Path $ReportsDir)) {
|
If(-not (Test-Path $ReportsDir)) {
|
||||||
New-Item -ItemType Directory -Path $ReportsDir -Force | Out-Null
|
New-Item -ItemType Directory -Path $ReportsDir -Force | Out-Null
|
||||||
}
|
}
|
||||||
|
|
||||||
If (-not (Test-Path $OutputDir)) {
|
If(-not (Test-Path $OutputDir)) {
|
||||||
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
|
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -710,9 +702,9 @@ Function Main {
|
|||||||
Write-ColorOutput "`n Rapport disponible à: $ReportPath" "Cyan"
|
Write-ColorOutput "`n Rapport disponible à: $ReportPath" "Cyan"
|
||||||
|
|
||||||
# Ouverture automatique du rapport
|
# Ouverture automatique du rapport
|
||||||
If (Get-Command "Start-Process" -ErrorAction SilentlyContinue) {
|
If(Get-Command "Start-Process" -ErrorAction SilentlyContinue) {
|
||||||
$OpenReport = Read-Host "`n Voulez-vous ouvrir le rapport maintenant? (O/N)"
|
$OpenReport = Read-Host "`n Voulez-vous ouvrir le rapport maintenant? (O/N)"
|
||||||
If ($OpenReport -eq "O" -or $OpenReport -eq "o" -or $OpenReport -eq "Y" -or $OpenReport -eq "y") {
|
If($OpenReport -eq "O" -or $OpenReport -eq "o" -or $OpenReport -eq "Y" -or $OpenReport -eq "y") {
|
||||||
Start-Process $ReportPath
|
Start-Process $ReportPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -723,7 +715,7 @@ Function Main {
|
|||||||
Clear-Host
|
Clear-Host
|
||||||
|
|
||||||
# Exécution du script principal
|
# Exécution du script principal
|
||||||
Try {
|
Try{
|
||||||
Main
|
Main
|
||||||
}
|
}
|
||||||
Catch {
|
Catch {
|
||||||
|
Reference in New Issue
Block a user