Esempio n. 1
0
 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);
     }
 }
Esempio n. 2
0
        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);
                }
            }
        }