From 801061f4f25485011d99f4c335b5054f2d2d8dec Mon Sep 17 00:00:00 2001 From: ShaoHua <345265198@qq.com> Date: Sun, 16 Jul 2023 23:50:15 +0800 Subject: [PATCH] if this dns record is not exits.create the dns record. --- Hua.DDNS.Test/Hua.DDNS.Test.csproj | 4 +- Hua.DDNS/DDNSProviders/Ali/AliDDNSProvider.cs | 7 +++ .../Dnspod/DnspodDDNSProvider.cs | 15 +++++++ Hua.DDNS/DDNSProviders/IDDNSProvider.cs | 7 +++ .../Namesilo/NamesiloDDNSProvider.cs | 31 +++++++++++++ Hua.DDNS/Hua.DDNS.csproj | 39 ++++++++-------- Hua.DDNS/Jobs/NewJob.cs | 45 +++++++++++++------ Hua.DDNS/Models/DnsRecord.cs | 15 ++++++- Hua.DDNS/Models/MappingProfile.cs | 8 ++++ 9 files changed, 133 insertions(+), 38 deletions(-) diff --git a/Hua.DDNS.Test/Hua.DDNS.Test.csproj b/Hua.DDNS.Test/Hua.DDNS.Test.csproj index 60b9d56..da18ea0 100644 --- a/Hua.DDNS.Test/Hua.DDNS.Test.csproj +++ b/Hua.DDNS.Test/Hua.DDNS.Test.csproj @@ -1,7 +1,7 @@  - net6.0 + net7.0 enable enable @@ -9,7 +9,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Hua.DDNS/DDNSProviders/Ali/AliDDNSProvider.cs b/Hua.DDNS/DDNSProviders/Ali/AliDDNSProvider.cs index 7398830..70d1348 100644 --- a/Hua.DDNS/DDNSProviders/Ali/AliDDNSProvider.cs +++ b/Hua.DDNS/DDNSProviders/Ali/AliDDNSProvider.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using AlibabaCloud.OpenApiClient.Models; using AlibabaCloud.SDK.Alidns20150109; using AlibabaCloud.SDK.Alidns20150109.Models; +using AlibabaCloud.TeaUtil.Models; using AutoMapper; using Hua.DDNS.Common.Config.Options; using Hua.DDNS.Models; @@ -55,6 +56,12 @@ namespace Hua.DDNS.DDNSProviders.Ali return _mapper.Map>(record); } + public async Task CreateDnsRecordAsync(DnsRecord record) + { + var rep = await _client.AddDomainRecordAsync(_mapper.Map(record)); + return record; + } + /// /// 变更解析记录列表 /// diff --git a/Hua.DDNS/DDNSProviders/Dnspod/DnspodDDNSProvider.cs b/Hua.DDNS/DDNSProviders/Dnspod/DnspodDDNSProvider.cs index cd73b5f..b7ad0f2 100644 --- a/Hua.DDNS/DDNSProviders/Dnspod/DnspodDDNSProvider.cs +++ b/Hua.DDNS/DDNSProviders/Dnspod/DnspodDDNSProvider.cs @@ -12,12 +12,14 @@ using TencentCloud.Common; using TencentCloud.Dnspod.V20210323; using System.Net; using TencentCloud.Dnspod.V20210323.Models; +using Newtonsoft.Json.Linq; namespace Hua.DDNS.DDNSProviders.Dnspod { /// /// DdnsProvider for Dnspod + /// /// public class DnspodDdnsProvider : IDdnsProvider { @@ -53,6 +55,19 @@ namespace Hua.DDNS.DDNSProviders.Dnspod return _mapper.Map>(recordList); } + public async Task CreateDnsRecordAsync(DnsRecord record) + { + var response = await _client.CreateRecord(new CreateRecordRequest() + { + Domain = _ddnsOption.Domain, + Value = record.Ip, + RecordLine = "默认", + RecordType = record.RecordType, + TTL = Convert.ToUInt32(record.TTL), + }); + return record; + } + public async Task> ModifyRecordListAsync(string newIp, IEnumerable records) { var rep = await _client.ModifyRecordBatch(new ModifyRecordBatchRequest() diff --git a/Hua.DDNS/DDNSProviders/IDDNSProvider.cs b/Hua.DDNS/DDNSProviders/IDDNSProvider.cs index 840c414..3cce1b6 100644 --- a/Hua.DDNS/DDNSProviders/IDDNSProvider.cs +++ b/Hua.DDNS/DDNSProviders/IDDNSProvider.cs @@ -21,6 +21,13 @@ namespace Hua.DDNS.DDNSProviders Task?> GetRecordListAsync(); + /// + /// 创建解析记录 + /// + /// + /// + Task CreateDnsRecordAsync(DnsRecord record); + /// /// 修改域名解析记录 /// diff --git a/Hua.DDNS/DDNSProviders/Namesilo/NamesiloDDNSProvider.cs b/Hua.DDNS/DDNSProviders/Namesilo/NamesiloDDNSProvider.cs index 1ddcd08..976adb7 100644 --- a/Hua.DDNS/DDNSProviders/Namesilo/NamesiloDDNSProvider.cs +++ b/Hua.DDNS/DDNSProviders/Namesilo/NamesiloDDNSProvider.cs @@ -1,7 +1,9 @@ using System.Xml; using AutoMapper; using Hua.DDNS.Models; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; +using Newtonsoft.Json; namespace Hua.DDNS.DDNSProviders.Namesilo { @@ -60,6 +62,35 @@ namespace Hua.DDNS.DDNSProviders.Namesilo }).ToList(); } + public async Task CreateDnsRecordAsync(DnsRecord dnsRecord) + { + var host = dnsRecord.Host[..(dnsRecord.Host.Length - dnsRecord.Domain.Length - 1)]; + //https://www.namesilo.com/api/dnsAddRecord?version=1&type=xml&key=12345&domain=namesilo.com&rrtype=A&rrhost=test&rrvalue=55.55.55.55&rrttl=7207 + var url = $"https://www.namesilo.com/api/dnsUpdateRecord?version=1&type=xml&key={_namesiloOption.ApiKey}&domain={dnsRecord.Domain}&rrtype={dnsRecord.RecordType}&rrid={dnsRecord.Id}&rrhost={host}&rrvalue={dnsRecord.Ip}&rrttl={dnsRecord.TTL}"; + + using var client = new HttpClient(); + { + + var response = await client.GetAsync(url); + var content = await response.Content.ReadAsStringAsync(); + + var reply = new XmlDocument(); + reply.LoadXml(content); + var status = reply.SelectSingleNode("/namesilo/reply/code/text()"); + if (status == null) + { + await Console.Error.WriteLineAsync($"Failed to create record: '{JsonConvert.SerializeObject(dnsRecord)}'"); + } + + if (status.Value == "300") + { + return null; + //continue; + } + } + return dnsRecord; + } + public async Task> ModifyRecordListAsync(string newIp, IEnumerable records) { foreach (var dnsRecord in records) diff --git a/Hua.DDNS/Hua.DDNS.csproj b/Hua.DDNS/Hua.DDNS.csproj index efbf6b7..7461907 100644 --- a/Hua.DDNS/Hua.DDNS.csproj +++ b/Hua.DDNS/Hua.DDNS.csproj @@ -1,37 +1,36 @@ - + - net6.0 + net7.0 enable enable + true dotnet-Hua.DDNS-C4DADDFF-6D5B-4BD5-AB11-02F07B517CAC Windows - true true - + - - - - - - - + + + + + + - - - - - - - - + + + + + + + + - + diff --git a/Hua.DDNS/Jobs/NewJob.cs b/Hua.DDNS/Jobs/NewJob.cs index 99d1f47..edfc156 100644 --- a/Hua.DDNS/Jobs/NewJob.cs +++ b/Hua.DDNS/Jobs/NewJob.cs @@ -21,6 +21,7 @@ using TencentCloud.Dnspod.V20210323.Models; using Tea; using Tea.Utils; +using System.Net.Sockets; namespace Hua.DDNS.Jobs { @@ -45,31 +46,47 @@ namespace Hua.DDNS.Jobs public async Task Execute(IJobExecutionContext context) { + //2.获取DNS记录 + IDdnsProvider? ddnsProvider = _ddnsOption.Platform switch + { + PlatformEnum.Namesilo => _serviceProvider.GetRequiredService(), + PlatformEnum.Tencent => _serviceProvider.GetRequiredService(), + PlatformEnum.Ali => _serviceProvider.GetRequiredService(), + _ => null + }; + newIp = await _httpHelper.GetCurrentPublicIpv4(); try - { + { //1. 获取当前机器ip var domain = $"{_ddnsOption.SubDomainArray.First()}.{_ddnsOption.Domain}"; - var oldIp = (await Dns.GetHostEntryAsync(domain)).AddressList.First(); - newIp = await _httpHelper.GetCurrentPublicIpv4(); + IPAddress oldIp = null; + oldIp = (await Dns.GetHostEntryAsync(domain)).AddressList.First(); + //1.1 如果当前dns记录与实际dns记录一致,跳出本次执行 if (newIp == oldIp.ToString()) return; - //2.获取DNS记录 - IDdnsProvider? ddnsProvider = _ddnsOption.Platform switch - { - PlatformEnum.Namesilo => _serviceProvider.GetRequiredService(), - PlatformEnum.Tencent => _serviceProvider.GetRequiredService(), - PlatformEnum.Ali => _serviceProvider.GetRequiredService(), - _ => null - }; var dnsRecordList = await ddnsProvider!.GetRecordListAsync(); - var record = dnsRecordList.FirstOrDefault(m => m.Ip == newIp && _ddnsOption.SubDomainArray.Any(n => m.SubDomain == n)); - if (record != null && record.Ip == newIp) return;//如果记录已经变更,不调用更新接口 + var record = dnsRecordList.FirstOrDefault(m => + m.Ip == newIp && _ddnsOption.SubDomainArray.Any(n => m.SubDomain == n)); + if (record != null && record.Ip == newIp) return; //如果记录已经变更,不调用更新接口 //3.比较并更新 - await ddnsProvider.ModifyRecordListAsync(newIp, dnsRecordList.Where(m => m.Ip != newIp && _ddnsOption.SubDomainArray.Any(n => m.SubDomain == n))); + await ddnsProvider.ModifyRecordListAsync(newIp, + dnsRecordList.Where(m => m.Ip != newIp && _ddnsOption.SubDomainArray.Any(n => m.SubDomain == n))); + } + catch (SocketException e) + { + if (e.Message.Contains("不知道这样的主机")) + { + await ddnsProvider.CreateDnsRecordAsync(new DnsRecord() + { + Ip = newIp, + Host = _ddnsOption.SubDomainArray.First(), + Domain = _ddnsOption.Domain, + }); + } } catch (Exception e) { diff --git a/Hua.DDNS/Models/DnsRecord.cs b/Hua.DDNS/Models/DnsRecord.cs index 27691d1..11d8434 100644 --- a/Hua.DDNS/Models/DnsRecord.cs +++ b/Hua.DDNS/Models/DnsRecord.cs @@ -13,6 +13,17 @@ public class DnsRecord public string Host { get; set; } public string SubDomain { get; set; } public string Domain { get; set; } - public string TTL { get; set; } - public string RecordType { get; set; } + public string TTL { get; set; } = "10"; + public string RecordType { get; set; } = "A"; + + public DnsRecord(string ip,string domain) + { + Ip = ip; + Host = domain; + } + + public DnsRecord() + { + + } } \ No newline at end of file diff --git a/Hua.DDNS/Models/MappingProfile.cs b/Hua.DDNS/Models/MappingProfile.cs index 588ac8c..d6a4e20 100644 --- a/Hua.DDNS/Models/MappingProfile.cs +++ b/Hua.DDNS/Models/MappingProfile.cs @@ -34,6 +34,14 @@ namespace Hua.DDNS.Models .ForMember(dest => dest.Ip, opt => opt.MapFrom(src => src.Value)) .ForMember(dest => dest.SubDomain, opt => opt.MapFrom(src => src.Name)) ; + CreateMap() + //.ForMember(dest => dest., opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.RecordType)) + .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Ip)) + .ForMember(dest => dest.RR, opt => opt.MapFrom(src => src.SubDomain)) + .ForMember(dest => dest.DomainName, opt => opt.MapFrom(src => src.Domain)) + ; + } } }