Skip to content

Commit

Permalink
#115 chore: switch to json configuration
Browse files Browse the repository at this point in the history
+ All configuration is now json
+ Logging options are specified in appsettings.json as well as the path to the linguard's json configuration file
+ Plugins location is set through configuration, but it is read before all settings so plugins can be loaded before deserializing options that depend of plugins (e.g.: traffic drivers)
  • Loading branch information
joseantmazonsb committed Apr 16, 2022
1 parent c2f5245 commit 576f5af
Show file tree
Hide file tree
Showing 123 changed files with 1,287 additions and 1,109 deletions.
14 changes: 7 additions & 7 deletions Linguard/Cli.Test/AddClientCommandShould.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public async Task CreateRandomClient() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

var commandLine = $"{commandName} --interface {iface.Name}";

Expand All @@ -41,7 +41,7 @@ public async Task CreateClientWithName() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

const string name = "bob";
var commandLine = $"{commandName} --interface {iface.Name} --name {name}";
Expand All @@ -59,7 +59,7 @@ public async Task CreateClientWithEndpoint() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

const string endpoint = "vpn.example2.com";
var commandLine = $"{commandName} --interface {iface.Name} --endpoint {endpoint}";
Expand All @@ -77,7 +77,7 @@ public async Task CreateClientWithIPs() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

var faker = new Faker();
var ipv4 = $"{faker.Internet.Ip()}/24";
Expand All @@ -99,7 +99,7 @@ public async Task CreateClientWithDns() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

var dns = "my.dns.com";
var commandLine = $"{commandName} --interface {iface.Name} --dns1 {dns}";
Expand All @@ -119,7 +119,7 @@ public async Task CreateClientWithTwoDns() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

var dns1 = "my.dns.com";
var dns2 = "8.8.8.8";
Expand All @@ -140,7 +140,7 @@ public async Task CreateClientWithAllowedIPs() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

const string allowedIPs = "10.7.1.2/24 10.7.1.3/24 10.8.1.3/24";
var commandLine = $"{commandName} --interface {iface.Name} --allowedIps {allowedIPs}";
Expand Down
8 changes: 4 additions & 4 deletions Linguard/Cli.Test/AddInterfaceCommandShould.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public async Task CreateInterfaceWithNoArguments() {
await app.App.RunAsync(commandLine);
var errors = app.Error.GetString();
errors.Should().BeEmpty();
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Should().NotBeEmpty();
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Should().NotBeEmpty();
}

[Fact]
Expand All @@ -37,7 +37,7 @@ public async Task CreateTwoInterfacesWithNoArguments() {
await app.App.RunAsync(commandLine);
var errors = app.Error.GetString();
errors.Should().BeEmpty();
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Should().HaveCount(2);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Should().HaveCount(2);
}

[Fact]
Expand All @@ -51,7 +51,7 @@ public async Task CreateInterfaceWithDefinedName() {
await app.App.RunAsync(commandLine);
var errors = app.Error.GetString();
errors.Should().BeEmpty();
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Should().NotBeEmpty();
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Should().NotBeEmpty();
}

[Fact]
Expand All @@ -66,6 +66,6 @@ public async Task CreateInterfaceWithDefinedGateway() {
await app.App.RunAsync(commandLine);
var errors = app.Error.GetString();
errors.Should().BeEmpty();
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Should().NotBeEmpty();
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Should().NotBeEmpty();
}
}
2 changes: 1 addition & 1 deletion Linguard/Cli.Test/AddInterfaceCommandShouldNot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public async Task AddTwoInterfacesWithTheSameName() {
await app.App.RunAsync(commandLine);
var errors = app.Error.GetString();
errors.Should().Contain(Validation.InterfaceNameAlreadyInUse);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Should().HaveCount(1);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Should().HaveCount(1);
}

[Fact]
Expand Down
6 changes: 3 additions & 3 deletions Linguard/Cli.Test/ListClientsCommandShould.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public async Task ListOnePeer() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);
var peer = GeneratePeer(app.ConfigurationManager, iface);
iface.Clients.Add(peer);

Expand All @@ -45,9 +45,9 @@ public async Task ListPeersForSpecificInterface() {
var app = Utils.BuildTestApp(command);

var iface1 = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface1);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface1);
var iface2 = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface2);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface2);
var peer = GeneratePeer(app.ConfigurationManager, iface1);
iface1.Clients.Add(peer);
iface2.Clients.Add(GeneratePeer(app.ConfigurationManager, iface2));
Expand Down
2 changes: 1 addition & 1 deletion Linguard/Cli.Test/ListInterfacesCommandShould.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public async Task ListOneInterface() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

var commandLine = $"{commandName}";

Expand Down
2 changes: 1 addition & 1 deletion Linguard/Cli.Test/ShowInterfaceCommandShould.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public async Task ShowInterface() {
var commandName = command.GetAttribute<CommandAttribute>().Name!;
var app = Utils.BuildTestApp(command);
var iface = GenerateInterface(app.ConfigurationManager);
app.ConfigurationManager.Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
app.ConfigurationManager.Configuration.Wireguard.Interfaces.Add(iface);

var commandLine = $"{commandName} --name {iface.Name}";

Expand Down
2 changes: 1 addition & 1 deletion Linguard/Cli/Cli.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

<ItemGroup>
<ProjectReference Include="..\Core\Core.csproj" />
<ProjectReference Include="..\Json\Json.csproj" />
<ProjectReference Include="..\Plugins.TrafficDrivers.Json\Plugins.TrafficDrivers.Json.csproj" />
<ProjectReference Include="..\Yaml\Yaml.csproj" />
</ItemGroup>

Expand Down
6 changes: 3 additions & 3 deletions Linguard/Cli/Commands/AddClientCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ public AddClientCommand(IConfigurationManager configurationManager, IClientGener
private readonly ILogger _logger;
private readonly IClientGenerator _generator;
private readonly IConfigurationManager _configurationManager;
private IWireguardConfiguration Configuration
=> _configurationManager.Configuration.GetModule<IWireguardConfiguration>()!;
private IWireguardOptions Options
=> _configurationManager.Configuration.Wireguard;

[CommandOption("name", Description = "Name of the peer.")]
public string? Name { get; set; }
Expand Down Expand Up @@ -78,7 +78,7 @@ public ValueTask ExecuteAsync(IConsole console) {
console.Error.WriteLine(Validation.InterfaceNotFound);
return ValueTask.CompletedTask;
}
var iface = Configuration.Interfaces.SingleOrDefault(i => i.Name.Equals(Interface));
var iface = Options.Interfaces.SingleOrDefault(i => i.Name.Equals(Interface));
if (iface == default) {
console.Error.WriteLine(Validation.InterfaceNotFound);
return ValueTask.CompletedTask;
Expand Down
2 changes: 1 addition & 1 deletion Linguard/Cli/Commands/AddInterfaceCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public virtual ValueTask ExecuteAsync(IConsole console) {
if (!Validate(iface, console)) {
return ValueTask.CompletedTask;
}
Configuration.GetModule<IWireguardConfiguration>()!.Interfaces.Add(iface);
Configuration.Wireguard.Interfaces.Add(iface);
ConfigurationManager.Save();
var msg = $"Added interface '{iface.Name}'.";
Logger.LogInformation(msg);
Expand Down
8 changes: 4 additions & 4 deletions Linguard/Cli/Commands/EditClientCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ public EditClientCommand(IConfigurationManager configurationManager,
private readonly AbstractValidator<Client> _validator;
private readonly ILogger _logger;
private readonly IConfigurationManager _configurationManager;
private IWireguardConfiguration Configuration
=> _configurationManager.Configuration.GetModule<IWireguardConfiguration>()!;
private IWireguardOptions Options
=> _configurationManager.Configuration.Wireguard;

[CommandOption("name", Description = "Current name of the client.", IsRequired = true)]
public string Name { get; set; }
Expand Down Expand Up @@ -77,7 +77,7 @@ private IWireguardConfiguration Configuration
public string? NewInterface { get; set; }

public ValueTask ExecuteAsync(IConsole console) {
var iface = Configuration.Interfaces.SingleOrDefault(i => i.Name.Equals(Interface));
var iface = Options.Interfaces.SingleOrDefault(i => i.Name.Equals(Interface));
if (iface == default) {
console.Error.WriteLine(Validation.InterfaceNotFound);
return ValueTask.CompletedTask;
Expand Down Expand Up @@ -120,7 +120,7 @@ protected void ApplyParametersSetByUser(Client client) {
if (AllowedIPs != default) client.AllowedIPs = AllowedIPs;
if (Endpoint != default) client.Endpoint = Endpoint;
if (NewInterface == default || NewInterface.Equals(Interface)) return;
var iface = Configuration.Interfaces
var iface = Options.Interfaces
.SingleOrDefault(i => i.Name.Equals(NewInterface));
if (iface == default) {
throw new ArgumentException(
Expand Down
2 changes: 1 addition & 1 deletion Linguard/Cli/Commands/EditInterfaceCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public EditInterfaceCommand(IConfigurationManager configurationManager, ILogger
}

public override ValueTask ExecuteAsync(IConsole console) {
var iface = Configuration.GetModule<IWireguardConfiguration>()!
var iface = Configuration.Wireguard
.Interfaces.SingleOrDefault(i => i.Name.Equals(Name));
if (iface == default) {
Logger.LogError($"No interface named '{Name}' was found.");
Expand Down
8 changes: 4 additions & 4 deletions Linguard/Cli/Commands/ListClientsCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,24 @@ public ListClientsCommand(IConfigurationManager configurationManager) {
}

private readonly IConfigurationManager _configurationManager;
private IWireguardConfiguration Configuration
=> _configurationManager.Configuration.GetModule<IWireguardConfiguration>()!;
private IWireguardOptions Options
=> _configurationManager.Configuration.Wireguard;

[CommandOption("interface", Description = "Name of the client's interface.")]
public string? Interface { get; set; } = default;

public ValueTask ExecuteAsync(IConsole console) {
ICollection<Client> peers;
if (Interface != default) {
var iface = Configuration.Interfaces.SingleOrDefault(i => i.Name.Equals(Interface));
var iface = Options.Interfaces.SingleOrDefault(i => i.Name.Equals(Interface));
if (iface == default) {
console.Error.WriteLine(Validation.InterfaceNotFound);
return ValueTask.CompletedTask;
}
peers = iface.Clients;
}
else {
peers = Configuration.Interfaces.SelectMany(i => i.Clients).ToList();
peers = Options.Interfaces.SelectMany(i => i.Clients).ToList();
}
if (!peers.Any()) {
console.Output.WriteLine("There are no clients yet.");
Expand Down
6 changes: 3 additions & 3 deletions Linguard/Cli/Commands/ListInterfacesCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ public ListInterfacesCommand(IConfigurationManager configurationManager) {
}

private readonly IConfigurationManager _configurationManager;
private IWireguardConfiguration Configuration
=> _configurationManager.Configuration.GetModule<IWireguardConfiguration>()!;
private IWireguardOptions Options
=> _configurationManager.Configuration.Wireguard;

public ValueTask ExecuteAsync(IConsole console) {
var interfaces = Configuration.Interfaces;
var interfaces = Options.Interfaces;
if (!interfaces.Any()) {
console.Output.WriteLine("There are no interfaces yet.");
return ValueTask.CompletedTask;
Expand Down
2 changes: 1 addition & 1 deletion Linguard/Cli/Commands/ShowClientCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public ShowClientCommand(IConfigurationManager configurationManager) {
}

public ValueTask ExecuteAsync(IConsole console) {
var peer = Configuration.GetModule<IWireguardConfiguration>()!.Interfaces
var peer = Configuration.Wireguard.Interfaces
.SingleOrDefault(i => i.Name.Equals(Interface))
?.Clients
.SingleOrDefault(c => c.Name.Equals(Name));
Expand Down
2 changes: 1 addition & 1 deletion Linguard/Cli/Commands/ShowInterfaceCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public ShowInterfacesCommand(IConfigurationManager configurationManager) {
}

public ValueTask ExecuteAsync(IConsole console) {
var iface = Configuration.GetModule<IWireguardConfiguration>()!
var iface = Configuration.Wireguard
.Interfaces.SingleOrDefault(i => i.Name.Equals(Name));
if (iface == default) {
console.Error.WriteLine(Validation.InterfaceNotFound);
Expand Down
6 changes: 3 additions & 3 deletions Linguard/Cli/DefaultYamlConfigurationSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
using Linguard.Core.Configuration.Serialization;
using Linguard.Core.Drivers.TrafficStorage;
using Linguard.Core.Models.Wireguard;
using Linguard.Json;
using Linguard.Plugins.TrafficDrivers.Json;
using Linguard.Yaml.Serialization;
using YamlDotNet.Serialization.NamingConventions;
using UriTypeConverter = Linguard.Yaml.Serialization.UriTypeConverter;
Expand All @@ -18,8 +18,8 @@ public static class DefaultYamlConfigurationSerializer {
.WithTypeConverter<NetworkInterfaceTypeConverter>()
.WithTypeConverter<UriTypeConverter>()
.WithTypeMapping<IConfiguration, ConfigurationBase>()
.WithTypeMapping<IWireguardConfiguration, WireguardConfiguration>()
.WithTypeMapping<ITrafficConfiguration, TrafficConfiguration>()
.WithTypeMapping<IWireguardOptions, WireguardOptions>()
.WithTypeMapping<ITrafficOptions, TrafficOptions>()
.WithTypeMapping<ITrafficStorageDriver, TrafficStorageDriver>()
.WithTypeMapping<ISet<Interface>, HashSet<Interface>>()
.WithTypeMapping<ISet<Client>, HashSet<Client>>()
Expand Down
36 changes: 18 additions & 18 deletions Linguard/Core.Test/Mocks/DefaultConfiguration.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Core.Test.Stubs;
using Linguard.Core.Configuration;
using Linguard.Core.Drivers.TrafficStorage;
using Linguard.Core.Models.Wireguard;
Expand All @@ -11,22 +12,15 @@ namespace Core.Test.Mocks;
public sealed class DefaultConfiguration : Mock<IConfiguration> {

public DefaultConfiguration() {
SetupProperty(c => c.Modules, new HashSet<IConfigurationModule> {
GetWireguardConfigurationMock().Object,
GetTrafficConfigurationMock().Object
});
SetupProperty(o => o.Wireguard, GetWireguardConfigurationMock().Object);
SetupProperty(o => o.Traffic, GetTrafficConfigurationMock().Object);
SetupProperty(o => o.Plugins, GetPluginConfigurationMock().Object);
Setup(o => o.Clone()).Returns(Object);
Setup(o => o.GetModule<IConfigurationModule>())
.Returns(new InvocationFunc(invocation => {
var type = invocation.Method.GetGenericArguments()[0];
return Object.Modules.SingleOrDefault(m
=> m.GetType() == type || m.GetType().GetInterface(type.Name) != default);
}));
}

private Mock<IWireguardConfiguration> GetWireguardConfigurationMock() {
private Mock<IWireguardOptions> GetWireguardConfigurationMock() {
var interfaces = new HashSet<Interface>();
var wireguardConfiguration = new Mock<IWireguardConfiguration>()
var mock = new Mock<IWireguardOptions>()
.SetupProperty(c => c.Interfaces, interfaces)
.SetupProperty(c => c.Endpoint,
new Uri("vpn.example.com", UriKind.RelativeOrAbsolute))
Expand All @@ -36,20 +30,26 @@ private Mock<IWireguardConfiguration> GetWireguardConfigurationMock() {
.SetupProperty(c => c.PrimaryDns,
new Uri("8.8.8.8", UriKind.RelativeOrAbsolute))
.SetupProperty(c => c.SecondaryDns, default);
wireguardConfiguration.Setup(o => o.GetInterface(It.IsAny<Client>()))
mock.Setup(o => o.GetInterface(It.IsAny<Client>()))
.Returns<Client>(c =>
interfaces.SingleOrDefault(i => i.Clients.Contains(c))
);
wireguardConfiguration.Setup(o => o.GetInterface(It.IsAny<string>()))
mock.Setup(o => o.GetInterface(It.IsAny<string>()))
.Returns<string>(pubkey =>
interfaces.SingleOrDefault(i => i.Clients.Any(c => c.PublicKey == pubkey))
);
return wireguardConfiguration;
return mock;
}

private Mock<IPluginOptions> GetPluginConfigurationMock() {
var mock = new Mock<IPluginOptions>();
return mock;
}

private Mock<ITrafficConfiguration> GetTrafficConfigurationMock() {
var mock = new Mock<ITrafficConfiguration>()
.SetupProperty(c => c.StorageDriver, new Mock<ITrafficStorageDriver>().Object);
private Mock<ITrafficOptions> GetTrafficConfigurationMock() {
var mock = new Mock<ITrafficOptions>()
.SetupProperty(c => c.StorageDriver, new TrafficStorageDriverStub())
.SetupProperty(c => c.Enabled, true);
return mock;
}
}
1 change: 0 additions & 1 deletion Linguard/Core.Test/Mocks/DefaultConfigurationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@ namespace Core.Test.Mocks;
public class DefaultConfigurationManager : Mock<IConfigurationManager> {
public DefaultConfigurationManager() {
SetupProperty(c => c.Configuration, new DefaultConfiguration().Object);
SetupProperty(c => c.WorkingDirectory, new Mock<IWorkingDirectory>().Object);
}
}
Loading

0 comments on commit 576f5af

Please sign in to comment.