web-proxy rewrite

This commit is contained in:
Kevin Kai Berthold 2023-09-21 23:44:05 +02:00
parent 26c741ad03
commit 283fa1abc2
10 changed files with 63 additions and 134 deletions

View file

@ -10,24 +10,26 @@ public class ConsoleHandler : IMessageHandler<AgentSession>
{
public async ValueTask HandleAsync<TMessage>(AgentSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage
{
if (message is ConsoleQueryRequest consoleQueryRequest)
if (message is Proxy<ConsoleQueryRequest> consoleQueryRequest)
{
await OnConsoleQueryRequestAsync(sender, consoleQueryRequest, cancellationToken);
}
}
private async ValueTask OnConsoleQueryRequestAsync(AgentSession sender, ConsoleQueryRequest consoleQueryRequest, CancellationToken cancellationToken)
private async ValueTask OnConsoleQueryRequestAsync(AgentSession sender, Proxy<ConsoleQueryRequest> consoleQueryRequest, CancellationToken cancellationToken)
{
var result = await QueryScriptAsync(consoleQueryRequest.Query);
var result = await QueryScriptAsync(consoleQueryRequest.Message.Query);
await sender.SendAsync(new ConsoleQuery
await sender.SendAsync(new Proxy<ConsoleQuery>
{
Id = consoleQueryRequest.Id,
RequestId = consoleQueryRequest.RequestId,
HostId = consoleQueryRequest.HostId,
Query = consoleQueryRequest.Query,
Message = new ConsoleQuery
{
Data = result.Data,
Errors = result.Errors,
HadErrors = result.HadErrors
}
}, cancellationToken);
}

View file

@ -6,27 +6,12 @@ namespace Insight.Domain.Messages.Agent;
public partial class ConsoleQuery : IMessage
{
[MemoryPackOrder(0)]
public string? Id { get; set; }
[MemoryPackOrder(1)]
public string? HostId { get; set; }
[MemoryPackOrder(2)]
public string? Query { get; set; }
[MemoryPackOrder(3)]
public string? Data { get; set; }
[MemoryPackOrder(4)]
[MemoryPackOrder(1)]
public string? Errors { get; set; }
[MemoryPackOrder(5)]
public bool IsString { get; set; }
[MemoryPackOrder(6)]
public bool IsArray { get; set; }
[MemoryPackOrder(7)]
[MemoryPackOrder(2)]
public bool HadErrors { get; set; }
}
@ -34,11 +19,5 @@ public partial class ConsoleQuery : IMessage
public partial class ConsoleQueryRequest : IMessage
{
[MemoryPackOrder(0)]
public string? Id { get; set; }
[MemoryPackOrder(1)]
public string? HostId { get; set; }
[MemoryPackOrder(2)]
public string? Query { get; set; }
}

View file

@ -4,11 +4,9 @@ namespace Insight.Domain.Messages;
[MemoryPackable]
[MemoryPackUnion(0, typeof(Keepalive))]
[MemoryPackUnion(1, typeof(Agent.Authentication))]
[MemoryPackUnion(2, typeof(Agent.AuthenticationRequest))]
[MemoryPackUnion(1, typeof(Agent.AuthenticationRequest))]
[MemoryPackUnion(2, typeof(Agent.Authentication))]
[MemoryPackUnion(10, typeof(Agent.InventoryRequest))]
[MemoryPackUnion(20, typeof(Agent.ConsoleQuery))]
[MemoryPackUnion(21, typeof(Agent.ConsoleQueryRequest))]
[MemoryPackUnion(100, typeof(Agent.Application))]
[MemoryPackUnion(101, typeof(Agent.ApplicationList))]
[MemoryPackUnion(102, typeof(Agent.Drive))]
@ -41,6 +39,8 @@ namespace Insight.Domain.Messages;
[MemoryPackUnion(129, typeof(Agent.VideocardList))]
[MemoryPackUnion(130, typeof(Agent.VirtualMaschine))]
[MemoryPackUnion(131, typeof(Agent.VirtualMaschineList))]
[MemoryPackUnion(400, typeof(Web.ConsoleQueryProxy))]
[MemoryPackUnion(401, typeof(Web.ConsoleQueryProxyRequest))]
[MemoryPackUnion(132, typeof(Agent.ConsoleQuery))]
[MemoryPackUnion(133, typeof(Agent.ConsoleQueryRequest))]
[MemoryPackUnion(1000, typeof(Proxy<Agent.ConsoleQuery>))]
[MemoryPackUnion(1001, typeof(Proxy<Agent.ConsoleQueryRequest>))]
public partial interface IMessage { }

View file

@ -0,0 +1,17 @@
using MemoryPack;
namespace Insight.Domain.Messages;
[MemoryPackable]
public partial class Proxy<TMessage> : IMessage
where TMessage : IMessage
{
[MemoryPackOrder(0)]
public string? RequestId { get; set; }
[MemoryPackOrder(1)]
public string? HostId { get; set; }
[MemoryPackOrder(2)]
public TMessage? Message { get; set; }
}

View file

@ -1,38 +0,0 @@
using MemoryPack;
namespace Insight.Domain.Messages.Web;
[MemoryPackable]
public partial class ConsoleQueryProxy : IMessage
{
[MemoryPackOrder(0)]
public string? Id { get; set; }
[MemoryPackOrder(1)]
public string? HostId { get; set; }
[MemoryPackOrder(2)]
public string? Query { get; set; }
[MemoryPackOrder(3)]
public string? Data { get; set; }
[MemoryPackOrder(4)]
public string? Errors { get; set; }
[MemoryPackOrder(7)]
public bool HadErrors { get; set; }
}
[MemoryPackable]
public partial class ConsoleQueryProxyRequest : IMessage
{
[MemoryPackOrder(0)]
public string? Id { get; set; }
[MemoryPackOrder(1)]
public string? HostId { get; set; }
[MemoryPackOrder(2)]
public string? Query { get; set; }
}

View file

@ -1,7 +1,6 @@
using Insight.Domain.Interfaces;
using Insight.Domain.Messages;
using Insight.Domain.Messages.Agent;
using Insight.Domain.Messages.Web;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using Vaitr.Network;
@ -26,25 +25,17 @@ public class ConsoleHandler : IMessageHandler<AgentSession>
public async ValueTask HandleAsync<TMessage>(AgentSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage
{
if (message is ConsoleQuery consoleQuery)
if (message is Proxy<ConsoleQuery> consoleResponse)
{
await OnConsoleQueryAsync(sender, consoleQuery, cancellationToken);
await OnConsoleQueryAsync(sender, consoleResponse, cancellationToken);
}
}
private async ValueTask OnConsoleQueryAsync(AgentSession session, ConsoleQuery query, CancellationToken cancellationToken)
private async ValueTask OnConsoleQueryAsync(AgentSession session, Proxy<ConsoleQuery> consoleResponse, CancellationToken cancellationToken)
{
// check if web online
if (_webPool.FirstOrDefault().Value is not WebSession web) return;
await web.SendAsync(new ConsoleQueryProxy
{
Id = query.Id,
HostId = query.HostId,
Query = query.Query,
Data = query.Data,
Errors = query.Errors,
HadErrors = query.HadErrors
}, cancellationToken);
await web.SendAsync(consoleResponse, cancellationToken);
}
}

View file

@ -1,7 +1,6 @@
using Insight.Domain.Interfaces;
using Insight.Domain.Messages;
using Insight.Domain.Messages.Agent;
using Insight.Domain.Messages.Web;
using Insight.Infrastructure;
using Insight.Infrastructure.Entities;
using Microsoft.Extensions.Logging;
@ -33,19 +32,18 @@ public class ConsoleProxyHandler : IMessageHandler<WebSession>
_database = database;
_bus = bus;
_logger = logger;
_subscriptions.Add(_bus.SubscribeAsync<ConsoleQuery>(OnConsoleQueryAsync, null));
}
public async ValueTask HandleAsync<TMessage>(WebSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage
{
if (message is ConsoleQueryProxyRequest consoleRequest)
if (message is Proxy<ConsoleQueryRequest> consoleRequest)
{
_logger.LogCritical("received: {0}" + consoleRequest.Message);
await OnConsoleQueryRequestAsync(sender, consoleRequest, cancellationToken);
}
}
private async ValueTask OnConsoleQueryRequestAsync(WebSession session, ConsoleQueryProxyRequest request, CancellationToken cancellationToken)
private async ValueTask OnConsoleQueryRequestAsync(WebSession session, Proxy<ConsoleQueryRequest> request, CancellationToken cancellationToken)
{
// get host
var hostEntity = await _database.Host()
@ -76,28 +74,7 @@ public class ConsoleProxyHandler : IMessageHandler<WebSession>
// check if agent online
if (_agentPool.FirstOrDefault(p => p.Value.Id == agentEntity.Id).Value is not AgentSession agent) return;
// send "real" packet to agent
await agent.SendAsync(new ConsoleQueryRequest
{
Id = request.Id,
HostId = request.HostId,
Query = request.Query
}, cancellationToken);
}
private async ValueTask OnConsoleQueryAsync(ConsoleQuery query, CancellationToken cancellationToken)
{
// check if web online
if (_webPool.FirstOrDefault().Value is not WebSession web) return;
await web.SendAsync(new ConsoleQueryProxy
{
Id = query.Id,
HostId = query.HostId,
Query = query.Query,
Data = query.Data,
Errors = query.Errors,
HadErrors = query.HadErrors
}, cancellationToken);
// proxy-send request packet to agent
await agent.SendAsync(request, cancellationToken);
}
}

View file

@ -1,6 +1,6 @@
using Insight.Domain.Interfaces;
using Insight.Domain.Messages;
using Insight.Domain.Messages.Web;
using Insight.Domain.Messages.Agent;
using Vaitr.Bus;
namespace Insight.Web.Network.Handlers;
@ -16,7 +16,7 @@ public class ConsoleHandler : IMessageHandler<WebSession>
public async ValueTask HandleAsync<TMessage>(WebSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage
{
if (message is ConsoleQueryProxy consoleQuery)
if (message is Proxy<ConsoleQuery> consoleQuery)
{
await _bus.PublishAsync(consoleQuery, cancellationToken);
}

View file

@ -6,17 +6,17 @@
{
<MudGrid>
<MudItem xs="12" sm="12" md="12" lg="12">
<MudTextField T="string" Label="Query" Variant="Variant.Outlined" @bind-Text="_model.ConsoleQuery.Query" Lines="20" />
<MudTextField T="string" Label="Query" Variant="Variant.Outlined" @bind-Text="_model.Request.Query" Lines="20" />
</MudItem>
<MudItem xs="12" sm="12" md="12" lg="12">
@if (_model.ConsoleQuery.HadErrors is false)
@if (_model.Response.HadErrors is false)
{
<MudTextField T="string" Label="Data" Variant="Variant.Outlined" @bind-Text="_model.ConsoleQuery.Data" Lines="20" />
<MudTextField T="string" Label="Data" Variant="Variant.Outlined" @bind-Text="_model.Response.Data" Lines="20" />
}
else
{
<MudTextField T="string" Label="Errors" Variant="Variant.Outlined" @bind-Text="_model.ConsoleQuery.Errors" Lines="20" />
<MudTextField T="string" Label="Errors" Variant="Variant.Outlined" @bind-Text="_model.Response.Errors" Lines="20" />
}
</MudItem>

View file

@ -1,5 +1,5 @@
using Insight.Domain.Messages;
using Insight.Domain.Messages.Web;
using Insight.Domain.Messages.Agent;
using Insight.Infrastructure;
using Insight.Infrastructure.Entities;
using Insight.Web.Constants;
@ -33,7 +33,7 @@ public partial class Index
protected override async Task OnInitializedAsync()
{
_subscriptions.Add(Bus.SubscribeAsync<ConsoleQueryProxy>(OnQueryResultAsync, p => p.Id == _id));
_subscriptions.Add(Bus.SubscribeAsync<Proxy<ConsoleQuery>>(OnQueryResultAsync, p => p.RequestId == _id));
}
private async Task LoadDataAsync()
@ -75,15 +75,15 @@ public partial class Index
private async Task SubmitAsync()
{
if (_model.ConsoleQuery.Query is null || WebPool.Any() is false) return;
if (_model.Request.Query is null || WebPool.Any() is false) return;
try
{
await WebPool.First().Value.SendAsync(new ConsoleQueryProxyRequest
await WebPool.First().Value.SendAsync(new Proxy<ConsoleQueryRequest>
{
Id = _id,
RequestId = _id,
HostId = HostId,
Query = _model.ConsoleQuery.Query
Message = _model.Request
}, default);
Notification.Information(Snackbar, "Sent Query Command");
@ -94,17 +94,18 @@ public partial class Index
}
}
private async ValueTask OnQueryResultAsync(ConsoleQueryProxy query, CancellationToken cancellationToken)
private async ValueTask OnQueryResultAsync(Proxy<ConsoleQuery> proxy, CancellationToken cancellationToken)
{
_model.ConsoleQuery.HadErrors = query.HadErrors;
_model.ConsoleQuery.Data = query.Data;
_model.ConsoleQuery.Errors = query.Errors;
_model.Response.HadErrors = proxy.Message.HadErrors;
_model.Response.Data = proxy.Message?.Data;
_model.Response.Errors = proxy.Message?.Errors;
await InvokeAsync(StateHasChanged);
}
private class IndexViewModel
{
public readonly ConsoleQueryProxy ConsoleQuery = new();
public readonly ConsoleQueryRequest Request = new();
public readonly ConsoleQuery Response = new();
}
}