public void SetRecord(DnsResourceRecord record) { AuthZone zone = GetOrAddSubDomainZone(record.Name); zone.SetRecords(record.Type, new DnsResourceRecord[] { record }); if (zone is SubDomainZone) { (zone as SubDomainZone).AutoUpdateState(); } }
public void SetRecords(string domain, DnsResourceRecordType type, uint ttl, DnsResourceRecordData[] records) { DnsResourceRecord[] resourceRecords = new DnsResourceRecord[records.Length]; for (int i = 0; i < records.Length; i++) { resourceRecords[i] = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, records[i]); } AuthZone zone = GetOrAddSubDomainZone(domain); zone.SetRecords(type, resourceRecords); if (zone is SubDomainZone) { (zone as SubDomainZone).AutoUpdateState(); } }
public void UpdateRecord(DnsResourceRecord oldRecord, DnsResourceRecord newRecord) { if (oldRecord.Type != newRecord.Type) { throw new DnsServerException("Cannot update record: new record must be of same type."); } if (oldRecord.Type == DnsResourceRecordType.SOA) { throw new DnsServerException("Cannot update record: use SetRecords() for updating SOA record."); } if (!_root.TryGet(oldRecord.Name, out AuthZone zone)) { throw new DnsServerException("Cannot update record: zone does not exists."); } switch (oldRecord.Type) { case DnsResourceRecordType.CNAME: case DnsResourceRecordType.PTR: case DnsResourceRecordType.APP: if (oldRecord.Name.Equals(newRecord.Name, StringComparison.OrdinalIgnoreCase)) { zone.SetRecords(newRecord.Type, new DnsResourceRecord[] { newRecord }); if (zone is SubDomainZone) { (zone as SubDomainZone).AutoUpdateState(); } } else { zone.DeleteRecords(oldRecord.Type); if (zone is SubDomainZone) { if (zone.IsEmpty) { _root.TryRemove(oldRecord.Name, out _); //remove empty sub zone } else { (zone as SubDomainZone).AutoUpdateState(); } } AuthZone newZone = GetOrAddSubDomainZone(newRecord.Name); newZone.SetRecords(newRecord.Type, new DnsResourceRecord[] { newRecord }); if (newZone is SubDomainZone) { (newZone as SubDomainZone).AutoUpdateState(); } } break; default: if (oldRecord.Name.Equals(newRecord.Name, StringComparison.OrdinalIgnoreCase)) { zone.DeleteRecord(oldRecord.Type, oldRecord.RDATA); zone.AddRecord(newRecord); if (zone is SubDomainZone) { (zone as SubDomainZone).AutoUpdateState(); } } else { zone.DeleteRecord(oldRecord.Type, oldRecord.RDATA); if (zone is SubDomainZone) { if (zone.IsEmpty) { _root.TryRemove(oldRecord.Name, out _); //remove empty sub zone } else { (zone as SubDomainZone).AutoUpdateState(); } } AuthZone newZone = GetOrAddSubDomainZone(newRecord.Name); newZone.AddRecord(newRecord); if (newZone is SubDomainZone) { (newZone as SubDomainZone).AutoUpdateState(); } } break; } }