Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions OpenSRS.NET.Tests/DomainClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,48 @@ public async Task CreateDnsZoneAsync_ReturnsParsedResult()
var result = await client.CreateDnsZoneAsync(request);
Assert.IsType<CreateDnsZoneResult>(result);
}

[Fact]
public async Task GetDnsZoneAsync_ReturnsParsedResult()
{
var client = new TestOpenSRSClient();
var request = new GetDnsZoneRequest { Domain = "example.com" };
var result = await client.GetDnsZoneAsync(request);
Assert.IsType<GetDnsZoneResult>(result);
}

[Fact]
public async Task SetDnsZoneAsync_ReturnsParsedResult()
{
var client = new TestOpenSRSClient();
var request = new SetDnsZoneRequest { Domain = "example.com" };
var result = await client.SetDnsZoneAsync(request);
Assert.IsType<SetDnsZoneResult>(result);
}

[Fact]
public async Task ResetDnsZoneAsync_ReturnsParsedResult()
{
var client = new TestOpenSRSClient();
var request = new ResetDnsZoneRequest { Domain = "example.com" };
var result = await client.ResetDnsZoneAsync(request);
Assert.IsType<ResetDnsZoneResult>(result);
}

[Fact]
public async Task ForceDnsNameserversAsync_ReturnsParsedResult()
{
var client = new TestOpenSRSClient();
var request = new ForceDnsNameserversRequest { Domain = "example.com" };
var result = await client.ForceDnsNameserversAsync(request);
Assert.IsType<ForceDnsNameserversResult>(result);
}

[Fact]
public async Task DeleteDnsZoneAsync_CompletesSuccessfully()
{
var client = new TestOpenSRSClient();
var request = new DeleteDnsZoneRequest { Domain = "example.com" };
await client.DeleteDnsZoneAsync(request);
}
}
18 changes: 18 additions & 0 deletions OpenSRS.NET/Actions/ForceDnsNameserversRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Collections.Generic;

namespace OpenSRS.NET.Actions
{
public sealed class ForceDnsNameserversRequest : OpenSRSRequest
{
public ForceDnsNameserversRequest() : base("FORCE_DNS_NAMESERVERS", "DOMAIN") { }

public string Domain { get; set; }

public override Dictionary<string, object> GetParameters()
{
return new Dictionary<string, object> {
{ "domain", Domain }
};
}
}
}
29 changes: 29 additions & 0 deletions OpenSRS.NET/Actions/ForceDnsNameserversResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using OpenSRS.NET.Models;
using System.Xml.Linq;
using System.Xml.XPath;

namespace OpenSRS.NET.Actions
{
public sealed class ForceDnsNameserversResult
{
public static ForceDnsNameserversResult Parse(string text)
{
var result = new ForceDnsNameserversResult();

var doc = XDocument.Parse(text);

var itemEl = doc.XPathSelectElement(@"/OPS_envelope/body/data_block/dt_assoc");

var response = ResponseDetails.FromEl(itemEl);
if (!response.IsSuccess)
{
throw new OpenSRSException(response.ResponseText)
{
ResponseCode = response.ResponseCode
};
}

return result;
}
}
}
18 changes: 18 additions & 0 deletions OpenSRS.NET/Actions/GetDnsZoneRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Collections.Generic;

namespace OpenSRS.NET.Actions
{
public sealed class GetDnsZoneRequest : OpenSRSRequest
{
public GetDnsZoneRequest() : base("GET_DNS_ZONE", "DOMAIN") { }

public string Domain { get; set; }

public override Dictionary<string, object> GetParameters()
{
return new Dictionary<string, object> {
{ "domain", Domain }
};
}
}
}
97 changes: 97 additions & 0 deletions OpenSRS.NET/Actions/GetDnsZoneResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
using OpenSRS.NET.Models;
using System.Linq;
using System.Runtime.Serialization;
using System.Xml.Linq;
using System.Xml.XPath;

namespace OpenSRS.NET.Actions
{
public sealed class GetDnsZoneResult
{
public DnsRecordSet RecordSet { get; set; } = new DnsRecordSet();

[DataMember(Name = "nameservers_ok")]
public bool NameserversOK { get; set; }

public static GetDnsZoneResult Parse(string text)
{
var result = new GetDnsZoneResult();

var doc = XDocument.Parse(text);

var itemEl = doc.XPathSelectElement(@"/OPS_envelope/body/data_block/dt_assoc");

var response = ResponseDetails.FromEl(itemEl);
if (!response.IsSuccess)
{
throw new OpenSRSException(response.ResponseText)
{
ResponseCode = response.ResponseCode
};
}

XElement recordsArray = doc.XPathSelectElement(@"//item[@key=""records""]/dt_assoc");
if (recordsArray != null)
{
foreach (var record in recordsArray.Descendants())
{
switch (record.Attribute("key")?.Value)
{
case "A":
var AItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var AItem in AItems)
{
result.RecordSet.A.Add(new ARecord { Address = System.Net.IPAddress.Parse(AItem["ip_address"]), Subdomain = AItem["subdomain"] });
}
break;
case "AAAA":
var AAAAItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var AItem in AAAAItems)
{
result.RecordSet.AAAA.Add(new AAAARecord { Address = System.Net.IPAddress.Parse(AItem["ip_address"]), Subdomain = AItem["subdomain"] });
}
break;
case "CNAME":
var CNItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var CNItem in CNItems)
{
result.RecordSet.CNAME.Add(new CNAMERecord { HostName = CNItem["hostname"], Subdomain = CNItem["subdomain"] });
}
break;
case "MX":
var MXItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var MXItem in MXItems)
{
result.RecordSet.MX.Add(new MXRecord { Priority = int.Parse(MXItem["priority"]), HostName = MXItem["hostname"], Subdomain = MXItem["subdomain"] });
}
break;
case "TXT":
var TXTItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var TXTItem in TXTItems)
{
result.RecordSet.TXT.Add(new TXTRecord { Text = TXTItem["text"], Subdomain = TXTItem["subdomain"] });
}
break;
case "SRV":
var SRVItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var SRVItem in SRVItems)
{
result.RecordSet.SRV.Add(new SRVRecord { HostName = SRVItem["hostname"], Priority = int.Parse(SRVItem["priority"]), Port = int.Parse(SRVItem["port"]), Weight = int.Parse(SRVItem["weight"]), Subdomain = SRVItem["subdomain"] });
}
break;
default:
break;
}
}
}

var nameserversOkEl = doc.XPathSelectElement(@"//item[@key=""nameservers_ok""]");
if (nameserversOkEl != null)
{
result.NameserversOK = int.Parse(nameserversOkEl.Value) == 1;
}

return result;
}
}
}
21 changes: 21 additions & 0 deletions OpenSRS.NET/Actions/ResetDnsZoneRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.Collections.Generic;

namespace OpenSRS.NET.Actions
{
public sealed class ResetDnsZoneRequest : OpenSRSRequest
{
public ResetDnsZoneRequest() : base("RESET_DNS_ZONE", "DOMAIN") { }

public string Domain { get; set; }

public string DnsTemplate { get; set; }

public override Dictionary<string, object> GetParameters()
{
return new Dictionary<string, object> {
{ "domain", Domain },
{ "dns_template", DnsTemplate }
};
}
}
}
97 changes: 97 additions & 0 deletions OpenSRS.NET/Actions/ResetDnsZoneResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
using OpenSRS.NET.Models;
using System.Linq;
using System.Runtime.Serialization;
using System.Xml.Linq;
using System.Xml.XPath;

namespace OpenSRS.NET.Actions
{
public sealed class ResetDnsZoneResult
{
public DnsRecordSet RecordSet { get; set; } = new DnsRecordSet();

[DataMember(Name = "nameservers_ok")]
public bool NameserversOK { get; set; }

public static ResetDnsZoneResult Parse(string text)
{
var result = new ResetDnsZoneResult();

var doc = XDocument.Parse(text);

var itemEl = doc.XPathSelectElement(@"/OPS_envelope/body/data_block/dt_assoc");

var response = ResponseDetails.FromEl(itemEl);
if (!response.IsSuccess)
{
throw new OpenSRSException(response.ResponseText)
{
ResponseCode = response.ResponseCode
};
}

XElement recordsArray = doc.XPathSelectElement(@"//item[@key=""records""]/dt_assoc");
if (recordsArray != null)
{
foreach (var record in recordsArray.Descendants())
{
switch (record.Attribute("key")?.Value)
{
case "A":
var AItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var AItem in AItems)
{
result.RecordSet.A.Add(new ARecord { Address = System.Net.IPAddress.Parse(AItem["ip_address"]), Subdomain = AItem["subdomain"] });
}
break;
case "AAAA":
var AAAAItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var AItem in AAAAItems)
{
result.RecordSet.AAAA.Add(new AAAARecord { Address = System.Net.IPAddress.Parse(AItem["ip_address"]), Subdomain = AItem["subdomain"] });
}
break;
case "CNAME":
var CNItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var CNItem in CNItems)
{
result.RecordSet.CNAME.Add(new CNAMERecord { HostName = CNItem["hostname"], Subdomain = CNItem["subdomain"] });
}
break;
case "MX":
var MXItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var MXItem in MXItems)
{
result.RecordSet.MX.Add(new MXRecord { Priority = int.Parse(MXItem["priority"]), HostName = MXItem["hostname"], Subdomain = MXItem["subdomain"] });
}
break;
case "TXT":
var TXTItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var TXTItem in TXTItems)
{
result.RecordSet.TXT.Add(new TXTRecord { Text = TXTItem["text"], Subdomain = TXTItem["subdomain"] });
}
break;
case "SRV":
var SRVItems = ResponseHelper.ReadArray(record.Descendants("dt_array").First());
foreach (var SRVItem in SRVItems)
{
result.RecordSet.SRV.Add(new SRVRecord { HostName = SRVItem["hostname"], Priority = int.Parse(SRVItem["priority"]), Port = int.Parse(SRVItem["port"]), Weight = int.Parse(SRVItem["weight"]), Subdomain = SRVItem["subdomain"] });
}
break;
default:
break;
}
}
}

var nameserversOkEl = doc.XPathSelectElement(@"//item[@key=""nameservers_ok""]");
if (nameserversOkEl != null)
{
result.NameserversOK = int.Parse(nameserversOkEl.Value) == 1;
}

return result;
}
}
}
22 changes: 22 additions & 0 deletions OpenSRS.NET/Actions/SetDnsZoneRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using OpenSRS.NET.Models;
using System.Collections.Generic;

namespace OpenSRS.NET.Actions
{
public sealed class SetDnsZoneRequest : OpenSRSRequest
{
public SetDnsZoneRequest() : base("SET_DNS_ZONE", "DOMAIN") { }

public string Domain { get; set; }

public DnsRecordSet Records { get; set; }

public override Dictionary<string, object> GetParameters()
{
return new Dictionary<string, object> {
{ "domain", Domain },
{ "records", Records?.ToDtAssoc() }
};
}
}
}
Loading