From ce508b178c1a26d28811ca5bace20801ed3992eb Mon Sep 17 00:00:00 2001 From: McMak Date: Wed, 13 May 2015 06:27:24 +0300 Subject: [PATCH] Improvements WiX UI, installed component detection, update via UI. --- .../Sources/Setup.WIXInstaller/Product.wxs | 12 +-- .../WebsitePanel.Setup/Common/Global.cs | 1 + .../WebsitePanel.Setup/Internal/Adapter.cs | 20 ++-- .../Internal/BackupRestore.cs | 14 ++- .../WebsitePanel.WIXInstaller/CustomAction.cs | 97 +++++++++++++++++++ .../WebsitePanel.WIXInstaller.csproj | 1 + 6 files changed, 127 insertions(+), 18 deletions(-) diff --git a/WebsitePanel.Installer/Sources/Setup.WIXInstaller/Product.wxs b/WebsitePanel.Installer/Sources/Setup.WIXInstaller/Product.wxs index 273fbfaf..6d4f921b 100644 --- a/WebsitePanel.Installer/Sources/Setup.WIXInstaller/Product.wxs +++ b/WebsitePanel.Installer/Sources/Setup.WIXInstaller/Product.wxs @@ -563,8 +563,8 @@ - - + + @@ -599,7 +599,7 @@ - + @@ -607,14 +607,14 @@ - + - + @@ -649,7 +649,7 @@ - 1 + diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/Global.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/Global.cs index 6bf1759f..e0215046 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/Global.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/Global.cs @@ -39,6 +39,7 @@ namespace WebsitePanel.Setup public const string DefaultInstallPathRoot = @"C:\WebsitePanel"; public const string LoopbackIPv4 = "127.0.0.1"; public const string InstallerProductCode = "cfg core"; + public const string DefaultProductName = "WebsitePanel"; public abstract class Parameters { diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Internal/Adapter.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Internal/Adapter.cs index f0f28301..5eeb3a0c 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Internal/Adapter.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Internal/Adapter.cs @@ -170,9 +170,13 @@ namespace WebsitePanel.Setup.Internal } public static string GetComponentID(SetupVariables Ctx) { - var XmlPath = string.Format("//component[.//add/@key='ComponentCode' and .//add/@value='{0}']", Ctx.ComponentCode); + return GetComponentID(GetFullConfigPath(Ctx), Ctx.ComponentCode); + } + public static string GetComponentID(string Cfg, string ComponentCode) + { + var XmlPath = string.Format("//component[.//add/@key='ComponentCode' and .//add/@value='{0}']", ComponentCode); var Xml = new XmlDocument(); - Xml.Load(GetFullConfigPath(Ctx)); + Xml.Load(Cfg); var Node = Xml.SelectSingleNode(XmlPath) as XmlElement; return Node == null ? null : Node.GetAttribute("id"); } @@ -3926,20 +3930,20 @@ namespace WebsitePanel.Setup.Internal try { Log.WriteStart("RestoreXmlConfigs"); - var Backup = BackupRestore.Find(Ctx.InstallerFolder, "WebsitePanel", Ctx.ComponentName); + var Backup = BackupRestore.Find(Ctx.InstallerFolder, Global.DefaultProductName, Ctx.ComponentName); switch(Ctx.ComponentCode) { - case "server": + case Global.Server.ComponentCode: { Backup.XmlFiles.Add("Web.config"); } break; - case "enterpriseserver": + case Global.EntServer.ComponentCode: { Backup.XmlFiles.Add("Web.config"); } break; - case "portal": + case Global.WebPortal.ComponentCode: { Backup.XmlFiles.Add("Web.config"); Backup.XmlFiles.Add(@"App_Data\Countries.config"); @@ -3957,9 +3961,7 @@ namespace WebsitePanel.Setup.Internal break; } var MainCfg = Path.Combine(Ctx.InstallerFolder, BackupRestore.MainConfig); - var XCfg = new XmlDocument(); - XCfg.Load(MainCfg); - if (XCfg.SelectSingleNode("//components").ChildNodes.Count == 0) + if (!BackupRestore.HaveChild(MainCfg, "//components")) { Log.WriteInfo("Restoring main config..."); XmlDocumentMerge.Process(Backup.BackupMainConfigFile, MainCfg); diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Internal/BackupRestore.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Internal/BackupRestore.cs index 5778175f..91890d6e 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Internal/BackupRestore.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Internal/BackupRestore.cs @@ -8,7 +8,7 @@ using Ionic.Zip; namespace WebsitePanel.Setup.Internal { - class BackupRestore + public class BackupRestore { struct DirectoryTag { @@ -47,9 +47,7 @@ namespace WebsitePanel.Setup.Internal Version BckpVersion; var StrVersion = VersionName.Substring(FullId.Length); if (Version.TryParse(StrVersion, out BckpVersion)) - { DirList.Add(new DirectoryTag { Name = VersionItem, Date = date, Version = BckpVersion }); - } } } } @@ -61,6 +59,16 @@ namespace WebsitePanel.Setup.Internal } return Result; } + public static bool HaveChild(string XmlDocPath, string XmlPath) + { + var Result = false; + var XCfg = new XmlDocument(); + XCfg.Load(XmlDocPath); + var Node = XCfg.SelectSingleNode(XmlPath); + if (Node != null) + Result = Node.ChildNodes.Count > 0; + return Result; + } private static string GetComponentRoot(DirectoryTag DirTag, string Id) { var Cfg = GetMainConfig(DirTag); diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.WIXInstaller/CustomAction.cs b/WebsitePanel.Installer/Sources/WebsitePanel.WIXInstaller/CustomAction.cs index 3bc32d46..0ff7782e 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.WIXInstaller/CustomAction.cs +++ b/WebsitePanel.Installer/Sources/WebsitePanel.WIXInstaller/CustomAction.cs @@ -27,6 +27,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; using System.Collections.Generic; +using System.Configuration; using System.Configuration.Install; using System.Data; using System.Data.Sql; @@ -87,6 +88,102 @@ namespace WebsitePanel.WIXInstaller var Ctx = session; Ctx.AttachToSetupLog(); Log.WriteStart("PreFillSettings"); + var WSP = Ctx["WEBSITEPANELDIR"]; + var CfgStr = string.Empty; + Func GetCfg = (string CfgDir) => + { + if (Directory.Exists(CfgDir)) + { + var CfgFile = Path.Combine(CfgDir, BackupRestore.MainConfig); + if (File.Exists(CfgFile) && BackupRestore.HaveChild(CfgFile, "//components")) + return CfgFile; + else + { + var Names = new string[] { Global.Server.ComponentName, Global.EntServer.ComponentName, Global.WebPortal.ComponentName }; + foreach (var Name in Names) + { + var Backup = BackupRestore.Find(CfgDir, Global.DefaultProductName, Name); + if (Backup != null && BackupRestore.HaveChild(Backup.BackupMainConfigFile, "//components")) + return CfgStr = Backup.BackupMainConfigFile; + } + } + } + return string.Empty; + }; + Func SetProperty = (Session CtxSession, string Prop, string Value) => + { + if(!string.IsNullOrWhiteSpace(Value)) + { + CtxSession[Prop] = Value; + return true; + } + return false; + }; + CfgStr = GetCfg(WSP); + if(string.IsNullOrWhiteSpace(CfgStr)) + { + var Drives = from Drive in DriveInfo.GetDrives() where Drive.DriveType == DriveType.Fixed select Drive; + foreach(var Drive in Drives) + { + var Dir = Path.Combine(Drive.RootDirectory.FullName, Global.DefaultProductName); + CfgStr = GetCfg(Dir); + if (!string.IsNullOrWhiteSpace(CfgStr)) + break; + } + } + if (!string.IsNullOrWhiteSpace(CfgStr)) + { + var EServerUrl = string.Empty; + AppConfig.LoadConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = CfgStr }); + var CtxVars = new SetupVariables(); + CtxVars.ComponentId = WiXSetup.GetComponentID(CfgStr, Global.Server.ComponentCode); + if (!string.IsNullOrWhiteSpace(CtxVars.ComponentId)) + { + AppConfig.LoadComponentSettings(CtxVars); + Ctx["COMPFOUND_SERVER"] = "1"; + SetProperty(Ctx, "PI_SERVER_IP", CtxVars.WebSiteIP); + SetProperty(Ctx, "PI_SERVER_PORT", CtxVars.WebSitePort); + SetProperty(Ctx, "PI_SERVER_HOST", CtxVars.WebSiteDomain); + SetProperty(Ctx, "PI_SERVER_LOGIN", CtxVars.UserAccount); + SetProperty(Ctx, "PI_SERVER_PASSWORD", CtxVars.UserPassword); + SetProperty(Ctx, "PI_SERVER_PASSWORD_CONFIRM",CtxVars.UserPassword); + SetProperty(Ctx, "PI_SERVER_DOMAIN", CtxVars.UserDomain); + SetProperty(Ctx, "SERVER_ACCESS_PASSWORD", CtxVars.ServerPassword); + SetProperty(Ctx, "SERVER_ACCESS_PASSWORD_CONFIRM", CtxVars.ServerPassword); + } + CtxVars.ComponentId = WiXSetup.GetComponentID(CfgStr, Global.EntServer.ComponentCode); + if (!string.IsNullOrWhiteSpace(CtxVars.ComponentId)) + { + AppConfig.LoadComponentSettings(CtxVars); + Ctx["COMPFOUND_ESERVER"] = "1"; + SetProperty(Ctx, "PI_ESERVER_IP", CtxVars.WebSiteIP); + SetProperty(Ctx, "PI_ESERVER_PORT", CtxVars.WebSitePort); + SetProperty(Ctx, "PI_ESERVER_HOST", CtxVars.WebSiteDomain); + SetProperty(Ctx, "PI_ESERVER_LOGIN", CtxVars.UserAccount); + SetProperty(Ctx, "PI_ESERVER_PASSWORD", CtxVars.UserPassword); + SetProperty(Ctx, "PI_ESERVER_PASSWORD_CONFIRM", CtxVars.UserPassword); + SetProperty(Ctx, "PI_ESERVER_DOMAIN", CtxVars.UserDomain); + SetProperty(Ctx, "SERVERADMIN_PASSWORD", CtxVars.ServerAdminPassword); + SetProperty(Ctx, "SERVERADMIN_PASSWORD_CONFIRM", CtxVars.ServerAdminPassword); + EServerUrl = string.Format("http://{0}:{1}", CtxVars.WebSiteIP, CtxVars.WebSitePort); + } + CtxVars.ComponentId = WiXSetup.GetComponentID(CfgStr, Global.WebPortal.ComponentCode); + if (!string.IsNullOrWhiteSpace(CtxVars.ComponentId)) + { + AppConfig.LoadComponentSettings(CtxVars); + Ctx["COMPFOUND_PORTAL"] = "1"; + SetProperty(Ctx, "PI_PORTAL_IP", CtxVars.WebSiteIP); + SetProperty(Ctx, "PI_PORTAL_PORT", CtxVars.WebSitePort); + SetProperty(Ctx, "PI_PORTAL_HOST", CtxVars.WebSiteDomain); + SetProperty(Ctx, "PI_PORTAL_LOGIN", CtxVars.UserAccount); + SetProperty(Ctx, "PI_PORTAL_PASSWORD", CtxVars.UserPassword); + SetProperty(Ctx, "PI_PORTAL_PASSWORD_CONFIRM", CtxVars.UserPassword); + SetProperty(Ctx, "PI_PORTAL_DOMAIN", CtxVars.UserDomain); + if (!SetProperty(Ctx, "PI_ESERVER_URL", CtxVars.EnterpriseServerURL)) + if (!SetProperty(Ctx, "PI_ESERVER_URL", EServerUrl)) + SetProperty(Ctx, "PI_ESERVER_URL", Global.WebPortal.DefaultEntServURL); + } + } TryApllyNewPassword(Ctx, "PI_SERVER_PASSWORD"); TryApllyNewPassword(Ctx, "PI_ESERVER_PASSWORD"); TryApllyNewPassword(Ctx, "PI_PORTAL_PASSWORD"); diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.WIXInstaller/WebsitePanel.WIXInstaller.csproj b/WebsitePanel.Installer/Sources/WebsitePanel.WIXInstaller/WebsitePanel.WIXInstaller.csproj index 1a4b44b7..0aee4f2c 100644 --- a/WebsitePanel.Installer/Sources/WebsitePanel.WIXInstaller/WebsitePanel.WIXInstaller.csproj +++ b/WebsitePanel.Installer/Sources/WebsitePanel.WIXInstaller/WebsitePanel.WIXInstaller.csproj @@ -47,6 +47,7 @@ ..\..\Lib\Microsoft.Web.Administration.dll +