From f329be004c93ef2ca8418141d27daeae5e6f4d74 Mon Sep 17 00:00:00 2001 From: Elias Stepanik Date: Wed, 15 Mar 2023 13:27:24 +0100 Subject: [PATCH] Added Support for multiple Account --- DDNSUpdater/Models/Domain.cs | 13 +++ DDNSUpdater/Services/DDNSService.cs | 133 ++++++++++++++++------------ Dockerfile | 2 - docker-compose.yml | 4 +- 4 files changed, 93 insertions(+), 59 deletions(-) create mode 100644 DDNSUpdater/Models/Domain.cs diff --git a/DDNSUpdater/Models/Domain.cs b/DDNSUpdater/Models/Domain.cs new file mode 100644 index 0000000..4561060 --- /dev/null +++ b/DDNSUpdater/Models/Domain.cs @@ -0,0 +1,13 @@ +namespace DDNSUpdater.Models; + +public class Domain +{ + public Domain(string domain, string key) + { + DomainString = domain; + Key = key; + } + + public string DomainString { get; set; } + public string Key { get; set; } +} \ No newline at end of file diff --git a/DDNSUpdater/Services/DDNSService.cs b/DDNSUpdater/Services/DDNSService.cs index 4df6d24..75014df 100644 --- a/DDNSUpdater/Services/DDNSService.cs +++ b/DDNSUpdater/Services/DDNSService.cs @@ -1,5 +1,7 @@ -using System.Net; +using System.Collections; +using System.Net; using DDNSUpdater.Interfaces; +using DDNSUpdater.Models; using DDNSUpdater.Models.Requests; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; @@ -11,28 +13,28 @@ namespace DDNSUpdater.Services; public class DDNSService : IDDNSService { - private string UpdateURL { get; set; } - public string APIKey { get; set; } - public List Domains { get; set; } + private List UpdateURLs { get; set; } + public List Domains { get; set; } private readonly ILogger _logger; public DDNSService(ILogger logger,IConfiguration configuration) { _logger = logger; - APIKey = configuration.GetValue("APIKey"); - if(Environment.GetEnvironmentVariable("API_Key") != "") - APIKey = Environment.GetEnvironmentVariable("API_Key"); - logger.LogDebug($"Got the Following Key: {APIKey}"); - Domains = configuration.GetSection("Domains").Get>(); - if (Environment.GetEnvironmentVariable("DOMAINS") != "") + foreach (DictionaryEntry de in Environment.GetEnvironmentVariables()) { - var domainsRaw = Environment.GetEnvironmentVariable("DOMAINS"); - var domains = new List(); - domains = domainsRaw.Split(",").ToList(); - domains.ForEach(x=>x.Replace(",","")); - Domains = domains; + if (de.Key.ToString().Contains("DOMAIN")) + { + var key = de.Value.ToString().Split("-").ToList(); + + key.ForEach(x=>x.Replace("-","")); + + var env = de.Value.ToString().Split(";").ToList(); + + + Domains[int.Parse(key[1])] = new Domain(env[0],env[1]); + } } @@ -41,62 +43,83 @@ public class DDNSService : IDDNSService public async void Start() { - UpdateURL = await GetUpdateURL(); - _logger.LogInformation("Got new Update URL: " + UpdateURL); + UpdateURLs = await GetUpdateURLs(); + _logger.LogInformation("Got new Update URLs: " + UpdateURLs); } public async void Update() { - var client = new RestClient(UpdateURL); - var request = new RestRequest("",Method.Get); - request.AddHeader("Cookie", "0b04270753322c986927738ac2b6c0d8=ea099cbd8a6109c688f9831d6bbfa7a1; 5b66c83e4535f5f6bef8295496cfe559=e85228fccae97f107478bf9ef664e4eb; DPX=v1:ghOJrOzFTj:htgOaKFW:63d3bf8f:de"); - var body = @""; - request.AddParameter("text/plain", body, ParameterType.RequestBody); + foreach (var UpdateURL in UpdateURLs) + { + var client = new RestClient(UpdateURL); + var request = new RestRequest("",Method.Get); + request.AddHeader("Cookie", "0b04270753322c986927738ac2b6c0d8=ea099cbd8a6109c688f9831d6bbfa7a1; 5b66c83e4535f5f6bef8295496cfe559=e85228fccae97f107478bf9ef664e4eb; DPX=v1:ghOJrOzFTj:htgOaKFW:63d3bf8f:de"); + var body = @""; + request.AddParameter("text/plain", body, ParameterType.RequestBody); - try - { - var response = await client.ExecuteAsync(request); - _logger.LogInformation("Send Update to Ionos"); + try + { + var response = await client.ExecuteAsync(request); + _logger.LogInformation("Send Update to Ionos"); + } + catch (Exception e) + { + _logger.LogError(e.Message); + throw; + } } - catch (Exception e) - { - _logger.LogError(e.Message); - throw; - } - + } public async void SetUpdateURL() { - UpdateURL = await GetUpdateURL(); + UpdateURLs = await GetUpdateURLs(); } - private async Task GetUpdateURL() + private async Task> GetUpdateURLs() { - var dyndns = new DynamicDns() + List updateURLs = new List(); + + Dictionary> domainDict = new Dictionary>(); + foreach (var domain in Domains) { - Domains = Domains, - Description = "My DynamicDns" - }; - var content = JsonConvert.SerializeObject(dyndns); - var client = new RestClient("https://api.hosting.ionos.com/dns/v1"); - var request = new RestRequest("/dyndns", Method.Post); - - - request.AddHeader("X-API-Key", APIKey); - - request.AddStringBody(content, ContentType.Json); - - - try - { - var response = client.ExecutePost(request); - return response.Data.UpdateUrl; + if (!domainDict.ContainsKey(domain.Key)) + { + domainDict.Add(domain.Key, new List()); + } + + domainDict[domain.Key].Add(domain.DomainString); } - catch (Exception error) + + foreach (var domainList in domainDict) { - _logger.LogError(error.Message); - return ""; + var dyndns = new DynamicDns() + { + Domains = domainList.Value, + Description = "My DynamicDns" + }; + var content = JsonConvert.SerializeObject(dyndns); + var client = new RestClient("https://api.hosting.ionos.com/dns/v1"); + var request = new RestRequest("/dyndns", Method.Post); + + + request.AddHeader("X-API-Key", domainList.Key); + + request.AddStringBody(content, ContentType.Json); + + + try + { + var response = client.ExecutePost(request); + updateURLs.Add(response.Data.UpdateUrl); + } + catch (Exception error) + { + _logger.LogError(error.Message); + return null; + } } + + return updateURLs; } } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index d641494..9ce6e81 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,6 +15,4 @@ RUN dotnet publish "DDNSUpdater.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . -ENV API_Key=default -ENV DOMAINS=default ENTRYPOINT ["dotnet", "DDNSUpdater.dll"] diff --git a/docker-compose.yml b/docker-compose.yml index 63812de..ac557c1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,5 +7,5 @@ services: tty: true stdin_open: true environment: - APIKey: "" - Domains_0: "*.test.de" + Domains_0: "*.test.de;Key" + Domains_1: "*.test.de;Key"