Exemple #1
0
        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");
        }
Exemple #2
0
        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");
        }
Exemple #3
0
        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));
        }