private void SyncFromInternetX() { //load from internet x this.LogInfo("Running full sync from InternetX to Imscp..."); autodnsRecheckTime = DateTime.Now.AddHours(1); autodnsCache.Clear(); warningsSent.Clear(); foreach (Autodns autodns in autodnsAccounts) { this.LogInfo("Sync {0}", autodns); string[] zones = autodns.ZoneSearch("*"); AutodnsRecordList autodnsRecords = autodns.ZoneInquire(zones); SyncFromInternetX(autodnsRecords); } }
private void SyncFromInternetX(AutodnsRecordList zones) { foreach (AutodnsRecordItem item in zones.Items) { this.LogDebug("Sync {0}", item); autodnsCache[item.Zone] = item; string domainName = item.Zone; if (!imscpDomain.TryGetStruct(nameof(Domain.Name), domainName, out Domain domain)) { this.LogInfo("InternetX Domain <red>{0}<default> is not present in <red>imscp<default>!", domainName); continue; } var oldDoms = imscpDomainDns.GetStructs( Search.FieldEquals(nameof(DomainDns.DomainID), domain.ID) & Search.FieldEquals(nameof(DomainDns.DomainClass), "IN")); bool updated = false; foreach (DnsResourceRecord record in item.Records) { string name = record.Name; switch (record.Name) { case "www": continue; } if (name == null) { name = ""; } else { name = name + "."; } if (name.Contains("*")) { name = name.Replace("*", "wildcard"); } string nameAndTTL = name + domainName + ".\t" + record.TTL; string domainText; switch (record.Type) { case "A": case "AAAA": case "CNAME": case "SPF": case "TXT": case "NS": domainText = record.Value; break; case "SRV": case "MX": domainText = Math.Max(0, record.Pref) + " " + record.Value; break; default: throw new NotImplementedException(); } DomainDns domainDns = oldDoms.SingleOrDefault(d => d.NameAndTTL == nameAndTTL && d.DomainType == record.Type && d.DomainText == domainText); if (domainDns.ID == 0) { //create new domainDns = new DomainDns() { //dont care ID = 0, AliasID = 0, OwnedBy = "custom_dns_feature", //fixed DomainClass = "IN", DomainID = (int)domain.ID, //data NameAndTTL = nameAndTTL, DomainType = record.Type, DomainText = domainText, Status = "tochange", }; this.LogInfo("New <green>{0}<default>.", domainDns); imscpDomainDns.Insert(domainDns); updated = true; continue; } else { oldDoms.Remove(domainDns); } } foreach (var dom in oldDoms) { var copy = dom; copy.Status = "todelete"; updated = true; this.LogInfo("Deleted <red>{0}<default>.", copy); imscpDomainDns.Replace(copy); } if (updated) { domain.Status = "tochange"; imscpDomain.Update(domain); } } }