mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-19 06:54:19 +01:00
Check tor services in the background
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
36
BTCPayServer/HostedServices/TorServicesHostedService.cs
Normal file
36
BTCPayServer/HostedServices/TorServicesHostedService.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>();
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
Reference in New Issue
Block a user