websitepanel/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs
robvde 43b73aee66 Added the ability to stamp mailboxes with a mailbox plan as well as those
mailboxes that have no mailbox plan assigned yet.

The following SQL statement will 'upgrade' the user data to work with the new
exchange 2010 SP2 provider. Ensure you replace the variables with values that
matches your environment.

DECLARE  @NetBIOSDomain nvarchar(20)
DECLARE  @ExchangeOrgRoot nvarchar(256)

SET @NetBIOSDomain = 'MYDOMAIN'
SET @ExchangeOrgRoot = 'CN=First Organization,CN=Microsoft Exchange,CN=Services,
CN=Configuration,DC=mydomain,DC=local'

UPDATE ExchangeAccounts SET SamAccountName = @NetBIOSDomain+'\'+AccountName
WHERE AccountID IN  (SELECT AccountID FROM ExchangeAccounts
WHERE AccountType IN (3,7) AND SamAccountName = '')

INSERT INTO ServiceItemProperties (ItemID, PropertyName, PropertyValue)
(SELECT SP.ItemID, 'AddressBookPolicy',
PV = 'CN='+SP.PropertyValue+' Address Policy,CN=AddressBook Mailbox Policies,'
+ @ExchangeOrgRoot
FROM         ServiceItemProperties AS SP
WHERE     (PropertyName = 'OrganizationID') AND (ItemID IN
 (SELECT     ItemID
 FROM          ServiceItemProperties AS ServiceItemProperties_1
 WHERE      (PropertyName = 'GlobalAddressList') AND (PropertyValue <> ''))))

UPDATE SP SET PropertyValue='CN='+SP2.PropertyValue+' Rooms,CN=All Address Lists
,CN=Address Lists Container,'+@ExchangeOrgRoot
FROM ServiceItemProperties AS SP
JOIN ServiceItemProperties AS SP2 ON SP.ItemID = SP2.ItemID
AND SP.PropertyName='RoomsAddressList'
WHERE (SP2.PropertyName = 'OrganizationID') AND (SP2.ItemID IN
 (SELECT     ItemID
 FROM          ServiceItemProperties AS ServiceItemProperties_1
 WHERE      (PropertyName = 'GlobalAddressList') AND (PropertyValue <> '')))
2012-07-12 17:14:19 +04:00

2381 lines
98 KiB
C#

// Copyright (c) 2012, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Web;
using System.Data;
using System.Reflection;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Xml;
using System.Net.Mail;
using WebsitePanel.Providers;
using WebsitePanel.Providers.Web;
using WebsitePanel.Providers.FTP;
using WebsitePanel.Providers.Mail;
using WebsitePanel.Providers.OS;
using OS = WebsitePanel.Providers.OS;
using Reports = WebsitePanel.EnterpriseServer.Base.Reports;
using System.Diagnostics;
using WebsitePanel.Templates;
namespace WebsitePanel.EnterpriseServer
{
/// <summary>
/// Summary description for Packages.
/// </summary>
public class PackageController
{
#region Hosting Plans
public static DataSet GetHostingPlans(int userId)
{
return DataProvider.GetHostingPlans(SecurityContext.User.UserId, userId);
}
public static DataSet GetHostingAddons(int userId)
{
return DataProvider.GetHostingAddons(SecurityContext.User.UserId, userId);
}
public static HostingPlanInfo GetHostingPlan(int planId)
{
return ObjectUtils.FillObjectFromDataReader<HostingPlanInfo>(
DataProvider.GetHostingPlan(SecurityContext.User.UserId, planId));
}
public static DataSet GetHostingPlanQuotas(int packageId, int planId, int serverId)
{
return DataProvider.GetHostingPlanQuotas(SecurityContext.User.UserId, packageId,
planId, serverId);
}
public static HostingPlanContext GetHostingPlanContext(int planId)
{
HostingPlanContext context = new HostingPlanContext();
// load hosting plan
context.HostingPlan = GetHostingPlan(planId);
if (context.HostingPlan == null)
return null;
// load groups and quotas
DataSet ds = GetHostingPlanQuotas(0, planId, 0);
List<HostingPlanGroupInfo> groups = new List<HostingPlanGroupInfo>();
foreach (DataRow dr in ds.Tables[0].Rows)
{
HostingPlanGroupInfo group = new HostingPlanGroupInfo();
group.GroupId = (int)dr["GroupID"];
group.GroupName = (string)dr["GroupName"];
bool enabled = (bool)dr["Enabled"];
group.Enabled = enabled;
group.CalculateBandwidth = (bool)dr["CalculateBandwidth"];
group.CalculateDiskSpace = (bool)dr["CalculateDiskSpace"];
if (enabled)
{
groups.Add(group);
context.Groups.Add(group.GroupName, group);
}
}
List<QuotaValueInfo> quotas = new List<QuotaValueInfo>();
foreach (DataRow dr in ds.Tables[1].Rows)
{
QuotaValueInfo quota = new QuotaValueInfo();
quota.QuotaId = (int)dr["QuotaId"];
quota.GroupId = (int)dr["GroupId"];
quota.QuotaName = (string)dr["QuotaName"];
quota.QuotaTypeId = (int)dr["QuotaTypeId"];
quota.QuotaAllocatedValue = (int)dr["QuotaValue"];
quotas.Add(quota);
context.Quotas.Add(quota.QuotaName, quota);
}
context.GroupsArray = groups.ToArray();
context.QuotasArray = quotas.ToArray();
return context;
}
private static string BuildPlanQuotasXml(HostingPlanGroupInfo[] groups, HostingPlanQuotaInfo[] quotas)
{
// build xml
/*
XML Format:
<plan>
<groups>
<group id="16" enabled="1" calculateDiskSpace="1" calculateBandwidth="1"/>
</groups>
<quotas>
<quota id="2" value="2"/>
</quotas>
</plan>
*/
if (groups == null || quotas == null)
return null;
XmlDocument doc = new XmlDocument();
XmlElement nodePlan = doc.CreateElement("plan");
XmlElement nodeGroups = doc.CreateElement("groups");
nodePlan.AppendChild(nodeGroups);
XmlElement nodeQuotas = doc.CreateElement("quotas");
nodePlan.AppendChild(nodeQuotas);
// groups
if (groups != null)
{
foreach (HostingPlanGroupInfo group in groups)
{
XmlElement nodeGroup = doc.CreateElement("group");
nodeGroups.AppendChild(nodeGroup);
nodeGroup.SetAttribute("id", group.GroupId.ToString());
nodeGroup.SetAttribute("enabled", group.Enabled ? "1" : "0");
nodeGroup.SetAttribute("calculateDiskSpace", group.CalculateDiskSpace ? "1" : "0");
nodeGroup.SetAttribute("calculateBandwidth", group.CalculateBandwidth ? "1" : "0");
}
}
// quotas
if (quotas != null)
{
foreach (HostingPlanQuotaInfo quota in quotas)
{
XmlElement nodeQuota = doc.CreateElement("quota");
nodeQuotas.AppendChild(nodeQuota);
nodeQuota.SetAttribute("id", quota.QuotaId.ToString());
nodeQuota.SetAttribute("value", quota.QuotaValue.ToString());
}
}
return nodePlan.OuterXml;
}
public static List<HostingPlanInfo> GetUserAvailableHostingPlans(int userId)
{
return ObjectUtils.CreateListFromDataSet<HostingPlanInfo>(
DataProvider.GetUserAvailableHostingPlans(SecurityContext.User.UserId, userId));
}
public static List<HostingPlanInfo> GetUserAvailableHostingAddons(int userId)
{
return ObjectUtils.CreateListFromDataSet<HostingPlanInfo>(
DataProvider.GetUserAvailableHostingAddons(SecurityContext.User.UserId, userId));
}
public static int AddHostingPlan(HostingPlanInfo plan)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsReseller);
if (accountCheck < 0) return accountCheck;
string quotasXml = BuildPlanQuotasXml(plan.Groups, plan.Quotas);
return DataProvider.AddHostingPlan(SecurityContext.User.UserId, plan.UserId, plan.PackageId, plan.PlanName,
plan.PlanDescription, plan.Available, plan.ServerId, plan.SetupPrice, plan.RecurringPrice,
plan.RecurrenceUnit, plan.RecurrenceLength, plan.IsAddon, quotasXml);
}
public static PackageResult UpdateHostingPlan(HostingPlanInfo plan)
{
PackageResult result = new PackageResult();
// check account
result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsReseller);
if (result.Result < 0) return result;
string quotasXml = BuildPlanQuotasXml(plan.Groups, plan.Quotas);
result.ExceedingQuotas = DataProvider.UpdateHostingPlan(SecurityContext.User.UserId,
plan.PlanId, plan.PackageId, plan.ServerId, plan.PlanName,
plan.PlanDescription, plan.Available, plan.SetupPrice, plan.RecurringPrice,
plan.RecurrenceUnit, plan.RecurrenceLength, quotasXml);
if (result.ExceedingQuotas.Tables[0].Rows.Count > 0)
result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED;
return result;
}
public static int DeleteHostingPlan(int planId)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsReseller);
if (accountCheck < 0) return accountCheck;
int result = DataProvider.DeleteHostingPlan(SecurityContext.User.UserId, planId);
if (result == -1)
return BusinessErrorCodes.ERROR_HOSTING_PLAN_USED_IN_PACKAGE;
else if (result == -2)
return BusinessErrorCodes.ERROR_HOSTING_ADDON_USED_IN_PACKAGE;
return 0;
}
#endregion
#region Packages
public static List<PackageInfo> GetMyPackages(int userId)
{
List<PackageInfo> packages = new List<PackageInfo>();
ObjectUtils.FillCollectionFromDataSet<PackageInfo>(packages,
GetRawMyPackages(userId));
return packages;
}
public static List<PackageInfo> GetPackages(int userId)
{
List<PackageInfo> packages = new List<PackageInfo>();
ObjectUtils.FillCollectionFromDataSet<PackageInfo>(
packages, GetRawPackages(userId));
return packages;
}
public static DataSet GetNestedPackagesSummary(int packageId)
{
return DataProvider.GetNestedPackagesSummary(SecurityContext.User.UserId, packageId);
}
public static List<PackageInfo> GetPackagePackages(int packageId, bool recursive)
{
List<PackageInfo> packages = new List<PackageInfo>();
ObjectUtils.FillCollectionFromDataSet<PackageInfo>(
packages, GetRawPackagePackages(packageId, recursive));
return packages;
}
public static DataSet GetRawMyPackages(int userId)
{
return DataProvider.GetMyPackages(SecurityContext.User.UserId, userId);
}
public static DataSet GetRawPackages(int userId)
{
return DataProvider.GetPackages(SecurityContext.User.UserId, userId);
}
public static DataSet GetRawPackagePackages(int packageId, bool recursive)
{
return DataProvider.GetPackagePackages(SecurityContext.User.UserId, packageId, recursive);
}
public static DataSet GetPackagesPaged(int userId, string filterColumn, string filterValue,
string sortColumn, int startRow, int maximumRows)
{
return DataProvider.GetPackagesPaged(SecurityContext.User.UserId, userId,
filterColumn, filterValue, sortColumn, startRow, maximumRows);
}
public static DataSet GetNestedPackagesPaged(int packageId, string filterColumn, string filterValue,
int statusId, int planId, int serverId, string sortColumn, int startRow, int maximumRows)
{
return DataProvider.GetNestedPackagesPaged(SecurityContext.User.UserId, packageId,
filterColumn, filterValue, statusId, planId, serverId, sortColumn, startRow, maximumRows);
}
public static DataSet SearchServiceItemsPaged(int userId, int itemTypeId, string filterValue,
string sortColumn, int startRow, int maximumRows)
{
return DataProvider.SearchServiceItemsPaged(SecurityContext.User.UserId, userId, itemTypeId, filterValue,
sortColumn, startRow, maximumRows);
}
public static DataSet GetPackageQuotas(int packageId)
{
return DataProvider.GetPackageQuotas(SecurityContext.User.UserId, packageId);
}
public static DataSet GetPackageQuotasForEdit(int packageId)
{
return DataProvider.GetPackageQuotasForEdit(SecurityContext.User.UserId, packageId);
}
public static PackageInfo GetPackage(int packageId)
{
return ObjectUtils.FillObjectFromDataReader<PackageInfo>(
DataProvider.GetPackage(SecurityContext.User.UserId, packageId));
}
public static PackageContext GetPackageContext(int packageId)
{
PackageContext context = new PackageContext();
// load package
context.Package = GetPackage(packageId);
if (context.Package == null)
return null;
// load groups and quotas
DataSet ds = GetPackageQuotas(packageId);
List<HostingPlanGroupInfo> groups = new List<HostingPlanGroupInfo>();
foreach (DataRow dr in ds.Tables[0].Rows)
{
HostingPlanGroupInfo group = new HostingPlanGroupInfo();
group.GroupId = (int)dr["GroupID"];
group.GroupName = (string)dr["GroupName"];
group.Enabled = true;
group.CalculateBandwidth = (bool)dr["CalculateBandwidth"];
group.CalculateDiskSpace = (bool)dr["CalculateDiskSpace"];
groups.Add(group);
context.Groups.Add(group.GroupName, group);
}
List<QuotaValueInfo> quotas = new List<QuotaValueInfo>();
foreach (DataRow dr in ds.Tables[1].Rows)
{
QuotaValueInfo quota = new QuotaValueInfo();
quota.QuotaId = (int)dr["QuotaId"];
quota.GroupId = (int)dr["GroupId"];
quota.QuotaName = (string)dr["QuotaName"];
quota.QuotaTypeId = (int)dr["QuotaTypeId"];
quota.QuotaAllocatedValue = (int)dr["QuotaValue"];
quota.QuotaUsedValue = (int)dr["QuotaUsedValue"];
quota.QuotaExhausted = (packageId < 2) || (quota.QuotaAllocatedValue != -1 && quota.QuotaUsedValue >= quota.QuotaAllocatedValue);
quotas.Add(quota);
context.Quotas.Add(quota.QuotaName, quota);
}
context.GroupsArray = groups.ToArray();
context.QuotasArray = quotas.ToArray();
return context;
}
public static UserInfo GetPackageOwner(int packageId)
{
PackageInfo package = GetPackage(packageId);
if (package == null)
return null;
return UserController.GetUser(package.UserId);
}
public static PackageResult AddPackageWithResources(int userId, int planId, string spaceName,
int statusId, bool sendLetter,
bool createResources, string domainName, bool createInstantAlias, bool createWebSite,
bool createFtpAccount, string ftpAccountName, bool createMailAccount)
{
try
{
TaskManager.StartTask("HOSTING_SPACE_WR", "ADD", spaceName);
PackageResult result = new PackageResult();
// check account
result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsResellerCSR);
if (result.Result < 0) return result;
// check if domain exists
result.Result = ServerController.CheckDomain(domainName);
if (result.Result < 0)
return result;
// load user info
UserInfo user = UserController.GetUser(userId);
if (createFtpAccount)
{
// check if FTP account exists
if (String.IsNullOrEmpty(ftpAccountName))
ftpAccountName = user.Username;
if (FtpServerController.FtpAccountExists(ftpAccountName))
{
result.Result = BusinessErrorCodes.ERROR_ACCOUNT_WIZARD_FTP_ACCOUNT_EXISTS;
return result;
}
}
// load hosting plan
HostingPlanInfo plan = PackageController.GetHostingPlan(planId);
string packageName = spaceName;
if (String.IsNullOrEmpty(packageName) || packageName.Trim() == "")
packageName = plan.PlanName;
// create package
int packageId = -1;
try
{
result = PackageController.AddPackage(
userId, planId, packageName, "", statusId, DateTime.Now, false);
}
catch (Exception ex)
{
// error while adding package
throw ex;
}
if (result.Result < 0)
return result;
packageId = result.Result;
// create domain
if (createResources)
{
int domainId = 0;
if (!String.IsNullOrEmpty(domainName))
{
try
{
DomainInfo domain = new DomainInfo();
domain.PackageId = packageId;
domain.DomainName = domainName;
domain.HostingAllowed = false;
domainId = ServerController.AddDomain(domain, createInstantAlias, true);
if (domainId < 0)
{
result.Result = domainId;
DeletePackage(packageId);
return result;
}
}
catch (Exception ex)
{
// error while adding domain
DeletePackage(packageId);
throw new Exception("Could not add domain", ex);
}
}
if (createWebSite && !String.IsNullOrEmpty(domainName))
{
// create web site
try
{
int webSiteId = WebServerController.AddWebSite(
packageId, domainId, 0, true);
if (webSiteId < 0)
{
result.Result = webSiteId;
DeletePackage(packageId);
return result;
}
}
catch (Exception ex)
{
// error while creating web site
DeletePackage(packageId);
throw new Exception("Could not create web site", ex);
}
}
// create FTP account
if (createFtpAccount)
{
try
{
FtpAccount ftpAccount = new FtpAccount();
ftpAccount.PackageId = packageId;
ftpAccount.Name = ftpAccountName;
ftpAccount.Password = user.Password;
ftpAccount.Folder = "\\";
ftpAccount.CanRead = true;
ftpAccount.CanWrite = true;
int ftpAccountId = FtpServerController.AddFtpAccount(ftpAccount);
if (ftpAccountId < 0)
{
result.Result = ftpAccountId;
DeletePackage(packageId);
return result;
}
}
catch (Exception ex)
{
// error while creating ftp account
DeletePackage(packageId);
throw new Exception("Could not create FTP account", ex);
}
}
if (createMailAccount && !String.IsNullOrEmpty(domainName))
{
// create default mailbox
try
{
// load mail policy
UserSettings settings = UserController.GetUserSettings(userId, UserSettings.MAIL_POLICY);
string catchAllName = !String.IsNullOrEmpty(settings["CatchAllName"])
? settings["CatchAllName"] : "mail";
MailAccount mailbox = new MailAccount();
mailbox.Name = catchAllName + "@" + domainName;
mailbox.PackageId = packageId;
// gather information from the form
mailbox.Enabled = true;
mailbox.ResponderEnabled = false;
mailbox.ReplyTo = "";
mailbox.ResponderSubject = "";
mailbox.ResponderMessage = "";
// password
mailbox.Password = user.Password;
// redirection
mailbox.ForwardingAddresses = new string[] { };
mailbox.DeleteOnForward = false;
mailbox.MaxMailboxSize = 0;
int mailAccountId = MailServerController.AddMailAccount(mailbox);
if (mailAccountId < 0)
{
result.Result = mailAccountId;
DeletePackage(packageId);
return result;
}
// set catch-all account
MailDomain mailDomain = MailServerController.GetMailDomain(packageId, domainName);
mailDomain.CatchAllAccount = catchAllName;
mailDomain.PostmasterAccount = "mail";
mailDomain.AbuseAccount = "mail";
MailServerController.UpdateMailDomain(mailDomain);
int mailDomainId = mailDomain.Id;
// set mail domain pointer
// load domain instant alias
string instantAlias = ServerController.GetDomainAlias(packageId, domainName);
DomainInfo instantDomain = ServerController.GetDomain(instantAlias);
if (instantDomain == null || instantDomain.MailDomainId > 0)
instantAlias = "";
if (!String.IsNullOrEmpty(instantAlias))
MailServerController.AddMailDomainPointer(mailDomainId, instantDomain.DomainId);
}
catch (Exception ex)
{
// error while creating mail account
DeletePackage(packageId);
throw new Exception("Could not create mail account", ex);
}
}
}
TaskManager.ItemId = result.Result;
TaskManager.TaskParameters["SendLetter"] = sendLetter;
return result;
}
catch (Exception ex)
{
throw TaskManager.WriteError(ex);
}
finally
{
TaskManager.CompleteTask();
}
}
/// <summary>
/// Adds hosting package(space) to the user.
/// </summary>
/// <remarks>Added as a part of #1084 item fix.</remarks>
/// <param name="userId">User id</param>
/// <param name="planId">Hosting plan id</param>
/// <param name="packageName">Hosting package(space) name</param>
/// <param name="packageComments">Hosting package(space) comments</param>
/// <param name="statusId">Hosting package(space) initial status</param>
/// <param name="purchaseDate">Date purchased</param>
/// <param name="sendLetter">Inidicates whether to send e-mail notification or not</param>
/// <returns>Hosting package(space) creation result</returns>
public static PackageResult AddPackage(int userId, int planId, string packageName,
string packageComments, int statusId, DateTime purchaseDate, bool sendLetter)
{
return AddPackage(userId, planId, packageName, packageComments, statusId, purchaseDate,
sendLetter, false);
}
/// <summary>
/// Adds hosting package(space) to the user.
/// </summary>
/// <remarks>Modified as a fix for #1084 item.</remarks>
/// <param name="userId">User id</param>
/// <param name="planId">Hosting plan id</param>
/// <param name="packageName">Hosting package(space) name</param>
/// <param name="packageComments">Hosting package(space) comments</param>
/// <param name="statusId">Hosting package(space) initial status</param>
/// <param name="purchaseDate">Date purchased</param>
/// <param name="sendLetter">Inidicates whether to send e-mail notification or not</param>
/// <param name="signup">Used for external clients to set #Signup# variable in e-mail notification template</param>
/// <returns>Hosting package(space) creation result</returns>
public static PackageResult AddPackage(int userId, int planId, string packageName,
string packageComments, int statusId, DateTime purchaseDate, bool sendLetter, bool signup)
{
TaskManager.StartTask("HOSTING_SPACE", "ADD", packageName);
PackageResult result = new PackageResult();
try
{
// check account
result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsResellerCSR);
if (result.Result < 0) return result;
int packageId = -1;
result.ExceedingQuotas = DataProvider.AddPackage(SecurityContext.User.UserId, out packageId,
userId, planId, packageName, packageComments, statusId, purchaseDate);
if (result.ExceedingQuotas.Tables[0].Rows.Count > 0)
{
result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED;
return result;
}
result.Result = packageId;
// allocate "Web Sites" IP addresses
int webServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Web);
StringDictionary webSettings = ServerController.GetServiceSettings(webServiceId);
if (Utils.ParseBool(webSettings["AutoAssignDedicatedIP"], true))
ServerController.AllocateMaximumPackageIPAddresses(packageId, ResourceGroups.Web, IPAddressPool.WebSites);
// allocate "VPS" IP addresses
int vpsServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPS);
StringDictionary vpsSettings = ServerController.GetServiceSettings(vpsServiceId);
if (Utils.ParseBool(vpsSettings["AutoAssignExternalIP"], true))
ServerController.AllocateMaximumPackageIPAddresses(packageId, ResourceGroups.VPS, IPAddressPool.VpsExternalNetwork);
// allocate "VPSForPC" IP addresses
int vpsfcpServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPSForPC);
StringDictionary vpfcpsSettings = ServerController.GetServiceSettings(vpsfcpServiceId);
if (Utils.ParseBool(vpfcpsSettings["AutoAssignExternalIP"], true))
ServerController.AllocateMaximumPackageIPAddresses(packageId, ResourceGroups.VPSForPC, IPAddressPool.VpsExternalNetwork);
// load hosting plan
HostingPlanInfo plan = GetHostingPlan(planId);
// create home folder
int homeId = CreatePackageHome(plan.PackageId, packageId, userId);
if (homeId < 0)
result.Result = homeId;
TaskManager.ItemId = result.Result;
TaskManager.TaskParameters["Signup"] = signup;
TaskManager.TaskParameters["UserId"] = userId;
TaskManager.TaskParameters["SendLetter"] = sendLetter;
}
finally
{
TaskManager.CompleteTask();
}
return result;
}
public static PackageResult UpdatePackage(PackageInfo package)
{
TaskManager.StartTask("HOSTING_SPACE", "UPDATE", package.PackageName);
PackageResult result = new PackageResult();
try
{
// check account
result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsReseller);
if (result.Result < 0) return result;
// load package
PackageInfo originalPackage = GetPackage(package.PackageId);
if (originalPackage == null)
{
result.Result = BusinessErrorCodes.ERROR_PACKAGE_NOT_FOUND;
return result;
}
string quotasXml = BuildPlanQuotasXml(package.Groups, package.Quotas);
// update package
result.ExceedingQuotas = DataProvider.UpdatePackage(SecurityContext.User.UserId,
package.PackageId, package.PlanId, package.PackageName, package.PackageComments, package.StatusId,
package.PurchaseDate, package.OverrideQuotas, quotasXml);
if (result.ExceedingQuotas.Tables[0].Rows.Count > 0)
result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED;
}
finally
{
TaskManager.CompleteTask();
}
return result;
}
public static int UpdatePackageName(int packageId, string packageName,
string packageComments)
{
int result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
if (result < 0) return result;
DataProvider.UpdatePackageName(SecurityContext.User.UserId, packageId, packageName, packageComments);
return 0;
}
public static int DeletePackage(int packageId)
{
return DeletePackage(null, packageId);
}
public static int DeletePackage(string taskId, int packageId)
{
TaskManager.StartTask(taskId, "HOSTING_SPACE", "DELETE", packageId);
try
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsReseller);
if (accountCheck < 0) return accountCheck;
// check if package has child packages
if (GetPackagePackages(packageId, true).Count > 0)
return BusinessErrorCodes.ERROR_PACKAGE_HAS_PACKAGES;
// load "root" package
PackageInfo package = GetPackage(packageId);
if (package == null)
return BusinessErrorCodes.ERROR_PACKAGE_NOT_FOUND;
// add "root" package
List<PackageInfo> packages = new List<PackageInfo>();
packages.Add(package);
// delete packages
DeletePackages(packages);
}
finally
{
TaskManager.CompleteTask();
}
return 0;
}
public static int DeletePackages(List<PackageInfo> packages)
{
// delete packages asynchronously
PackageAsyncWorker packageWorker = new PackageAsyncWorker();
packageWorker.UserId = SecurityContext.User.UserId;
packageWorker.Packages = packages;
// invoke worker
packageWorker.DeletePackagesServiceItemsAsync();
return 0;
}
public static int ChangePackageStatus(int packageId, PackageStatus status, bool async)
{
return ChangePackageStatus(null, packageId, status, async);
}
public static int ChangePackageStatus(string taskId, int packageId, PackageStatus status, bool async)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsResellerCSR);
if (accountCheck < 0) return accountCheck;
List<PackageInfo> packages = new List<PackageInfo>();
// load package
PackageInfo package = GetPackage(packageId);
if (package == null)
return -1;
// add "root" package
packages.Add(package);
// add "child" packages
packages.AddRange(GetPackagePackages(packageId, true));
// change packages status
ChangePackagesStatus(packages, status, async);
return 0;
}
public static int ChangePackagesStatus(List<PackageInfo> packages, PackageStatus status, bool async)
{
int statusId = (int)status;
List<PackageInfo> changedPackages = new List<PackageInfo>();
foreach (PackageInfo p in packages)
{
// get package details
PackageInfo package = GetPackage(p.PackageId);
if (package != null && package.StatusId != statusId)
{
bool currEnabled = (package.StatusId == (int)PackageStatus.Active);
bool enabled = (statusId == (int)PackageStatus.Active);
// change package status
package.StatusId = statusId;
// save package
UpdatePackage(package);
// add to the list of affected packages
if (currEnabled != enabled)
changedPackages.Add(package);
}
}
// change service items state asynchronously
PackageAsyncWorker packageWorker = new PackageAsyncWorker();
packageWorker.UserId = SecurityContext.User.UserId;
packageWorker.Packages = changedPackages;
packageWorker.ItemsStatus = status;
// invoke worker
if (async)
packageWorker.ChangePackagesServiceItemsStateAsync();
else
packageWorker.ChangePackagesServiceItemsState();
return 0;
}
private static int CreatePackageHome(int resellerPackageId, int packageId, int userId)
{
// request OS service
int osId = GetPackageServiceId(packageId, ResourceGroups.Os);
if (osId == 0)
return 0;
//return BusinessErrorCodes.ERROR_OS_RESOURCE_UNAVAILABLE;
// load user details
UserInfo user = UserController.GetUser(userId);
// load package
string initialPath = null;
// load package settings
PackageSettings packageSettings = PackageController.GetPackageSettings(packageId,
PackageSettings.SPACES_FOLDER);
if (!String.IsNullOrEmpty(packageSettings["ChildSpacesFolder"]))
{
initialPath = Path.Combine(
FilesController.GetFullPackagePath(resellerPackageId, packageSettings["ChildSpacesFolder"]),
user.Username);
}
else
{
// load service settings
StringDictionary osSesstings = ServerController.GetServiceSettings(osId);
// build initial path
string usersHome = osSesstings["UsersHome"];
if (!usersHome.EndsWith("\\"))
usersHome += '\\';
initialPath = Path.Combine(usersHome, user.Username);
}
OS.OperatingSystem os = new OS.OperatingSystem();
ServiceProviderProxy.Init(os, osId);
string path = os.CreatePackageFolder(initialPath);
// store home folder info
HomeFolder homeFolder = new HomeFolder();
homeFolder.ServiceId = osId;
homeFolder.PackageId = packageId;
homeFolder.Name = path;
// save package item
return AddPackageItem(homeFolder);
}
public static DateTime GetPackageBandwidthUpdate(int packageId)
{
return DataProvider.GetPackageBandwidthUpdate(packageId);
}
public static void UpdatePackageBandwidthUpdate(int packageId, DateTime updateDate)
{
DataProvider.UpdatePackageBandwidthUpdate(packageId, updateDate);
}
#endregion
#region Package Add-ons
public static DataSet GetPackageAddons(int packageId)
{
return DataProvider.GetPackageAddons(SecurityContext.User.UserId, packageId);
}
public static PackageAddonInfo GetPackageAddon(int packageAddonId)
{
return ObjectUtils.FillObjectFromDataReader<PackageAddonInfo>(
DataProvider.GetPackageAddon(SecurityContext.User.UserId, packageAddonId));
}
public static PackageResult AddPackageAddonById(int packageId, int addonPlanId, int quantity)
{
PackageAddonInfo addon = new PackageAddonInfo();
addon.PackageId = packageId;
addon.PlanId = addonPlanId;
addon.Quantity = quantity;
addon.PurchaseDate = DateTime.Now;
addon.StatusId = 1; // active
addon.Comments = "";
return AddPackageAddon(addon);
}
public static PackageResult AddPackageAddon(PackageAddonInfo addon)
{
PackageResult result = new PackageResult();
// check account
result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsReseller);
if (result.Result < 0) return result;
int addonId = 0;
result.ExceedingQuotas = DataProvider.AddPackageAddon(SecurityContext.User.UserId, out addonId, addon.PackageId,
addon.PlanId, addon.Quantity, addon.StatusId, addon.PurchaseDate, addon.Comments);
if (result.ExceedingQuotas.Tables[0].Rows.Count > 0)
{
result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED;
return result;
}
result.Result = addonId;
return result;
}
public static PackageResult UpdatePackageAddon(PackageAddonInfo addon)
{
PackageResult result = new PackageResult();
// check account
result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsReseller);
if (result.Result < 0) return result;
result.ExceedingQuotas = DataProvider.UpdatePackageAddon(SecurityContext.User.UserId, addon.PackageAddonId,
addon.PlanId, addon.Quantity, addon.StatusId, addon.PurchaseDate, addon.Comments);
if (result.ExceedingQuotas.Tables[0].Rows.Count > 0)
result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED;
return result;
}
public static int DeletePackageAddon(int packageAddonId)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsReseller);
if (accountCheck < 0) return accountCheck;
DataProvider.DeletePackageAddon(SecurityContext.User.UserId, packageAddonId);
return 0;
}
#endregion
#region Package Items
public static DataSet GetSearchableServiceItemTypes()
{
return DataProvider.GetSearchableServiceItemTypes();
}
public static int GetPackageServiceId(int packageId, string groupName)
{
return DataProvider.GetPackageServiceId(SecurityContext.User.UserId, packageId, groupName);
}
public static List<ServiceProviderItem> GetPackageItemsByName(int packageId, string itemName)
{
DataSet dsItems = DataProvider.GetServiceItemsByName(
SecurityContext.User.UserId, packageId, itemName);
return CreateServiceItemsList(dsItems, 0);
}
public static List<ServiceProviderItem> GetPackageItemsByType(int packageId, string groupName, Type itemType)
{
return GetPackageItemsByType(packageId, groupName, itemType, false);
}
public static List<ServiceProviderItem> GetPackageItemsByType(int packageId, Type itemType)
{
return GetPackageItemsByType(packageId, null, itemType, false);
}
public static List<ServiceProviderItem> GetPackageItemsByType(int packageId, Type itemType, bool recursive)
{
return GetPackageItemsByType(packageId, null, itemType, recursive);
}
public static List<ServiceProviderItem> GetPackageItemsByType(int packageId, string groupName, Type itemType, bool recursive)
{
string typeName = ObjectUtils.GetTypeFullName(itemType);
DataSet dsItems = DataProvider.GetServiceItems(SecurityContext.User.UserId,
packageId, groupName, typeName, recursive);
return CreateServiceItemsList(dsItems, 0);
}
public static DataSet GetRawPackageItemsByType(int packageId, Type itemType, bool recursive)
{
return GetRawPackageItemsByType(packageId, null, itemType, recursive);
}
public static DataSet GetRawPackageItemsByType(int packageId, string groupName, Type itemType, bool recursive)
{
string typeName = ObjectUtils.GetTypeFullName(itemType);
DataSet dsItems = DataProvider.GetServiceItems(SecurityContext.User.UserId,
packageId, groupName, typeName, recursive);
FlatternItemsTable(dsItems, 0, itemType);
return dsItems;
}
public static ServiceItemsPaged GetPackageItemsPaged(int packageId, Type itemType,
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
return GetPackageItemsPaged(packageId, null, itemType, false, filterColumn, filterValue,
sortColumn, startRow, maximumRows);
}
public static ServiceItemsPaged GetPackageItemsPaged(int packageId, Type itemType, bool recursive,
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
return GetPackageItemsPaged(packageId, null, itemType, recursive, filterColumn, filterValue,
sortColumn, startRow, maximumRows);
}
public static DataSet GetRawPackageItemsPaged(int packageId, Type itemType, bool recursive,
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
return GetRawPackageItemsPaged(packageId, null, itemType, recursive, filterColumn, filterValue,
sortColumn, startRow, maximumRows);
}
public static ServiceItemsPaged GetPackageItemsPaged(int packageId, string groupName, Type itemType,
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
return GetPackageItemsPaged(packageId, groupName, itemType, false, filterColumn, filterValue,
sortColumn, startRow, maximumRows);
}
public static ServiceItemsPaged GetPackageItemsPaged(int packageId, string groupName, Type itemType, bool recursive,
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
string typeName = ObjectUtils.GetTypeFullName(itemType);
DataSet dsItems = DataProvider.GetServiceItemsPaged(
SecurityContext.User.UserId, packageId, groupName, typeName, 0, recursive, filterColumn, filterValue,
sortColumn, startRow, maximumRows);
ServiceItemsPaged result = new ServiceItemsPaged();
result.RecordsCount = (int)dsItems.Tables[0].Rows[0][0];
result.PageItems = CreateServiceItemsList(dsItems, 1).ToArray();
return result;
}
public static DataSet GetRawPackageItemsPaged(int packageId, string groupName, Type itemType,
bool recursive, string filterColumn, string filterValue, string sortColumn,
int startRow, int maximumRows)
{
return GetRawPackageItemsPaged(packageId, groupName, itemType, 0, recursive, filterColumn, filterValue,
sortColumn, startRow, maximumRows);
}
public static DataSet GetRawPackageItemsPaged(int packageId, string groupName, Type itemType,
int serverId, bool recursive, string filterColumn, string filterValue, string sortColumn,
int startRow, int maximumRows)
{
string typeName = ObjectUtils.GetTypeFullName(itemType);
DataSet dsItems = DataProvider.GetServiceItemsPaged(
SecurityContext.User.UserId, packageId, groupName, typeName, serverId, recursive, filterColumn, filterValue,
sortColumn, startRow, maximumRows);
FlatternItemsTable(dsItems, 1, itemType);
return dsItems;
}
public static int GetServiceItemsCount(Type itemType, string groupName)
{
return GetServiceItemsCount(itemType, groupName, 0);
}
public static int GetServiceItemsCount(Type itemType, string groupName, int serviceId)
{
string typeName = ObjectUtils.GetTypeFullName(itemType);
return DataProvider.GetServiceItemsCount(typeName, groupName, serviceId);
}
public static DataSet GetPackageItemsDataSet(int packageId)
{
return DataProvider.GetServiceItemsByPackage(SecurityContext.User.UserId,
packageId);
}
public static List<ServiceProviderItem> GetPackageItems(int packageId)
{
DataSet dsItems = GetPackageItemsDataSet(packageId);
return CreateServiceItemsList(dsItems, 0);
}
public static DataSet GetRawPackageItems(int packageId)
{
return DataProvider.GetServiceItemsByPackage(SecurityContext.User.UserId,
packageId);
}
public static DataSet GetServiceItemsDataSet(int serviceId)
{
return DataProvider.GetServiceItemsByService(SecurityContext.User.UserId,
serviceId);
}
public static List<ServiceProviderItem> GetServiceItems(int serviceId)
{
DataSet dsItems = GetServiceItemsDataSet(serviceId);
return CreateServiceItemsList(dsItems, 0);
}
public static List<ServiceProviderItemType> GetServiceItemTypes()
{
return ObjectUtils.CreateListFromDataReader<ServiceProviderItemType>(
DataProvider.GetServiceItemTypes());
}
public static ServiceProviderItemType GetServiceItemType(int itemTypeId)
{
return ObjectUtils.FillObjectFromDataReader<ServiceProviderItemType>(
DataProvider.GetServiceItemType(itemTypeId));
}
public static List<ServiceProviderItem> GetServiceItemsForStatistics(int serviceId, int packageId,
bool calculateDiskspace, bool calculateBandwidth, bool suspendable, bool disposable)
{
DataSet dsItems = DataProvider.GetServiceItemsForStatistics(SecurityContext.User.UserId,
serviceId, packageId, calculateDiskspace, calculateBandwidth, suspendable, disposable);
return CreateServiceItemsList(dsItems, 0);
}
public static ServiceProviderItem GetPackageItem(int itemId)
{
DataSet dsItem = DataProvider.GetServiceItem(SecurityContext.User.UserId, itemId);
DataView dvItem = dsItem.Tables[0].DefaultView;
if (dvItem.Count == 0)
return null;
return CreateServiceItem(dvItem[0], dsItem.Tables[1].DefaultView);
}
public static ServiceProviderItem GetPackageItemByName(int packageId, string itemName, Type itemType)
{
return GetPackageItemByName(packageId, null, itemName, itemType);
}
public static ServiceProviderItem GetPackageItemByName(int packageId, string groupName, string itemName, Type itemType)
{
string itemTypeName = ObjectUtils.GetTypeFullName(itemType);
DataSet dsItem = DataProvider.GetServiceItemByName(SecurityContext.User.UserId,
packageId, groupName, itemName, itemTypeName);
DataView dvItem = dsItem.Tables[0].DefaultView;
if (dvItem.Count == 0)
return null;
return CreateServiceItem(dvItem[0], dsItem.Tables[1].DefaultView);
}
public static bool CheckServiceItemExists(string itemName, Type itemType)
{
return CheckServiceItemExists(itemName, null, itemType);
}
public static bool CheckServiceItemExists(string itemName, string groupName, Type itemType)
{
string itemTypeName = ObjectUtils.GetTypeFullName(itemType);
return DataProvider.CheckServiceItemExists(itemName, groupName, itemTypeName);
}
public static bool CheckServiceItemExists(int serviceId, string itemName, Type itemType)
{
string itemTypeName = ObjectUtils.GetTypeFullName(itemType);
return DataProvider.CheckServiceItemExists(serviceId, itemName, itemTypeName);
}
public static int AddPackageItem(ServiceProviderItem item)
{
// check parameters
if (item.PackageId < 0)
throw new ArgumentException("item.PackageId property value should be specified!");
if (item.ServiceId < 0)
throw new ArgumentException("item.ServiceId property value should be specified!");
string itemTypeName = ObjectUtils.GetTypeFullName(item.GetType());
// build properties xml
string xml = BuildPropertiesXml(ObjectUtils.GetObjectProperties(item, true));
// add item itself
int itemId = DataProvider.AddServiceItem(SecurityContext.User.UserId,
item.ServiceId, item.PackageId, item.Name,
itemTypeName, xml);
return itemId;
}
public static int UpdatePackageItem(ServiceProviderItem item)
{
// build properties xml
string xml = BuildPropertiesXml(ObjectUtils.GetObjectProperties(item, true));
// update item
DataProvider.UpdateServiceItem(SecurityContext.User.UserId, item.Id, item.Name, xml);
return 0;
}
private static string BuildPropertiesXml(Hashtable props)
{
XmlDocument doc = new XmlDocument();
XmlElement nodeProps = doc.CreateElement("properties");
foreach (string propertyName in props.Keys)
{
XmlElement nodeProp = doc.CreateElement("property");
nodeProp.SetAttribute("name", propertyName);
nodeProp.SetAttribute("value", props[propertyName].ToString());
nodeProps.AppendChild(nodeProp);
}
return nodeProps.OuterXml;
}
public static int DetachPackageItem(int itemId)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsAdmin);
if (accountCheck < 0) return accountCheck;
// HACK: Mail accounts detach is hard coded.
MailDomain mailDomain = GetPackageItem(itemId) as MailDomain;
if (mailDomain != null)
{
// Load accounts and detach them as well.
List<ServiceProviderItem> accounts = GetPackageItemsByName(mailDomain.PackageId, "%@" + mailDomain.Name);
foreach (ServiceProviderItem account in accounts)
{
DetachPackageItem(account.Id);
}
}
DeletePackageItem(itemId);
return 0;
}
public static int MovePackageItem(int itemId, int destinationServiceId)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
| DemandAccount.IsAdmin);
if (accountCheck < 0) return accountCheck;
// move item
DataProvider.MoveServiceItem(SecurityContext.User.UserId, itemId, destinationServiceId);
return 0;
}
public static int DeletePackageItem(int itemId)
{
// delete item
DataProvider.DeleteServiceItem(SecurityContext.User.UserId, itemId);
return 0;
}
public static int UpdatePackageBandwidth(int packageId, string xml)
{
DataProvider.UpdatePackageBandwidth(packageId, xml);
return 0;
}
public static int UpdatePackageDiskSpace(int packageId, string xml)
{
DataProvider.UpdatePackageDiskSpace(packageId, xml);
return 0;
}
public static List<ServiceProviderItem> CreateServiceItemsList(DataSet dsItems, int itemsTablePosition)
{
List<ServiceProviderItem> items = new List<ServiceProviderItem>();
DataView dvItems = dsItems.Tables[itemsTablePosition].DefaultView;
foreach (DataRowView drItem in dvItems)
{
DataView dvProps = new DataView(dsItems.Tables[itemsTablePosition + 1], "ItemID=" + drItem["ItemID"].ToString(),
"", DataViewRowState.CurrentRows);
items.Add(CreateServiceItem(drItem, dvProps));
}
return items;
}
private static ServiceProviderItem CreateServiceItem(DataRowView drItem, DataView dvProps)
{
// create item instance
string itemTypeName = (string)drItem["TypeName"];
Type itemType = Type.GetType(itemTypeName);
if (itemType == null)
itemType = typeof(ServiceProviderItem); // create generic item
// create item instance and fill other properties
ServiceProviderItem item = (ServiceProviderItem)ObjectUtils.CreateObjectFromDataview(
Type.GetType(itemTypeName), dvProps, "PropertyName", "PropertyValue", true);
// fill item key properties
item.Id = (int)drItem["ItemID"];
item.TypeId = (int)drItem["ItemTypeID"];
item.Name = (string)drItem["ItemName"];
item.PackageId = (int)drItem["PackageID"];
item.ServiceId = (int)drItem["ServiceID"];
item.GroupName = (string)drItem["GroupName"];
item.CreatedDate = Utils.ParseDate(drItem["CreatedDate"]);
return item;
}
private static void FlatternItemsTable(DataSet dsItems, int itemsTablePosition, Type itemType)
{
DataTable dtItems = dsItems.Tables[itemsTablePosition];
DataTable dtProps = dsItems.Tables[itemsTablePosition + 1];
// add columns to the table
PropertyInfo[] props = itemType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (PropertyInfo prop in props)
{
if (!dtItems.Columns.Contains(prop.Name) && !prop.PropertyType.IsArray)
dtItems.Columns.Add(prop.Name, prop.PropertyType);
}
foreach (DataRow drItem in dtItems.Rows)
{
DataView dvProps = new DataView(dtProps, "ItemID=" + drItem["ItemID"].ToString(),
"", DataViewRowState.CurrentRows);
foreach (DataRowView drProp in dvProps)
{
object propValue = "";
string sVal = (drProp["PropertyValue"] != DBNull.Value) ? drProp["PropertyValue"].ToString() : "";
string columnName = drProp["PropertyName"].ToString();
if (!dtItems.Columns.Contains(columnName))
continue;
Type columnType = dtItems.Columns[columnName].DataType;
if (columnType == typeof(string))
propValue = sVal;
if (columnType == typeof(int))
propValue = (sVal != "") ? Int32.Parse(sVal) : 0;
if (columnType == typeof(long))
propValue = (sVal != "") ? Int64.Parse(sVal) : 0;
if (columnType == typeof(bool))
propValue = (sVal != "") ? Boolean.Parse(sVal) : false;
if (columnType == typeof(Guid))
propValue = (!string.IsNullOrEmpty(sVal)) ? new Guid(sVal) : Guid.Empty;
drItem[columnName] = propValue;
}
}
}
#endregion
#region Package Settings
public static PackageSettings GetPackageSettings(int packageId, string settingsName)
{
IDataReader reader = DataProvider.GetPackageSettings(
SecurityContext.User.UserId, packageId, settingsName);
PackageSettings settings = new PackageSettings();
settings.PackageId = packageId;
settings.SettingsName = settingsName;
while (reader.Read())
{
settings.PackageId = (int)reader["PackageID"];
settings[(string)reader["PropertyName"]] = (string)reader["PropertyValue"];
}
reader.Close();
// set root settings if required
if (settings.PackageId < 2)
{
// instant alias
if (String.Compare(PackageSettings.INSTANT_ALIAS, settingsName, true) == 0)
{
// load package info
PackageInfo package = GetPackage(packageId);
// load package server
ServerInfo srv = ServerController.GetServerByIdInternal(package.ServerId);
if (srv != null)
settings["InstantAlias"] = srv.InstantDomainAlias;
}
// name servers
else if (String.Compare(PackageSettings.NAME_SERVERS, settingsName, true) == 0)
{
// load DNS service settings
int dnsServiceId = GetPackageServiceId(packageId, ResourceGroups.Dns);
if (dnsServiceId > 0)
{
StringDictionary dnsSettings = ServerController.GetServiceSettings(dnsServiceId);
settings["NameServers"] = dnsSettings["NameServers"];
}
}
// shared SSL sites
else if (String.Compare(PackageSettings.SHARED_SSL_SITES, settingsName, true) == 0)
{
// load WEB service settings
int webServiceId = GetPackageServiceId(packageId, ResourceGroups.Web);
if (webServiceId > 0)
{
StringDictionary webSettings = ServerController.GetServiceSettings(webServiceId);
settings["SharedSslSites"] = webSettings["SharedSslSites"];
}
}
// child spaces location
else if (String.Compare(PackageSettings.SPACES_FOLDER, settingsName, true) == 0)
{
settings["ChildSpacesFolder"] = "";
}
// Exchange Server
else if (String.Compare(PackageSettings.EXCHANGE_SERVER, settingsName, true) == 0)
{
// load Exchange service settings
int exchServiceId = GetPackageServiceId(packageId, ResourceGroups.Exchange);
if (exchServiceId > 0)
{
StringDictionary exchSettings = ServerController.GetServiceSettings(exchServiceId);
settings["TempDomain"] = exchSettings["TempDomain"];
}
}
// VPS
else if (String.Compare(PackageSettings.VIRTUAL_PRIVATE_SERVERS, settingsName, true) == 0)
{
// load Exchange service settings
int vpsServiceId = GetPackageServiceId(packageId, ResourceGroups.VPS);
if (vpsServiceId > 0)
{
StringDictionary vpsSettings = ServerController.GetServiceSettings(vpsServiceId);
settings["HostnamePattern"] = vpsSettings["HostnamePattern"];
}
}
//vpforCP
else if (String.Compare(PackageSettings.VIRTUAL_PRIVATE_SERVERS_FOR_PRIVATE_CLOUD, settingsName, true) == 0)
{
int vpsServiceId = GetPackageServiceId(packageId, ResourceGroups.VPSForPC);
if (vpsServiceId > 0)
{
StringDictionary vpsSettings = ServerController.GetServiceSettings(vpsServiceId);
settings["HostnamePattern"] = vpsSettings["HostnamePattern"];
}
}
}
return settings;
}
public static int UpdatePackageSettings(PackageSettings settings)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
if (accountCheck < 0) return accountCheck;
//// get user details
//UserInfo user = GetUserInternally(settings.UserId);
//// place log record
//LogRecord record = new LogRecord();
//record.RecordType = LogRecordType.Information;
//record.PackageId = 0;
//record.ItemId = settings.UserId;
//record.Source = LogSource.USERS;
//record.Action = "USERS_UPDATE_USER_SETTINGS";
//record.ActionParameters.Add(user.Username).Add(settings.SettingsName);
try
{
// build xml
XmlDocument doc = new XmlDocument();
XmlElement nodeProps = doc.CreateElement("properties");
if (settings.SettingsArray != null)
{
foreach (string[] pair in settings.SettingsArray)
{
XmlElement nodeProp = doc.CreateElement("property");
nodeProp.SetAttribute("name", pair[0]);
nodeProp.SetAttribute("value", pair[1]);
nodeProps.AppendChild(nodeProp);
}
}
string xml = nodeProps.OuterXml;
// update settings
DataProvider.UpdatePackageSettings(SecurityContext.User.UserId,
settings.PackageId, settings.SettingsName, xml);
return 0;
}
catch (Exception ex)
{
//record.RecordType = LogRecordType.Error;
//record.Description["Error"] = ex.ToString();
throw new Exception("Could not update package settings", ex);
}
//finally
//{
// AuditLog.AddRecord(record);
//}
}
#endregion
#region Quotas
public static QuotaValueInfo GetPackageQuota(int packageId, string quotaName)
{
QuotaValueInfo quota = ObjectUtils.FillObjectFromDataReader<QuotaValueInfo>(
DataProvider.GetPackageQuota(SecurityContext.User.UserId,
packageId, quotaName));
// set exhausted flag
quota.QuotaExhausted = (quota.QuotaAllocatedValue != -1 && quota.QuotaUsedValue >= quota.QuotaAllocatedValue);
return quota;
}
#endregion
#region Fix for item #1547 by Pavel Tsurbeleu
public static string BuildMessageBccField(params string[] bccAddresses)
{
List<string> mailAddresses = new List<string>();
//
foreach (string bccItem in bccAddresses)
{
if (!String.IsNullOrEmpty(bccItem))
{
string bccAddress = bccItem.Trim();
// check if value is semicolon-delimited and convert it to the standard format
if (bccAddress.Contains(";"))
bccAddress = bccAddress.Replace(';', ',');
//
mailAddresses.Add(bccAddress);
}
}
//
return String.Join(",", mailAddresses.ToArray());
}
#endregion
#region Templates
public static int SendAccountSummaryLetter(int userId, string to, string bcc, bool signup)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
if (accountCheck < 0) return accountCheck;
// load user details
UserInfo user = UserController.GetUser(userId);
if (user == null)
return BusinessErrorCodes.ERROR_USER_NOT_FOUND;
UserSettings settings = UserController.GetUserSettings(userId, UserSettings.ACCOUNT_SUMMARY_LETTER);
string from = settings["From"];
#region Fix for item #1547 by Pavel Tsurbeleu
// Build BCC field
bcc = BuildMessageBccField(bcc, settings["CC"], user.SecondaryEmail);
#endregion
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);
if (String.IsNullOrEmpty(body))
return 0;// BusinessErrorCodes.ERROR_SETTINGS_ACCOUNT_LETTER_EMPTY_BODY;
// load user info
if (to == null)
to = user.Email;
subject = EvaluateAccountTempate(userId, subject, signup, true);
body = EvaluateAccountTempate(userId, body, signup, true);
// send message
return MailHelper.SendMessage(from, to, bcc, subject, body, priority, isHtml);
}
public static int SendPackageSummaryLetter(int packageId, string to, string bcc, bool signup)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
if (accountCheck < 0) return accountCheck;
// load package
PackageInfo package = GetPackage(packageId);
if (package == null)
return BusinessErrorCodes.ERROR_PACKAGE_NOT_FOUND;
// load user details
UserInfo user = UserController.GetUser(package.UserId);
if (user == null)
return BusinessErrorCodes.ERROR_USER_NOT_FOUND;
UserSettings settings = UserController.GetUserSettings(package.UserId, UserSettings.PACKAGE_SUMMARY_LETTER);
string from = settings["From"];
#region Fix for item #1547 by Pavel Tsurbeleu
// Build BCC field
bcc = BuildMessageBccField(bcc, settings["CC"], user.SecondaryEmail);
#endregion
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);
if (String.IsNullOrEmpty(body))
return 0;// BusinessErrorCodes.ERROR_SETTINGS_ACCOUNT_LETTER_EMPTY_BODY;
// load user info
if (to == null)
to = user.Email;
subject = EvaluatePackageTempate(packageId, subject, signup, true);
body = EvaluatePackageTempate(packageId, body, signup, true);
// send message
return MailHelper.SendMessage(from, to, bcc, subject, body, priority, isHtml);
}
public static string GetEvaluatedPackageTemplateBody(int packageId, bool signup)
{
// load user info
UserInfo user = GetPackageOwner(packageId);
string settingName = user.HtmlMail ? "HtmlBody" : "TextBody";
// get space letter settings
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.PACKAGE_SUMMARY_LETTER);
string body = settings[settingName];
if (String.IsNullOrEmpty(body))
return null;
string result = EvaluatePackageTempate(packageId, body, signup, false);
return user.HtmlMail ? result : result.Replace("\n", "<br/>");
}
public static string GetEvaluatedAccountTemplateBody(int userId, bool signup)
{
// load user info
UserInfo user = UserController.GetUser(userId);
string settingName = user.HtmlMail ? "HtmlBody" : "TextBody";
// get account letter settings
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.ACCOUNT_SUMMARY_LETTER);
string body = settings[settingName];
if (String.IsNullOrEmpty(body))
return null;
string result = EvaluateAccountTempate(userId, body, signup, false);
return user.HtmlMail ? result : result.Replace("\n", "<br/>");
}
public static string EvaluateUserPackageTempate(int userId, int packageId, string template)
{
// package context
if (packageId > -1)
{
return EvaluatePackageTempate(packageId, template, false, false);
}
else
{
return EvaluateAccountTempate(userId, template, false, false);
}
}
public static string EvaluatePackageTempate(int packageId, string template, bool signup, bool email)
{
Hashtable items = new Hashtable();
items["Signup"] = signup;
items["Email"] = email;
// load package
PackageInfo package = GetPackage(packageId);
if (package == null)
return null;
// add package context
PackageContext cntx = GetPackageContext(packageId);
items["space"] = cntx;
// get hosting plan
HostingPlanInfo plan = GetHostingPlan(package.PlanId);
if (plan != null)
items["plan"] = plan;
// name servers
PackageSettings packageSettings = PackageController.GetPackageSettings(packageId, PackageSettings.NAME_SERVERS);
string[] nameServers = new string[] { };
if (!String.IsNullOrEmpty(packageSettings["NameServers"]))
nameServers = packageSettings["NameServers"].Split(';');
items["NameServers"] = nameServers;
// instant alias
string instantAlias = null;
packageSettings = PackageController.GetPackageSettings(packageId, PackageSettings.INSTANT_ALIAS);
if (!String.IsNullOrEmpty(packageSettings["InstantAlias"]))
instantAlias = packageSettings["InstantAlias"];
items["InstantAlias"] = instantAlias;
// web sites
List<WebsitePanel.Providers.Web.WebSite> webSites =
WebServerController.GetWebSites(packageId, false);
items["WebSites"] = webSites;
// domains
List<DomainInfo> domains = ServerController.GetDomains(packageId, false);
items["Domains"] = domains;
// FTP Server
int ftpServiceId = GetPackageServiceId(packageId, ResourceGroups.Ftp);
if (ftpServiceId > 0)
{
// get FTP DNS records
List<GlobalDnsRecord> ftpRecords = ServerController.GetDnsRecordsByService(ftpServiceId);
if (ftpRecords.Count > 0)
{
GlobalDnsRecord ftpRecord = ftpRecords[0];
string ftpIp = ftpRecord.ExternalIP;
if (String.IsNullOrEmpty(ftpIp))
ftpIp = ftpRecord.RecordData;
items["FtpIP"] = ftpIp;
}
}
// FTP accounts
List<FtpAccount> ftpAccounts =
FtpServerController.GetFtpAccounts(packageId, false);
items["FtpAccounts"] = ftpAccounts;
// Mail Accounts
List<MailAccount> mailAccounts =
MailServerController.GetMailAccounts(packageId, false);
items["MailAccounts"] = mailAccounts;
// mail server IP
List<GlobalDnsRecord> mailRecords = new List<GlobalDnsRecord>();
int mailServiceId = GetPackageServiceId(packageId, ResourceGroups.Mail);
if (mailServiceId > 0)
{
StringDictionary mailSettings = ServerController.GetServiceSettings(mailServiceId);
if (mailSettings != null)
items["MailIP"] = ServerController.GetExternalIPAddress(Utils.ParseInt(mailSettings["ServerIPAddress"], 0));
mailRecords = ServerController.GetDnsRecordsByService(mailServiceId);
}
items["MailRecords"] = mailRecords;
SetSqlServerExternalAddress(packageId, items, ResourceGroups.MsSql2000);
SetSqlServerExternalAddress(packageId, items, ResourceGroups.MsSql2005);
SetSqlServerExternalAddress(packageId, items, ResourceGroups.MsSql2008);
SetSqlServerExternalAddress(packageId, items, ResourceGroups.MsSql2012);
SetSqlServerExternalAddress(packageId, items, ResourceGroups.MySql4);
SetSqlServerExternalAddress(packageId, items, ResourceGroups.MySql5);
// Exchange organizations
items["ExchangeOrganizations"] = ExchangeServerController.GetExchangeOrganizations(packageId, false);
// Exchange service settings
int exchangeServiceId = GetPackageServiceId(packageId, ResourceGroups.Exchange);
StringDictionary exchangeSettings = ServerController.GetServiceSettings(exchangeServiceId);
if (exchangeSettings != null)
{
items["TempDomain"] = exchangeSettings["TempDomain"];
items["AutodiscoverIP"] = exchangeSettings["AutodiscoverIP"];
items["AutodiscoverDomain"] = exchangeSettings["AutodiscoverDomain"];
items["OwaUrl"] = exchangeSettings["OwaUrl"];
items["ActiveSyncServer"] = exchangeSettings["ActiveSyncServer"];
items["SmtpServers"] = Utils.ParseDelimitedString(exchangeSettings["SmtpServers"], '\n');
}
// package root folder
items["PackageRootFolder"] = FilesController.GetHomeFolder(packageId);
// get user details
UserInfo user = UserController.GetUser(package.UserId);
if (user == null)
return null;
items["user"] = user;
// get reseller details
UserInfo reseller = UserController.GetUser(user.OwnerId);
if (reseller != null)
{
reseller.Password = "";
items["reseller"] = reseller;
}
return EvaluateTemplate(template, items);
}
private static void SetSqlServerExternalAddress(int packageId, Hashtable items, string groupName)
{
int serviceId = GetPackageServiceId(packageId, groupName);
if (serviceId > 0)
{
StringDictionary sqlSettings = ServerController.GetServiceSettings(serviceId);
items[groupName + "Address"] = sqlSettings["ExternalAddress"]; // left for compatibility with existing templates
items[groupName + "ExternalAddress"] = sqlSettings["ExternalAddress"];
items[groupName + "InternalAddress"] = sqlSettings["InternalAddress"];
}
}
public static string EvaluateAccountTempate(int userId, string template, bool signup, bool email)
{
Hashtable items = new Hashtable();
items["Signup"] = signup;
items["Email"] = email;
// get user details
UserInfo user = UserController.GetUser(userId);
if (user == null)
return null;
items["user"] = user;
// get reseller details
UserInfo reseller = UserController.GetUser(user.OwnerId);
if (reseller != null)
{
reseller.Password = "";
items["reseller"] = reseller;
}
// get all purchased packages
List<PackageInfo> packages = GetMyPackages(userId);
items["Spaces"] = packages;
// hosting plans
Hashtable plans = new Hashtable();
foreach (PackageInfo package in packages)
{
HostingPlanInfo plan = GetHostingPlan(package.PlanId);
if (plan != null && !plans.ContainsKey(plan.PlanId))
plans.Add(plan.PlanId, plan);
}
items["Plans"] = plans;
//Add ons
Hashtable addOns = new Hashtable();
int i = 0;
foreach (PackageInfo package in packages)
{
List<PackageAddonInfo> lstAddOns = ObjectUtils.CreateListFromDataSet<PackageAddonInfo>(GetPackageAddons(package.PackageId));
foreach (PackageAddonInfo addOn in lstAddOns)
{
addOns.Add(i, addOn);
i++;
}
}
items["Addons"] = addOns;
// package contexts
Hashtable cntxs = new Hashtable();
foreach (PackageInfo package in packages)
{
PackageContext cntx = GetPackageContext(package.PackageId);
cntxs.Add(package.PackageId, cntx);
}
items["SpaceContexts"] = cntxs;
return EvaluateTemplate(template, items);
}
public static string EvaluateTemplate(string template, Hashtable items)
{
StringWriter writer = new StringWriter();
try
{
Template tmp = new Template(template);
if (items != null)
{
foreach (string key in items.Keys)
tmp[key] = items[key];
}
tmp.Evaluate(writer);
}
catch (ParserException ex)
{
return String.Format("Error in template (Line {0}, Column {1}): {2}",
ex.Line, ex.Column, ex.Message);
}
return writer.ToString();
}
#endregion
#region Reports
public static DataSet GetPackagesBandwidthPaged(int userId, int packageId,
DateTime startDate, DateTime endDate, string sortColumn,
int startRow, int maximumRows)
{
return DataProvider.GetPackagesBandwidthPaged(
SecurityContext.User.UserId, userId, packageId, startDate, endDate, sortColumn,
startRow, maximumRows);
}
public static DataSet GetPackagesDiskspacePaged(int userId, int packageId, string sortColumn,
int startRow, int maximumRows)
{
return DataProvider.GetPackagesDiskspacePaged(
SecurityContext.User.UserId, userId, packageId, sortColumn,
startRow, maximumRows);
}
public static DataSet GetPackageBandwidth(int packageId, DateTime startDate, DateTime endDate)
{
return DataProvider.GetPackageBandwidth(
SecurityContext.User.UserId, packageId, startDate, endDate);
}
public static DataSet GetPackageDiskspace(int packageId)
{
return DataProvider.GetPackageDiskspace(
SecurityContext.User.UserId, packageId);
}
#endregion
#region Overusage Report
public static Reports.OverusageReport GetOverusageSummaryReport(int userId, int packageId, DateTime startDate, DateTime endDate)
{
Reports.OverusageReport report = new Reports.OverusageReport();
report = GetDiskspaceReport(report, userId, packageId, String.Empty);
report = GetBandwidthReport(report, userId, packageId, String.Empty, startDate, endDate);
return report;
}
public static Reports.OverusageReport GetDiskspaceOverusageDetailsReport(int userId, int packageId)
{
Reports.OverusageReport report = new Reports.OverusageReport();
report = GetDiskspaceInformationAboutPackage(report, packageId);
report = GetDiskspaceDetails(report);
return report;
}
public static Reports.OverusageReport GetBandwidthDetailsReport(int userId, int packageId, DateTime startDate, DateTime endDate)
{
Reports.OverusageReport report = new Reports.OverusageReport();
report = GetBandwidthInformationAboutPackage(report, packageId, startDate, endDate);
report = GetBandwidthDetails(report, startDate, endDate);
return report;
}
private static Reports.OverusageReport GetDiskspaceInformationAboutPackage(Reports.OverusageReport report, int packageId)
{
PackageInfo packageInfo = GetPackage(packageId);
packageInfo.DiskSpaceQuota = GetPackageQuota(packageId, "OS.Diskspace").QuotaAllocatedValue;
packageInfo.DiskSpaceQuota = packageInfo.DiskSpaceQuota < 1 ? 0 : packageInfo.DiskSpaceQuota;
// 1. Add HostingSpace row
report.HostingSpace.AddHostingSpaceRow(
Reports.OverusageReport.HostingSpaceRow
.CreateFromPackageInfo(
report
, packageInfo
, UserController.GetUser(packageInfo.UserId)
, ServerController.GetServerByIdInternal(packageInfo.ServerId)
, packageInfo.DiskSpace > packageInfo.DiskSpaceQuota
, packageInfo.BandWidth > packageInfo.BandWidthQuota
, String.Empty
)
);
report.DiskspaceOverusage.AddDiskspaceOverusageRow(
Reports.OverusageReport.DiskspaceOverusageRow
.CreateFromPackageInfo(
report
, packageInfo
)
);
return report;
}
private static Reports.OverusageReport GetBandwidthInformationAboutPackage(Reports.OverusageReport report, int packageId, DateTime startDate, DateTime endDate)
{
PackageInfo packageInfo = GetPackage(packageId);
packageInfo.BandWidthQuota = GetPackageQuota(packageId, "OS.Bandwidth").QuotaAllocatedValue;
packageInfo.BandWidthQuota = packageInfo.BandWidthQuota < 1 ? 0 : packageInfo.BandWidthQuota;
// 1. Add HostingSpace row
report.HostingSpace.AddHostingSpaceRow(
Reports.OverusageReport.HostingSpaceRow
.CreateFromPackageInfo(
report
, packageInfo
, UserController.GetUser(packageInfo.UserId)
, ServerController.GetServerByIdInternal(packageInfo.ServerId)
, packageInfo.DiskSpace > packageInfo.DiskSpaceQuota
, packageInfo.BandWidth > packageInfo.BandWidthQuota
, String.Empty
)
);
// 2. Add BandwidthOverusage row
report.BandwidthOverusage.AddBandwidthOverusageRow(
Reports.OverusageReport.BandwidthOverusageRow
.CreateFromPackageInfo(
report
, packageInfo
)
);
return report;
}
private static Reports.OverusageReport GetBandwidthDetails(Reports.OverusageReport report, DateTime startDate, DateTime endDate)
{
foreach (Reports.OverusageReport.HostingSpaceRow hsRow in report.HostingSpace.Rows)
{
DataSet ds = GetPackageBandwidth((int)hsRow.HostingSpaceId, startDate, endDate);
foreach (DataRow bwRow in ds.Tables[0].Rows)
{
report.OverusageDetails.AddOverusageDetailsRow(
Reports.OverusageReport.OverusageDetailsRow
.CreateFromBandwidthRow(report, bwRow, hsRow.HostingSpaceId, "Bandwidth")
);
}
}
return report;
}
private static Reports.OverusageReport GetDiskspaceDetails(Reports.OverusageReport report)
{
foreach (Reports.OverusageReport.HostingSpaceRow hsRow in report.HostingSpace.Rows)
{
DataSet ds = GetPackageDiskspace((int)hsRow.HostingSpaceId);
foreach (DataRow dsRow in ds.Tables[0].Rows)
{
report.OverusageDetails.AddOverusageDetailsRow(
Reports.OverusageReport.OverusageDetailsRow
.CreateFromPackageDiskspaceRow(report, dsRow, hsRow.HostingSpaceId, "Diskspace")
);
}
}
return report;
}
private static Reports.OverusageReport GetBandwidthReport(Reports.OverusageReport report, int userId, long packageId, string rootHostingSpacePath, DateTime startDate, DateTime endDate)
{
DataTable bwTable = GetPackagesBandwidthPaged(userId, (int)packageId, startDate, endDate);
Reports.OverusageReport.HostingSpaceRow hsRow = null;
// 1.
foreach (DataRow bwRow in bwTable.Rows)
{
if (Reports.OverusageReport.HostingSpaceRow
.VerifyIfBandwidthOverused(bwRow))
{
hsRow = report.HostingSpace.FindByHostingSpaceId(
Reports.OverusageReport.HostingSpaceRow.GetPackageId(bwRow)
);
if (hsRow != null)
{
hsRow.IsBandwidthOverused = true;
}
else
{
report.HostingSpace.AddHostingSpaceRow(
CreateHostingSpacesRow(bwRow, report, false, true, rootHostingSpacePath)
);
}
report.BandwidthOverusage.AddBandwidthOverusageRow(
Reports.OverusageReport.BandwidthOverusageRow
.CreateFromHostingSpaceDataRow(report, bwRow)
);
}
}
// 2.
foreach (DataRow bwRow in bwTable.Rows)
{
if (Reports.OverusageReport.HostingSpaceRow
.IsContainChildSpaces(bwRow))
{
report = GetBandwidthReport(
report
, userId
, Reports.OverusageReport.HostingSpaceRow.GetPackageId(bwRow)
, String.Format(
"{0} \\ {1}"
, rootHostingSpacePath
, Reports.OverusageReportUtils.GetStringOrDefault(bwRow, "PackageName", String.Empty)
)
, startDate
, endDate
);
}
}
return report;
}
/// <summary>
/// Gathers summary information about disksapce usage.
/// </summary>
/// <param name="report"></param>
/// <param name="packageId"></param>
/// <param name="rootHostingSpacePath"></param>
/// <returns></returns>
private static Reports.OverusageReport GetDiskspaceReport(Reports.OverusageReport report, int userId, long packageId, string rootHostingSpacePath)
{
DataTable dsTable = GetPackagesDiskspacePaged(userId, (int)packageId);
Reports.OverusageReport.HostingSpaceRow hsRow = null;
//1. generate basic list of reports
foreach (DataRow dsRow in dsTable.Rows)
{
if (Reports.OverusageReport.HostingSpaceRow
.VerifyIfDiskspaceOverused(dsRow))
{
//determine whether this row already exists in the table
hsRow = report.HostingSpace.FindByHostingSpaceId(
Reports.OverusageReport.HostingSpaceRow.GetPackageId(dsRow)
);
if (hsRow != null)
{
//if so, just update it's Diskspace overusage status
hsRow.IsDiskspaceOverused = true;
}
else
{
//othrewise, create a new one
report.HostingSpace.AddHostingSpaceRow(
CreateHostingSpacesRow(dsRow, report, true, false, rootHostingSpacePath)
);
}
report.DiskspaceOverusage.AddDiskspaceOverusageRow(
Reports.OverusageReport.DiskspaceOverusageRow
.CreateFromHostingSpacesRow(report, dsRow)
);
}
}
//2. analyze children
foreach (DataRow dsRow in dsTable.Rows)
{
if (Reports.OverusageReport.HostingSpaceRow.IsContainChildSpaces(dsRow))
{
report = GetDiskspaceReport(
report
, userId
, Reports.OverusageReport.HostingSpaceRow.GetPackageId(dsRow)
, String.Format(
"{0} \\ {1}"
, rootHostingSpacePath
, Reports.OverusageReportUtils.GetStringOrDefault(dsRow, "PackageName", String.Empty)
)
);
}
}
return report;
}
/// <summary>
/// Retrieves child Hosting Spaces (packages) by parent Hosting Space Id
/// with information about bandwidth usage per Hosting Space
/// </summary>
/// <param name="packageId"></param>
/// <returns></returns>
private static DataTable GetPackagesDiskspacePaged(int userId, int packageId)
{
return GetPackagesDiskspacePaged(
userId
, packageId
, String.Empty
, 0
, int.MaxValue
).Tables[1];
}
/// <summary>
/// Retrieves child Hosting Spaces (packages) using parent Hosting Space Id
/// with information about bandwidth usage per Hosting Space
/// </summary>
/// <param name="packageId"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
private static DataTable GetPackagesBandwidthPaged(int userId, int packageId, DateTime startDate, DateTime endDate)
{
return GetPackagesBandwidthPaged(
userId
, packageId
, startDate
, endDate
, String.Empty
, 0
, int.MaxValue
).Tables[1];
}
/// <summary>
/// Creates HostingSpacesRow class instance.
/// </summary>
/// <param name="hsRow">Hosting Space information data row</param>
/// <param name="currentOverusageReport">The report to update.</param>
/// <param name="isDiskspaceOverused">Shows whether diskspace is overused.</param>
/// <param name="isBandwidthOverused">Shows whether bandwidth is overused.</param>
/// <param name="packageFullTree">Hosting spaces tree.</param>
/// <returns>HostingSpacesRow class instance.</returns>
private static Reports.OverusageReport.HostingSpaceRow CreateHostingSpacesRow(DataRow hsRow, Reports.OverusageReport currentOverusageReport, bool isDiskspaceOverused, bool isBandwidthOverused, string packageFullTree)
{
Reports.OverusageReport.HostingSpaceRow row = Reports.OverusageReport.HostingSpaceRow.CreateFromHostingSpacesRow(currentOverusageReport, hsRow, isDiskspaceOverused, isBandwidthOverused, packageFullTree);
//TODO: Optimiza it in some way :)
PackageInfo packageInfo = GetPackage((int)row.HostingSpaceId);
row.Location = ServerController.GetServerShortDetails(packageInfo.ServerId).ServerName;
row.HostingSpaceCreationDate = packageInfo.PurchaseDate;
return row;
}
#endregion
#region Helper Methods
public static Dictionary<int, List<ServiceProviderItem>> OrderServiceItemsByServices(
List<ServiceProviderItem> items)
{
// order items by service id
Dictionary<int, List<ServiceProviderItem>> orderedItems = new Dictionary<int, List<ServiceProviderItem>>();
foreach (ServiceProviderItem item in items)
{
int serviceId = item.ServiceId;
List<ServiceProviderItem> serviceItems = null;
if (orderedItems.ContainsKey(serviceId))
serviceItems = orderedItems[serviceId];
else
{
serviceItems = new List<ServiceProviderItem>();
orderedItems.Add(serviceId, serviceItems);
}
// add item to the appropriate list
serviceItems.Add(item);
}
return orderedItems;
}
#endregion
}
}