Merge with default

This commit is contained in:
vfedosevich 2014-12-30 02:07:05 -08:00
commit d3c6a46d6f
227 changed files with 13105 additions and 5593 deletions

View file

@ -36,6 +36,8 @@ using Microsoft.ApplicationBlocks.Data;
using System.Collections.Generic;
using Microsoft.Win32;
using WebsitePanel.Providers.RemoteDesktopServices;
using WebsitePanel.Providers.DNS;
using WebsitePanel.Providers.DomainLookup;
namespace WebsitePanel.EnterpriseServer
{
@ -1908,9 +1910,9 @@ namespace WebsitePanel.EnterpriseServer
public static IDataReader GetProcessBackgroundTasks(BackgroundTaskStatus status)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "GetProcessBackgroundTasks",
new SqlParameter("@status", (int)status));
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "GetProcessBackgroundTasks",
new SqlParameter("@status", (int)status));
}
public static IDataReader GetBackgroundTopTask(Guid guid)
@ -3265,6 +3267,18 @@ namespace WebsitePanel.EnterpriseServer
);
}
public static DataSet GetOrganizationObjectsByDomain(int itemId, string domainName)
{
return SqlHelper.ExecuteDataset(
ConnectionString,
CommandType.StoredProcedure,
"GetOrganizationObjectsByDomain",
new SqlParameter("@ItemID", itemId),
new SqlParameter("@DomainName", domainName)
);
}
#endregion
#region CRM
@ -4636,10 +4650,10 @@ namespace WebsitePanel.EnterpriseServer
public static void UpdateRDSServer(RdsServer server)
{
UpdateRDSServer(server.Id, server.ItemId, server.Name, server.FqdName, server.Description,
server.RdsCollectionId);
server.RdsCollectionId, server.ConnectionEnabled);
}
public static void UpdateRDSServer(int id, int? itemId, string name, string fqdName, string description, int? rdsCollectionId)
public static void UpdateRDSServer(int id, int? itemId, string name, string fqdName, string description, int? rdsCollectionId, bool connectionEnabled)
{
SqlHelper.ExecuteNonQuery(
ConnectionString,
@ -4650,7 +4664,8 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@Name", name),
new SqlParameter("@FqdName", fqdName),
new SqlParameter("@Description", description),
new SqlParameter("@RDSCollectionId", rdsCollectionId)
new SqlParameter("@RDSCollectionId", rdsCollectionId),
new SqlParameter("@ConnectionEnabled", connectionEnabled)
);
}
@ -4729,5 +4744,127 @@ namespace WebsitePanel.EnterpriseServer
}
#endregion
#region MX|NX Services
public static IDataReader GetAllPackages()
{
return SqlHelper.ExecuteReader(
ConnectionString,
CommandType.StoredProcedure,
"GetAllPackages"
);
}
public static IDataReader GetDomainDnsRecords(int domainId, DnsRecordType recordType)
{
return SqlHelper.ExecuteReader(
ConnectionString,
CommandType.StoredProcedure,
"GetDomainDnsRecords",
new SqlParameter("@DomainId", domainId),
new SqlParameter("@RecordType", recordType)
);
}
public static IDataReader GetDomainAllDnsRecords(int domainId)
{
return SqlHelper.ExecuteReader(
ConnectionString,
CommandType.StoredProcedure,
"GetDomainAllDnsRecords",
new SqlParameter("@DomainId", domainId)
);
}
public static void AddDomainDnsRecord(DnsRecordInfo domainDnsRecord)
{
SqlHelper.ExecuteNonQuery(
ConnectionString,
CommandType.StoredProcedure,
"AddDomainDnsRecord",
new SqlParameter("@DomainId", domainDnsRecord.DomainId),
new SqlParameter("@RecordType", domainDnsRecord.RecordType),
new SqlParameter("@DnsServer", domainDnsRecord.DnsServer),
new SqlParameter("@Value", domainDnsRecord.Value),
new SqlParameter("@Date", domainDnsRecord.Date)
);
}
public static IDataReader GetScheduleTaskEmailTemplate(string taskId)
{
return SqlHelper.ExecuteReader(
ConnectionString,
CommandType.StoredProcedure,
"GetScheduleTaskEmailTemplate",
new SqlParameter("@taskId", taskId)
);
}
public static void DeleteDomainDnsRecord(int id)
{
SqlHelper.ExecuteNonQuery(
ConnectionString,
CommandType.StoredProcedure,
"DeleteDomainDnsRecord",
new SqlParameter("@Id", id)
);
}
public static void UpdateDomainCreationDate(int domainId, DateTime date)
{
UpdateDomainDate(domainId, "UpdateDomainCreationDate", date);
}
public static void UpdateDomainExpirationDate(int domainId, DateTime date)
{
UpdateDomainDate(domainId, "UpdateDomainExpirationDate", date);
}
public static void UpdateDomainLastUpdateDate(int domainId, DateTime date)
{
UpdateDomainDate(domainId, "UpdateDomainLastUpdateDate", date);
}
private static void UpdateDomainDate(int domainId, string stroredProcedure, DateTime date)
{
SqlHelper.ExecuteNonQuery(
ConnectionString,
CommandType.StoredProcedure,
stroredProcedure,
new SqlParameter("@DomainId", domainId),
new SqlParameter("@Date", date)
);
}
public static void UpdateDomainDates(int domainId, DateTime? domainCreationDate, DateTime? domainExpirationDate, DateTime? domainLastUpdateDate)
{
SqlHelper.ExecuteNonQuery(
ConnectionString,
CommandType.StoredProcedure,
"UpdateDomainDates",
new SqlParameter("@DomainId", domainId),
new SqlParameter("@DomainCreationDate", domainCreationDate),
new SqlParameter("@DomainExpirationDate", domainExpirationDate),
new SqlParameter("@DomainLastUpdateDate", domainLastUpdateDate)
);
}
public static void UpdateWhoisDomainInfo(int domainId, DateTime? domainCreationDate, DateTime? domainExpirationDate, DateTime? domainLastUpdateDate, string registrarName)
{
SqlHelper.ExecuteNonQuery(
ConnectionString,
CommandType.StoredProcedure,
"UpdateWhoisDomainInfo",
new SqlParameter("@DomainId", domainId),
new SqlParameter("@DomainCreationDate", domainCreationDate),
new SqlParameter("@DomainExpirationDate", domainExpirationDate),
new SqlParameter("@DomainLastUpdateDate", domainLastUpdateDate),
new SqlParameter("@DomainRegistrarName", registrarName)
);
}
#endregion
}
}

View file

@ -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);

View file

@ -193,6 +193,9 @@ namespace WebsitePanel.EnterpriseServer
stats.UsedDiskSpace = tempStats.UsedDiskSpace;
stats.UsedLitigationHoldSpace = tempStats.UsedLitigationHoldSpace;
stats.UsedArchingStorage = tempStats.UsedArchingStorage;
stats.CreatedSharedMailboxes = tempStats.CreatedSharedMailboxes;
stats.CreatedResourceMailboxes = tempStats.CreatedResourceMailboxes;
}
else
{
@ -221,6 +224,9 @@ namespace WebsitePanel.EnterpriseServer
stats.UsedDiskSpace += tempStats.UsedDiskSpace;
stats.UsedLitigationHoldSpace += tempStats.UsedLitigationHoldSpace;
stats.UsedArchingStorage += tempStats.UsedArchingStorage;
stats.CreatedSharedMailboxes += tempStats.CreatedSharedMailboxes;
stats.CreatedResourceMailboxes += tempStats.CreatedResourceMailboxes;
}
}
}
@ -241,6 +247,9 @@ namespace WebsitePanel.EnterpriseServer
stats.AllocatedLitigationHoldSpace = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue;
stats.AllocatedArchingStorage = cntx.Quotas[Quotas.EXCHANGE2013_ARCHIVINGSTORAGE].QuotaAllocatedValue;
stats.AllocatedSharedMailboxes = cntx.Quotas[Quotas.EXCHANGE2013_SHAREDMAILBOXES].QuotaAllocatedValue;
stats.AllocatedResourceMailboxes = cntx.Quotas[Quotas.EXCHANGE2013_RESOURCEMAILBOXES].QuotaAllocatedValue;
return stats;
}
catch (Exception ex)
@ -1679,8 +1688,21 @@ namespace WebsitePanel.EnterpriseServer
// check mailbox quota
OrganizationStatistics orgStats = GetOrganizationStatistics(itemId);
if ((orgStats.AllocatedMailboxes > -1) && (orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
if (accountType == ExchangeAccountType.SharedMailbox)
{
if ((orgStats.AllocatedSharedMailboxes > -1) && (orgStats.CreatedSharedMailboxes >= orgStats.AllocatedSharedMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
else if ((accountType == ExchangeAccountType.Room) || (accountType == ExchangeAccountType.Equipment))
{
if ((orgStats.AllocatedResourceMailboxes > -1) && (orgStats.CreatedResourceMailboxes >= orgStats.AllocatedResourceMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
else
{
if ((orgStats.AllocatedMailboxes > -1) && (orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
// place log record

View file

@ -507,6 +507,15 @@ namespace WebsitePanel.EnterpriseServer
}
}
public static bool CheckDomainUsedByHostedOrganization(int itemId, int domainId)
{
DomainInfo domain = ServerController.GetDomain(domainId);
if (domain == null)
return false;
return (DataProvider.CheckDomainUsedByHostedOrganization(domain.DomainName) == 1);
}
private static void DeleteOCSUsers(int itemId, ref bool successful)
{
try
@ -3080,5 +3089,10 @@ namespace WebsitePanel.EnterpriseServer
}
#endregion
public static DataSet GetOrganizationObjectsByDomain(int itemId, string domainName)
{
return DataProvider.GetOrganizationObjectsByDomain(itemId, domainName);
}
}
}

View file

@ -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;
}

View file

@ -1505,6 +1505,13 @@ namespace WebsitePanel.EnterpriseServer
/// <returns>True if quota will exceed. Otherwise, false.</returns>
protected bool VerifyIfQuotaWillBeExceeded(int packageId, string quotaName, int numberOfItemsToAdd)
{
// Don't bother to check quota if the number of items to add is zero or less otherwise IsQuotasWillExceed
// will fail when quota is set to 0 on lists or groups and still thera are no items to import
if (numberOfItemsToAdd <= 0)
{
return false;
}
bool result = false;
QuotaValueInfo quotaInfo = PackageController.GetPackageQuota(packageId, quotaName);

View file

@ -40,6 +40,9 @@ using WebsitePanel.Providers;
using WebsitePanel.Providers.OS;
using OS = WebsitePanel.Providers.OS;
using System.Collections;
using WebsitePanel.Providers.DomainLookup;
using WebsitePanel.Providers.DNS;
using System.Linq;
namespace WebsitePanel.EnterpriseServer
@ -811,5 +814,6 @@ namespace WebsitePanel.EnterpriseServer
#endregion
}
}

View file

@ -980,11 +980,13 @@ namespace WebsitePanel.EnterpriseServer
homeFolder.PackageId = packageId;
homeFolder.Name = path;
int res = AddPackageItem(homeFolder);
// Added By Haya
UpdatePackageHardQuota(packageId);
// save package item
return AddPackageItem(homeFolder);
return res;
}
public static DateTime GetPackageBandwidthUpdate(int packageId)

View file

@ -68,6 +68,11 @@ namespace WebsitePanel.EnterpriseServer
return AddRdsCollectionInternal(itemId, collection);
}
public static ResultObject EditRdsCollection(int itemId, RdsCollection collection)
{
return EditRdsCollectionInternal(itemId, collection);
}
public static RdsCollectionPaged GetRdsCollectionsPaged(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
return GetRdsCollectionsPagedInternal(itemId, filterColumn, filterValue, sortColumn, startRow, maximumRows);
@ -93,9 +98,9 @@ namespace WebsitePanel.EnterpriseServer
return GetFreeRdsServersPagedInternal(filterColumn, filterValue, sortColumn, startRow, maximumRows);
}
public static RdsServersPaged GetOrganizationRdsServersPaged(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
public static RdsServersPaged GetOrganizationRdsServersPaged(int itemId, int? collectionId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
return GetOrganizationRdsServersPagedInternal(itemId, filterColumn, filterValue, sortColumn, startRow, maximumRows);
return GetOrganizationRdsServersPagedInternal(itemId, collectionId, filterColumn, filterValue, sortColumn, startRow, maximumRows);
}
public static RdsServersPaged GetOrganizationFreeRdsServersPaged(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
@ -108,6 +113,11 @@ namespace WebsitePanel.EnterpriseServer
return GetRdsServerInternal(rdsSeverId);
}
public static ResultObject SetRDServerNewConnectionAllowed(int itemId, bool newConnectionAllowed, int rdsSeverId)
{
return SetRDServerNewConnectionAllowedInternal(itemId, newConnectionAllowed, rdsSeverId);
}
public static List<RdsServer> GetCollectionRdsServers(int collectionId)
{
return GetCollectionRdsServersInternal(collectionId);
@ -193,6 +203,16 @@ namespace WebsitePanel.EnterpriseServer
return GetOrganizationRdsUsersCountInternal(itemId);
}
public static List<string> GetApplicationUsers(int itemId, int collectionId, RemoteApplication remoteApp)
{
return GetApplicationUsersInternal(itemId, collectionId, remoteApp);
}
public static ResultObject SetApplicationUsers(int itemId, int collectionId, RemoteApplication remoteApp, List<string> users)
{
return SetApplicationUsersInternal(itemId, collectionId, remoteApp, users);
}
private static RdsCollection GetRdsCollectionInternal(int collectionId)
{
var collection = ObjectUtils.FillObjectFromDataReader<RdsCollection>(DataProvider.GetRDSCollectionById(collectionId));
@ -280,6 +300,58 @@ namespace WebsitePanel.EnterpriseServer
return result;
}
private static ResultObject EditRdsCollectionInternal(int itemId, RdsCollection collection)
{
var result = TaskManager.StartResultTask<ResultObject>("REMOTE_DESKTOP_SERVICES", "EDIT_RDS_COLLECTION");
try
{
Organization org = OrganizationController.GetOrganization(itemId);
if (org == null)
{
result.IsSuccess = false;
result.AddError("", new NullReferenceException("Organization not found"));
return result;
}
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
var existingServers =
ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToList();
var removedServers = existingServers.Where(x => !collection.Servers.Select(y => y.Id).Contains(x.Id));
var newServers = collection.Servers.Where(x => !existingServers.Select(y => y.Id).Contains(x.Id));
foreach(var server in removedServers)
{
DataProvider.RemoveRDSServerFromCollection(server.Id);
}
rds.AddRdsServersToDeployment(newServers.ToArray());
foreach (var server in newServers)
{
DataProvider.AddRDSServerToCollection(server.Id, collection.Id);
}
}
catch (Exception ex)
{
result.AddError("REMOTE_DESKTOP_SERVICES_ADD_RDS_COLLECTION", ex);
}
finally
{
if (!result.IsSuccess)
{
TaskManager.CompleteResultTask(result);
}
else
{
TaskManager.CompleteResultTask();
}
}
return result;
}
private static RdsCollectionPaged GetRdsCollectionsPagedInternal(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
DataSet ds = DataProvider.GetRDSCollectionsPaged(itemId, filterColumn, filterValue, sortColumn, startRow, maximumRows);
@ -420,9 +492,9 @@ namespace WebsitePanel.EnterpriseServer
return result;
}
private static RdsServersPaged GetOrganizationRdsServersPagedInternal(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
private static RdsServersPaged GetOrganizationRdsServersPagedInternal(int itemId, int? collectionId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
DataSet ds = DataProvider.GetRDSServersPaged(itemId, null, filterColumn, filterValue, sortColumn, startRow, maximumRows, ignoreRdsCollectionId: true);
DataSet ds = DataProvider.GetRDSServersPaged(itemId, collectionId, filterColumn, filterValue, sortColumn, startRow, maximumRows, ignoreRdsCollectionId: !collectionId.HasValue);
RdsServersPaged result = new RdsServersPaged();
result.RecordsCount = (int)ds.Tables[0].Rows[0][0];
@ -457,6 +529,54 @@ namespace WebsitePanel.EnterpriseServer
return ObjectUtils.FillObjectFromDataReader<RdsServer>(DataProvider.GetRDSServerById(rdsSeverId));
}
private static ResultObject SetRDServerNewConnectionAllowedInternal(int itemId, bool newConnectionAllowed, int rdsSeverId)
{
ResultObject result = TaskManager.StartResultTask<ResultObject>("REMOTE_DESKTOP_SERVICES", "SET_RDS_SERVER_NEW_CONNECTIONS_ALLOWED"); ;
try
{
// load organization
Organization org = OrganizationController.GetOrganization(itemId);
if (org == null)
{
result.IsSuccess = false;
result.AddError("", new NullReferenceException("Organization not found"));
return result;
}
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
var rdsServer = GetRdsServer(rdsSeverId);
if (rdsServer == null)
{
result.IsSuccess = false;
result.AddError("", new NullReferenceException("RDS Server not found"));
return result;
}
rds.SetRDServerNewConnectionAllowed(newConnectionAllowed, rdsServer);
rdsServer.ConnectionEnabled = newConnectionAllowed;
DataProvider.UpdateRDSServer(rdsServer);
}
catch (Exception ex)
{
result.AddError("REMOTE_DESKTOP_SERVICES_SET_RDS_SERVER_NEW_CONNECTIONS_ALLOWED", ex);
}
finally
{
if (!result.IsSuccess)
{
TaskManager.CompleteResultTask(result);
}
else
{
TaskManager.CompleteResultTask();
}
}
return result;
}
private static int GetOrganizationRdsUsersCountInternal(int itemId)
{
return DataProvider.GetOrganizationRdsUsersCount(itemId);
@ -479,19 +599,26 @@ namespace WebsitePanel.EnterpriseServer
try
{
if (1 == 1)//(CheckRDSServerAvaliable(rdsServer.FqdName))
if (CheckRDSServerAvaliable(rdsServer.FqdName))
{
rdsServer.Id = DataProvider.AddRDSServer(rdsServer.Name, rdsServer.FqdName, rdsServer.Description);
}
else
{
result.AddError("", new Exception("The server that you are adding, is not available"));
result.AddError("REMOTE_DESKTOP_SERVICES_ADD_RDS_SERVER", new Exception("The server that you are adding, is not available"));
return result;
}
}
catch (Exception ex)
{
result.AddError("REMOTE_DESKTOP_SERVICES_ADD_RDS_SERVER", ex);
if (ex.InnerException != null)
{
result.AddError("Unable to add RDS Server", ex.InnerException);
}
else
{
result.AddError("Unable to add RDS Server", ex);
}
}
finally
{
@ -639,7 +766,7 @@ namespace WebsitePanel.EnterpriseServer
RdsServer rdsServer = GetRdsServer(serverId);
if (!rds.CheckSessionHostFeatureInstallation(rdsServer.FqdName))
//if (!rds.CheckSessionHostFeatureInstallation(rdsServer.FqdName))
{
rds.AddSessionHostFeatureToServer(rdsServer.FqdName);
}
@ -722,7 +849,7 @@ namespace WebsitePanel.EnterpriseServer
private static List<OrganizationUser> GetRdsCollectionUsersInternal(int collectionId)
{
return ObjectUtils.CreateListFromDataReader<OrganizationUser>(DataProvider.GetRDSCollectionUsersByRDSCollectionId(collectionId));
}
}
private static ResultObject SetUsersToRdsCollectionInternal(int itemId, int collectionId, List<OrganizationUser> users)
{
@ -802,6 +929,61 @@ namespace WebsitePanel.EnterpriseServer
return result;
}
private static List<string> GetApplicationUsersInternal(int itemId, int collectionId, RemoteApplication remoteApp)
{
var result = new List<string>();
Organization org = OrganizationController.GetOrganization(itemId);
if (org == null)
{
return result;
}
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
var collection = GetRdsCollection(collectionId);
result.AddRange(rds.GetApplicationUsers(collection.Name, remoteApp.DisplayName));
return result;
}
private static ResultObject SetApplicationUsersInternal(int itemId, int collectionId, RemoteApplication remoteApp, List<string> users)
{
var result = TaskManager.StartResultTask<ResultObject>("REMOTE_DESKTOP_SERVICES", "SET_REMOTE_APP_USERS");
try
{
Organization org = OrganizationController.GetOrganization(itemId);
if (org == null)
{
result.IsSuccess = false;
result.AddError("", new NullReferenceException("Organization not found"));
return result;
}
var collection = GetRdsCollection(collectionId);
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
rds.SetApplicationUsers(collection.Name, remoteApp, users.ToArray());
}
catch (Exception ex)
{
result.AddError("REMOTE_DESKTOP_SERVICES_SET_REMOTE_APP_USERS", ex);
}
finally
{
if (!result.IsSuccess)
{
TaskManager.CompleteResultTask(result);
}
else
{
TaskManager.CompleteResultTask();
}
}
return result;
}
private static ResultObject AddRemoteApplicationToCollectionInternal(int itemId, RdsCollection collection, RemoteApplication remoteApp)
{
var result = TaskManager.StartResultTask<ResultObject>("REMOTE_DESKTOP_SERVICES", "ADD_REMOTE_APP_TO_COLLECTION");
@ -992,18 +1174,12 @@ namespace WebsitePanel.EnterpriseServer
private static bool CheckRDSServerAvaliable(string hostname)
{
bool result = false;
var ping = new Ping();
var reply = ping.Send(hostname, 1000);
try
if (reply.Status == IPStatus.Success)
{
var ping = new Ping();
var reply = ping.Send(hostname, 1000); // 1 second time out (in ms)
if (reply.Status == IPStatus.Success)
result = true;
}
catch (Exception)
{
result = false;
result = true;
}
return result;

View file

@ -200,11 +200,14 @@ namespace WebsitePanel.EnterpriseServer
//TaskManager.Write(String.Format("{0} - Invoke GetServiceItemsDiskSpace method ('{1}' items) - {2} attempt",
// DateTime.Now, objItems.Count, attempt));
ServiceProvider prov = new ServiceProvider();
ServiceProviderProxy.Init(prov, serviceId);
ServiceProviderItemDiskSpace[] itemsDiskSpace = prov.GetServiceItemsDiskSpace(objItems.ToArray());
if (itemsDiskSpace != null && itemsDiskSpace.Length > 0)
organizationDiskSpaces.AddRange(itemsDiskSpace);
if (objItems.Count > 0)
{
ServiceProvider prov = new ServiceProvider();
ServiceProviderProxy.Init(prov, serviceId);
ServiceProviderItemDiskSpace[] itemsDiskSpace = prov.GetServiceItemsDiskSpace(objItems.ToArray());
if (itemsDiskSpace != null && itemsDiskSpace.Length > 0)
organizationDiskSpaces.AddRange(itemsDiskSpace);
}
return organizationDiskSpaces.ToArray();
}

View file

@ -0,0 +1,210 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using WebsitePanel.Providers.DomainLookup;
using Whois.NET;
namespace WebsitePanel.EnterpriseServer
{
public class DomainExpirationTask: SchedulerTask
{
private static readonly string TaskId = "SCHEDULE_TASK_DOMAIN_EXPIRATION";
// Input parameters:
private static readonly string DaysBeforeNotify = "DAYS_BEFORE";
private static readonly string MailToParameter = "MAIL_TO";
private static readonly string EnableNotification = "ENABLE_NOTIFICATION";
private static readonly string IncludeNonExistenDomains = "INCLUDE_NONEXISTEN_DOMAINS";
private static readonly string MailBodyTemplateParameter = "MAIL_BODY";
private static readonly string MailBodyDomainRecordTemplateParameter = "MAIL_DOMAIN_RECORD";
public override void DoWork()
{
BackgroundTask topTask = TaskManager.TopTask;
var domainUsers = new Dictionary<int, UserInfo>();
var checkedDomains = new List<int>();
var expiredDomains = new List<DomainInfo>();
var nonExistenDomains = new List<DomainInfo>();
var allDomains = new List<DomainInfo>();
var allTopLevelDomains = new List<DomainInfo>();
// get input parameters
int daysBeforeNotify;
bool sendEmailNotifcation = Convert.ToBoolean( topTask.GetParamValue(EnableNotification));
bool includeNonExistenDomains = Convert.ToBoolean(topTask.GetParamValue(IncludeNonExistenDomains));
// check input parameters
if (String.IsNullOrEmpty((string)topTask.GetParamValue("MAIL_TO")))
{
TaskManager.WriteWarning("The e-mail message has not been sent because 'Mail To' is empty.");
return;
}
int.TryParse((string)topTask.GetParamValue(DaysBeforeNotify), out daysBeforeNotify);
var user = UserController.GetUser(topTask.EffectiveUserId);
var packages = GetUserPackages(user.UserId, user.Role);
foreach (var package in packages)
{
var domains = ServerController.GetDomains(package.PackageId);
allDomains.AddRange(domains);
domains = domains.Where(x => !x.IsSubDomain && !x.IsDomainPointer).ToList(); //Selecting top-level domains
allTopLevelDomains.AddRange(domains);
var domainUser = UserController.GetUser(package.UserId);
if (!domainUsers.ContainsKey(package.PackageId))
{
domainUsers.Add(package.PackageId, domainUser);
}
foreach (var domain in domains)
{
if (checkedDomains.Contains(domain.DomainId))
{
continue;
}
checkedDomains.Add(domain.DomainId);
ServerController.UpdateDomainWhoisData(domain);
if (CheckDomainExpiration(domain.ExpirationDate, daysBeforeNotify))
{
expiredDomains.Add(domain);
}
if (domain.ExpirationDate == null && domain.CreationDate == null)
{
nonExistenDomains.Add(domain);
}
Thread.Sleep(100);
}
}
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.DomainId != x.DomainId && subDomain.DomainName.ToLowerInvariant().Contains(x.DomainName.ToLowerInvariant())).OrderByDescending(s => s.DomainName.Length).FirstOrDefault(); ;
if (mainDomain != null)
{
ServerController.UpdateDomainWhoisData(subDomain, mainDomain.CreationDate, mainDomain.ExpirationDate, mainDomain.RegistrarName);
var nonExistenDomain = nonExistenDomains.FirstOrDefault(x => subDomain.DomainId == x.DomainId);
if (nonExistenDomain != null)
{
nonExistenDomains.Remove(nonExistenDomain);
}
Thread.Sleep(100);
}
}
expiredDomains = expiredDomains.GroupBy(p => p.DomainId).Select(g => g.First()).ToList();
if (expiredDomains.Count > 0 && sendEmailNotifcation)
{
SendMailMessage(user, expiredDomains, domainUsers, nonExistenDomains, includeNonExistenDomains);
}
}
private IEnumerable<PackageInfo> GetUserPackages(int userId,UserRole userRole)
{
var packages = new List<PackageInfo>();
switch (userRole)
{
case UserRole.Administrator:
{
packages = ObjectUtils.CreateListFromDataReader<PackageInfo>(DataProvider.GetAllPackages());
break;
}
default:
{
packages = PackageController.GetMyPackages(userId);
break;
}
}
return packages;
}
private bool CheckDomainExpiration(DateTime? date, int daysBeforeNotify)
{
if (date == null)
{
return false;
}
return (date.Value - DateTime.Now).Days < daysBeforeNotify;
}
private void SendMailMessage(UserInfo user, IEnumerable<DomainInfo> domains, Dictionary<int, UserInfo> domainUsers, IEnumerable<DomainInfo> nonExistenDomains, bool includeNonExistenDomains)
{
BackgroundTask topTask = TaskManager.TopTask;
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.DOMAIN_EXPIRATION_LETTER);
string from = settings["From"];
var bcc = settings["CC"];
string subject = settings["Subject"];
string body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"];
bool isHtml = user.HtmlMail;
MailPriority priority = MailPriority.Normal;
if (!String.IsNullOrEmpty(settings["Priority"]))
priority = (MailPriority)Enum.Parse(typeof(MailPriority), settings["Priority"], true);
// input parameters
string mailTo = (string)topTask.GetParamValue("MAIL_TO");
Hashtable items = new Hashtable();
items["user"] = user;
items["Domains"] = domains.Select(x => new { DomainName = x.DomainName,
ExpirationDate = x.ExpirationDate < DateTime.Now ? "Expired" : x.ExpirationDate.ToString(),
ExpirationDateOrdering = x.ExpirationDate,
Registrar = x.RegistrarName,
Customer = string.Format("{0} {1}", domainUsers[x.PackageId].FirstName, domainUsers[x.PackageId].LastName) })
.OrderBy(x => x.ExpirationDateOrdering).ThenBy(x => x.Customer).ThenBy(x => x.DomainName);
items["IncludeNonExistenDomains"] = includeNonExistenDomains;
items["NonExistenDomains"] = nonExistenDomains.Select(x => new
{
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);
// send mail message
MailHelper.SendMessage(from, mailTo, bcc, subject, body, priority, isHtml);
}
}
}

View file

@ -0,0 +1,394 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using WebsitePanel.Providers.DNS;
using WebsitePanel.Providers.DomainLookup;
using WebsitePanel.Server;
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";
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);
int pause;
// check input parameters
if (String.IsNullOrEmpty(dnsServersString))
{
TaskManager.WriteWarning("Specify 'DNS' task parameter.");
return;
}
if (String.IsNullOrEmpty((string)topTask.GetParamValue("MAIL_TO")))
{
TaskManager.WriteWarning("The e-mail message has not been sent because 'Mail To' is empty.");
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)
{
TaskManager.WriteWarning(String.Format("Server with the name '{0}' was not found", serverName));
return;
}
WindowsServer winServer = new WindowsServer();
ServiceProviderProxy.ServerInit(winServer, server.ServerId);
var user = UserController.GetUser(topTask.UserId);
var dnsServers = dnsServersString.Split(';');
var packages = ObjectUtils.CreateListFromDataReader<PackageInfo>(DataProvider.GetAllPackages());
foreach (var package in packages)
{
var domains = ServerController.GetDomains(package.PackageId);
domains = domains.Where(x => !x.IsSubDomain && !x.IsDomainPointer).ToList(); //Selecting top-level domains
//domains = domains.Where(x => x.ZoneItemId > 0).ToList(); //Selecting only dns enabled domains
foreach (var domain in domains)
{
if (domainsChanges.Any(x => x.DomainName == domain.DomainName))
{
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;
domainChanges.Registrar = domain.RegistrarName;
domainChanges.ExpirationDate = domain.ExpirationDate;
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, 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);
}
}
var changedDomains = FindDomainsWithChangedRecords(domainsChanges);
SendMailMessage(user, changedDomains, domainUsers);
}
#region Helpers
private IEnumerable<DomainDnsChanges> FindDomainsWithChangedRecords(IEnumerable<DomainDnsChanges> domainsChanges)
{
var changedDomains = new List<DomainDnsChanges>();
foreach (var domainChanges in domainsChanges)
{
var firstTimeAdditon = domainChanges.DnsChanges.All(x => x.Status == DomainDnsRecordStatuses.Added);
if (firstTimeAdditon)
{
continue;
}
bool isChanged = domainChanges.DnsChanges.Any(d => d.Status != DomainDnsRecordStatuses.NotChanged);
if (isChanged)
{
changedDomains.Add(domainChanges);
}
}
return changedDomains;
}
private IEnumerable<DnsRecordInfoChange> ApplyDomainRecordsChanges(IEnumerable<DnsRecordInfo> dbRecords, List<DnsRecordInfo> dnsRecords, string dnsServer)
{
var dnsRecordChanges = new List<DnsRecordInfoChange>();
var filteredDbRecords = dbRecords.Where(x => x.DnsServer == dnsServer);
foreach (var record in filteredDbRecords)
{
var dnsRecord = dnsRecords.FirstOrDefault(x => x.Value == record.Value);
if (dnsRecord != null)
{
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = record, NewRecord = dnsRecord, Type = record.RecordType, Status = DomainDnsRecordStatuses.NotChanged, DnsServer = dnsServer });
dnsRecords.Remove(dnsRecord);
}
else
{
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = record, NewRecord = new DnsRecordInfo { Value = string.Empty}, Type = record.RecordType, Status = DomainDnsRecordStatuses.Removed, DnsServer = dnsServer });
RemoveRecord(record);
}
}
foreach (var record in dnsRecords)
{
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = new DnsRecordInfo { Value = string.Empty }, NewRecord = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.Added, DnsServer = dnsServer });
AddRecord(record);
}
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)
{
FillRecordData(record, domain, dnsServer);
}
}
private void FillRecordData(DnsRecordInfo record, DomainInfo domain, string dnsServer)
{
record.DomainId = domain.DomainId;
record.Date = DateTime.Now;
record.DnsServer = dnsServer;
}
private void RemoveRecords(IEnumerable<DnsRecordInfo> dnsRecords)
{
foreach (var record in dnsRecords)
{
RemoveRecord(record);
}
}
private void RemoveRecord(DnsRecordInfo dnsRecord)
{
DataProvider.DeleteDomainDnsRecord(dnsRecord.Id);
Thread.Sleep(100);
}
private void AddRecords(IEnumerable<DnsRecordInfo> dnsRecords)
{
foreach (var record in dnsRecords)
{
AddRecord(record);
}
}
private void AddRecord(DnsRecordInfo dnsRecord)
{
DataProvider.AddDomainDnsRecord(dnsRecord);
Thread.Sleep(100);
}
private void SendMailMessage(UserInfo user, IEnumerable<DomainDnsChanges> domainsChanges, Dictionary<int, UserInfo> domainUsers)
{
BackgroundTask topTask = TaskManager.TopTask;
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.DOMAIN_LOOKUP_LETTER);
string from = settings["From"];
var bcc = settings["CC"];
string subject = settings["Subject"];
MailPriority priority = MailPriority.Normal;
if (!String.IsNullOrEmpty(settings["Priority"]))
priority = (MailPriority)Enum.Parse(typeof(MailPriority), settings["Priority"], true);
// input parameters
string mailTo = (string)topTask.GetParamValue("MAIL_TO");
string body = string.Empty;
bool isHtml = user.HtmlMail;
if (domainsChanges.Any())
{
body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"];
}
else
{
body = user.HtmlMail ? settings["NoChangesHtmlBody"] : settings["NoChangesTextBody"];
}
Hashtable items = new Hashtable();
items["user"] = user;
items["DomainUsers"] = domainUsers;
items["Domains"] = domainsChanges;
body = PackageController.EvaluateTemplate(body, items);
// send mail message
MailHelper.SendMessage(from, mailTo, bcc, subject, body, priority, isHtml);
}
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 = 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);
return records.ToList();
}
private IEnumerable<DnsRecordInfo> ParseNsLookupResult(string raw, string dnsServer, DnsRecordType recordType)
{
var records = new List<DnsRecordInfo>();
var recordTypePattern = string.Empty;
switch (recordType)
{
case DnsRecordType.NS:
{
recordTypePattern = NsRecordPattern;
break;
}
case DnsRecordType.MX:
{
recordTypePattern = MxRecordPattern;
break;
}
}
var regex = new Regex(recordTypePattern, RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(raw))
{
if (match.Groups.Count != 2)
{
continue;
}
var dnsRecord = new DnsRecordInfo
{
Value = match.Groups[1].Value != null ? match.Groups[1].Value.Replace("\r\n", "").Replace("\r", "").Replace("\n", "").ToLowerInvariant().Trim() : null,
RecordType = recordType,
DnsServer = dnsServer
};
records.Add(dnsRecord);
}
return records;
}
#endregion
}
}

View file

@ -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");
}
}

View file

@ -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)
{

View file

@ -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;
@ -39,6 +40,11 @@ using WebsitePanel.Server;
using WebsitePanel.Providers.ResultObjects;
using WebsitePanel.Providers.Web;
using WebsitePanel.Providers.HostedSolution;
using Whois.NET;
using System.Text.RegularExpressions;
using WebsitePanel.Providers.DomainLookup;
using System.Globalization;
using System.Linq;
namespace WebsitePanel.EnterpriseServer
{
@ -49,6 +55,35 @@ namespace WebsitePanel.EnterpriseServer
{
private const string LOG_SOURCE_SERVERS = "SERVERS";
private static List<string> _createdDatePatterns = new List<string> { @"Creation Date:(.+)", // base
@"created:(.+)",
@"Created On:(.+) UTC",
@"Created On:(.+)",
@"Domain Registration Date:(.+)",
@"Domain Create Date:(.+)",
@"Registered on:(.+)"};
private static List<string> _expiredDatePatterns = new List<string> { @"Expiration Date:(.+) UTC", //base UTC
@"Expiration Date:(.+)", // base
@"Registry Expiry Date:(.+)", //.org
@"paid-till:(.+)", //.ru
@"Expires On:(.+)", //.name
@"Domain Expiration Date:(.+)", //.us
@"renewal date:(.+)", //.pl
@"Expiry date:(.+)", //.uk
@"anniversary:(.+)", //.fr
@"expires:(.+)" //.fi
};
private static List<string> _registrarNamePatterns = new List<string> {
@"Created by Registrar:(.+)",
@"Registrar:(.+)",
@"Registrant Name:(.+)"
};
private static List<string> _datePatterns = new List<string> { @"ddd MMM dd HH:mm:ss G\MT yyyy"
};
#region Servers
public static List<ServerInfo> GetAllServers()
{
@ -1613,6 +1648,26 @@ namespace WebsitePanel.EnterpriseServer
#endregion
#region Domains
public static List<DnsRecordInfo> GetDomainDnsRecords(int domainId)
{
var result = new List<DnsRecordInfo>();
var records = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainAllDnsRecords(domainId));
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;
}
public static int CheckDomain(string domainName)
{
int checkDomainResult = DataProvider.CheckDomain(-10, domainName, false);
@ -1787,6 +1842,8 @@ namespace WebsitePanel.EnterpriseServer
ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPS, domain, "");
ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPSForPC, domain, "");
}
UpdateDomainWhoisData(domain);
}
// add instant alias
@ -2138,11 +2195,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
@ -2637,6 +2696,79 @@ namespace WebsitePanel.EnterpriseServer
TaskManager.CompleteTask();
}
}
public static DomainInfo UpdateDomainWhoisData(DomainInfo domain)
{
try
{
var whoisResult = WhoisClient.Query(domain.DomainName.ToLowerInvariant());
string creationDateString = ParseWhoisDomainInfo(whoisResult.Raw, _createdDatePatterns);
string expirationDateString = ParseWhoisDomainInfo(whoisResult.Raw, _expiredDatePatterns);
domain.CreationDate = ParseDate(creationDateString);
domain.ExpirationDate = ParseDate(expirationDateString);
domain.RegistrarName = ParseWhoisDomainInfo(whoisResult.Raw, _registrarNamePatterns);
DataProvider.UpdateWhoisDomainInfo(domain.DomainId, domain.CreationDate, domain.ExpirationDate, DateTime.Now, domain.RegistrarName);
}
catch (Exception e)
{
//wrong domain
}
return domain;
}
public static DomainInfo UpdateDomainWhoisData(DomainInfo domain, DateTime? creationDate, DateTime? expirationDate, string registrarName)
{
DataProvider.UpdateWhoisDomainInfo(domain.DomainId, creationDate, expirationDate, DateTime.Now, registrarName);
domain.CreationDate = creationDate;
domain.ExpirationDate = expirationDate;
domain.RegistrarName = registrarName;
return domain;
}
private static string ParseWhoisDomainInfo(string raw, IEnumerable<string> patterns)
{
foreach (var createdRegex in patterns)
{
var regex = new Regex(createdRegex, RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(raw))
{
if (match.Success && match.Groups.Count == 2)
{
return match.Groups[1].ToString().Trim();
}
}
}
return null;
}
private static DateTime? ParseDate(string dateString)
{
if (string.IsNullOrEmpty(dateString))
{
return null;
}
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
@ -2654,7 +2786,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[] { };

View file

@ -35,6 +35,9 @@
<Reference Include="Ionic.Zip.Reduced">
<HintPath>..\..\Lib\Ionic.Zip.Reduced.dll</HintPath>
</Reference>
<Reference Include="IPAddressRange">
<HintPath>..\..\Lib\References\Whois.NET\IPAddressRange.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Services3">
<HintPath>..\..\Lib\Microsoft.Web.Services3.dll</HintPath>
<Private>True</Private>
@ -62,6 +65,9 @@
<Reference Include="WebsitePanel.Server.Client">
<HintPath>..\..\Bin\WebsitePanel.Server.Client.dll</HintPath>
</Reference>
<Reference Include="WhoisClient">
<HintPath>..\..\Lib\References\Whois.NET\WhoisClient.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Comments\CommentsController.cs" />
@ -140,9 +146,11 @@
<Compile Include="SchedulerTasks\CalculatePackagesDiskspaceTask.cs" />
<Compile Include="SchedulerTasks\CancelOverdueInvoicesTask.cs" />
<Compile Include="SchedulerTasks\CheckWebSiteTask.cs" />
<Compile Include="SchedulerTasks\DomainExpirationTask.cs" />
<Compile Include="SchedulerTasks\FTPFilesTask.cs" />
<Compile Include="SchedulerTasks\GenerateInvoicesTask.cs" />
<Compile Include="SchedulerTasks\HostedSolutionReport.cs" />
<Compile Include="SchedulerTasks\DomainLookupViewTask.cs" />
<Compile Include="SchedulerTasks\NotifyOverusedDatabasesTask.cs" />
<Compile Include="SchedulerTasks\RunPaymentQueueTask.cs" />
<Compile Include="SchedulerTasks\RunSystemCommandTask.cs" />