-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHosts.cs
100 lines (81 loc) · 3.73 KB
/
Hosts.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using Docker.DotNet;
namespace docker_hosts_writer
{
public class DockerHosts
{
public string IPAddress { get; set; } = String.Empty;
public List<string> Domain { get; set; } = [];
}
public class Hosts
{
private readonly ILogger<Hosts> _logger;
private DockerClient? _dockerClient;
private Dictionary<string, Dictionary<string, DockerHosts>> _dockerHosts;
private string _domainPrefix = String.Empty;
private string _domainSuffix = String.Empty;
public Hosts(ILogger<Hosts> logger)
{
_logger = logger;
_dockerHosts = new Dictionary<string, Dictionary<string, DockerHosts>>();
}
public void SetDockerClient(DockerClient dockerClient)
{
_dockerClient = dockerClient;
}
public void SetPrefixSuffix(
string defaultPrefix,
string defaultSuffix)
{
_domainPrefix = defaultPrefix;
_domainSuffix = defaultSuffix;
}
public Dictionary<string, Dictionary<string, DockerHosts>> GetHost() => _dockerHosts;
public async Task AddHost(string containerId, string networkName, CancellationToken cancellationToken)
{
var domains = new List<string>();
var containerDetails = await _dockerClient!.Containers.InspectContainerAsync(containerId, cancellationToken);
domains.Add(containerDetails.Config.Hostname);
domains.Add(containerDetails.Name.Replace("/", ""));
if (containerDetails.Config.Labels.ContainsKey("com.docker.compose.project"))
domains.Add(containerDetails.Config.Labels["com.docker.compose.project"]);
if (containerDetails.Config.Labels.ContainsKey("com.docker.compose.service"))
domains.Add(containerDetails.Config.Labels["com.docker.compose.service"]);
var network = containerDetails.NetworkSettings.Networks[networkName];
if (network != null)
AddHost(containerId, networkName, network.IPAddress, domains);
}
private void AddHost(string containerId, string networkName, string ip, List<string> domains)
{
domains = domains.Distinct().Select(domain =>
{
domain = !String.IsNullOrEmpty(_domainPrefix) && !domain.StartsWith(_domainSuffix) ? $"{_domainPrefix}{domain}" : domain;
domain = !String.IsNullOrEmpty(_domainSuffix) && !domain.EndsWith(_domainSuffix) ? $"{domain}{_domainSuffix}" : domain;
return domain;
}).ToList();
if (!_dockerHosts.ContainsKey(containerId))
{
_dockerHosts.Add(containerId, new Dictionary<string, DockerHosts>{{
networkName, new DockerHosts() {
IPAddress = ip,
Domain = domains
}}});
}
else
{
if (_dockerHosts[containerId].ContainsKey(networkName))
_dockerHosts[containerId].Remove(networkName);
_dockerHosts[containerId].Add(networkName, new DockerHosts()
{
IPAddress = ip,
Domain = domains
});
}
}
public void RemoveHost(string containerId, string networkName)
{
_logger.LogInformation(3001, $"Removing hosts (containerID={containerId.Substring(0, 12)}, networkName={networkName})");
if (_dockerHosts.ContainsKey(containerId))
_dockerHosts[containerId].Remove(networkName);
}
}
}