Added: HostHeader import. To ensure all pointers/hostheaders are within the

domains table.

This is mandatory to ensure a proper dns provisioning
This commit is contained in:
robvde 2012-10-26 12:11:44 +04:00
parent ff5aeda5f7
commit 2f42401a73
8 changed files with 401 additions and 68 deletions

View file

@ -29,8 +29,9 @@
using System; using System;
using System.Data; using System.Data;
using System.Collections.Generic; using System.Collections.Generic;
using WebsitePanel.EnterpriseServer;
using WebsitePanel.Providers; using WebsitePanel.Providers;
using WebsitePanel.Providers.Web;
namespace WebsitePanel.EnterpriseServer namespace WebsitePanel.EnterpriseServer
{ {
@ -68,69 +69,74 @@ namespace WebsitePanel.EnterpriseServer
if (accountCheck < 0) return items; if (accountCheck < 0) return items;
// load item type // load item type
ServiceProviderItemType itemType = PackageController.GetServiceItemType(itemTypeId); if (itemTypeId > 0)
// 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
{ {
List<string> importableItems = null; ServiceProviderItemType itemType = PackageController.GetServiceItemType(itemTypeId);
ctrl = Activator.CreateInstance(Type.GetType(group.GroupController)) as IImportController;
if (ctrl != null)
{
importableItems = ctrl.GetImportableItems(packageId, itemTypeId, Type.GetType(itemType.TypeName), group);
}
foreach (string importableItem in importableItems) // load group
{ ResourceGroupInfo group = ServerController.GetResourceGroup(itemType.GroupId);
// filter items by service // get service id
bool serviceContains = false; int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
foreach (DataRow dr in dtServiceItems.Rows) 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<string> importableItems = null;
ctrl = Activator.CreateInstance(Type.GetType(group.GroupController)) as IImportController;
if (ctrl != null)
{ {
string serviceItemName = (string)dr["ItemName"]; importableItems = ctrl.GetImportableItems(packageId, itemTypeId, Type.GetType(itemType.TypeName), group);
int serviceItemTypeId = (int)dr["ItemTypeId"];
if (String.Compare(importableItem, serviceItemName, true) == 0
&& serviceItemTypeId == itemTypeId)
{
serviceContains = true;
break;
}
} }
// filter items by package foreach (string importableItem in importableItems)
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 // filter items by service
&& packageItemTypeId == itemTypeId) bool serviceContains = false;
foreach (DataRow dr in dtServiceItems.Rows)
{ {
packageContains = true; string serviceItemName = (string)dr["ItemName"];
break; 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; return items;
} }
@ -172,19 +178,35 @@ namespace WebsitePanel.EnterpriseServer
TaskManager.IndicatorCurrent = 0; TaskManager.IndicatorCurrent = 0;
Dictionary<int, List<string>> groupedItems = new Dictionary<int, List<string>>(); Dictionary<int, List<string>> groupedItems = new Dictionary<int, List<string>>();
List<string> customItems = new List<string>();
// sort by groups // sort by groups
foreach (string item in items) foreach (string item in items)
{ {
string[] itemParts = item.Split('|'); string[] itemParts = item.Split('|');
int itemTypeId = Utils.ParseInt(itemParts[0], 0); if (!item.StartsWith("+"))
string itemName = itemParts[1]; {
int itemTypeId = Utils.ParseInt(itemParts[0], 0);
string itemName = itemParts[1];
// add to group // add to group
if (!groupedItems.ContainsKey(itemTypeId)) if (!groupedItems.ContainsKey(itemTypeId))
groupedItems[itemTypeId] = new List<string>(); groupedItems[itemTypeId] = new List<string>();
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 // import each group
@ -226,9 +248,64 @@ namespace WebsitePanel.EnterpriseServer
catch { /* do nothing */ } 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(); TaskManager.CompleteTask();
return 0; return 0;
} }
private static List<string> GetImportableCustomerItems(int packageId, int itemTypeId)
{
List<string> items = new List<string>();
PackageInfo packageInfo = PackageController.GetPackage(packageId);
if (packageInfo == null) return items;
switch (itemTypeId)
{
case -100:
List<UserInfo> users = UserController.GetUsers(packageInfo.UserId, true);
foreach (UserInfo user in users)
{
List<PackageInfo> packages = PackageController.GetPackages(user.UserId);
foreach (PackageInfo package in packages)
{
List<WebSite> 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;
}
} }
} }

View file

@ -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<DomainInfo> 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<DomainInfo> 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<DomainInfo> 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 #endregion
#region IBackupController Members #region IBackupController Members

View file

@ -9,7 +9,7 @@
<add name="EnterpriseServer" connectionString="server=HSTPROV01;database=WebsitePanelMerge;uid=WebsitePanel;pwd=aj7ep6fyhmw3b5qeth7c;" /> <add name="EnterpriseServer" connectionString="server=HSTPROV01;database=WebsitePanelMerge;uid=WebsitePanel;pwd=aj7ep6fyhmw3b5qeth7c;" />
<add name="EnterpriseServer" connectionString="server=HSTWSP01;database=WebsitePanelMerge;uid=WebsitePanel;pwd=pserxfbnlc6hwmdedbp0;" providerName="System.Data.SqlClient" /> <add name="EnterpriseServer" connectionString="server=HSTWSP01;database=WebsitePanelMerge;uid=WebsitePanel;pwd=pserxfbnlc6hwmdedbp0;" providerName="System.Data.SqlClient" />
--> -->
<add name="EnterpriseServer" connectionString="server=HSTPROV01;database=WebsitePanelMerge;uid=WebsitePanel;pwd=aj7ep6fyhmw3b5qeth7c;" /> <add name="EnterpriseServer" connectionString="server=HSTWSP01;database=WebsitePanelMerge;uid=WebsitePanel;pwd=pserxfbnlc6hwmdedbp0;" providerName="System.Data.SqlClient" />
</connectionStrings> </connectionStrings>
<appSettings> <appSettings>
<!-- A1D4KDHUE83NKHddF --> <!-- A1D4KDHUE83NKHddF -->
@ -17,7 +17,7 @@
<add key="WebsitePanel.CryptoKey" value="3x7eqt7zabc5n5afs6dg" /> <add key="WebsitePanel.CryptoKey" value="3x7eqt7zabc5n5afs6dg" />
<add key="WebsitePanel.CryptoKey" value="fr2ym4wn2gmbrj7dz336" /> <add key="WebsitePanel.CryptoKey" value="fr2ym4wn2gmbrj7dz336" />
--> -->
<add key="WebsitePanel.CryptoKey" value="3x7eqt7zabc5n5afs6dg" /> <add key="WebsitePanel.CryptoKey" value="fr2ym4wn2gmbrj7dz336" />
<!-- A1D4KDHUE83NKHddF --> <!-- A1D4KDHUE83NKHddF -->
<add key="WebsitePanel.EncryptionEnabled" value="true" /> <add key="WebsitePanel.EncryptionEnabled" value="true" />
<!-- Web Applications --> <!-- Web Applications -->

View file

@ -2118,6 +2118,10 @@
<data name="ServiceItemType.WebSite" xml:space="preserve"> <data name="ServiceItemType.WebSite" xml:space="preserve">
<value>Web Site</value> <value>Web Site</value>
</data> </data>
<data name="ServiceItemType.HostHeader" xml:space="preserve">
<value>Web Site Host Header</value>
</data>
<data name="AuditLogSource.APP_INSTALLER" xml:space="preserve"> <data name="AuditLogSource.APP_INSTALLER" xml:space="preserve">
<value>Applications Installer</value> <value>Applications Installer</value>
</data> </data>

View file

@ -1,9 +1,42 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SpaceImportResources.ascx.cs" Inherits="WebsitePanel.Portal.SpaceImportResources" %> <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SpaceImportResources.ascx.cs" Inherits="WebsitePanel.Portal.SpaceImportResources" %>
<%@ Register Src="UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> <%@ Register Src="UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<script type="text/javascript">
function TreeViewCheckBoxClicked(Check_Event)
{
var objElement;
try
{
objElement = window.event.srcElement;
}
catch (Error)
{
}
if (objElement != null)
{
if (objElement.tagName == "INPUT" && objElement.type == "checkbox")
{
__doPostBack("", "");
}
}
else
{
if (Check_Event != null)
{
if (Check_Event.target.toString() == "[object HTMLInputElement]")
{
__doPostBack("", "");
}
}
}
}
</script>
<div class="FormBody"> <div class="FormBody">
<asp:treeview runat="server" id="tree" populatenodesfromclient="true" NodeIndent="10" <asp:treeview runat="server" id="tree" populatenodesfromclient="true" NodeIndent="10"
showexpandcollapse="true" expanddepth="0" ontreenodepopulate="tree_TreeNodePopulate"> showexpandcollapse="true" expanddepth="0" ontreenodepopulate="tree_TreeNodePopulate" OnTreeNodeCheckChanged="tree_TreeNodeCheckChanged" >
<LevelStyles> <LevelStyles>
<asp:TreeNodeStyle CssClass="FileManagerTreeNode" /> <asp:TreeNodeStyle CssClass="FileManagerTreeNode" />
<asp:TreeNodeStyle CssClass="FileManagerTreeNode" /> <asp:TreeNodeStyle CssClass="FileManagerTreeNode" />

View file

@ -45,6 +45,8 @@ namespace WebsitePanel.Portal
{ {
public partial class SpaceImportResources : WebsitePanelModuleBase public partial class SpaceImportResources : WebsitePanelModuleBase
{ {
private static TreeNode rootNode;
protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
{ {
// enable async tasks // enable async tasks
@ -52,6 +54,8 @@ namespace WebsitePanel.Portal
if (!IsPostBack) if (!IsPostBack)
{ {
tree.Attributes.Add("onClick", "TreeViewCheckBoxClicked(event)");
PrepareTree(); PrepareTree();
} }
} }
@ -64,7 +68,7 @@ namespace WebsitePanel.Portal
tree.NoExpandImageUrl = PortalUtils.GetThemedImage("empty.gif"); tree.NoExpandImageUrl = PortalUtils.GetThemedImage("empty.gif");
tree.Nodes.Clear(); tree.Nodes.Clear();
TreeNode rootNode = new TreeNode(); rootNode = new TreeNode();
rootNode.ImageUrl = PortalUtils.GetThemedImage("folder.png"); rootNode.ImageUrl = PortalUtils.GetThemedImage("folder.png");
rootNode.Text = GetLocalizedString("Text.Resources"); rootNode.Text = GetLocalizedString("Text.Resources");
rootNode.Value = "Root"; rootNode.Value = "Root";
@ -72,16 +76,28 @@ namespace WebsitePanel.Portal
tree.Nodes.Add(rootNode); tree.Nodes.Add(rootNode);
// populate root node // populate root node
TreeNode node;
ServiceProviderItemType[] types = ES.Services.Import.GetImportableItemTypes(PanelSecurity.PackageId); ServiceProviderItemType[] types = ES.Services.Import.GetImportableItemTypes(PanelSecurity.PackageId);
foreach (ServiceProviderItemType type in types) foreach (ServiceProviderItemType type in types)
{ {
TreeNode node = new TreeNode(); node = new TreeNode();
node.Value = "-" + type.ItemTypeId.ToString(); node.Value = "-" + type.ItemTypeId.ToString();
node.Text = GetSharedLocalizedString("ServiceItemType." + type.DisplayName); node.Text = GetSharedLocalizedString("ServiceItemType." + type.DisplayName);
node.PopulateOnDemand = true; node.PopulateOnDemand = true;
node.ImageUrl = PortalUtils.GetThemedImage("folder.png"); node.ImageUrl = PortalUtils.GetThemedImage("folder.png");
rootNode.ChildNodes.Add(node); 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) protected void tree_TreeNodePopulate(object sender, TreeNodeEventArgs e)
@ -100,6 +116,58 @@ namespace WebsitePanel.Portal
e.Node.ChildNodes.Add(node); 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) protected void btnImport_Click(object sender, EventArgs e)
@ -142,5 +210,33 @@ namespace WebsitePanel.Portal
{ {
RedirectSpaceHomePage(); 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);
}
}
}
} }
} }

View file

@ -1,19 +1,51 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // 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 // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace WebsitePanel.Portal { namespace WebsitePanel.Portal {
public partial class SpaceImportResources { public partial class SpaceImportResources {
protected WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks;
protected System.Web.UI.WebControls.TreeView tree; /// <summary>
protected System.Web.UI.WebControls.Button btnImport; /// asyncTasks control.
protected System.Web.UI.WebControls.Button btnCancel; /// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks;
/// <summary>
/// tree control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TreeView tree;
/// <summary>
/// btnImport control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnImport;
/// <summary>
/// btnCancel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnCancel;
} }
} }

View file

@ -50,7 +50,7 @@ namespace WebsitePanel.Portal
lnkImportResources.NavigateUrl = EditUrl(PortalUtils.SPACE_ID_PARAM, PanelSecurity.PackageId.ToString(), "import"); lnkImportResources.NavigateUrl = EditUrl(PortalUtils.SPACE_ID_PARAM, PanelSecurity.PackageId.ToString(), "import");
lnkBackup.Visible = lnkRestore.Visible = PortalUtils.PageExists("Backup"); lnkBackup.Visible = lnkRestore.Visible = PortalUtils.PageExists("Backup");
lnkImportResources.Visible = (PanelSecurity.PackageId > 1 && lnkImportResources.Visible = (PanelSecurity.PackageId >= 1 &&
PanelSecurity.LoggedUser.Role == UserRole.Administrator); PanelSecurity.LoggedUser.Role == UserRole.Administrator);
if (PanelSecurity.SelectedUser.RoleId.Equals(1)) if (PanelSecurity.SelectedUser.RoleId.Equals(1))