Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
0e37a2e
Addes signalR service and wwwroot folder in presentation service
to-0 Aug 17, 2023
2066ac5
presentation modified to serve static files in /wwwroot folder + adde…
Aug 17, 2023
62d26b8
added SignalR JS client to presentation + demo message sending
Aug 18, 2023
667f767
Moved monitoring service to presentation service.
to-0 Aug 21, 2023
1975d09
Redis service + modified monitoring service
Aug 21, 2023
f729b10
Testing admin requests to receive list of connected users
to-0 Aug 21, 2023
5968883
added redis image + webapi service for redis
Aug 21, 2023
c682aa6
redis API functions are now async
Aug 22, 2023
de0f383
redis api endpoints now return status codes
Aug 22, 2023
7a790a3
redis api - added endpoints to create and append lists in redis
Aug 22, 2023
5c7a9c9
presentation: /monitoring page shows a dummy list of users with their…
Aug 23, 2023
13a62f6
Authorization required to invoke functions of MonitoringHub
to-0 Aug 23, 2023
9f9bf1d
monitoringservice added to envoy
Aug 23, 2023
bb6ecad
monitoringservice API endpoints for logging connections + retrieving …
Aug 23, 2023
f9d80cf
Added dynamic table refreshing in monitoring page.
to-0 Aug 23, 2023
27f8fb6
SignalR hub pulls user email from claims + 1st version of connection …
Aug 23, 2023
8742504
Fixed errors with ConnectionLog in monitoringService
to-0 Aug 23, 2023
936e6ef
Deleted comments
to-0 Aug 23, 2023
6b4a97b
javascript pinging monitor hub in loop with 2s intervals
Aug 23, 2023
d802e37
First version of admin monitoring board implemented
to-0 Aug 23, 2023
7ab98d6
Removed debug outputs; changed admin monitoring interval to 1s; preve…
Aug 24, 2023
7415486
Deleting comments
to-0 Aug 24, 2023
c0a2f8b
refactoring in monitoring_admin.js
Aug 24, 2023
578735f
added error logging to monitoringservice
Aug 24, 2023
a930552
Moved last seen calculation to presentation service
to-0 Aug 24, 2023
04ae1c2
Removed console logs
to-0 Aug 24, 2023
31f2056
Monitoring logging in presentation service
Aug 24, 2023
5f105a5
Nothing
to-0 Aug 30, 2023
dd9dcca
Fixed getting user email from Claims in monitoring hub
to-0 Aug 24, 2023
c296665
User now connects and starts pinging automatically on visiting /conne…
Aug 25, 2023
ac2e5f4
Coloring of monitoring page, admin gets notified when getting user fa…
to-0 Aug 25, 2023
1dca20c
Refactoring
to-0 Aug 25, 2023
a1e7e26
Admin monitoring of connected users - sort by email
Aug 25, 2023
6c9230c
Refactoring of monitoring_admin.js
to-0 Aug 25, 2023
29a070c
Code cleanup - removed some whitespaces
Aug 28, 2023
1d96070
Testing extraction if IP adress
to-0 Aug 28, 2023
438e217
monitoringservice refactoring - now uses controllers + sending lists …
Aug 28, 2023
e615152
removed Converters from presentation
Aug 28, 2023
fc04d6c
Write out IP adress
to-0 Aug 28, 2023
e15f843
monitoringservice changed log level
Aug 28, 2023
a450cb3
Removed functions that are not related to signalR and are in other br…
to-0 Aug 30, 2023
2eee61c
Merge conflict
to-0 Aug 30, 2023
9ede99c
Implemented ip filter
to-0 Aug 30, 2023
f94bb54
IP filter now supports range of IP addresses
Aug 31, 2023
c9e215b
Changed filter type to ResourceFilter
Aug 31, 2023
8692631
Fiter for signalR hub, also trying to extract ip addresses from appse…
to-0 Aug 31, 2023
bd30f78
Merge conflict and preparing for testing ipfilter
to-0 Aug 31, 2023
7d46605
Deleted unnecessary attributes
to-0 Aug 31, 2023
9961947
Changed IPHubFilter to work with ranges of IP addresses
to-0 Sep 4, 2023
db053df
Added error handling when parsing IP address
to-0 Sep 4, 2023
6555a76
Ip filter for connection page registered as service, with ip range fr…
to-0 Sep 4, 2023
bf7eeb7
Hub Filter accepts 1 range of IP addresses supplied in appsettings.json
Sep 4, 2023
5b232a5
Merge branch 'filterIP' of https://github.com/to-0/APC into filterIP
Sep 4, 2023
ef1894b
Renamed IpFilter
to-0 Sep 4, 2023
7fab26c
IP Filters refactoring
Sep 4, 2023
0495016
IP filters check the content of X-Forwarded-For header first, if it c…
to-0 Sep 5, 2023
cbc9de2
GetRemoteIP() refactoring
Sep 5, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,4 @@ yarn-error.log*
*.csproj.user

# Go bin files
__debug_bin
__debug_bin
44 changes: 44 additions & 0 deletions cppseminar/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ services:
- ./presentation/Model:/src/Model
- ./presentation/Pages:/src/Pages
- ./presentation/Services:/src/Services
- ./presentation/wwwroot:/src/wwwroot
- ./presentation/Hubs:/src/Hubs
- ./presentation/Filters:/src/Filters
- ./presentation/appsettings.json:/src/appsettings.json
networks:
- sharednet
ports:
Expand All @@ -57,6 +61,7 @@ services:
restart: always
depends_on:
- rabbitmq.local
- monitoringservice.local

userservice.local:
build:
Expand Down Expand Up @@ -261,7 +266,46 @@ services:
- ./envoy/envoy.yaml:/etc/envoy/envoy.yaml
networks:
- sharednet

redis.local:
image: redis:7.2.0
build:
target: dev
networks:
- sharednet
ports:
- 6379:6379
restart: always

monitoringservice.local:
build:
context: ./monitoringservice
target: dev
volumes:
- ./monitoringservice/Program.cs:/src/Program.cs
- ./monitoringservice/Startup.cs:/src/Startup.cs
- ./monitoringservice/Model:/src/Model
- ./monitoringservice/Services:/src/Services
- ./monitoringservice/Controllers:/src/Controllers
- ./monitoringservice/monitoringservice.csproj:/src/monitoringservice.csproj
- ./monitoringservice/appsettings.json:/src/appsettings.json
networks:
- sharednet
ports:
- 8085:80
environment:
DOTNET_USE_POLLING_FILE_WATCHER: 1
DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM: 1
DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER: 1
DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH: 1
ASPNETCORE_ENVIRONMENT: Development
API_GATEWAY: http://gateway.local:5000/
LOG_PRETTY: 1
restart: always
depends_on:
redis.local:
condition: service_started


networks:
sharednet:
Expand Down
17 changes: 16 additions & 1 deletion cppseminar/envoy/envoy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ static_resources:
path_separated_prefix: /test
route:
cluster: test-service
- match:
path_separated_prefix: /monitoring
route:
cluster: monitoring-service
http_filters:
- name: envoy.filters.http.router
typed_config:
Expand Down Expand Up @@ -88,4 +92,15 @@ static_resources:
address:
socket_address:
address: submissions.local
port_value: 80
port_value: 80
- name: monitoring-service
type: strict_dns
load_assignment:
cluster_name: monitoring-service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: monitoringservice.local
port_value: 80
61 changes: 61 additions & 0 deletions cppseminar/monitoringservice/Controllers/MonitoringController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Text.Json;
using monitoringservice.Model;
using monitoringservice.Services;

namespace monitoringservice.Controllers;

[Route("monitoring")]
[ApiController]
public class MonitoringController : ControllerBase
{
private readonly ILogger<MonitoringController> _logger;
private readonly StorageService _service;

public MonitoringController(ILogger<MonitoringController> logger, StorageService service)
{
_logger = logger;
_service = service;
}

[HttpGet("get/recents")]
public async Task<ActionResult<List<ConnectionLog>>> OnGetAsync()
{
try
{
return await _service.getConnectionLogsAsync();
}
catch (Exception e)
{
_logger.LogError("Exception occured while retrieving all ConnectionLog records. " + e);
return StatusCode(500);
}
}

[HttpPost("post/log")]
public async Task<ActionResult> LogConnection([FromBody] ConnectionLog connectionLog)
{
if (connectionLog.UserEmail == null || connectionLog.Timestamp == null)
{
return BadRequest();
}
else
{
try
{
await _service.setConnectionlogAsync(connectionLog);
return Ok();
}
catch (Exception e)
{
_logger.LogError("Exception occured while logging user connection. " + e);
return StatusCode(500);
}
}
}
}
21 changes: 21 additions & 0 deletions cppseminar/monitoringservice/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["monitoringservice.csproj", "./monitoringservice.csproj"]
RUN dotnet restore "monitoringservice.csproj"
COPY . .
RUN dotnet build "monitoringservice.csproj" -c Release -o /app/build

FROM build as dev
CMD dotnet watch run --urls=http://0.0.0.0:80

FROM build AS publish
RUN dotnet publish "monitoringservice.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "monitoringservice.dll"]
19 changes: 19 additions & 0 deletions cppseminar/monitoringservice/Model/ConnectionLog.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;


namespace monitoringservice.Model
{
public class ConnectionLog
{
public ConnectionLog(string email, DateTime timestamp){
UserEmail = email;
Timestamp = timestamp;
}
public ConnectionLog(){
}
public string UserEmail { get; set; }
public DateTime Timestamp { get; set; }
}
}
56 changes: 56 additions & 0 deletions cppseminar/monitoringservice/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
using Serilog.Formatting.Compact;
using monitoringservice.Model;
using monitoringservice.Services;

namespace monitoringservice;

public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.Console(new RenderedCompactJsonFormatter())
.CreateLogger();

try
{
Log.Information("Starting web host");
CreateHostBuilder(args).Build().Run();
}
catch (Exception e)
{
Log.Fatal("Host terminated unexpectedly. {e}", e);
}
finally
{
Log.CloseAndFlush();
}
}

public static IHostBuilder CreateHostBuilder(string[] args)
{
if (Environment.GetEnvironmentVariable("LOG_PRETTY") == "1")
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
return Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}

37 changes: 37 additions & 0 deletions cppseminar/monitoringservice/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:9271",
"sslPort": 44364
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5224",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7026;http://localhost:5224",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
47 changes: 47 additions & 0 deletions cppseminar/monitoringservice/Services/StorageService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using StackExchange.Redis;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using monitoringservice.Model;

namespace monitoringservice.Services;
public class StorageService
{
private readonly IDatabase _db;
private readonly IServer _server;
private readonly ILogger<StorageService> _logger;

public StorageService(ILogger<StorageService> logger)
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("redis.local");
_db = redis.GetDatabase();
_server = redis.GetServer("redis.local", 6379);
_logger = logger;
}

public async Task setConnectionlogAsync(ConnectionLog connectionLog)
{
await _db.StringSetAsync(connectionLog.UserEmail, connectionLog.Timestamp.ToString());
}

public async Task<string?> getValueAsync(string Key)
{
string value = await _db.StringGetAsync(Key);
return value;
}

/* This works only when key-value pairs of string-string are in redis */

public async Task<List<ConnectionLog>> getConnectionLogsAsync()
{
List<ConnectionLog> connectionLogsList = new List<ConnectionLog>();

var emails = _server.Keys();
foreach (var email in emails)
{
var timestamp = await _db.StringGetAsync(email);
connectionLogsList.Add(new ConnectionLog(email, DateTime.Parse(timestamp)));
}
return connectionLogsList;
}
}
48 changes: 48 additions & 0 deletions cppseminar/monitoringservice/Startup.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

using monitoringservice.Services;
using monitoringservice.Model;

namespace monitoringservice;

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSingleton<StorageService>();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
Loading