Check tor services in the background

This commit is contained in:
nicolas.dorier
2019-03-17 21:07:24 +09:00
parent ea02d77e69
commit e3a8892d24
5 changed files with 63 additions and 11 deletions

View File

@@ -446,7 +446,7 @@ namespace BTCPayServer.Controllers
} }
[Route("server/services")] [Route("server/services")]
public async Task<IActionResult> Services() public IActionResult Services()
{ {
var result = new ServicesViewModel(); var result = new ServicesViewModel();
result.ExternalServices = _Options.ExternalServices; result.ExternalServices = _Options.ExternalServices;
@@ -466,7 +466,7 @@ namespace BTCPayServer.Controllers
Link = this.Url.Action(nameof(SSHService)) Link = this.Url.Action(nameof(SSHService))
}); });
} }
foreach(var torService in await _torServices.GetServices()) foreach(var torService in _torServices.Services)
{ {
if (torService.VirtualPort == 80) if (torService.VirtualPort == 80)
{ {

View File

@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Configuration;
using BTCPayServer.Services;
using Microsoft.Extensions.Hosting;
namespace BTCPayServer.HostedServices
{
public class TorServicesHostedService : BaseAsyncService
{
private readonly BTCPayServerOptions _options;
private readonly TorServices _torServices;
public TorServicesHostedService(BTCPayServerOptions options, TorServices torServices)
{
_options = options;
_torServices = torServices;
}
internal override Task[] InitializeTasks()
{
// TODO: We should report auto configured services (like bitcoind, lnd or clightning)
if (string.IsNullOrEmpty(_options.TorrcFile))
return Array.Empty<Task>();
return new Task[] { CreateLoopTask(RefreshTorServices) };
}
async Task RefreshTorServices()
{
await _torServices.Refresh();
await Task.Delay(TimeSpan.FromSeconds(120), Cancellation);
}
}
}

View File

@@ -189,6 +189,7 @@ namespace BTCPayServer.Hosting
services.AddSingleton<IHostedService, RatesHostedService>(); services.AddSingleton<IHostedService, RatesHostedService>();
services.AddSingleton<IHostedService, BackgroundJobSchedulerHostedService>(); services.AddSingleton<IHostedService, BackgroundJobSchedulerHostedService>();
services.AddSingleton<IHostedService, AppHubStreamer>(); services.AddSingleton<IHostedService, AppHubStreamer>();
services.AddSingleton<IHostedService, TorServicesHostedService>();
services.AddSingleton<IHostedService, PaymentRequestStreamer>(); services.AddSingleton<IHostedService, PaymentRequestStreamer>();
services.AddSingleton<IBackgroundJobClient, BackgroundJobClient>(); services.AddSingleton<IBackgroundJobClient, BackgroundJobClient>();
services.AddTransient<IConfigureOptions<MvcOptions>, BTCPayClaimsFilter>(); services.AddTransient<IConfigureOptions<MvcOptions>, BTCPayClaimsFilter>();

View File

@@ -1,9 +1,11 @@
using System; using System;
using Microsoft.Extensions.Logging;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using BTCPayServer.Configuration; using BTCPayServer.Configuration;
using BTCPayServer.Logging;
namespace BTCPayServer.Services namespace BTCPayServer.Services
{ {
@@ -15,19 +17,31 @@ namespace BTCPayServer.Services
_Options = options; _Options = options;
} }
public async Task<TorService[]> GetServices() public TorService[] Services { get; internal set; } = Array.Empty<TorService>();
internal async Task Refresh()
{ {
if (string.IsNullOrEmpty(_Options.TorrcFile) || !File.Exists(_Options.TorrcFile)) if (string.IsNullOrEmpty(_Options.TorrcFile) || !File.Exists(_Options.TorrcFile))
return Array.Empty<TorService>(); {
if (!string.IsNullOrEmpty(_Options.TorrcFile))
Logs.PayServer.LogWarning("Torrc file is not found");
Services = Array.Empty<TorService>();
return;
}
List<TorService> result = new List<TorService>(); List<TorService> result = new List<TorService>();
try try
{ {
var torrcContent = await File.ReadAllTextAsync(_Options.TorrcFile); var torrcContent = await File.ReadAllTextAsync(_Options.TorrcFile);
if (!Torrc.TryParse(torrcContent, out var torrc)) if (!Torrc.TryParse(torrcContent, out var torrc))
return Array.Empty<TorService>(); {
Logs.PayServer.LogWarning("Torrc file could not be parsed");
Services = Array.Empty<TorService>();
return;
}
var services = torrc.ServiceDirectories.SelectMany(d => d.ServicePorts.Select(p => (Directory: new DirectoryInfo(d.DirectoryPath), VirtualPort: p.VirtualPort))) var services = torrc.ServiceDirectories.SelectMany(d => d.ServicePorts.Select(p => (Directory: new DirectoryInfo(d.DirectoryPath), VirtualPort: p.VirtualPort)))
.Select(d => (ServiceName: d.Directory.Name, .Select(d => (ServiceName: d.Directory.Name,
ReadingLines: System.IO.File.ReadAllLinesAsync(Path.Combine(d.Directory.FullName, "hostname")), ReadingLines: System.IO.File.ReadAllLinesAsync(Path.Combine(d.Directory.FullName, "hostname")),
VirtualPort: d.VirtualPort)) VirtualPort: d.VirtualPort))
.ToArray(); .ToArray();
@@ -46,16 +60,17 @@ namespace BTCPayServer.Services
torService.ServiceType = TorServiceType.BTCPayServer; torService.ServiceType = TorServiceType.BTCPayServer;
result.Add(torService); result.Add(torService);
} }
catch catch (Exception ex)
{ {
Logs.PayServer.LogWarning(ex, $"Error while reading hidden service {service.ServiceName} configuration");
} }
} }
} }
catch catch (Exception ex)
{ {
Logs.PayServer.LogWarning(ex, $"Error while reading torrc file");
} }
return result.ToArray(); Services = result.ToArray();
} }
} }

View File

@@ -79,7 +79,7 @@
</div> </div>
} }
@if (Model.TorServices.Length != 0) @if (Model.TorServices.Count != 0)
{ {
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">