Skip to content

Commit 7af0e45

Browse files
authored
Merge pull request #582 from KelvinTegelaar/dev
[pull] dev from KelvinTegelaar:dev
2 parents 6e4d78c + d612dc6 commit 7af0e45

File tree

9 files changed

+467
-30
lines changed

9 files changed

+467
-30
lines changed

Modules/CIPPCore/Public/CippQueue/Set-CippQueueTask.ps1

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ function Set-CippQueueTask {
88
[string]$TaskId = (New-Guid).Guid.ToString(),
99
[string]$Name,
1010
[ValidateSet('Queued', 'Running', 'Completed', 'Failed')]
11-
[string]$Status = 'Queued'
11+
[string]$Status = 'Queued',
12+
[string]$Message
1213
)
1314

1415
$CippQueueTasks = Get-CippTable -TableName CippQueueTasks
@@ -20,8 +21,11 @@ function Set-CippQueueTask {
2021
Name = $Name
2122
Status = $Status
2223
}
24+
if ($Message) {
25+
$QueueTaskEntry.Message = $Message
26+
}
2327
$CippQueueTasks.Entity = $QueueTaskEntry
2428

2529
Add-CIPPAzDataTableEntity @CippQueueTasks -Force
2630
return $QueueTaskEntry
27-
}
31+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
function Invoke-ExecAppInsightsQuery {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint
5+
.ROLE
6+
CIPP.SuperAdmin.Read
7+
#>
8+
[CmdletBinding()]
9+
param (
10+
$Request,
11+
$TriggerMetadata
12+
)
13+
14+
$Query = $Request.Body.query ?? $Request.Query.query
15+
if (-not $Query) {
16+
return [HttpResponseContext]@{
17+
StatusCode = [HttpStatusCode]::BadRequest
18+
Body = @{
19+
Results = 'No query provided in request body.'
20+
}
21+
}
22+
}
23+
24+
try {
25+
$LogData = Get-ApplicationInsightsQuery -Query $Query
26+
27+
$Body = @{
28+
Results = @($LogData)
29+
Metadata = @{
30+
Query = $Query
31+
}
32+
} | ConvertTo-Json -Depth 10 -Compress
33+
34+
return [HttpResponseContext]@{
35+
StatusCode = [HttpStatusCode]::OK
36+
Body = $Body
37+
}
38+
39+
} catch {
40+
return [HttpResponseContext]@{
41+
StatusCode = [HttpStatusCode]::InternalServerError
42+
Body = @{
43+
Results = "$($_.Exception.Message)"
44+
Metadata = @{
45+
Query = $Query
46+
Exception = Get-CippException -Exception $_
47+
}
48+
}
49+
}
50+
}
51+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
function Invoke-ExecDiagnosticsPresets {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint
5+
.ROLE
6+
CIPP.SuperAdmin.ReadWrite
7+
#>
8+
[CmdletBinding()]
9+
param (
10+
$Request,
11+
$TriggerMetadata
12+
)
13+
14+
try {
15+
$Table = Get-CIPPTable -TableName 'DiagnosticsPresets'
16+
$Action = $Request.Body.action
17+
$GUID = $Request.Body.GUID
18+
19+
if ($Action -eq 'delete') {
20+
if (-not $GUID) {
21+
return [HttpResponseContext]@{
22+
StatusCode = [HttpStatusCode]::BadRequest
23+
Body = @{
24+
Results = 'GUID is required for delete action'
25+
}
26+
}
27+
}
28+
29+
Remove-AzDataTableEntity @Table -Entity @{
30+
PartitionKey = 'Preset'
31+
RowKey = $GUID
32+
}
33+
34+
return [HttpResponseContext]@{
35+
StatusCode = [HttpStatusCode]::OK
36+
Body = @{
37+
Results = 'Preset deleted successfully'
38+
}
39+
}
40+
} else {
41+
# Save or update preset
42+
$Name = $Request.Body.name
43+
$Query = $Request.Body.query
44+
45+
if (-not $Name -or -not $Query) {
46+
return [HttpResponseContext]@{
47+
StatusCode = [HttpStatusCode]::BadRequest
48+
Body = @{
49+
Results = 'Name and query are required'
50+
}
51+
}
52+
}
53+
54+
# Use provided GUID or generate new one
55+
if (-not $GUID) {
56+
$GUID = (New-Guid).Guid
57+
}
58+
59+
# Convert query to compressed JSON for storage
60+
$QueryJson = ConvertTo-Json -InputObject @{ query = $Query } -Compress
61+
62+
$Entity = @{
63+
PartitionKey = 'Preset'
64+
RowKey = [string]$GUID
65+
name = [string]$Name
66+
data = [string]$QueryJson
67+
}
68+
69+
Add-CIPPAzDataTableEntity @Table -Entity $Entity -Force
70+
71+
return [HttpResponseContext]@{
72+
StatusCode = [HttpStatusCode]::OK
73+
Body = @{
74+
Results = 'Preset saved successfully'
75+
Metadata = @{
76+
GUID = $GUID
77+
}
78+
}
79+
}
80+
}
81+
} catch {
82+
return [HttpResponseContext]@{
83+
StatusCode = [HttpStatusCode]::InternalServerError
84+
Body = @{
85+
Error = "Failed to manage diagnostics preset: $($_.Exception.Message)"
86+
}
87+
}
88+
}
89+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
function Invoke-ListDiagnosticsPresets {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint
5+
.ROLE
6+
CIPP.SuperAdmin.Read
7+
#>
8+
[CmdletBinding()]
9+
param (
10+
$Request,
11+
$TriggerMetadata
12+
)
13+
14+
try {
15+
$Table = Get-CIPPTable -TableName 'DiagnosticsPresets'
16+
$Presets = Get-CIPPAzDataTableEntity @Table | ForEach-Object {
17+
$Data = $_.data | ConvertFrom-Json
18+
[PSCustomObject]@{
19+
GUID = $_.RowKey
20+
name = $_.name
21+
query = $Data.query
22+
}
23+
}
24+
25+
return [HttpResponseContext]@{
26+
StatusCode = [HttpStatusCode]::OK
27+
Body = @($Presets)
28+
}
29+
} catch {
30+
return [HttpResponseContext]@{
31+
StatusCode = [HttpStatusCode]::InternalServerError
32+
Body = @{
33+
Error = "Failed to list diagnostics presets: $($_.Exception.Message)"
34+
}
35+
}
36+
}
37+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
function Get-ApplicationInsightsQuery {
2+
[CmdletBinding()]
3+
param (
4+
[Parameter(Mandatory = $true)]
5+
[string]$Query
6+
)
7+
8+
if (-not $env:APPLICATIONINSIGHTS_CONNECTION_STRING -and -not $env:APPINSIGHTS_INSTRUMENTATIONKEY) {
9+
throw 'Application Insights is not enabled for this instance.'
10+
}
11+
12+
if ($env:MSI_SECRET) {
13+
$null = Connect-AzAccount -Identity
14+
}
15+
16+
$SubscriptionId = $env:WEBSITE_OWNER_NAME -split '\+' | Select-Object -First 1
17+
if ($env:WEBSITE_SKU -ne 'FlexConsumption' -and $Owner -match '^(?<SubscriptionId>[^+]+)\+(?<RGName>[^-]+(?:-[^-]+)*?)(?:-[^-]+webspace(?:-Linux)?)?$') {
18+
$RGName = $Matches.RGName
19+
} else {
20+
$RGName = $env:WEBSITE_RESOURCE_GROUP
21+
}
22+
$AppInsightsName = $env:WEBSITE_SITE_NAME
23+
24+
$Body = @{
25+
'query' = $Query
26+
'options' = @{'truncationMaxSize' = 67108864 }
27+
'maxRows' = 1001
28+
'workspaceFilters' = @{'regions' = @() }
29+
} | ConvertTo-Json -Depth 10 -Compress
30+
31+
$AppInsightsQuery = 'subscriptions/{0}/resourceGroups/{1}/providers/microsoft.insights/components/{2}/query' -f $SubscriptionId, $RGName, $AppInsightsName
32+
33+
$resource = 'https://api.loganalytics.io'
34+
$Token = Get-AzAccessToken -ResourceUrl $resource
35+
36+
$headerParams = @{'Authorization' = "Bearer $($Token.Token)" }
37+
$logAnalyticsBaseURI = 'https://api.loganalytics.io/v1'
38+
39+
$result = Invoke-RestMethod -Method POST -Uri "$($logAnalyticsBaseURI)/$AppInsightsQuery" -Headers $headerParams -Body $Body -ContentType 'application/json' -ErrorAction Stop
40+
41+
# Format Result to PSObject
42+
$headerRow = $null
43+
$headerRow = $result.tables.columns | Select-Object name
44+
$columnsCount = $headerRow.Count
45+
$logData = foreach ($row in $result.tables.rows) {
46+
$data = New-Object PSObject
47+
for ($i = 0; $i -lt $columnsCount; $i++) {
48+
$data | Add-Member -MemberType NoteProperty -Name $headerRow[$i].name -Value $row[$i]
49+
}
50+
$data
51+
}
52+
53+
return $logData
54+
}

0 commit comments

Comments
 (0)