DNS SRV Record support. Only supported with MS DNS Provider

This commit is contained in:
robvde 2012-07-04 13:18:58 +04:00
parent a327e27e15
commit 452fcb7f47
28 changed files with 6890 additions and 4002 deletions

View file

@ -1,4 +1,4 @@
// Copyright (c) 2012, Outercurve Foundation.
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
@ -122,20 +122,20 @@ namespace WebsitePanel.EnterpriseServer
try
{
// TO-DO: Check connectivity
return 0;
return 0;
}
catch (WebException ex)
{
HttpWebResponse response = (HttpWebResponse)ex.Response;
if (response != null && response.StatusCode == HttpStatusCode.NotFound)
if (response != null && response.StatusCode == HttpStatusCode.NotFound)
return BusinessErrorCodes.ERROR_ADD_SERVER_NOT_FOUND;
else if (response != null && response.StatusCode == HttpStatusCode.BadRequest)
else if (response != null && response.StatusCode == HttpStatusCode.BadRequest)
return BusinessErrorCodes.ERROR_ADD_SERVER_BAD_REQUEST;
else if (response != null && response.StatusCode == HttpStatusCode.InternalServerError)
else if (response != null && response.StatusCode == HttpStatusCode.InternalServerError)
return BusinessErrorCodes.ERROR_ADD_SERVER_INTERNAL_SERVER_ERROR;
else if (response != null && response.StatusCode == HttpStatusCode.ServiceUnavailable)
else if (response != null && response.StatusCode == HttpStatusCode.ServiceUnavailable)
return BusinessErrorCodes.ERROR_ADD_SERVER_SERVICE_UNAVAILABLE;
else if (response != null && response.StatusCode == HttpStatusCode.Unauthorized)
else if (response != null && response.StatusCode == HttpStatusCode.Unauthorized)
return BusinessErrorCodes.ERROR_ADD_SERVER_UNAUTHORIZED;
if (ex.Message.Contains("The remote name could not be resolved") || ex.Message.Contains("Unable to connect"))
{
@ -155,7 +155,7 @@ namespace WebsitePanel.EnterpriseServer
{
TaskManager.WriteError("General Server Error");
TaskManager.WriteError(ex);
return BusinessErrorCodes.ERROR_ADD_SERVER_APPLICATION_ERROR;
return BusinessErrorCodes.ERROR_ADD_SERVER_APPLICATION_ERROR;
}
}
finally
@ -220,7 +220,7 @@ namespace WebsitePanel.EnterpriseServer
throw new ApplicationException("Could not find services. General error was occued.", ex);
}
}
public static int AddServer(ServerInfo server, bool autoDiscovery)
{
// check account
@ -243,8 +243,8 @@ namespace WebsitePanel.EnterpriseServer
}
TaskManager.StartTask("SERVER", "ADD", server.ServerName);
int serverId = DataProvider.AddServer(server.ServerName, server.ServerUrl,
int serverId = DataProvider.AddServer(server.ServerName, server.ServerUrl,
CryptoUtils.Encrypt(server.Password), server.Comments, server.VirtualServer, server.InstantDomainAlias,
server.PrimaryGroupId, server.ADEnabled, server.ADRootDomain, server.ADUsername, CryptoUtils.Encrypt(server.ADPassword),
server.ADAuthenticationType);
@ -261,7 +261,7 @@ namespace WebsitePanel.EnterpriseServer
TaskManager.WriteError(ex);
}
}
TaskManager.ItemId = serverId;
TaskManager.CompleteTask();
@ -294,7 +294,7 @@ namespace WebsitePanel.EnterpriseServer
return availResult;
}
DataProvider.UpdateServer(server.ServerId, server.ServerName, server.ServerUrl,
DataProvider.UpdateServer(server.ServerId, server.ServerName, server.ServerUrl,
CryptoUtils.Encrypt(server.Password), server.Comments, server.InstantDomainAlias,
server.PrimaryGroupId, server.ADEnabled, server.ADRootDomain, server.ADUsername, CryptoUtils.Encrypt(server.ADPassword),
server.ADAuthenticationType);
@ -322,7 +322,7 @@ namespace WebsitePanel.EnterpriseServer
server.Password = password;
// update server
DataProvider.UpdateServer(server.ServerId, server.ServerName, server.ServerUrl,
DataProvider.UpdateServer(server.ServerId, server.ServerName, server.ServerUrl,
CryptoUtils.Encrypt(server.Password), server.Comments, server.InstantDomainAlias,
server.PrimaryGroupId, server.ADEnabled, server.ADRootDomain, server.ADUsername, CryptoUtils.Encrypt(server.ADPassword),
server.ADAuthenticationType);
@ -350,7 +350,7 @@ namespace WebsitePanel.EnterpriseServer
server.ADPassword = adPassword;
// update server
DataProvider.UpdateServer(server.ServerId, server.ServerName, server.ServerUrl,
DataProvider.UpdateServer(server.ServerId, server.ServerName, server.ServerUrl,
CryptoUtils.Encrypt(server.Password), server.Comments, server.InstantDomainAlias,
server.PrimaryGroupId, server.ADEnabled, server.ADRootDomain, server.ADUsername, CryptoUtils.Encrypt(server.ADPassword),
server.ADAuthenticationType);
@ -636,12 +636,12 @@ namespace WebsitePanel.EnterpriseServer
| DemandAccount.IsActive);
if (accountCheck < 0) return accountCheck;
// load original service
ServiceInfo origService = GetServiceInfo(service.ServiceId);
// load original service
ServiceInfo origService = GetServiceInfo(service.ServiceId);
TaskManager.StartTask("SERVER", "UPDATE_SERVICE");
TaskManager.ItemId = origService.ServerId;
TaskManager.ItemName = GetServerByIdInternal(origService.ServerId).ServerName;
TaskManager.ItemId = origService.ServerId;
TaskManager.ItemName = GetServerByIdInternal(origService.ServerId).ServerName;
TaskManager.WriteParameter("New service name", service.ServiceName);
DataProvider.UpdateService(service.ServiceId, service.ServiceName,
@ -839,7 +839,7 @@ namespace WebsitePanel.EnterpriseServer
public static BoolResult IsInstalled(int serverId, int providerId)
{
BoolResult res = TaskManager.StartResultTask<BoolResult>("AUTO_DISCOVERY", "IS_INSTALLED");
try
{
ProviderInfo provider = GetProvider(providerId);
@ -848,22 +848,22 @@ namespace WebsitePanel.EnterpriseServer
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_PROVIDER_INFO);
return res;
}
AutoDiscovery.AutoDiscovery ad = new AutoDiscovery.AutoDiscovery();
ServiceProviderProxy.ServerInit(ad, serverId);
res = ad.IsInstalled(provider.ProviderType);
res = ad.IsInstalled(provider.ProviderType);
}
catch(Exception ex)
catch (Exception ex)
{
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_CHECK_IF_PROVIDER_SOFTWARE_INSTALLED, ex);
}
TaskManager.CompleteResultTask();
return res;
}
public static string GetServerVersion(int serverId)
{
AutoDiscovery.AutoDiscovery ad = new AutoDiscovery.AutoDiscovery();
@ -871,7 +871,7 @@ namespace WebsitePanel.EnterpriseServer
return ad.GetServerVersion();
}
#endregion
#region IP Addresses
@ -1400,18 +1400,18 @@ namespace WebsitePanel.EnterpriseServer
private static string GetIPAddressesQuotaByResourceGroup(string groupName)
{
if (String.Compare(groupName, ResourceGroups.VPS, true) == 0)
{
return Quotas.VPS_EXTERNAL_IP_ADDRESSES_NUMBER;
}
else if (String.Compare(groupName, ResourceGroups.VPSForPC, true) == 0)
{
return Quotas.VPSForPC_EXTERNAL_IP_ADDRESSES_NUMBER;
}
else
{
return Quotas.WEB_IP_ADDRESSES;
}
if (String.Compare(groupName, ResourceGroups.VPS, true) == 0)
{
return Quotas.VPS_EXTERNAL_IP_ADDRESSES_NUMBER;
}
else if (String.Compare(groupName, ResourceGroups.VPSForPC, true) == 0)
{
return Quotas.VPSForPC_EXTERNAL_IP_ADDRESSES_NUMBER;
}
else
{
return Quotas.WEB_IP_ADDRESSES;
}
}
#endregion
@ -1521,7 +1521,8 @@ namespace WebsitePanel.EnterpriseServer
TaskManager.WriteParameter("Data", record.RecordData);
DataProvider.AddDnsRecord(SecurityContext.User.UserId, record.ServiceId, record.ServerId, record.PackageId,
record.RecordType, record.RecordName, record.RecordData, record.MxPriority, record.IpAddressId);
record.RecordType, record.RecordName, record.RecordData, record.MxPriority,
record.SrvPriority, record.SrvWeight, record.SrvPort, record.IpAddressId);
TaskManager.CompleteTask();
@ -1540,7 +1541,8 @@ namespace WebsitePanel.EnterpriseServer
TaskManager.WriteParameter("Data", record.RecordData);
DataProvider.UpdateDnsRecord(SecurityContext.User.UserId, record.RecordId,
record.RecordType, record.RecordName, record.RecordData, record.MxPriority, record.IpAddressId);
record.RecordType, record.RecordName, record.RecordData, record.MxPriority,
record.SrvPriority, record.SrvWeight, record.SrvPort, record.IpAddressId);
TaskManager.CompleteTask();
@ -1571,7 +1573,7 @@ namespace WebsitePanel.EnterpriseServer
#region Domains
public static int CheckDomain(string domainName)
{
int checkDomainResult = DataProvider.CheckDomain(-10, domainName);
int checkDomainResult = DataProvider.CheckDomain(-10, domainName, false);
if (checkDomainResult == -1)
return BusinessErrorCodes.ERROR_DOMAIN_ALREADY_EXISTS;
@ -1677,8 +1679,7 @@ namespace WebsitePanel.EnterpriseServer
}
public static int AddDomainWithProvisioning(int packageId, string domainName, DomainType domainType,
bool createWebSite, int pointWebSiteId, int pointMailDomainId,
bool createDnsZone, bool createInstantAlias, bool allowSubDomains)
bool createWebSite, int pointWebSiteId, int pointMailDomainId, bool createDnsZone, bool createInstantAlias, bool allowSubDomains)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
@ -1687,7 +1688,7 @@ namespace WebsitePanel.EnterpriseServer
// check package
int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive);
if (packageCheck < 0) return packageCheck;
// set flags
bool isSubDomain = (domainType == DomainType.SubDomain || domainType == DomainType.ProviderSubDomain);
bool isDomainPointer = (domainType == DomainType.DomainPointer);
@ -1748,10 +1749,10 @@ namespace WebsitePanel.EnterpriseServer
public static int AddDomain(DomainInfo domain)
{
return AddDomain(domain, false);
return AddDomain(domain, false, false);
}
public static int AddDomain(DomainInfo domain, bool createInstantAlias)
public static int AddDomain(DomainInfo domain, bool createInstantAlias, bool createZone)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
@ -1762,7 +1763,7 @@ namespace WebsitePanel.EnterpriseServer
if (packageCheck < 0) return packageCheck;
// add main domain
int domainId = AddDomainInternal(domain.PackageId, domain.DomainName, true,
int domainId = AddDomainInternal(domain.PackageId, domain.DomainName, createZone,
domain.IsSubDomain, false, domain.IsDomainPointer, false);
if (domainId < 0)
@ -1805,7 +1806,7 @@ namespace WebsitePanel.EnterpriseServer
}
// check if the domain already exists
int checkResult = DataProvider.CheckDomain(packageId, domainName);
int checkResult = DataProvider.CheckDomain(packageId, domainName, isDomainPointer);
if (checkResult < 0)
{
@ -1816,15 +1817,18 @@ namespace WebsitePanel.EnterpriseServer
else
return checkResult;
}
if (domainName.ToLower().StartsWith("www."))
return BusinessErrorCodes.ERROR_DOMAIN_STARTS_WWW;
/*
if (domainName.ToLower().StartsWith("www."))
return BusinessErrorCodes.ERROR_DOMAIN_STARTS_WWW;
*/
// place log record
TaskManager.StartTask("DOMAIN", "ADD", domainName);
TaskManager.PackageId = packageId;
TaskManager.TaskParameters["CreateZone"] = createDnsZone;
// create DNS zone
int zoneItemId = 0;
if (createDnsZone)
@ -1895,60 +1899,60 @@ namespace WebsitePanel.EnterpriseServer
}
}
public static int DetachDomain(int domainId)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin);
if (accountCheck < 0) return accountCheck;
public static int DetachDomain(int domainId)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin);
if (accountCheck < 0) return accountCheck;
// load domain
DomainInfo domain = GetDomain(domainId);
// load domain
DomainInfo domain = GetDomain(domainId);
// place log record
TaskManager.StartTask("DOMAIN", "DETACH", domain.DomainName);
TaskManager.ItemId = domain.DomainId;
// place log record
TaskManager.StartTask("DOMAIN", "DETACH", domain.DomainName);
TaskManager.ItemId = domain.DomainId;
try
{
// check if domain can be deleted
if (domain.WebSiteId > 0)
{
TaskManager.WriteError("Domain points to the existing web site");
return BusinessErrorCodes.ERROR_DOMAIN_POINTS_TO_WEB_SITE;
}
try
{
// check if domain can be deleted
if (domain.WebSiteId > 0)
{
TaskManager.WriteError("Domain points to the existing web site");
return BusinessErrorCodes.ERROR_DOMAIN_POINTS_TO_WEB_SITE;
}
if (domain.MailDomainId > 0)
{
TaskManager.WriteError("Domain points to the existing mail domain");
return BusinessErrorCodes.ERROR_DOMAIN_POINTS_TO_MAIL_DOMAIN;
}
if (domain.MailDomainId > 0)
{
TaskManager.WriteError("Domain points to the existing mail domain");
return BusinessErrorCodes.ERROR_DOMAIN_POINTS_TO_MAIL_DOMAIN;
}
if (DataProvider.ExchangeOrganizationDomainExists(domain.DomainId))
{
TaskManager.WriteError("Domain points to the existing organization domain");
return BusinessErrorCodes.ERROR_ORGANIZATION_DOMAIN_IS_IN_USE;
}
// remove DNS zone meta-item if required
if (domain.ZoneItemId > 0)
{
PackageController.DeletePackageItem(domain.ZoneItemId);
}
if (domain.ZoneItemId > 0)
{
PackageController.DeletePackageItem(domain.ZoneItemId);
}
// delete domain
DataProvider.DeleteDomain(SecurityContext.User.UserId, domainId);
// delete domain
DataProvider.DeleteDomain(SecurityContext.User.UserId, domainId);
return 0;
}
catch (Exception ex)
{
throw TaskManager.WriteError(ex);
}
finally
{
TaskManager.CompleteTask();
}
}
return 0;
}
catch (Exception ex)
{
throw TaskManager.WriteError(ex);
}
finally
{
TaskManager.CompleteTask();
}
}
public static int DeleteDomain(int domainId)
{
@ -1991,9 +1995,9 @@ namespace WebsitePanel.EnterpriseServer
if (res < 0)
return res;
}
// delete zone if required
DnsServerController.DeleteZone(domain.ZoneItemId);
// delete zone if required
DnsServerController.DeleteZone(domain.ZoneItemId);
// delete domain
DataProvider.DeleteDomain(SecurityContext.User.UserId, domainId);
@ -2096,7 +2100,7 @@ namespace WebsitePanel.EnterpriseServer
}
// add web site DNS records
int res = AddWebSiteZoneRecords(domainId);
int res = AddWebSiteZoneRecords("", domainId);
if (res < 0)
return res;
@ -2112,7 +2116,7 @@ namespace WebsitePanel.EnterpriseServer
}
}
private static int AddWebSiteZoneRecords(int domainId)
private static int AddWebSiteZoneRecords(string hostName, int domainId)
{
// load domain
DomainInfo domain = GetDomainItem(domainId);
@ -2126,7 +2130,7 @@ namespace WebsitePanel.EnterpriseServer
return res;
}
public static int CreateDomainInstantAlias(int domainId)
public static int CreateDomainInstantAlias(string hostName, int domainId)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
@ -2166,14 +2170,15 @@ namespace WebsitePanel.EnterpriseServer
if (webRes < 0)
return webRes;
}
// add mail domain pointer
if (domain.MailDomainId > 0 && instantAlias.MailDomainId == 0)
{
int mailRes = MailServerController.AddMailDomainPointer(domain.MailDomainId, instantAliasId);
if (mailRes < 0)
return mailRes;
}
/*
// add mail domain pointer
if (domain.MailDomainId > 0 && instantAlias.MailDomainId == 0)
{
int mailRes = MailServerController.AddMailDomainPointer(domain.MailDomainId, instantAliasId);
if (mailRes < 0)
return mailRes;
}
*/
return 0;
}
@ -2214,14 +2219,15 @@ namespace WebsitePanel.EnterpriseServer
if (webRes < 0)
return webRes;
}
// remove from mail domain pointers
if (instantAlias.MailDomainId > 0)
{
int mailRes = MailServerController.DeleteMailDomainPointer(instantAlias.MailDomainId, instantAlias.DomainId);
if (mailRes < 0)
return mailRes;
}
/*
// remove from mail domain pointers
if (instantAlias.MailDomainId > 0)
{
int mailRes = MailServerController.DeleteMailDomainPointer(instantAlias.MailDomainId, instantAlias.DomainId);
if (mailRes < 0)
return mailRes;
}
*/
// delete instant alias
int res = DeleteDomain(instantAlias.DomainId);
@ -2272,12 +2278,15 @@ namespace WebsitePanel.EnterpriseServer
dt.Columns.Add("RecordName", typeof(string));
dt.Columns.Add("RecordData", typeof(string));
dt.Columns.Add("MxPriority", typeof(int));
dt.Columns.Add("SrvPriority", typeof(int));
dt.Columns.Add("SrvWeight", typeof(int));
dt.Columns.Add("SrvPort", typeof(int));
// add rows
DnsRecord[] records = GetDnsZoneRecords(domainId);
foreach (DnsRecord record in records)
{
dt.Rows.Add(record.RecordType, record.RecordName, record.RecordData, record.MxPriority);
dt.Rows.Add(record.RecordType, record.RecordName, record.RecordData, record.MxPriority, record.SrvPriority, record.SrvWeight, record.SrvPort);
}
return ds;
@ -2299,7 +2308,7 @@ namespace WebsitePanel.EnterpriseServer
}
public static int AddDnsZoneRecord(int domainId, string recordName, DnsRecordType recordType,
string recordData, int mxPriority)
string recordData, int mxPriority, int srvPriority, int srvWeight, int srvPort)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
@ -2315,7 +2324,7 @@ namespace WebsitePanel.EnterpriseServer
// get DNS service
DnsZone zoneItem = (DnsZone)PackageController.GetPackageItem(domain.ZoneItemId);
if(zoneItem == null)
if (zoneItem == null)
return 0;
// place log record
@ -2337,6 +2346,9 @@ namespace WebsitePanel.EnterpriseServer
record.RecordName = recordName;
record.RecordData = recordData;
record.MxPriority = mxPriority;
record.SrvPriority = srvPriority;
record.SrvWeight = srvWeight;
record.SrvPort = srvPort;
dns.AddZoneRecord(zoneItem.Name, record);
return 0;
@ -2353,7 +2365,7 @@ namespace WebsitePanel.EnterpriseServer
public static int UpdateDnsZoneRecord(int domainId,
string originalRecordName, string originalRecordData,
string recordName, DnsRecordType recordType, string recordData, int mxPriority)
string recordName, DnsRecordType recordType, string recordData, int mxPriority, int srvPriority, int srvWeight, int srvPortNumber)
{
// place log record
DomainInfo domain = GetDomain(domainId);
@ -2367,7 +2379,7 @@ namespace WebsitePanel.EnterpriseServer
DeleteDnsZoneRecord(domainId, originalRecordName, recordType, originalRecordData);
// add new record
AddDnsZoneRecord(domainId, recordName, recordType, recordData, mxPriority);
AddDnsZoneRecord(domainId, recordName, recordType, recordData, mxPriority, srvPriority, srvWeight, srvPortNumber);
return 0;
}
@ -2410,7 +2422,7 @@ namespace WebsitePanel.EnterpriseServer
DNSServer dns = new DNSServer();
ServiceProviderProxy.Init(dns, zoneItem.ServiceId);
DnsRecord record = GetDnsZoneRecord(domainId, recordName, recordType, recordData);
DnsRecord record = GetDnsZoneRecord(domainId, recordName, recordType, recordData);
dns.DeleteZoneRecord(zoneItem.Name, record);
return 0;