diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 895c2d3f..e2f2f94a 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -6130,8 +6130,112 @@ REFERENCES [dbo].[Domains] ([DomainID]) ON DELETE CASCADE GO +IF EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'ScheduleTasksEmailTemplates') +DROP TABLE ScheduleTasksEmailTemplates +GO +CREATE TABLE ScheduleTasksEmailTemplates +( + [TaskID] [nvarchar](100) NOT NULL, + [ParameterID] [nvarchar](100) NOT NULL, + [Value] [nvarchar](Max) NULL +) +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTasksEmailTemplates] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP' AND [ParameterID]= N'MAIL_BODY' ) +BEGIN +INSERT [dbo].[ScheduleTasksEmailTemplates] ([TaskID], [ParameterID], [Value]) VALUES (N'SCHEDULE_TASK_DOMAIN_LOOKUP', N'MAIL_BODY', N' + + Account Summary Information + + + +
+ + +
+ MX and NS Information +
+ +

+Hello!, +

+ +

+Please, find below details for mx and ns changes. +

+ + + + + + + + + + + + + [RecordRow] + +
DomainDNSRecord TypeDataBase ValueDns Value
+ + +

+If you have any questions regarding your hosting account, feel free to contact our support department at any time. +

+ +

+Best regards +

+ +
+ +') +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTasksEmailTemplates] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP' AND [ParameterID]= N'MAIL_DOMAIN_RECORD' ) +BEGIN +INSERT [dbo].[ScheduleTasksEmailTemplates] ([TaskID], [ParameterID], [Value]) VALUES (N'SCHEDULE_TASK_DOMAIN_LOOKUP', N'MAIL_DOMAIN_RECORD',N' + [domain] + [dns] + [recordType] + [dbRecord] + [dnsRecord] + ') +END +GO + -- Procedures for Domai lookup service +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetScheduleTaskEmailTemplate') +DROP PROCEDURE GetScheduleTaskEmailTemplate +GO +CREATE PROCEDURE [dbo].GetScheduleTaskEmailTemplate +( + @TaskID [nvarchar](100) , + @ParameterID [nvarchar](100) +) +AS +SELECT + [TaskID] , + [ParameterID], + [Value] + FROM [dbo].[ScheduleTasksEmailTemplates] where [TaskID] = @TaskID AND [ParameterID] = @ParameterID +GO IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetAllPackageIds') DROP PROCEDURE GetAllPackageIds diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index 67597939..ceacc208 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -4743,9 +4743,9 @@ namespace WebsitePanel.EnterpriseServer ); } - public static IDataReader AddDomainDnsRecord(DnsRecordInfo domainDnsRecord) + public static void AddDomainDnsRecord(DnsRecordInfo domainDnsRecord) { - return SqlHelper.ExecuteReader( + SqlHelper.ExecuteReader( ConnectionString, CommandType.StoredProcedure, "AddDomainDnsRecord", @@ -4757,9 +4757,20 @@ namespace WebsitePanel.EnterpriseServer ); } - public static IDataReader DeleteDomainDnsRecord(int id) + public static IDataReader GetScheduleTaskEmailTemplate(string taskId, string parameterId) { return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetScheduleTaskEmailTemplate", + new SqlParameter("@taskId", taskId), + new SqlParameter("@parameterId", parameterId) + ); + } + + public static void DeleteDomainDnsRecord(int id) + { + SqlHelper.ExecuteReader( ConnectionString, CommandType.StoredProcedure, "DeleteDomainDnsRecord", diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainLookupViewTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainLookupViewTask.cs index 765b3544..42b6bbbd 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainLookupViewTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainLookupViewTask.cs @@ -9,10 +9,15 @@ namespace WebsitePanel.EnterpriseServer { public class DomainLookupViewTask : SchedulerTask { + private static readonly string TaskId = "SCHEDULE_TASK_DOMAIN_LOOKUP"; + // Input parameters: private static readonly string DnsServersParameter = "DNS_SERVERS"; private static readonly string MailToParameter = "MAIL_TO"; + private static readonly string MailBodyTemplateParameter = "MAIL_BODY"; + private static readonly string MailBodyDomainRecordTemplateParameter = "MAIL_DOMAIN_RECORD"; + public override void DoWork() { BackgroundTask topTask = TaskManager.TopTask; @@ -57,6 +62,7 @@ namespace WebsitePanel.EnterpriseServer foreach (var domain in domains) { DomainChanges domainChanges = new DomainChanges(); + domainChanges.Domain = domain.DomainName; var mxRecords = ObjectUtils.CreateListFromDataReader(DataProvider.GetDomainMXRecords(domain.DomainId, DnsRecordType.MX)); var nsRecords = ObjectUtils.CreateListFromDataReader(DataProvider.GetDomainMXRecords(domain.DomainId, DnsRecordType.NS)); @@ -70,8 +76,8 @@ namespace WebsitePanel.EnterpriseServer FillRecordData(dnsMxRecords, domain, dnsServer); FillRecordData(dnsNsRecords, domain, dnsServer); - domainChanges.MxChanges.Add(ApplyDomainRecordsChanges(mxRecords, dnsMxRecords, dnsServer)); - domainChanges.NsChanges.Add(ApplyDomainRecordsChanges(nsRecords, dnsNsRecords, dnsServer)); + domainChanges.DnsChanges.Add(ApplyDomainRecordsChanges(mxRecords, dnsMxRecords, dnsServer)); + domainChanges.DnsChanges.Add(ApplyDomainRecordsChanges(nsRecords, dnsNsRecords, dnsServer)); } domainsChanges.Add(domainChanges); @@ -96,18 +102,16 @@ namespace WebsitePanel.EnterpriseServer foreach (var domainChanges in domainsChanges) { - var firstTimeAdditon = domainChanges.MxChanges.All(x => x.DnsRecordsCompare.All(dns => dns.DbRecord == null)) - && domainChanges.NsChanges.All(x => x.DnsRecordsCompare.All(dns => dns.DbRecord == null)); + var firstTimeAdditon = domainChanges.DnsChanges.All(x => x.DnsRecordsCompare.All(dns => dns.DbRecord == null)); if (firstTimeAdditon) { continue; } - bool mxIsChanged = domainChanges.MxChanges.Any(x => x.DnsRecordsCompare.Any(d => d.Status != DomainDnsRecordStatuses.NotChanged)); - bool nsIsChanged = domainChanges.NsChanges.Any(x => x.DnsRecordsCompare.Any(d => d.Status != DomainDnsRecordStatuses.NotChanged)); + bool isChanged = domainChanges.DnsChanges.Any(x => x.DnsRecordsCompare.Any(d => d.Status != DomainDnsRecordStatuses.NotChanged)); - if (mxIsChanged || nsIsChanged) + if (isChanged) { changedDomains.Add(domainChanges); } @@ -129,13 +133,13 @@ namespace WebsitePanel.EnterpriseServer if (dnsRecord != null) { - domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = record, DnsRecord = dnsRecord, Status = DomainDnsRecordStatuses.NotChanged }); + domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = record, DnsRecord = dnsRecord, Type= record.RecordType, Status = DomainDnsRecordStatuses.NotChanged }); dnsRecords.Remove(dnsRecord); } else { - domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = record, DnsRecord = null, Status = DomainDnsRecordStatuses.Removed }); + domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = record, DnsRecord = null, Type = record.RecordType, Status = DomainDnsRecordStatuses.Removed }); RemoveRecord(record); @@ -145,7 +149,7 @@ namespace WebsitePanel.EnterpriseServer foreach (var record in dnsRecords) { - domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = null, DnsRecord = record, Status = DomainDnsRecordStatuses.Added }); + domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = null, DnsRecord = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.Added }); AddRecord(record); @@ -200,11 +204,13 @@ namespace WebsitePanel.EnterpriseServer { BackgroundTask topTask = TaskManager.TopTask; + var bodyTempalte = ObjectUtils.FillObjectFromDataReader(DataProvider.GetScheduleTaskEmailTemplate(TaskId, MailBodyTemplateParameter)); + var domainRecordTemplate = ObjectUtils.FillObjectFromDataReader(DataProvider.GetScheduleTaskEmailTemplate(TaskId, MailBodyDomainRecordTemplateParameter)); + // input parameters - string mailFrom = "wsp@scheduler.noreply"; + string mailFrom = "wsp-scheduler@noreply.net"; string mailTo = (string)topTask.GetParamValue("MAIL_TO"); - string mailSubject = "WSP MX and NS notification"; - string mailBody = "Hello!

"; + string mailSubject = "MX and NS notification"; if (String.IsNullOrEmpty(mailTo)) { @@ -212,8 +218,32 @@ namespace WebsitePanel.EnterpriseServer } else { + var tableRecords = new List(); + + foreach (var domain in domainsChanges) + { + var changes = domain.DnsChanges; + + foreach (var dnsChanged in changes.Where(x=>x.IsChanged)) + { + foreach (var record in dnsChanged.DnsRecordsCompare.Where(x=>x.Status != DomainDnsRecordStatuses.NotChanged)) + { + var tableRow = Utils.ReplaceStringVariable(domainRecordTemplate.Value, "domain", domain.Domain); + tableRow = Utils.ReplaceStringVariable(tableRow, "dns", dnsChanged.DnsServer); + tableRow = Utils.ReplaceStringVariable(tableRow, "recordType", record.Type.ToString()); + tableRow = Utils.ReplaceStringVariable(tableRow, "dbRecord", record.DbRecord != null ? record.DbRecord.Value : "-"); + tableRow = Utils.ReplaceStringVariable(tableRow, "dnsRecord", record.DnsRecord != null ? record.DnsRecord.Value : "-"); + + tableRecords.Add(tableRow); + } + } + } + + + var mailBody = Utils.ReplaceStringVariable(bodyTempalte.Value, "RecordRow", string.Join(" ", tableRecords)); + // send mail message - // MailHelper.SendMessage(mailFrom, mailTo, mailSubject, mailBody, false); + MailHelper.SendMessage(mailFrom, mailTo, mailSubject, mailBody, true); } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainChanges.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainChanges.cs index 5bd9f038..9af977ae 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainChanges.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainChanges.cs @@ -9,13 +9,11 @@ namespace WebsitePanel.Providers.DomainLookup { public string Domain { get; set; } - public List MxChanges { get; set; } - public List NsChanges { get; set; } + public List DnsChanges { get; set; } public DomainChanges() { - MxChanges = new List(); - NsChanges = new List(); + DnsChanges = new List(); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainDnsRecordCompare.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainDnsRecordCompare.cs index f3663b43..e21d0eac 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainDnsRecordCompare.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainDnsRecordCompare.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using WebsitePanel.Providers.DNS; namespace WebsitePanel.Providers.DomainLookup { @@ -10,5 +11,6 @@ namespace WebsitePanel.Providers.DomainLookup public DnsRecordInfo DbRecord { get; set; } public DnsRecordInfo DnsRecord { get; set; } public DomainDnsRecordStatuses Status { get; set; } + public DnsRecordType Type { get; set; } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/ScheduleTaskEmailTemplate.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/ScheduleTaskEmailTemplate.cs new file mode 100644 index 00000000..1ffa6e23 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/ScheduleTaskEmailTemplate.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WebsitePanel.Providers.DomainLookup +{ + public class ScheduleTaskEmailTemplate + { + public string TaskId { get; set; } + public string ParameterID { get; set; } + public string Value { get; set; } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj index 576d7cec..4bd21714 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj @@ -90,6 +90,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.OS.Windows2012/Windows2012.cs b/WebsitePanel/Sources/WebsitePanel.Providers.OS.Windows2012/Windows2012.cs index c034f52e..c9787fe6 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.OS.Windows2012/Windows2012.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.OS.Windows2012/Windows2012.cs @@ -322,19 +322,22 @@ namespace WebsitePanel.Providers.OS { foreach (var dnsRecordPs in dnsRecordsPs) { - DnsRecordInfo newRecord; + DnsRecordInfo newRecord = null; switch (recordType) { - case DnsRecordType.MX: { newRecord = CreateMxDnsRecordFromPsObject(dnsRecordPs); break; } - case DnsRecordType.NS: { newRecord = CreateNsDnsRecordFromPsObject(dnsRecordPs); break; } + case DnsRecordType.MX: { newRecord = CreateDnsRecordFromPsObject(dnsRecordPs, "NameExchange"); break; } + case DnsRecordType.NS: { newRecord = CreateDnsRecordFromPsObject(dnsRecordPs, "NameHost"); break; } default: continue; } - newRecord.DnsServer = dnsServer; - newRecord.RecordType = recordType; + if (newRecord != null) + { + newRecord.DnsServer = dnsServer; + newRecord.RecordType = recordType; - records.Add(newRecord); + records.Add(newRecord); + } } } @@ -347,21 +350,16 @@ namespace WebsitePanel.Providers.OS return records.ToArray(); } - private DnsRecordInfo CreateMxDnsRecordFromPsObject(PSObject psObject) + private DnsRecordInfo CreateDnsRecordFromPsObject(PSObject psObject, string valueName) { + if (!psObject.Members.Any(x => x.Name == valueName)) + { + return null; + } + var dnsRecord = new DnsRecordInfo { - Value = Convert.ToString(GetPSObjectProperty(psObject, "NameExchange")), - }; - - return dnsRecord; - } - - private DnsRecordInfo CreateNsDnsRecordFromPsObject(PSObject psObject) - { - var dnsRecord = new DnsRecordInfo - { - Value = Convert.ToString(GetPSObjectProperty(psObject, "NameHost")), + Value = Convert.ToString(GetPSObjectProperty(psObject, valueName)), }; return dnsRecord;