diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportController.cs index 13d53b8a..7ca6f938 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Provisioning/ImportController.cs @@ -29,8 +29,9 @@ using System; using System.Data; using System.Collections.Generic; - +using WebsitePanel.EnterpriseServer; using WebsitePanel.Providers; +using WebsitePanel.Providers.Web; namespace WebsitePanel.EnterpriseServer { @@ -68,69 +69,74 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return items; // load item type - ServiceProviderItemType itemType = PackageController.GetServiceItemType(itemTypeId); - - // load group - ResourceGroupInfo group = ServerController.GetResourceGroup(itemType.GroupId); - - // get service id - int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName); - if (serviceId == 0) - return items; - - DataTable dtServiceItems = PackageController.GetServiceItemsDataSet(serviceId).Tables[0]; - DataTable dtPackageItems = PackageController.GetPackageItemsDataSet(packageId).Tables[0]; - - // instantiate controller - IImportController ctrl = null; - try + if (itemTypeId > 0) { - List importableItems = null; - ctrl = Activator.CreateInstance(Type.GetType(group.GroupController)) as IImportController; - if (ctrl != null) - { - importableItems = ctrl.GetImportableItems(packageId, itemTypeId, Type.GetType(itemType.TypeName), group); - } + ServiceProviderItemType itemType = PackageController.GetServiceItemType(itemTypeId); - foreach (string importableItem in importableItems) - { + // load group + ResourceGroupInfo group = ServerController.GetResourceGroup(itemType.GroupId); - // filter items by service - bool serviceContains = false; - foreach (DataRow dr in dtServiceItems.Rows) + // get service id + int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName); + if (serviceId == 0) + return items; + + DataTable dtServiceItems = PackageController.GetServiceItemsDataSet(serviceId).Tables[0]; + DataTable dtPackageItems = PackageController.GetPackageItemsDataSet(packageId).Tables[0]; + + // instantiate controller + IImportController ctrl = null; + try + { + List importableItems = null; + ctrl = Activator.CreateInstance(Type.GetType(group.GroupController)) as IImportController; + if (ctrl != null) { - string serviceItemName = (string)dr["ItemName"]; - int serviceItemTypeId = (int)dr["ItemTypeId"]; - - if (String.Compare(importableItem, serviceItemName, true) == 0 - && serviceItemTypeId == itemTypeId) - { - serviceContains = true; - break; - } + importableItems = ctrl.GetImportableItems(packageId, itemTypeId, Type.GetType(itemType.TypeName), group); } - // filter items by package - bool packageContains = false; - foreach (DataRow dr in dtPackageItems.Rows) + foreach (string importableItem in importableItems) { - string packageItemName = (string)dr["ItemName"]; - int packageItemTypeId = (int)dr["ItemTypeId"]; - if (String.Compare(importableItem, packageItemName, true) == 0 - && packageItemTypeId == itemTypeId) + // filter items by service + bool serviceContains = false; + foreach (DataRow dr in dtServiceItems.Rows) { - packageContains = true; - break; + string serviceItemName = (string)dr["ItemName"]; + int serviceItemTypeId = (int)dr["ItemTypeId"]; + + if (String.Compare(importableItem, serviceItemName, true) == 0 + && serviceItemTypeId == itemTypeId) + { + serviceContains = true; + break; + } } + + // filter items by package + bool packageContains = false; + foreach (DataRow dr in dtPackageItems.Rows) + { + string packageItemName = (string)dr["ItemName"]; + int packageItemTypeId = (int)dr["ItemTypeId"]; + + if (String.Compare(importableItem, packageItemName, true) == 0 + && packageItemTypeId == itemTypeId) + { + packageContains = true; + break; + } + } + + if (!serviceContains && !packageContains) + items.Add(importableItem); } - if (!serviceContains && !packageContains) - items.Add(importableItem); } - + catch { /* do nothing */ } } - catch { /* do nothing */ } + else + return GetImportableCustomerItems(packageId, itemTypeId); return items; } @@ -172,19 +178,35 @@ namespace WebsitePanel.EnterpriseServer TaskManager.IndicatorCurrent = 0; Dictionary> groupedItems = new Dictionary>(); + List customItems = new List(); // sort by groups foreach (string item in items) { + string[] itemParts = item.Split('|'); - int itemTypeId = Utils.ParseInt(itemParts[0], 0); - string itemName = itemParts[1]; + if (!item.StartsWith("+")) + { + int itemTypeId = Utils.ParseInt(itemParts[0], 0); + string itemName = itemParts[1]; - // add to group - if (!groupedItems.ContainsKey(itemTypeId)) - groupedItems[itemTypeId] = new List(); + // add to group + if (!groupedItems.ContainsKey(itemTypeId)) + groupedItems[itemTypeId] = new List(); - groupedItems[itemTypeId].Add(itemName); + groupedItems[itemTypeId].Add(itemName); + } + else + { + switch (itemParts[0]) + { + case ("+100"): + if (itemParts.Length > 2) + customItems.Add(item); + break; + } + + } } // import each group @@ -226,9 +248,64 @@ namespace WebsitePanel.EnterpriseServer catch { /* do nothing */ } } + foreach (string s in customItems) + { + try + { + string[] sParts = s.Split('|'); + switch (sParts[0]) + { + case "+100": + TaskManager.Write(String.Format("Import {0}", sParts[4])); + + int result = WebServerController.ImporHostHeader(int.Parse(sParts[2],0), int.Parse(sParts[3],0), int.Parse(sParts[5],0)); + + if (result < 0) + TaskManager.WriteError(String.Format("Failed to Import {0} ,error: {1}: ", sParts[4], result.ToString())); + + break; + } + } + catch { /* do nothing */ } + + TaskManager.IndicatorCurrent++; + } + + TaskManager.IndicatorCurrent = items.Length; + TaskManager.CompleteTask(); return 0; } + + private static List GetImportableCustomerItems(int packageId, int itemTypeId) + { + + List items = new List(); + PackageInfo packageInfo = PackageController.GetPackage(packageId); + if (packageInfo == null) return items; + + switch (itemTypeId) + { + case -100: + List users = UserController.GetUsers(packageInfo.UserId, true); + foreach (UserInfo user in users) + { + List packages = PackageController.GetPackages(user.UserId); + foreach (PackageInfo package in packages) + { + List webSites = WebServerController.GetWebSites(package.PackageId, false); + foreach (WebSite webSite in webSites) + { + items.Add(user.Username+"|"+user.UserId.ToString()+"|"+package.PackageId.ToString()+"|"+webSite.SiteId+"|"+webSite.Id); + } + } + } + + break; + } + + return items; + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs index 368ad65c..6df74480 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs @@ -3689,6 +3689,97 @@ Please ensure the space has been allocated {0} IP address as a dedicated one and } } + + public static int ImporHostHeader(int userId, int packageId, int siteId) + { + WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteId); + if (siteItem == null) + return -1; + + // load live site from service + WebServer web = new WebServer(); + ServiceProviderProxy.Init(web, siteItem.ServiceId); + + // Verify if already exists + List domains = ServerController.GetDomains(packageId); + + // Get hostheader + foreach (ServerBinding b in web.GetSiteBindings(siteItem.SiteId)) + { + if ((!DoesHeaderExistInDomains(b.Host.ToLower(), domains)) && (!string.IsNullOrEmpty(b.Host))) + { + // If not get domain info and add to domains + int domainId = FindDomainForHeader(b.Host.ToLower(), domains); + if (domainId > 0) + { + DomainInfo domain = ServerController.GetDomain(domainId); + DomainInfo newDomain = new DomainInfo(); + newDomain.DomainName = b.Host.ToLower(); + newDomain.PackageId = domain.PackageId; + + int newDomainID = ServerController.AddDomain(newDomain, domain.IsInstantAlias, false); + if (newDomainID > 0) + { + newDomain = ServerController.GetDomain(newDomainID); + if (newDomain != null) + { + newDomain.WebSiteId = siteId; + newDomain.ZoneItemId = domain.ZoneItemId; + newDomain.DomainItemId = domain.DomainId; + newDomain.IsDomainPointer = true; + ServerController.UpdateDomain(newDomain); + } + } + } + } + } + + return 0; + } + + private static bool DoesHeaderExistInDomains(string header, List domains) + { + bool bExist = false; + + if (!string.IsNullOrEmpty(header)) + { + foreach (DomainInfo d in domains) + { + if ((header == d.DomainName.ToLower()) && + (d.IsDomainPointer)) + { + bExist = true; + break; + } + } + } + return bExist; + } + + + private static int FindDomainForHeader(string header, List domains) + { + int domainId = 0; + + while (header.IndexOf(".") != -1) + { + header = header.Substring(header.IndexOf(".") + 1); + + foreach (DomainInfo d in domains) + { + if ((header == d.DomainName.ToLower()) && (!d.IsDomainPointer)) + { + domainId = d.DomainId; + break; + } + } + } + + return domainId; + } + + + #endregion #region IBackupController Members diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config index 6c7d9d64..27a5f82b 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config @@ -9,7 +9,7 @@ --> - + @@ -17,7 +17,7 @@ --> - + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index d73ac512..49bba505 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -2118,6 +2118,10 @@ Web Site + + Web Site Host Header + + Applications Installer diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx index 812aaf2a..3f1074af 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx @@ -1,9 +1,42 @@ <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SpaceImportResources.ascx.cs" Inherits="WebsitePanel.Portal.SpaceImportResources" %> <%@ Register Src="UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + +
+ showexpandcollapse="true" expanddepth="0" ontreenodepopulate="tree_TreeNodePopulate" OnTreeNodeCheckChanged="tree_TreeNodeCheckChanged" > diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx.cs index cf6752f6..5e2c5b07 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx.cs @@ -45,6 +45,8 @@ namespace WebsitePanel.Portal { public partial class SpaceImportResources : WebsitePanelModuleBase { + private static TreeNode rootNode; + protected void Page_Load(object sender, EventArgs e) { // enable async tasks @@ -52,6 +54,8 @@ namespace WebsitePanel.Portal if (!IsPostBack) { + tree.Attributes.Add("onClick", "TreeViewCheckBoxClicked(event)"); + PrepareTree(); } } @@ -64,7 +68,7 @@ namespace WebsitePanel.Portal tree.NoExpandImageUrl = PortalUtils.GetThemedImage("empty.gif"); tree.Nodes.Clear(); - TreeNode rootNode = new TreeNode(); + rootNode = new TreeNode(); rootNode.ImageUrl = PortalUtils.GetThemedImage("folder.png"); rootNode.Text = GetLocalizedString("Text.Resources"); rootNode.Value = "Root"; @@ -72,16 +76,28 @@ namespace WebsitePanel.Portal tree.Nodes.Add(rootNode); // populate root node + TreeNode node; ServiceProviderItemType[] types = ES.Services.Import.GetImportableItemTypes(PanelSecurity.PackageId); foreach (ServiceProviderItemType type in types) { - TreeNode node = new TreeNode(); + node = new TreeNode(); node.Value = "-" + type.ItemTypeId.ToString(); node.Text = GetSharedLocalizedString("ServiceItemType." + type.DisplayName); node.PopulateOnDemand = true; node.ImageUrl = PortalUtils.GetThemedImage("folder.png"); rootNode.ChildNodes.Add(node); } + + // Add Import HostHeaders + node = new TreeNode(); + node.Value = "+100"; + node.Text = GetSharedLocalizedString("ServiceItemType.HostHeader"); + node.PopulateOnDemand = true; + node.ImageUrl = PortalUtils.GetThemedImage("folder.png"); + rootNode.ChildNodes.Add(node); + + + } protected void tree_TreeNodePopulate(object sender, TreeNodeEventArgs e) @@ -100,6 +116,58 @@ namespace WebsitePanel.Portal e.Node.ChildNodes.Add(node); } } + + if (e.Node.Value.StartsWith("+")) + { + int itemTypeId = Utils.ParseInt(e.Node.Value.Substring(1), 0); + string[] items = ES.Services.Import.GetImportableItems(PanelSecurity.PackageId, itemTypeId * -1); + + switch (itemTypeId) + { + case 100: + + TreeNode headerNode = new TreeNode(); + headerNode.Text = GetSharedLocalizedString("ServiceItemType.HostHeader"); + headerNode.Value = "+" + itemTypeId.ToString(); + headerNode.ShowCheckBox = true; + e.Node.ChildNodes.Add(headerNode); + + foreach (string item in items) + { + string[] objectData = item.Split('|'); + + TreeNode userNode = null; + foreach (TreeNode n in headerNode.ChildNodes) + { + if (n.Value == "+" + itemTypeId.ToString() + "|" + objectData[1]) ; + { + userNode = n; + break; + } + } + + if (userNode == null) + { + userNode = new TreeNode(); + userNode.Text = objectData[0]; + userNode.Value = "+" + itemTypeId.ToString() + "|" + objectData[1]; + userNode.ShowCheckBox = true; + headerNode.ChildNodes.Add(userNode); + } + + TreeNode siteNode = new TreeNode(); + siteNode.Text = objectData[3]; + siteNode.Value = "+" + itemTypeId.ToString() + "|" + item; + siteNode.ShowCheckBox = true; + userNode.ChildNodes.Add(siteNode); + + headerNode.Expand(); + } + break; + } + + } + } protected void btnImport_Click(object sender, EventArgs e) @@ -142,5 +210,33 @@ namespace WebsitePanel.Portal { RedirectSpaceHomePage(); } + + + void checkChildNodes(TreeNodeCollection ptnChildren, bool isChecked) + { + foreach (TreeNode childNode in ptnChildren) + { + childNode.Checked = isChecked; + + + if (childNode.ChildNodes.Count > 0) + { + this.checkChildNodes(childNode.ChildNodes, isChecked); + } + } + } + + protected void tree_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e) + { + foreach (TreeNode childNode in e.Node.ChildNodes) + { + childNode.Checked = e.Node.Checked; + + if (childNode.ChildNodes.Count > 0) + { + this.checkChildNodes(childNode.ChildNodes, e.Node.Checked); + } + } + } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx.designer.cs index 306b3112..d0b42d71 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceImportResources.ascx.designer.cs @@ -1,19 +1,51 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.42 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal { + public partial class SpaceImportResources { - protected WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - protected System.Web.UI.WebControls.TreeView tree; - protected System.Web.UI.WebControls.Button btnImport; - protected System.Web.UI.WebControls.Button btnCancel; + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// tree control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TreeView tree; + + /// + /// btnImport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnImport; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceTools.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceTools.ascx.cs index 45c708bf..00027267 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceTools.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceTools.ascx.cs @@ -50,7 +50,7 @@ namespace WebsitePanel.Portal lnkImportResources.NavigateUrl = EditUrl(PortalUtils.SPACE_ID_PARAM, PanelSecurity.PackageId.ToString(), "import"); lnkBackup.Visible = lnkRestore.Visible = PortalUtils.PageExists("Backup"); - lnkImportResources.Visible = (PanelSecurity.PackageId > 1 && + lnkImportResources.Visible = (PanelSecurity.PackageId >= 1 && PanelSecurity.LoggedUser.Role == UserRole.Administrator); if (PanelSecurity.SelectedUser.RoleId.Equals(1))