private ServerRole[] ParseRoles(SitecoreInformationContext info) { var value = info.Configuration .SelectSingleElement("/configuration/appSettings/add[@key='role:define']")?.GetAttribute("value"); var roles = new List <ServerRole>(); if (!string.IsNullOrEmpty(value)) { foreach (var text in value.Split(",;|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) { var name = text.Trim(); ServerRole role; if (Enum.TryParse(name, out role)) { roles.Add(role); } else if (name.Equals("Standalone", StringComparison.OrdinalIgnoreCase)) { return(Enum.GetValues(typeof(ServerRole)).Cast <ServerRole>().ToArray()); } else { Logger?.Invoke($"Couldn't parse role: {name}"); } } return(roles.ToArray()); } throw new InvalidOperationException("The roles are not specified in the role:define attribute in the web.config file"); }
public void GetSettingTest() { var context = new SitecoreInformationContext { Configuration = new XmlDocument().TryParse(@" <configuration> <sitecore> <settings> <setting name=""abc"" value=""old1"" /> <setting name=""abc"">new1</setting> </settings> </sitecore> </configuration>") }; context.GetSetting("abc") .Should() .Be("new1"); }
public IEnumerable <IResource> DoGetResources() { var rootPath = GetRootPath(); var instanceName = FileName; Logger?.Invoke("Parsing log files..."); var logFolder = Path.GetDirectoryName(Directory.GetFiles(TempFolderPath, "log*.txt", SearchOption.AllDirectories).OrderBy(x => x.Length).FirstOrDefault()); var logging = LoggingContext.ParseFolder(logFolder); if (logging != null) { yield return(logging); if (instanceName == FileName) { var files = Directory.GetFiles(logFolder, "log.*.txt", SearchOption.AllDirectories).OrderByDescending(x => x); // start with last files first foreach (var file in files) { // in first 100 lines Sitecore must write "Sitecore started", otherwise we can skip this file var lines = File.ReadLines(file).Take(100); if (!lines.Any(x => x.Contains("Sitecore started"))) { continue; } lines = File.ReadLines(file).Take(2000); // in first 2K rows there must be: // - assemblies e.g. C:\path\to\file.dll (AssemblyProduct, AssemblyDescription, AssemblyInformationalVersion) // - Operating system Microsoft Windows NT 6.3.9600.0 // - UTC offset: -04:00:00 // - Machine name: WS-ANP // - App pool ID: sc82pool // - Process ID: 9844 // - Windows identity used by the process: DK\ANP. Impersonation: False // - Managed pipeline mode: Integrated // - EventQueues enabled: True // - Instance Name:WS-ANP-sc82 // - Databases // - core // - master // - web // - filesystem // - Heartbeat - Initializing // - Heartbeat - Interval set to: 00:00:02 // - Heartbeat - Worker thread started // - Trying to load XML configuration /App_Config/Security/Domains.config // - sitecore // - extranet // - ds // - default // - xDB is disabled. // - Tracking is disabled. // - Missing valid xDB license. var token = "Instance Name:"; instanceName = lines.FirstOrDefault(line => line.Contains(token)); instanceName = instanceName.Substring(instanceName.IndexOf(token) + token.Length).Trim(); // stop parsing files break; } } } if (instanceName == FileName) { // if log files does not contain instance name - use package metadata var instanceInfoPath = Directory.GetFiles(TempFolderPath, "InstanceInfo.xml", SearchOption.AllDirectories).FirstOrDefault(); if (instanceInfoPath == null || !File.Exists(instanceInfoPath)) { instanceInfoPath = Directory.GetFiles(TempFolderPath, "PackageInfo.xml", SearchOption.AllDirectories).FirstOrDefault(); } if (instanceInfoPath != null && File.Exists(instanceInfoPath)) { var xml = new XmlDocument(); xml.Load(instanceInfoPath); var name = xml.SelectSingleElement("package/selectedInstance")?.InnerText; if (!string.IsNullOrEmpty(name)) { instanceName = name; var machineName = xml.SelectSingleElement("package/machineName")?.InnerText; if (!string.IsNullOrWhiteSpace(machineName)) { instanceName = machineName + "-" + instanceName; } } } } Logger?.Invoke("Parsing Sitecore information..."); var info = SitecoreInformationContext.TryParse(Source.FileSystem.ParseDirectory(TempFolderPath), instanceName, client); Assert.IsNotNull(info, nameof(info)); yield return(info); yield return(new ServerRolesContext(Roles ?? ParseRoles(info))); Logger?.Invoke("Parsing database data..."); var databases = SitecorePackageDatabaseContext.TryParse(rootPath, info); if (databases != null) { yield return(databases); } var webServer = SupportPackageWebServerContext.Parse(rootPath); if (webServer != null) { yield return(webServer); } }
public static SitecorePackageDatabaseContext TryParse(string root, SitecoreInformationContext info) { Assert.ArgumentNotNull(root, nameof(root)); Assert.ArgumentNotNull(info, nameof(info)); var connectionStringsNode = info.Configuration.SelectElements("/configuration/connectionStrings").SingleOrDefault(); if (connectionStringsNode == null) { Log.Error("no connection strings node"); return(null); } var connectionStringsList = connectionStringsNode.GetElementsByTagName("add"); if (connectionStringsList.Count <= 0) { Log.Error("no connection strings"); return(null); } var sqlConnectionStrings = new Dictionary <string, string>(); var mongoConnectionStrings = new Dictionary <string, string>(); foreach (var connectionStringElement in connectionStringsList.OfType <XmlElement>()) { var connectionString = connectionStringElement.GetAttribute("connectionString"); var name = connectionStringElement.GetAttribute("name"); Log.Info($"Parsing connection string: {name}, value: {connectionString}"); if (string.IsNullOrWhiteSpace(name)) { continue; } if (connectionString.StartsWith("mongodb", StringComparison.InvariantCultureIgnoreCase)) { mongoConnectionStrings.Add(name, connectionString); } else { try { new SqlConnectionStringBuilder(connectionString); } catch (Exception ex) { if (ex is FormatException || ex is ArgumentException) { Log.Info(ex, $"Unknown format of connection string: {connectionString}"); } else { Log.Error(ex, $"Unknown issue occurred during parsing connection string: {connectionString}"); } continue; } sqlConnectionStrings.Add(name, connectionString); } } var connectionStrings = new Dictionary <string, string>(); foreach (var connectionStringElement in connectionStringsList.OfType <XmlElement>()) { var name = connectionStringElement.GetAttribute("name"); var connectionString = connectionStringElement.GetAttribute("connectionString"); connectionStrings.Add(name.ToLower(), connectionString); } return(new SitecorePackageDatabaseContext(SupportPackageSqlDatabaseContext.Parse(sqlConnectionStrings, root), MongoDatabaseContext.Parse(mongoConnectionStrings), connectionStrings)); }