Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки...

Инструменты пользователя

Инструменты сайта


squid:powershell-script-for-creating-html-report-using-web-api-data-from-squidarm

Вариант PowerShell скрипта для создания HTML отчёта по данным Web API SquidARM

Здесь рассмотрен пример PowerShell скрипта, использующего функционал Web API в составе SquidARM для построения отчёта об использовании Интернет-ресурсов пользователями прокси сервера Squid.

Данный вариант скрипта является черновым и может быть изменён со временем.

$startDate = "01.03.2024" 
$endDate   = "15.03.2024"
$URLUsers   = @("icanfly01")
#
$URLBase = "https://squidarm.holding.com/api/user/"
[int]$LimitLines = 100
$htmlLogo = $PSScriptRoot + "\MyCompany-Logo.png"
$htmlOutDir = "C:\Temp\"
[bool]$echoScript = $false
#
$printsDate = $([datetime]::parseexact($startDate,"dd.MM.yyyy",$null)).GetDateTimeFormats()[5]
$printeDate = $([datetime]::parseexact($endDate,"dd.MM.yyyy",$null)).GetDateTimeFormats()[5]
#
# Адаптация Logo для HTML-отчётов
#
$ImageBits =  [Convert]::ToBase64String((Get-Content $htmlLogo -Encoding Byte))
$ImageFile = Get-Item $htmlLogo
$ImageType = $ImageFile.Extension.Substring(1) #strip off the leading 
$ImageTag = "<Img src='data:image/$ImageType;base64,$($ImageBits)' Alt='$($ImageFile.Name)' style='float:left' width='40' height='23' hspace=10>"
#
# Функция получения из AD полного имени пользователя
#
Function GetADUserName() {
	Param ($useracc)
	Try {
		(Get-ADUser $useracc).Name
	} Catch {}
}
#
#
# Функция преобразования байт в читаемый вид
#
Function BytesToHRF() {
    Param ([int64]$size)
    If     ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)}
    ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)}
    ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)}
    ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)}
    ElseIf ($size -gt 0)   {[string]::Format("{0:0.00} B", $size)}
	Else { " - " } 
}
#
# Основной блок скрипта в цикле по каждому пользователю
#
ForEach ($URLUser in $URLUsers) {
#
$scriptStart = Get-Date
$UserName = GetADUserName $URLUser
$pintUser = If ($UserName){$UserName + " (" + $URLUser + ")"} Else { $URLUser }
#
# Получение данных через веб-API
#
$Result = @()
$sDate = [datetime]::parseexact($startDate, 'dd.MM.yyyy', $null).AddDays(-1)
$eDate = [datetime]::parseexact($endDate, 'dd.MM.yyyy', $null)
While ($sDate -lt $eDate) {
	$sDate = $sDate.AddDays(1)
	$URL = $URLBase + $URLUser + "/" + $sDate.ToString("yyyy") + "/" + $sDate.ToString("MM") +  "/" + $sDate.ToString("dd") + ".json"	
	Try{
		$JArrs = @()
		$JSON = Invoke-WebRequest $URL -UseDefaultCredentials | ConvertFrom-Json
	  	$JArrs = $JSON.data
		ForEach ($Arr in $JArrs) {
	   	#
	  	# Пример одного извлекаемого массива: {arc.msn.com, 0, 4638, 1, 0}
	  	#		
		$Item = New-Object System.Object
		$Item | Add-Member -MemberType NoteProperty -Name "Domain" -Value $Arr[0]
		$Item | Add-Member -MemberType NoteProperty -Name "BytesFromCache" -Value $Arr[1]
		$Item | Add-Member -MemberType NoteProperty -Name "BytesDownloaded" -Value $Arr[2]
		$Item | Add-Member -MemberType NoteProperty -Name "Requests" -Value $Arr[3]
		$Item | Add-Member -MemberType NoteProperty -Name "Refuses" -Value $Arr[4]
		$Result += $Item			
	  	}
	}
	Catch {}
 }
#
# Предварительная группировка результата в разрезе доменов
#
$gResult = @()
$gResult = $Result | Group-Object -Property Domain
$fResult = @()
$fResult += ForEach($gItem in $gResult){
    $gItem.Group | Select -Unique Domain,
	@{Name = 'gBytesFromCache';Expression = {(($gItem.Group) | Measure -Property BytesFromCache -sum).Sum}},
    @{Name = 'gBytesDownloaded';Expression = {(($gItem.Group) | Measure -Property BytesDownloaded -sum).Sum}},
	@{Name = 'gRequests';Expression = {(($gItem.Group) | Measure -Property Requests -sum).Sum}},
	@{Name = 'gRefuses';Expression = {(($gItem.Group) | Measure -Property Refuses -sum).Sum}}
}
#
# Подсчёт общих итоговых значений
#
$totalBytesFromCache = BytesToHRF $(($fResult | Measure-Object 'gBytesFromCache' -Sum).Sum)
$totalBytesDownloaded = BytesToHRF $(($fResult | Measure-Object 'gBytesDownloaded' -Sum).Sum)
#$totalRequests = ($fResult | Measure-Object 'gRequests' -Sum).Sum
#$totalRefuses = ($fResult | Measure-Object 'gRefuses' -Sum).Sum
#
# Вывод результата на консоль
#
If ($echoScript) {
Write-Host "Отчёт о посещаемости Интернет-ресурсов пользователя : $pintUser"
Write-Host "В отчёте выведены данные за период с $printsDate по $printeDate"
Write-Host "Сформировано $('{0:dd.MM.yyyy в HH:mm}' -f (get-date))"
$fResult | Sort-Object 'gBytesDownloaded' -Descending | Select-Object -First $LimitLines | Format-Table -Autosize `
	@{Name="Имя домена";Expression = { $_.Domain }; Alignment="Center"},
  	@{Name="Загружено из Интернет";Expression = { BytesToHRF $_.gBytesDownloaded };Alignment="Center"},
	@{Name="Загружено из кеша";Expression = { BytesToHRF $_.gBytesFromCache }; Alignment="Center"},
  	@{Name="Запросов";Expression = { $_.gRequests };Alignment="Right"},
  	@{Name="Ошибок";Expression = { $_.gRefuses };Alignment="Right"}
}
#
# Генерация HTML отчёта
#
$fragments = @()
#
# Шапка отчёта
#
$fragments+= $ImageTag
$fragments+= "<H2>Отчёт об использовании Интернет-ресурсов</H2>"
$TableTop = @{"User" = $pintUser; "Period" = "$printsDate - $printeDate"}
$fragments+= $TableTop |
Select @{Name = "Пользователь";Expression = {$_.User}},
	   @{Name = "Период отчёта";Expression = {$_.Period}},
	   @{Name = "Всего загружено из Интернет";Expression = {$totalBytesDownloaded}},
	   @{Name = "Всего загружено из кеша прокси";Expression = {$totalBytesFromCache}} | 
	   ConvertTo-Html -Fragment -As List
#
$fragments+= "<hr />"
#
# Вёрстка табличного контента HTML
#
[xml]$html  = $fResult | Sort-Object 'gBytesDownloaded' -Descending | 
Select-Object -First $LimitLines  @{Name="Имя домена"; Expression={$_.Domain}},
	@{Name="Загружено из Интернет";Expression = { BytesToHRF $_.gBytesDownloaded}},
	@{Name="Загружено из кеша";Expression = { BytesToHRF $_.gBytesFromCache}},	
	@{Name="Запросов";Expression = {$_.gRequests}},
	@{Name="Ошибок";Expression = {$_.gRefuses}} | ConvertTo-Html -Fragment
#
# Дополнительное HTML форматирование основной таблицы
#
For ($i=1; $i -le $html.table.tr.count-1; $i++) {
 
  [int64]$refusesCount = $html.table.tr[$i].td[4]
 
  $tclass = $html.CreateAttribute("class")
  $tclass.value = "maintable"
  $html.table.tr[$i].attributes.append($tclass) | Out-null
 
  If ($refusesCount -gt 0) {
    $class = $html.CreateAttribute("class")
	$class.value = "alert"
    $html.table.tr[$i].attributes.append($class) | Out-null
  }
}
#
$fragments+= $html.InnerXml
#
# Вёрстка нижней части отчёта
#
$fragments+= "<hr />"
#
# Подсчёт основного времени извлечения данных и первичной HTML верстки
#
$scriptEnd = Get-Date
$tt = new-timespan -seconds $(($scriptEnd - $scriptStart).TotalSeconds)
If (($tt.TotalSeconds) -lt 60) {$scriptTime = '{0:0} сек.' -f $tt.seconds}
ElseIf (($tt.TotalSeconds) -gt 3599) {$scriptTime = '{0:0} ч. {1:0} мин. {2:0} сек.' -f $tt.Hours,$tt.Minutes,$tt.Seconds}
Else {$scriptTime = '{1:0} мин. {2:0} сек.' -f $tt.Hours,$tt.Minutes,$tt.Seconds}
#
$TableBot = @{"BuildTime"="$('{0:dd.MM.yyyy в HH:mm}' -f (get-date))";"sTime" = $scriptTime}
$fragments+= $TableBot |
Select @{Name="Дата и время формирования отчёта";Expression = {$_.BuildTime}},
	   @{Name="Время построения отчёта";Expression = {$_.sTime}} |
ConvertTo-Html -Fragment -As List
#
$fragments+= "<p class='footer'></p>"
#
# Формирование имени файла HTML-отчёта
#
$htmlPath = $htmlOutDir + "Интернет отчёт " + $UserName + " за " + $printsDate + " - " + $printeDate + ".htm"
#
# Выгрузка HTML-отчёта 
#
$convertParams = @{ 
  head = @"
<Title>Отчёт об использовании Интернет-ресурсов пользователя $pintUser</Title>
<style>
body { background-color:rgba(255, 255, 255, 1);
       font-family:verdana, sans-serif;
       font-size:10pt; 
	   color: #1e1e1e;}
td, th { border:0px solid black; 
         border-collapse:collapse;
         white-space:pre;}
th { color:white;
     background-color:rgba(104, 117, 138, 1);
	 font-weight:normal;
	 padding: 6px;}
#table, tr, td { padding: 3px; margin: 0px ;white-space:pre; }
tr:nth-child(odd) {background-color:#efefef;}
table { margin-left:5px; margin-bottom:20px;}
h1, h2 {
 /* font-family:Tahoma;
 color:#6D7B8D; */
}
.maintable {
 text-align:center;
}
.alert {
 text-align:center;
 color: red; 
 }
.footer 
{ color:green; 
  margin-left:10px; 
  font-family:Tahoma;
  font-size:8pt;
  font-style:italic;
}
</style>
"@
 body = $fragments
}
ConvertTo-Html @convertParams | Out-File $htmlPath
#
# Открываем браузер
#
#$IE = New-Object -COM internetexplorer.application
#$IE.navigate2($htmlPath)
#$IE.visible = $true
 
}

Проверено на следующих конфигурациях:

Версия ОС Версия PowerShell Версия SquidARM
Windows 10 22H2 5.1.19041.4046 0.04-1

Автор первичной редакции:
Алексей Максимов
Время публикации: 01.05.2024 15:34

Обсуждение

Ваш комментарий:
 
squid/powershell-script-for-creating-html-report-using-web-api-data-from-squidarm.txt · Последнее изменение: 01.05.2024 16:00 — Алексей Максимов

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki