Merge
This commit is contained in:
commit
4de74dcea7
47 changed files with 1148 additions and 396 deletions
|
@ -29,6 +29,8 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using WebsitePanel.Providers;
|
||||
|
@ -38,6 +40,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
public class DnsServerController : IImportController, IBackupController
|
||||
{
|
||||
private static string GetAsciiZoneName(string zoneName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(zoneName)) return zoneName;
|
||||
var idn = new IdnMapping();
|
||||
return idn.GetAscii(zoneName);
|
||||
}
|
||||
|
||||
private static DNSServer GetDNSServer(int serviceId)
|
||||
{
|
||||
DNSServer dns = new DNSServer();
|
||||
|
@ -55,6 +64,9 @@ namespace WebsitePanel.EnterpriseServer
|
|||
// get DNS provider
|
||||
DNSServer dns = GetDNSServer(serviceId);
|
||||
|
||||
// Ensure zoneName is in ascii before saving to database
|
||||
zoneName = GetAsciiZoneName(zoneName);
|
||||
|
||||
// check if zone already exists
|
||||
if (dns.ZoneExists(zoneName))
|
||||
return BusinessErrorCodes.ERROR_DNS_ZONE_EXISTS;
|
||||
|
@ -199,7 +211,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
// zone item
|
||||
DnsZone zone = primaryZone ? new DnsZone() : new SecondaryDnsZone();
|
||||
zone.Name = zoneName;
|
||||
zone.Name = GetAsciiZoneName(zoneName);
|
||||
zone.PackageId = spaceId;
|
||||
zone.ServiceId = serviceId;
|
||||
int zoneItemId = PackageController.AddPackageItem(zone);
|
||||
|
@ -280,6 +292,8 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
foreach (GlobalDnsRecord record in records)
|
||||
{
|
||||
domainName = GetAsciiZoneName(domainName);
|
||||
|
||||
DnsRecord rr = new DnsRecord();
|
||||
rr.RecordType = (DnsRecordType)Enum.Parse(typeof(DnsRecordType), record.RecordType, true);
|
||||
rr.RecordName = Utils.ReplaceStringVariable(record.RecordName, "host_name", hostName, true);
|
||||
|
@ -359,8 +373,11 @@ namespace WebsitePanel.EnterpriseServer
|
|||
DNSServer dns = new DNSServer();
|
||||
ServiceProviderProxy.Init(dns, serviceId);
|
||||
|
||||
// IDN: The list of importable names is populated with unicode names, to make it easier for the user
|
||||
var idn = new IdnMapping();
|
||||
|
||||
if (itemType == typeof(DnsZone))
|
||||
items.AddRange(dns.GetZones());
|
||||
items.AddRange(dns.GetZones().Select(z => idn.GetUnicode(z)));
|
||||
|
||||
return items;
|
||||
}
|
||||
|
@ -377,7 +394,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
// add DNS zone
|
||||
DnsZone zone = new DnsZone();
|
||||
zone.Name = itemName;
|
||||
zone.Name = GetAsciiZoneName(itemName);
|
||||
zone.ServiceId = serviceId;
|
||||
zone.PackageId = packageId;
|
||||
int zoneId = PackageController.AddPackageItem(zone);
|
||||
|
|
|
@ -278,11 +278,16 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
|
||||
private static void PopulateOrganizationData(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
{
|
||||
TaskManager.Write("Stat populate organization data "+org.Name);
|
||||
|
||||
if (report.ExchangeReport != null)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate exchange report items");
|
||||
|
||||
PopulateExchangeReportItems(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -295,6 +300,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate populate CRM report items");
|
||||
|
||||
PopulateCRMReportItems(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -307,6 +314,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate SharePoint item ");
|
||||
|
||||
PopulateSharePointItem(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -319,6 +328,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate Lync report items");
|
||||
|
||||
PopulateLyncReportItems(org, report, topReseller);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -331,6 +342,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate Organization statistics report");
|
||||
|
||||
PopulateOrganizationStatisticsReport(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -339,7 +352,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
TaskManager.Write("End populate organization data " + org.Name);
|
||||
}
|
||||
|
||||
private static int GetExchangeServiceID(int packageId)
|
||||
|
@ -408,6 +421,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
|
||||
private static void PopulateExchangeReportItems(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Exchange Report Items " + org.Name);
|
||||
|
||||
//Check if exchange organization
|
||||
if (string.IsNullOrEmpty(org.GlobalAddressList))
|
||||
return;
|
||||
|
@ -420,10 +435,14 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get mailboxes for current organization {0}", org.Id), ex);
|
||||
}
|
||||
|
||||
TaskManager.WriteParameter("mailboxes.Count", mailboxes.Count);
|
||||
|
||||
try
|
||||
{
|
||||
int exchangeServiceId = GetExchangeServiceID(org.PackageId);
|
||||
|
@ -431,6 +450,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get exchange server. PackageId: {0}", org.PackageId), ex);
|
||||
}
|
||||
|
@ -440,6 +461,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.WriteParameter("mailbox", mailbox.UserPrincipalName);
|
||||
|
||||
stats = null;
|
||||
try
|
||||
{
|
||||
|
@ -448,6 +471,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
TaskManager.WriteError(ex, "Could not get mailbox statistics. AccountName: {0}",
|
||||
mailbox.UserPrincipalName);
|
||||
}
|
||||
|
@ -466,6 +491,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
|
||||
stats.BlackberryEnabled = BlackBerryController.CheckBlackBerryUserExists(mailbox.AccountId);
|
||||
report.ExchangeReport.Items.Add(stats);
|
||||
|
||||
TaskManager.Write("Items.Add");
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -473,7 +500,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TaskManager.Write("End Populate Exchange Report Items " + org.Name);
|
||||
}
|
||||
|
||||
|
||||
|
@ -547,6 +575,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
|
||||
private static void PopulateSpaceData(int packageId, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Populate SpaceData " + packageId);
|
||||
|
||||
List<Organization> organizations;
|
||||
|
||||
try
|
||||
|
@ -570,10 +600,14 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
TaskManager.Write("End Populate SpaceData " + packageId);
|
||||
}
|
||||
|
||||
private static void PopulateUserData(UserInfo user, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Populate UserData " + user.Username);
|
||||
|
||||
DataSet ds;
|
||||
try
|
||||
{
|
||||
|
@ -596,11 +630,14 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TaskManager.Write("End Populate UserData " + user.Username);
|
||||
}
|
||||
|
||||
private static void GetUsersData(EnterpriseSolutionStatisticsReport report, int userId, bool generateExchangeReport, bool generateSharePointReport, bool generateCRMReport, bool generateOrganizationReport, bool generateLyncReport, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Get UsersData " + userId);
|
||||
|
||||
List<UserInfo> users;
|
||||
try
|
||||
{
|
||||
|
@ -611,9 +648,12 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
throw new ApplicationException("Cannot get users for report", ex);
|
||||
}
|
||||
|
||||
TaskManager.WriteParameter("users.Count", users.Count);
|
||||
|
||||
foreach (UserInfo user in users)
|
||||
{
|
||||
TaskManager.WriteParameter("User", user.Username);
|
||||
|
||||
try
|
||||
{
|
||||
PopulateUserData(user, report, topReseller);
|
||||
|
@ -631,11 +671,16 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TaskManager.Write("End get UsersData " + userId);
|
||||
|
||||
}
|
||||
|
||||
public static EnterpriseSolutionStatisticsReport GetEnterpriseSolutionStatisticsReport(int userId, bool generateExchangeReport, bool generateSharePointReport, bool generateCRMReport, bool generateOrganizationReport, bool generateLyncReport)
|
||||
{
|
||||
TaskManager.Write("Get enterprise solution statistics report " + userId);
|
||||
|
||||
EnterpriseSolutionStatisticsReport report = new EnterpriseSolutionStatisticsReport();
|
||||
|
||||
if (generateExchangeReport || generateOrganizationReport)
|
||||
|
@ -647,7 +692,6 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
if (generateLyncReport || generateOrganizationReport)
|
||||
report.LyncReport = new LyncStatisticsReport();
|
||||
|
||||
|
||||
if (generateCRMReport || generateOrganizationReport)
|
||||
report.CRMReport = new CRMStatisticsReport();
|
||||
|
||||
|
@ -664,6 +708,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
TaskManager.WriteError(ex, "Cannot get enterprise solution statistics report");
|
||||
}
|
||||
|
||||
TaskManager.Write("End get enterprise solution statistics report " + userId);
|
||||
|
||||
return report;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
var checkedDomains = new List<int>();
|
||||
var expiredDomains = new List<DomainInfo>();
|
||||
var nonExistenDomains = new List<DomainInfo>();
|
||||
var subDomains = new List<DomainInfo>();
|
||||
var allDomains = new List<DomainInfo>();
|
||||
var allTopLevelDomains = new List<DomainInfo>();
|
||||
|
||||
// get input parameters
|
||||
|
@ -58,13 +58,11 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
var domains = ServerController.GetDomains(package.PackageId);
|
||||
|
||||
subDomains.AddRange(domains.Where(x => x.IsSubDomain));
|
||||
allDomains.AddRange(domains);
|
||||
|
||||
var topLevelDomains = domains = domains.Where(x => !x.IsSubDomain && !x.IsDomainPointer).ToList(); //Selecting top-level domains
|
||||
domains = domains.Where(x => !x.IsSubDomain && !x.IsDomainPointer).ToList(); //Selecting top-level domains
|
||||
|
||||
allTopLevelDomains.AddRange(topLevelDomains);
|
||||
|
||||
domains = topLevelDomains.Where(x => x.CreationDate == null || x.ExpirationDate == null ? true : CheckDomainExpiration(x.ExpirationDate, daysBeforeNotify)).ToList(); // selecting expired or with empty expire date domains
|
||||
allTopLevelDomains.AddRange(domains);
|
||||
|
||||
var domainUser = UserController.GetUser(package.UserId);
|
||||
|
||||
|
@ -98,17 +96,24 @@ namespace WebsitePanel.EnterpriseServer
|
|||
}
|
||||
}
|
||||
|
||||
subDomains = subDomains.GroupBy(p => p.DomainId).Select(g => g.First()).ToList();
|
||||
var subDomains = allDomains.Where(x => x.ExpirationDate == null || CheckDomainExpiration(x.ExpirationDate, daysBeforeNotify)).GroupBy(p => p.DomainId).Select(g => g.First()).ToList();
|
||||
allTopLevelDomains = allTopLevelDomains.GroupBy(p => p.DomainId).Select(g => g.First()).ToList();
|
||||
|
||||
foreach (var subDomain in subDomains)
|
||||
{
|
||||
var mainDomain = allTopLevelDomains.Where(x => subDomain.DomainName.ToLowerInvariant().Contains(x.DomainName.ToLowerInvariant())).OrderByDescending(s => s.DomainName.Length).FirstOrDefault(); ;
|
||||
var mainDomain = allTopLevelDomains.Where(x => subDomain.DomainId != x.DomainId && subDomain.DomainName.ToLowerInvariant().Contains(x.DomainName.ToLowerInvariant())).OrderByDescending(s => s.DomainName.Length).FirstOrDefault(); ;
|
||||
|
||||
if (mainDomain != null)
|
||||
{
|
||||
ServerController.UpdateDomainRegistrationData(subDomain, mainDomain.CreationDate, mainDomain.ExpirationDate);
|
||||
|
||||
var nonExistenDomain = nonExistenDomains.FirstOrDefault(x => subDomain.DomainId == x.DomainId);
|
||||
|
||||
if (nonExistenDomain != null)
|
||||
{
|
||||
nonExistenDomains.Remove(nonExistenDomain);
|
||||
}
|
||||
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
|
@ -176,9 +181,11 @@ namespace WebsitePanel.EnterpriseServer
|
|||
Hashtable items = new Hashtable();
|
||||
|
||||
items["user"] = user;
|
||||
|
||||
items["Domains"] = domains.Select(x => new { DomainName = x.DomainName,
|
||||
ExpirationDate = x.ExpirationDate,
|
||||
Customer = string.Format("{0} {1}", domainUsers[x.PackageId].FirstName, domainUsers[x.PackageId].LastName) });
|
||||
Customer = string.Format("{0} {1}", domainUsers[x.PackageId].FirstName, domainUsers[x.PackageId].LastName) })
|
||||
.OrderBy(x => x.ExpirationDate).ThenBy(x => x.Customer).ThenBy(x => x.DomainName);
|
||||
|
||||
items["IncludeNonExistenDomains"] = includeNonExistenDomains;
|
||||
|
||||
|
@ -186,7 +193,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
DomainName = x.DomainName,
|
||||
Customer = string.Format("{0} {1}", domainUsers[x.PackageId].FirstName, domainUsers[x.PackageId].LastName)
|
||||
});
|
||||
}).OrderBy(x => x.Customer).ThenBy(x => x.DomainName);
|
||||
|
||||
|
||||
body = PackageController.EvaluateTemplate(body, items);
|
||||
|
|
|
@ -23,21 +23,27 @@ namespace WebsitePanel.EnterpriseServer
|
|||
private static readonly string MailBodyTemplateParameter = "MAIL_BODY";
|
||||
private static readonly string MailBodyDomainRecordTemplateParameter = "MAIL_DOMAIN_RECORD";
|
||||
private static readonly string ServerNameParameter = "SERVER_NAME";
|
||||
private static readonly string PauseBetweenQueriesParameter = "PAUSE_BETWEEN_QUERIES";
|
||||
|
||||
private const string MxRecordPattern = @"mail exchanger = (.+)";
|
||||
private const string NsRecordPattern = @"nameserver = (.+)";
|
||||
|
||||
private const string DnsTimeOutMessage = @"dns request timed out";
|
||||
private const int DnsTimeOutRetryCount = 3;
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
BackgroundTask topTask = TaskManager.TopTask;
|
||||
|
||||
List<DomainDnsChanges> domainsChanges = new List<DomainDnsChanges>();
|
||||
var domainUsers = new Dictionary<int, UserInfo>();
|
||||
|
||||
// get input parameters
|
||||
string dnsServersString = (string)topTask.GetParamValue(DnsServersParameter);
|
||||
string serverName = (string)topTask.GetParamValue(ServerNameParameter);
|
||||
|
||||
// check input parameters
|
||||
int pause;
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(dnsServersString))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'DNS' task parameter.");
|
||||
|
@ -50,6 +56,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!int.TryParse((string)topTask.GetParamValue(PauseBetweenQueriesParameter), out pause))
|
||||
{
|
||||
TaskManager.WriteWarning("The 'pause between queries' parameter is not valid.");
|
||||
return;
|
||||
}
|
||||
|
||||
// find server by name
|
||||
ServerInfo server = ServerController.GetServerByName(serverName);
|
||||
if (server == null)
|
||||
|
@ -83,22 +96,32 @@ namespace WebsitePanel.EnterpriseServer
|
|||
continue;
|
||||
}
|
||||
|
||||
if (!domainUsers.ContainsKey(domain.PackageId))
|
||||
{
|
||||
var domainUser = UserController.GetUser(packages.First(x=>x.PackageId == domain.PackageId).UserId);
|
||||
|
||||
domainUsers.Add(domain.PackageId, domainUser);
|
||||
}
|
||||
|
||||
DomainDnsChanges domainChanges = new DomainDnsChanges();
|
||||
domainChanges.DomainName = domain.DomainName;
|
||||
domainChanges.PackageId = domain.PackageId;
|
||||
|
||||
var dbDnsRecords = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainAllDnsRecords(domain.DomainId));
|
||||
|
||||
//execute server
|
||||
foreach (var dnsServer in dnsServers)
|
||||
{
|
||||
var dnsMxRecords = GetDomainDnsRecords(winServer, domain.DomainName, dnsServer, DnsRecordType.MX);
|
||||
var dnsNsRecords = GetDomainDnsRecords(winServer, domain.DomainName, dnsServer, DnsRecordType.NS);
|
||||
var dnsMxRecords = GetDomainDnsRecords(winServer, domain.DomainName, dnsServer, DnsRecordType.MX, pause) ?? dbDnsRecords.Where(x => x.RecordType == DnsRecordType.MX).ToList();
|
||||
var dnsNsRecords = GetDomainDnsRecords(winServer, domain.DomainName, dnsServer, DnsRecordType.NS, pause) ?? dbDnsRecords.Where(x => x.RecordType == DnsRecordType.NS).ToList();
|
||||
|
||||
FillRecordData(dnsMxRecords, domain, dnsServer);
|
||||
FillRecordData(dnsNsRecords, domain, dnsServer);
|
||||
|
||||
domainChanges.DnsChanges.AddRange(ApplyDomainRecordsChanges(dbDnsRecords.Where(x => x.RecordType == DnsRecordType.MX), dnsMxRecords, dnsServer));
|
||||
domainChanges.DnsChanges.AddRange(ApplyDomainRecordsChanges(dbDnsRecords.Where(x => x.RecordType == DnsRecordType.NS), dnsNsRecords, dnsServer));
|
||||
|
||||
domainChanges.DnsChanges = CombineDnsRecordChanges(domainChanges.DnsChanges, dnsServer).ToList();
|
||||
}
|
||||
|
||||
domainsChanges.Add(domainChanges);
|
||||
|
@ -107,7 +130,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
var changedDomains = FindDomainsWithChangedRecords(domainsChanges);
|
||||
|
||||
SendMailMessage(user, changedDomains);
|
||||
SendMailMessage(user, changedDomains, domainUsers);
|
||||
}
|
||||
|
||||
|
||||
|
@ -150,13 +173,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
if (dnsRecord != null)
|
||||
{
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { Record = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.NotChanged, DnsServer = dnsServer });
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = record, NewRecord = dnsRecord, Type = record.RecordType, Status = DomainDnsRecordStatuses.NotChanged, DnsServer = dnsServer });
|
||||
|
||||
dnsRecords.Remove(dnsRecord);
|
||||
}
|
||||
else
|
||||
{
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { Record = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.Removed, DnsServer = dnsServer });
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = record, NewRecord = new DnsRecordInfo { Value = string.Empty}, Type = record.RecordType, Status = DomainDnsRecordStatuses.Removed, DnsServer = dnsServer });
|
||||
|
||||
RemoveRecord(record);
|
||||
}
|
||||
|
@ -164,7 +187,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
foreach (var record in dnsRecords)
|
||||
{
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { Record = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.Added, DnsServer= dnsServer});
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = new DnsRecordInfo { Value = string.Empty }, NewRecord = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.Added, DnsServer = dnsServer });
|
||||
|
||||
AddRecord(record);
|
||||
}
|
||||
|
@ -172,6 +195,39 @@ namespace WebsitePanel.EnterpriseServer
|
|||
return dnsRecordChanges;
|
||||
}
|
||||
|
||||
private IEnumerable<DnsRecordInfoChange> CombineDnsRecordChanges(IEnumerable<DnsRecordInfoChange> records, string dnsServer)
|
||||
{
|
||||
var resultRecords = records.Where(x => x.DnsServer == dnsServer).ToList();
|
||||
|
||||
var recordsToRemove = new List<DnsRecordInfoChange>();
|
||||
|
||||
var removedRecords = records.Where(x => x.Status == DomainDnsRecordStatuses.Removed);
|
||||
var addedRecords = records.Where(x => x.Status == DomainDnsRecordStatuses.Added);
|
||||
|
||||
foreach (DnsRecordType type in (DnsRecordType[])Enum.GetValues(typeof(DnsRecordType)))
|
||||
{
|
||||
foreach (var removedRecord in removedRecords.Where(x => x.Type == type))
|
||||
{
|
||||
var addedRecord = addedRecords.FirstOrDefault(x => x.Type == type && !recordsToRemove.Contains(x));
|
||||
|
||||
if (addedRecord != null)
|
||||
{
|
||||
recordsToRemove.Add(addedRecord);
|
||||
|
||||
removedRecord.NewRecord = addedRecord.NewRecord;
|
||||
removedRecord.Status = DomainDnsRecordStatuses.Updated;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var record in recordsToRemove)
|
||||
{
|
||||
resultRecords.Remove(record);
|
||||
}
|
||||
|
||||
return resultRecords;
|
||||
}
|
||||
|
||||
private void FillRecordData(IEnumerable<DnsRecordInfo> records, DomainInfo domain, string dnsServer)
|
||||
{
|
||||
foreach (var record in records)
|
||||
|
@ -217,7 +273,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
private void SendMailMessage(UserInfo user, IEnumerable<DomainDnsChanges> domainsChanges)
|
||||
private void SendMailMessage(UserInfo user, IEnumerable<DomainDnsChanges> domainsChanges, Dictionary<int, UserInfo> domainUsers)
|
||||
{
|
||||
BackgroundTask topTask = TaskManager.TopTask;
|
||||
|
||||
|
@ -251,6 +307,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
Hashtable items = new Hashtable();
|
||||
|
||||
items["user"] = user;
|
||||
items["DomainUsers"] = domainUsers;
|
||||
items["Domains"] = domainsChanges;
|
||||
|
||||
body = PackageController.EvaluateTemplate(body, items);
|
||||
|
@ -259,14 +316,29 @@ namespace WebsitePanel.EnterpriseServer
|
|||
MailHelper.SendMessage(from, mailTo, bcc, subject, body, priority, isHtml);
|
||||
}
|
||||
|
||||
public List<DnsRecordInfo> GetDomainDnsRecords(WindowsServer winServer, string domain, string dnsServer, DnsRecordType recordType)
|
||||
public List<DnsRecordInfo> GetDomainDnsRecords(WindowsServer winServer, string domain, string dnsServer, DnsRecordType recordType, int pause)
|
||||
{
|
||||
Thread.Sleep(pause);
|
||||
|
||||
//nslookup -type=mx google.com 195.46.39.39
|
||||
var command = "nslookup";
|
||||
var args = string.Format("-type={0} {1} {2}", recordType, domain, dnsServer);
|
||||
|
||||
// execute system command
|
||||
var raw = winServer.ExecuteSystemCommand(command, args);
|
||||
var raw = string.Empty;
|
||||
int triesCount = 0;
|
||||
|
||||
do
|
||||
{
|
||||
raw = winServer.ExecuteSystemCommand(command, args);
|
||||
}
|
||||
while (raw.ToLowerInvariant().Contains(DnsTimeOutMessage) && ++triesCount < DnsTimeOutRetryCount);
|
||||
|
||||
//timeout check
|
||||
if (raw.ToLowerInvariant().Contains(DnsTimeOutMessage))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var records = ParseNsLookupResult(raw, dnsServer, recordType);
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ using System.IO;
|
|||
using System.Net.Mail;
|
||||
using System.Net.Mime;
|
||||
using System.Text;
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using WebsitePanel.EnterpriseServer.Code.HostedSolution;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
|
||||
|
@ -51,6 +52,8 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Start HostedSolutionReportTask");
|
||||
|
||||
BackgroundTask topTask = TaskManager.TopTask;
|
||||
|
||||
bool isExchange = Utils.ParseBool(topTask.GetParamValue(EXCHANGE_REPORT), false);
|
||||
|
@ -61,23 +64,41 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
string email = topTask.GetParamValue(EMAIL).ToString();
|
||||
|
||||
TaskManager.WriteParameter("isExchange",isExchange);
|
||||
TaskManager.WriteParameter("isSharePoint",isSharePoint);
|
||||
TaskManager.WriteParameter("isLync", isLync);
|
||||
TaskManager.WriteParameter("isCRM", isCRM);
|
||||
TaskManager.WriteParameter("isOrganization", isOrganization);
|
||||
TaskManager.WriteParameter("email", email);
|
||||
|
||||
UserInfo user = PackageController.GetPackageOwner(topTask.PackageId);
|
||||
|
||||
TaskManager.WriteParameter("user", user.Username);
|
||||
|
||||
EnterpriseSolutionStatisticsReport report =
|
||||
ReportController.GetEnterpriseSolutionStatisticsReport(user.UserId, isExchange, isSharePoint, isCRM,
|
||||
isOrganization, isLync);
|
||||
|
||||
TaskManager.WriteParameter("report.ExchangeReport.Items.Count", report.ExchangeReport.Items.Count);
|
||||
TaskManager.WriteParameter("report.SharePointReport.Items.Count", report.SharePointReport.Items.Count);
|
||||
TaskManager.WriteParameter("report.CRMReport.Items.Count", report.CRMReport.Items.Count);
|
||||
TaskManager.WriteParameter("report.OrganizationReport.Items.Count", report.OrganizationReport.Items.Count);
|
||||
TaskManager.WriteParameter("report.LyncReport.Items.Count", report.LyncReport.Items.Count);
|
||||
|
||||
SendMessage(user, email, isExchange && report.ExchangeReport != null ? report.ExchangeReport.ToCSV() : string.Empty,
|
||||
isSharePoint && report.SharePointReport != null ? report.SharePointReport.ToCSV() : string.Empty,
|
||||
isCRM && report.CRMReport != null ? report.CRMReport.ToCSV() : string.Empty,
|
||||
isOrganization && report.OrganizationReport != null ? report.OrganizationReport.ToCSV() : string.Empty,
|
||||
isLync && report.LyncReport != null ? report.LyncReport.ToCSV() : string.Empty);
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
|
||||
TaskManager.Write("End HostedSolutionReportTask");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -97,6 +118,8 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
private void SendMessage(UserInfo user,string email, string exchange_csv, string sharepoint_csv, string crm_csv, string organization_csv, string lync_csv)
|
||||
{
|
||||
TaskManager.Write("SendMessage");
|
||||
|
||||
List<Attachment> attacments = new List<Attachment>();
|
||||
PrepareAttament("exchange.csv", exchange_csv, attacments);
|
||||
PrepareAttament("sharepoint.csv", sharepoint_csv, attacments);
|
||||
|
@ -104,9 +127,6 @@ namespace WebsitePanel.EnterpriseServer
|
|||
PrepareAttament("crm.csv", crm_csv, attacments);
|
||||
PrepareAttament("organization.csv", organization_csv, attacments);
|
||||
|
||||
|
||||
|
||||
|
||||
// get letter settings
|
||||
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.HOSTED_SOLUTION_REPORT);
|
||||
|
||||
|
@ -116,9 +136,29 @@ namespace WebsitePanel.EnterpriseServer
|
|||
string body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"];
|
||||
bool isHtml = user.HtmlMail;
|
||||
|
||||
MailPriority priority = MailPriority.Normal;
|
||||
MailPriority priority = MailPriority.Normal;
|
||||
|
||||
TaskManager.WriteParameter("from", from);
|
||||
TaskManager.WriteParameter("email", email);
|
||||
TaskManager.WriteParameter("subject", subject);
|
||||
TaskManager.WriteParameter("body", body);
|
||||
|
||||
|
||||
MailHelper.SendMessage(from, email, cc, subject, body, priority, isHtml, attacments.ToArray());
|
||||
int res = MailHelper.SendMessage(from, email, cc, subject, body, priority, isHtml, attacments.ToArray());
|
||||
|
||||
if (res==0)
|
||||
{
|
||||
TaskManager.Write("SendMessage OK");
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskManager.WriteError("SendMessage error ", "error code", res.ToString());
|
||||
}
|
||||
|
||||
TaskManager.WriteParameter("", res);
|
||||
|
||||
TaskManager.Write("End SendMessage");
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
public static SchedulerJob nextSchedule = null;
|
||||
|
||||
public static void Start()
|
||||
{
|
||||
{
|
||||
ScheduleTasks();
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
private static void RunManualTasks()
|
||||
{
|
||||
var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping);
|
||||
var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping);
|
||||
|
||||
foreach (var task in tasks)
|
||||
{
|
||||
|
|
|
@ -30,6 +30,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Xml;
|
||||
using WebsitePanel.Providers;
|
||||
|
@ -42,6 +43,8 @@ using WebsitePanel.Providers.HostedSolution;
|
|||
using Whois.NET;
|
||||
using System.Text.RegularExpressions;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
|
@ -72,6 +75,9 @@ namespace WebsitePanel.EnterpriseServer
|
|||
@"expires:(.+)" //.fi
|
||||
};
|
||||
|
||||
private static List<string> _datePatterns = new List<string> { @"ddd MMM dd HH:mm:ss G\MT yyyy"
|
||||
};
|
||||
|
||||
#region Servers
|
||||
public static List<ServerInfo> GetAllServers()
|
||||
{
|
||||
|
@ -1641,11 +1647,16 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
var result = new List<DnsRecordInfo>();
|
||||
|
||||
var mxRecords = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainDnsRecords(domainId, DnsRecordType.MX));
|
||||
var nsRecords = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainDnsRecords(domainId, DnsRecordType.NS));
|
||||
var records = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainAllDnsRecords(domainId));
|
||||
|
||||
result.AddRange(mxRecords);
|
||||
result.AddRange(nsRecords);
|
||||
var activeDomain = records.OrderByDescending(x => x.Date).FirstOrDefault();
|
||||
|
||||
if (activeDomain != null)
|
||||
{
|
||||
records = records.Where(x => x.DnsServer == activeDomain.DnsServer).ToList();
|
||||
}
|
||||
|
||||
result.AddRange(records);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -2178,11 +2189,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
}
|
||||
}
|
||||
|
||||
// Find and delete all zone items for this domain
|
||||
var zoneItems = PackageController.GetPackageItemsByType(domain.PackageId, ResourceGroups.Dns, typeof (DnsZone));
|
||||
zoneItems.AddRange(PackageController.GetPackageItemsByType(domain.PackageId, ResourceGroups.Dns, typeof(SecondaryDnsZone)));
|
||||
|
||||
// remove DNS zone meta-item if required
|
||||
if (domain.ZoneItemId > 0)
|
||||
foreach (var zoneItem in zoneItems.Where(z => z.Name == domain.ZoneName))
|
||||
{
|
||||
PackageController.DeletePackageItem(domain.ZoneItemId);
|
||||
PackageController.DeletePackageItem(zoneItem.Id);
|
||||
}
|
||||
|
||||
// delete domain
|
||||
|
@ -2723,7 +2736,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
if (match.Success && match.Groups.Count == 2)
|
||||
{
|
||||
return DateTime.Parse(match.Groups[1].ToString().Trim());
|
||||
return ParseDate(match.Groups[1].ToString().Trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2731,6 +2744,21 @@ namespace WebsitePanel.EnterpriseServer
|
|||
return null;
|
||||
}
|
||||
|
||||
private static DateTime? ParseDate(string dateString)
|
||||
{
|
||||
var result = DateTime.MinValue;
|
||||
|
||||
foreach (var datePattern in _datePatterns)
|
||||
{
|
||||
if (DateTime.TryParseExact(dateString, datePattern, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return DateTime.Parse(dateString);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region DNS Zones
|
||||
|
@ -2748,7 +2776,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
DNSServer dns = new DNSServer();
|
||||
ServiceProviderProxy.Init(dns, zoneItem.ServiceId);
|
||||
|
||||
return dns.GetZoneRecords(domain.DomainName);
|
||||
return dns.GetZoneRecords(zoneItem.Name);
|
||||
}
|
||||
|
||||
return new DnsRecord[] { };
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue