public static void AttachDatabase(string name, string databasesFolderPath, ConnectionString connectionString, SqlConnectionStringBuilder defaultConnectionString, IPipelineController controller)
    {
      SetConnectionStringNode(name, defaultConnectionString, connectionString);

      string databaseName = connectionString.GenerateDatabaseName(name);

      string databasePath =
        DatabaseFilenameHook(Path.Combine(databasesFolderPath, connectionString.DefaultFileName), 
          connectionString.Name.Replace("yafnet", "forum"), databasesFolderPath);

      if (!IsRemoteSqlServer())
      {
        if (!FileSystem.FileSystem.Local.File.Exists(databasePath))
        {
          var file = Path.GetFileName(databasePath);
          if (file.EqualsIgnoreCase("sitecore.reporting.mdf"))
          {
            databasePath = Path.Combine(Path.GetDirectoryName(databasePath), "Sitecore.Analytics.mdf");
          }
        }

        FileSystem.FileSystem.Local.File.AssertExists(databasePath, databasePath + " file doesn't exist");
      }

      if (SqlServerManager.Instance.DatabaseExists(databaseName, defaultConnectionString))
      {
        databaseName = ResolveConflict(defaultConnectionString, connectionString, databasePath, databaseName, controller);
      }

      if (databaseName != null)
      {
        SqlServerManager.Instance.AttachDatabase(databaseName, databasePath, defaultConnectionString);
      }
    }
        public static void AttachDatabase(ConnectionString connectionString, SqlConnectionStringBuilder defaultConnectionString, string name, string databasesFolderPath, string instanceName, IPipelineController controller)
        {
            if (connectionString.IsMongoConnectionString)
              {
            connectionString.Value = AttachDatabasesHelper.GetMongoConnectionString(connectionString.Name, instanceName);
            connectionString.SaveChanges();
            return;
              }

              if (connectionString.IsSqlConnectionString)
              {
            try
            {
              AttachDatabasesHelper.AttachDatabase(name, databasesFolderPath, connectionString, defaultConnectionString, controller);
            }
            catch (Exception ex)
            {
              if (connectionString.Name == "reporting.secondary")
              {
            throw;
              }

              Log.Warn(ex, "Attaching reporting.secondary database failed. Skipping...");
            }
              }
        }
        public static void Process(IEnumerable<Database> innerDatabases, string rootPath, SqlConnectionStringBuilder connectionString, string instanceName, IPipelineController controller, List<string> done)
        {
            string localDataSource = SqlServerManager.Instance.NormalizeServerName(connectionString.DataSource);

              foreach (Database database in innerDatabases)
              {
            var cstr = database.ConnectionString.ToString();
            if (!SqlServerManager.Instance.IsSqlConnectionString(cstr))
            {
              continue;
            }

            // if the database is attached to remote SQL Server
            string dataSource = SqlServerManager.Instance.NormalizeServerName(database.ConnectionString.DataSource);
            if (!dataSource.EqualsIgnoreCase(localDataSource))
            {
              // user doesn't confirm deleting
              if (controller == null || !controller.Confirm("The '{0}' database seems to be located on the '{1}' remote SQL server instead of the '{2}' local one specified in the Settings dialog. \n\nShould it be deleted as well?".FormatWith(database.RealName, dataSource, localDataSource)))
              {
            continue;
              }
            }

            string fileName = database.FileName;
            if (!string.IsNullOrEmpty(fileName))
            {
              // database is located out of the rootPath folder
              if (!fileName.ToLower().Contains(rootPath))
              {
            // user doesn't confirm deleting
            if (controller == null || !controller.Confirm("The '{0}' database with '{1}' file path is located out of the {2} instance's root path '{3}'. \n\nShould it be deleted as well?".FormatWith(database.RealName, fileName, instanceName, rootPath)))
            {
              continue;
            }
              }
            }

            if (SqlServerManager.Instance.DatabaseExists(database.RealName, connectionString))
            {
              database.Delete();
            }
              }

              SqlServerManager.Instance.DetectDatabases(rootPath, connectionString, name =>
              {
            if (!done.Contains(name))
            {
              SqlServerManager.Instance.DeleteDatabase(name,
            connectionString);
              done.Add(name);
            }
              });
        }
        public Pipeline([NotNull] PipelineDefinition pipelineDefinition, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller = null, bool isAsync = true)
        {
            Assert.ArgumentNotNull(pipelineDefinition, "pipelineDefinition");
              Assert.ArgumentNotNull(args, "args");

              this.controller = controller;
              this.pipelineDefinition = pipelineDefinition;
              this.title = pipelineDefinition.Title;
              this.steps = Step.CreateSteps(this.pipelineDefinition.Steps, args, controller);
              this.isAsync = isAsync;

              // Storing args for restarting pipeline
              this.processorArgs = args;
        }
        private static void ProcessActions(Instance instance, SqlConnectionStringBuilder connectionString, 
      IPipelineController controller, Product module, Dictionary<string, string> variables, 
      XmlElement actionsElement)
        {
            // made replacement
              actionsElement.InnerXml = variables.Aggregate(actionsElement.InnerXml,
            (result, variable) => result.Replace(variable.Key, variable.Value)).Replace("{InstanceName}", instance.Name);

              var actions = actionsElement.ChildNodes.OfType<XmlElement>();
              var webRootPath = instance.WebRootPath;
              List<string> ignoreCommands = new List<string>();
              foreach (XmlElement action in actions.Where(a => a.Name.EqualsIgnoreCase("patch")))
              {
            var commandText = action.GetAttribute("command").EmptyToNull().IsNotNull("The command attribute of <patch /> element must exist and must not be empty");
            var actionText = action.GetAttribute("action");
            if (actionText == "delete")
            {
              ignoreCommands.Add(commandText);
            }
              }

              // give extract more priority
              if (actions.Any(xml => xml.Name.EqualsIgnoreCase("extract")) && !ignoreCommands.Contains("extract"))
              {
            FileSystem.FileSystem.Local.Zip.UnpackZip(module.PackagePath, instance.WebRootPath);
              }

              foreach (XmlElement action in actions)
              {
            var children = action.ChildNodes.OfType<XmlElement>();
            string actionName = action.Name;
            if (ignoreCommands.Contains(actionName))
            {
              continue;
            }

            switch (actionName)
            {
              case "extract":
              {
            // give extract more priority
            // FileSystem.Instance.UnpackZip(module.PackagePath, instance.GetRootPath(webRootPath));
            break;
              }

              case "config":
              {
            string configPath = action.GetAttribute("path");
            try
            {
              XmlDocumentEx config = !string.IsNullOrEmpty(configPath)
                ? XmlDocumentEx.LoadFile(Path.Combine(webRootPath, configPath))
                : instance.GetWebConfig(webRootPath);
              PerformConfigChanges(instance, children, module, config, variables);
            }
            catch (XmlDocumentEx.FileIsMissingException ex)
            {
              Log.Warn(
                "The path attribute is specified (path: {0}) but the file doesn't exist".FormatWith(configPath),
                typeof(ConfigurationActions), ex);
            }

            break;
              }

              case "databases":
              {
            AddDatabase(instance, children, module, connectionString, controller);
            break;
              }

              case "editfile":
              {
            EditFile(action.GetAttribute("path"), children, instance, variables);
            break;
              }

              case "setRestrictingPlaceholders":
              {
            InstanceHelper.StartInstance(instance);
            SetRestrictingPlaceholders(action.GetAttribute("names"), GetWebServiceUrl(instance));
            break;
              }

              case "custom":
              {
            var typeName = action.GetAttribute("type").EmptyToNull().IsNotNull("The type attribute is missing in the <custom> install action");
            var obj = (IPackageInstallActions)ReflectionUtil.CreateObject(typeName);
            obj.Execute(instance, module);
            break;
              }

              case "sql":
              {
            var db = action.GetAttribute("database");
            var file = action.GetAttribute("file").Replace("$(data)", instance.DataFolderPath).Replace("$(website)", instance.WebRootPath);
            if (!string.IsNullOrEmpty(file))
            {
              Assert.IsTrue(File.Exists(file), string.Format("The {0} file does not exist", file));
            }

            var sql = string.IsNullOrEmpty(file) ? action.InnerText : FileSystem.FileSystem.Local.File.ReadAllText(file);
            Assert.IsNotNullOrEmpty(sql.Trim(), "The SQL command is empty");

            var cstr = instance.Configuration.ConnectionStrings.FirstOrDefault(x => x.Name == db);
            Assert.IsNotNull(cstr, "The {0} connection string is not found".FormatWith(db));
            using (var conn = SqlServerManager.Instance.OpenConnection(new SqlConnectionStringBuilder(cstr.Value), false))
            {
              foreach (var command in sql.Split("GO"))
              {
                SqlServerManager.Instance.Execute(conn, command);
              }
            }

            break;
              }
            }
              }
        }
        private static void FillVariables(IEnumerable<XmlElement> sections, Dictionary<string, string> variables, Instance instance, IPipelineController controller)
        {
            var @params = sections.SingleOrDefault(s => s.Name.EqualsIgnoreCase("params"));
              if (@params != null)
              {
            var children = @params.ChildNodes.OfType<XmlElement>();
            foreach (XmlElement param in children)
            {
              string variableName = param.GetAttribute("name");
              if (variables.ContainsKey(variableName))
              {
            continue;
              }

              string variableTitle = param.GetAttribute("title");
              string defaultVariableValue = param.GetAttribute("defaultValue");
              string mode = param.GetAttribute("mode");
              var options = param.GetAttribute("options");
              var typeName = param.GetAttribute("getOptionsType");
              var methodName = param.GetAttribute("getOptionsMethod");
              var multiselect = mode.EqualsIgnoreCase("multiselect");
              string variableValue = controller != null
            ? (multiselect || mode.Equals("select")
              ? controller.Select(variableTitle, !string.IsNullOrEmpty(options)
                ? options.Split('|')
                : GetOptions(typeName, methodName, instance), multiselect, defaultVariableValue)
              : controller.Ask(variableTitle, defaultVariableValue))
            : defaultVariableValue;
              variables.Add(variableName, variableValue);
            }
              }
        }
예제 #7
0
        private static IEnumerable <Step> CreateStepsPrivate([NotNull] IEnumerable <StepDefinition> steps, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller = null)
        {
            Assert.ArgumentNotNull(steps, nameof(steps));
            Assert.ArgumentNotNull(args, nameof(args));

            foreach (StepDefinition stepDefinition in steps)
            {
                var  argsName = stepDefinition.ArgsName.EmptyToNull();
                Step step     = new Step(ProcessorManager.CreateProcessors(stepDefinition.ProcessorDefinitions, args, controller), argsName);
                Assert.IsNotNull(step, "Can't instantiate step");
                yield return(step);
            }
        }
예제 #8
0
        private static Pipeline CreatePipeline([NotNull] string pipelineName, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller = null, bool isAsync = true)
        {
            Assert.ArgumentNotNull(pipelineName, nameof(pipelineName));
            Assert.ArgumentNotNull(args, nameof(args));

            using (new ProfileSection("Create pipeline"))
            {
                ProfileSection.Argument("pipelineName", pipelineName);
                ProfileSection.Argument("args", args);
                ProfileSection.Argument("controller", controller);
                ProfileSection.Argument("isAsync", isAsync);

                Assert.IsTrue(Definitions.ContainsKey(pipelineName), "The {0} pipeline defintion does not exist".FormatWith(pipelineName));
                PipelineDefinition definition = Definitions[pipelineName];

                Pipeline pipeline = new Pipeline(definition, args, controller, isAsync);
                if (controller != null)
                {
                    controller.Pipeline = pipeline;
                }

                return(ProfileSection.Result(pipeline));
            }
        }
예제 #9
0
        private static IEnumerable <Processor> CreateProcessorsPrivate([NotNull] IEnumerable <ProcessorDefinition> processorDefinitions, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller)
        {
            Assert.ArgumentNotNull(processorDefinitions, "processorDefinitions");
            Assert.ArgumentNotNull(args, "args");

            foreach (ProcessorDefinition processorDefinition in processorDefinitions)
            {
                foreach (Processor processor in processorDefinition.CreateProcessors(args))
                {
                    processor.ProcessorDefinition = processorDefinition;
                    bool isRequireProcessing = true;
                    try
                    {
                        isRequireProcessing = processor.IsRequireProcessing(args);
                    }
                    catch (Exception ex)
                    {
                        Log.Warn("Cannot detect if the processor {0} requires processing".FormatWith(processor.ProcessorDefinition.Type), typeof(ProcessorManager), ex);
                    }

                    if (isRequireProcessing)
                    {
                        List <Processor> nested = CreateProcessors(processorDefinition.NestedProcessorDefinitions, args, controller);
                        processor.NestedProcessors.AddRange(nested);
                        processor.Controller = controller;
                        yield return(processor);
                    }
                }
            }
        }
        private static void FillVariables(IEnumerable <XmlElement> sections, Dictionary <string, string> variables, Instance instance, IPipelineController controller)
        {
            var @params = sections.SingleOrDefault(s => s.Name.EqualsIgnoreCase("params"));

            if (@params != null)
            {
                var children = @params.ChildNodes.OfType <XmlElement>();
                foreach (XmlElement param in children)
                {
                    string variableName = param.GetAttribute("name");
                    if (variables.ContainsKey(variableName))
                    {
                        continue;
                    }

                    string variableTitle        = param.GetAttribute("title");
                    string defaultVariableValue = param.GetAttribute("defaultValue");
                    string mode          = param.GetAttribute("mode");
                    var    options       = param.GetAttribute("options");
                    var    typeName      = param.GetAttribute("getOptionsType");
                    var    methodName    = param.GetAttribute("getOptionsMethod");
                    var    multiselect   = mode.EqualsIgnoreCase("multiselect");
                    string variableValue = controller != null
            ? (multiselect || mode.Equals("select")
              ? controller.Select(variableTitle, !string.IsNullOrEmpty(options)
                ? options.Split('|')
                : GetOptions(typeName, methodName, instance), multiselect, defaultVariableValue)
              : controller.Ask(variableTitle, defaultVariableValue))
            : defaultVariableValue;
                    variables.Add(variableName, variableValue);
                }
            }
        }
예제 #11
0
        public static void AttachDatabase(ConnectionString connectionString, SqlConnectionStringBuilder defaultConnectionString, string name, string databasesFolderPath, string instanceName, IPipelineController controller)
        {
            if (connectionString.IsMongoConnectionString)
            {
                connectionString.Value = AttachDatabasesHelper.GetMongoConnectionString(connectionString.Name, instanceName);
                connectionString.SaveChanges();
                return;
            }

            if (connectionString.IsSqlConnectionString)
            {
                try
                {
                    AttachDatabasesHelper.AttachDatabase(name, databasesFolderPath, connectionString, defaultConnectionString, controller);
                }
                catch (Exception ex)
                {
                    if (connectionString.Name == "reporting.secondary")
                    {
                        throw;
                    }

                    Log.Warn(ex, "Attaching reporting.secondary database failed. Skipping...");
                }
            }
        }
        private static void AddDatabase([NotNull] Instance instance, [NotNull] IEnumerable <XmlElement> databases, [NotNull] Product module, SqlConnectionStringBuilder connectionString, IPipelineController controller)
        {
            Assert.ArgumentNotNull(instance, "instance");
            Assert.ArgumentNotNull(databases, "databases");
            Assert.ArgumentNotNull(module, "module");
            Assert.ArgumentNotNull(connectionString, "connectionString");
            foreach (XmlElement database in databases)
            {
                string name              = database.GetAttribute("name");
                string role              = database.GetAttribute("role").EmptyToNull() ?? name;
                string fileName          = database.GetAttribute("fileName");
                string sourceFileName    = database.GetAttribute("sourceFileName");
                string databasesFolder   = GetDatabasesFolder(instance, connectionString, controller);
                var    locationInPackage = database.GetAttribute("location");
                Assert.IsNotNull(databasesFolder, "databasesFolder");
                FileSystem.FileSystem.Local.Directory.AssertExists(databasesFolder);

                bool   skipAttach   = false;
                string realDBname   = SqlServerManager.Instance.GenerateDatabaseRealName(instance.Name, role);
                string physicalPath = Path.Combine(databasesFolder, fileName);

                var newDatabaseConnectionString = new SqlConnectionStringBuilder(connectionString.ToString());
                newDatabaseConnectionString.InitialCatalog = realDBname;
                if (SqlServerManager.Instance.DatabaseExists(realDBname, newDatabaseConnectionString))
                {
                    string       databasePath      = SqlServerManager.Instance.GetDatabaseFileName(realDBname, newDatabaseConnectionString);
                    const string theDatabaseExists = "The database with the same name ('{0}') already exists in the current instance of SQL Server ('{1}')";
                    if (string.IsNullOrEmpty(databasePath))
                    {
                        string message = string.Format(theDatabaseExists + ", but doesn't point to any file(s) and looks like corrupted.", realDBname, newDatabaseConnectionString.DataSource);
                        if (!controller.Confirm(message + "  Would you like to delete it? If not then this installation will be interrupted."))
                        {
                            throw new InvalidOperationException(message);
                        }

                        SqlServerManager.Instance.DeleteDatabase(realDBname, newDatabaseConnectionString);
                    }
                    else if (!databasePath.EqualsIgnoreCase(physicalPath))
                    {
                        throw new InvalidOperationException(string.Format(theDatabaseExists + ", but points to files by another location ('{2}') than was expected ('{3}')", realDBname, newDatabaseConnectionString.DataSource, databasePath, physicalPath));
                    }

                    skipAttach = true;
                }

                if (!skipAttach)
                {
                    ExtractDatabase(module, fileName, sourceFileName, databasesFolder, locationInPackage);
                    SqlServerManager.Instance.AttachDatabase(realDBname, physicalPath, newDatabaseConnectionString);
                }

                instance.Configuration.ConnectionStrings.Add(name, newDatabaseConnectionString);
            }
        }
        public static void ExecuteActions([NotNull] Instance instance, [NotNull] Product[] modules, [CanBeNull] List <Product> done, [NotNull] string param, [CanBeNull] SqlConnectionStringBuilder connectionString,
                                          [CanBeNull] IPipelineController controller = null, [CanBeNull] Dictionary <string, string> variables = null)
        {
            Assert.ArgumentNotNull(instance, "instance");
            Assert.ArgumentNotNull(modules, "modules");
            Assert.ArgumentNotNull(param, "param");

            variables = variables ?? new Dictionary <string, string>();
            foreach (Product module in modules)
            {
                if (done != null && done.Contains(module))
                {
                    continue;
                }

                XmlDocument manifest = module.Manifest;

                if (manifest == null)
                {
                    Log.Warn("The {0} doesn't have a manifest".FormatWith(module), typeof(ConfigurationActions));
                    if (done != null)
                    {
                        done.Add(module);
                    }

                    continue;
                }

                Product instanceProduct = instance.Product;
                if (!module.IsMatchRequirements(instanceProduct))
                {
                    Log.Warn("The {0} doesn't suites for {1}".FormatWith(module, instanceProduct), typeof(ConfigurationActions));
                    if (done != null)
                    {
                        done.Add(module);
                    }

                    continue;
                }

                // Get the rules xpath
                string[] paramArgs = param.Split('|');
                string   xpath     =
                    paramArgs.Length == 2
            ? Product.ManifestPrefix + paramArgs[0] + "/install/" + paramArgs[1] // is package
            : Product.ManifestPrefix + param + "/install";                       // is archive

                XmlElement element = manifest.SelectSingleNode(xpath) as XmlElement;
                if (element == null)
                {
                    Log.Warn("Can't find rules root (the {0} element in the manifest of the {3} file){1}The manifest is: {1}{2}".FormatWith(xpath, Environment.NewLine, manifest.OuterXml, module.PackagePath), typeof(ConfigurationActions));
                    if (done != null)
                    {
                        done.Add(module);
                    }

                    continue;
                }

                var sections = element.ChildNodes.OfType <XmlElement>().NotNull();
                FillVariables(sections, variables, instance, controller);
                var actions = sections.SingleOrDefault(s => s.Name.EqualsIgnoreCase("actions"));
                ProcessActions(instance, connectionString, controller, module, variables, actions);

                if (done != null)
                {
                    done.Add(module);
                }
            }
        }
        public static void AttachDatabase(string name, string sqlPrefix, bool attachSql, string databasesFolderPath, Adapters.WebServer.ConnectionString connectionString, SqlConnectionStringBuilder defaultConnectionString, IPipelineController controller)
        {
            SetConnectionStringNode(name, sqlPrefix, defaultConnectionString, connectionString);

            if (!attachSql)
            {
                return;
            }

            var databaseName = connectionString.GenerateDatabaseName(name, sqlPrefix);

            var databasePath = GetDatabasePath(databasesFolderPath, connectionString, databaseName, ".mdf");

            if (!File.Exists(databasePath))
            {
                databasePath = GetDatabasePath(databasesFolderPath, connectionString, databaseName, ".dacpac");
                if (!File.Exists(databasePath))
                {
                    Log.Warn($"File cannot be found: {databasePath} (.dacpac or .mdf)");
                    return;
                }
            }

            if (SqlServerManager.Instance.DatabaseExists(databaseName, defaultConnectionString))
            {
                databaseName = ResolveConflict(defaultConnectionString, connectionString, databasePath, databaseName, controller);
            }

            if (databaseName != null)
            {
                var extension = Path.GetExtension(databasePath);
                if (extension == ".dacpac")
                {
                    new SqlAdapter(new SqlConnectionString(defaultConnectionString.ToString())).DeployDatabase(databaseName, new RealFileSystem().ParseFile(databasePath));
                    var tmpPath = SqlServerManager.Instance.GetDatabaseFileName(databaseName, defaultConnectionString);
                    SqlServerManager.Instance.DetachDatabase(databaseName, defaultConnectionString);

                    extension    = ".mdf";
                    databasePath = Path.Combine(Path.GetDirectoryName(databasePath), Settings.CoreInstallRenameSqlFiles.Value ? databaseName + extension : Path.GetFileNameWithoutExtension(databasePath) + extension);

                    File.Move(tmpPath, databasePath);
                }

                SqlServerManager.Instance.AttachDatabase(databaseName, databasePath, defaultConnectionString);
            }
        }
        public static void AttachDatabase(string name, string sqlPrefix, bool attachSql, string databasesFolderPath, ConnectionString connectionString, SqlConnectionStringBuilder defaultConnectionString, IPipelineController controller)
        {
            SetConnectionStringNode(name, sqlPrefix, defaultConnectionString, connectionString);

            if (!attachSql)
            {
                return;
            }

            var databaseName = connectionString.GenerateDatabaseName(name, sqlPrefix);

            var databasePath =
                DatabaseFilenameHook(Path.Combine(databasesFolderPath, connectionString.DefaultFileName),
                                     connectionString.Name.Replace("yafnet", "forum"), databasesFolderPath);

            if (!FileSystem.Local.File.Exists(databasePath))
            {
                var file = Path.GetFileName(databasePath);
                if (connectionString.Name.EqualsIgnoreCase("reporting"))
                {
                    databasePath = Path.Combine(Path.GetDirectoryName(databasePath), "Sitecore.Analytics.mdf");
                }
                else if (connectionString.Name.EqualsIgnoreCase("exm.dispatch"))
                {
                    databasePath = Path.Combine(Path.GetDirectoryName(databasePath), "Sitecore.Exm.mdf");
                }
                else if (connectionString.Name.EqualsIgnoreCase("session"))
                {
                    databasePath = Path.Combine(Path.GetDirectoryName(databasePath), "Sitecore.Sessions.mdf");
                }
            }

            FileSystem.Local.File.AssertExists(databasePath, databasePath + " file doesn't exist");

            if (Settings.CoreInstallRenameSqlFiles.Value)
            {
                // Make the database data file also matching databaseName
                var newPath = databasePath.Replace(connectionString.DefaultFileName, string.Concat(databaseName, ".mdf"));
                try
                {
                    File.Move(databasePath, newPath);
                }
                catch
                {
                }

                // Assert again
                databasePath = newPath;
                FileSystem.Local.File.AssertExists(databasePath, databasePath + " file doesn't exist");
            }

            if (SqlServerManager.Instance.DatabaseExists(databaseName, defaultConnectionString))
            {
                databaseName = ResolveConflict(defaultConnectionString, connectionString, databasePath, databaseName, controller);
            }

            if (databaseName != null)
            {
                SqlServerManager.Instance.AttachDatabase(databaseName, databasePath, defaultConnectionString);
            }
        }
예제 #16
0
        public Pipeline([NotNull] PipelineDefinition pipelineDefinition, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller = null, bool isAsync = true)
        {
            Assert.ArgumentNotNull(pipelineDefinition, "pipelineDefinition");
            Assert.ArgumentNotNull(args, "args");

            this.controller         = controller;
            this.pipelineDefinition = pipelineDefinition;
            this.title   = pipelineDefinition.Title;
            this.steps   = Step.CreateSteps(this.pipelineDefinition.Steps, args, controller);
            this.isAsync = isAsync;

            // Storing args for restarting pipeline
            this.processorArgs = args;
        }
예제 #17
0
            public PipelineStartInfo([NotNull] ProcessorArgs processorArgs, [NotNull] List <Step> steps, [CanBeNull] IPipelineController pipelineController = null)
            {
                Assert.ArgumentNotNull(processorArgs, "processorArgs");
                Assert.ArgumentNotNull(steps, "steps");

                this.ProcessorArgs      = processorArgs;
                this.PipelineController = pipelineController;
                this.Steps = steps;
            }
        private static string GetDatabasesFolder(Instance instance, SqlConnectionStringBuilder connectionString, IPipelineController controller)
        {
            string   databasesFolder;
            Database mainDatabase = GetMainDatabase(instance, connectionString);

            if (mainDatabase == null)
            {
                while (true)
                {
                    databasesFolder = controller.Ask(
                        "Can't find any local database of the " + instance +
                        " instance to detect the Databases folder. Please specify it manually:",
                        instance.RootPath.TrimEnd('\\') + "\\Databases");
                    if (string.IsNullOrEmpty(databasesFolder))
                    {
                        if (controller.Confirm("You didn't input anything - would you like to terminate this installation?"))
                        {
                            throw new Exception("Aborted.");
                        }

                        continue;
                    }

                    if (!FileSystem.FileSystem.Local.Directory.Exists(databasesFolder))
                    {
                        if (controller.Confirm("The " + databasesFolder + " doesn't exist. Would you like to create the folder?"))
                        {
                            FileSystem.FileSystem.Local.Directory.CreateDirectory(databasesFolder);
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            else
            {
                databasesFolder = Path.GetDirectoryName(mainDatabase.FileName).EmptyToNull();
            }

            return(databasesFolder);
        }
        public static void AttachDatabase(Adapters.WebServer.ConnectionString connectionString, SqlConnectionStringBuilder defaultConnectionString, string name, string sqlPrefix, bool attachSql, string databasesFolderPath, string instanceName, IPipelineController controller)
        {
            if (connectionString.IsMongoConnectionString)
            {
                connectionString.Value = GetMongoConnectionString(connectionString.Name, sqlPrefix);
                connectionString.SaveChanges();
                return;
            }

            if (connectionString.IsSqlConnectionString)
            {
                AttachDatabase(name, sqlPrefix, attachSql, databasesFolderPath, connectionString, defaultConnectionString, controller);
            }
        }
        private static void ProcessActions(Instance instance, SqlConnectionStringBuilder connectionString,
                                           IPipelineController controller, Product module, Dictionary <string, string> variables,
                                           XmlElement actionsElement)
        {
            // made replacement
            actionsElement.InnerXml = variables.Aggregate(actionsElement.InnerXml,
                                                          (result, variable) => result.Replace(variable.Key, variable.Value)).Replace("{InstanceName}", instance.Name);

            var           actions        = actionsElement.ChildNodes.OfType <XmlElement>();
            var           webRootPath    = instance.WebRootPath;
            List <string> ignoreCommands = new List <string>();

            foreach (XmlElement action in actions.Where(a => a.Name.EqualsIgnoreCase("patch")))
            {
                var commandText = action.GetAttribute("command").EmptyToNull().IsNotNull("The command attribute of <patch /> element must exist and must not be empty");
                var actionText  = action.GetAttribute("action");
                if (actionText == "delete")
                {
                    ignoreCommands.Add(commandText);
                }
            }

            // give extract more priority
            if (actions.Any(xml => xml.Name.EqualsIgnoreCase("extract")) && !ignoreCommands.Contains("extract"))
            {
                FileSystem.FileSystem.Local.Zip.UnpackZip(module.PackagePath, instance.WebRootPath);
            }

            foreach (XmlElement action in actions)
            {
                var    children   = action.ChildNodes.OfType <XmlElement>();
                string actionName = action.Name;
                if (ignoreCommands.Contains(actionName))
                {
                    continue;
                }

                switch (actionName)
                {
                case "extract":
                {
                    // give extract more priority
                    // FileSystem.Instance.UnpackZip(module.PackagePath, instance.GetRootPath(webRootPath));
                    break;
                }

                case "config":
                {
                    string configPath = action.GetAttribute("path");
                    try
                    {
                        XmlDocumentEx config = !string.IsNullOrEmpty(configPath)
                ? XmlDocumentEx.LoadFile(Path.Combine(webRootPath, configPath))
                : instance.GetWebConfig(webRootPath);
                        PerformConfigChanges(instance, children, module, config, variables);
                    }
                    catch (XmlDocumentEx.FileIsMissingException ex)
                    {
                        Log.Warn(
                            "The path attribute is specified (path: {0}) but the file doesn't exist".FormatWith(configPath),
                            typeof(ConfigurationActions), ex);
                    }

                    break;
                }

                case "databases":
                {
                    AddDatabase(instance, children, module, connectionString, controller);
                    break;
                }

                case "editfile":
                {
                    EditFile(action.GetAttribute("path"), children, instance, variables);
                    break;
                }

                case "setRestrictingPlaceholders":
                {
                    InstanceHelper.StartInstance(instance);
                    SetRestrictingPlaceholders(action.GetAttribute("names"), GetWebServiceUrl(instance));
                    break;
                }

                case "custom":
                {
                    var typeName = action.GetAttribute("type").EmptyToNull().IsNotNull("The type attribute is missing in the <custom> install action");
                    var obj      = (IPackageInstallActions)ReflectionUtil.CreateObject(typeName);
                    obj.Execute(instance, module);
                    break;
                }

                case "sql":
                {
                    var db   = action.GetAttribute("database");
                    var file = action.GetAttribute("file").Replace("$(data)", instance.DataFolderPath).Replace("$(website)", instance.WebRootPath);
                    if (!string.IsNullOrEmpty(file))
                    {
                        Assert.IsTrue(File.Exists(file), string.Format("The {0} file does not exist", file));
                    }

                    var sql = string.IsNullOrEmpty(file) ? action.InnerText : FileSystem.FileSystem.Local.File.ReadAllText(file);
                    Assert.IsNotNullOrEmpty(sql.Trim(), "The SQL command is empty");

                    var cstr = instance.Configuration.ConnectionStrings.FirstOrDefault(x => x.Name == db);
                    Assert.IsNotNull(cstr, "The {0} connection string is not found".FormatWith(db));
                    using (var conn = SqlServerManager.Instance.OpenConnection(new SqlConnectionStringBuilder(cstr.Value), false))
                    {
                        foreach (var command in sql.Split("GO"))
                        {
                            SqlServerManager.Instance.Execute(conn, command);
                        }
                    }

                    break;
                }
                }
            }
        }
예제 #21
0
        public static void StartPipeline([NotNull] string pipelineName, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController pipelineController = null, bool isAsync = true)
        {
            Assert.ArgumentNotNull(pipelineName, nameof(pipelineName));
            Assert.ArgumentNotNull(args, nameof(args));

            Log.Info($"Pipeline '{pipelineName}' starts, isAsync: {isAsync.ToString(CultureInfo.InvariantCulture)}");
            using (new ProfileSection("Start pipeline"))
            {
                ProfileSection.Argument("pipelineName", pipelineName);
                ProfileSection.Argument("args", args);
                ProfileSection.Argument("pipelineController", pipelineController);
                ProfileSection.Argument("isAsync", isAsync);

                var pipeline = CreatePipeline(pipelineName, args, pipelineController, isAsync);
                pipeline.Start();
            }
        }
    private static IEnumerable<Processor> CreateProcessorsPrivate([NotNull] IEnumerable<ProcessorDefinition> processorDefinitions, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller)
    {
      Assert.ArgumentNotNull(processorDefinitions, nameof(processorDefinitions));
      Assert.ArgumentNotNull(args, nameof(args));

      foreach (ProcessorDefinition processorDefinition in processorDefinitions)
      {
        foreach (Processor processor in processorDefinition.CreateProcessors(args,controller))
        {
          if (processor.ProcessorDefinition == null)
          {
            processor.ProcessorDefinition = processorDefinition;
          }

          bool isRequireProcessing = true;
          try
          {
            isRequireProcessing = processor.IsRequireProcessing(args);
          }
          catch (Exception ex)
          {
            Log.Warn(ex, $"Cannot detect if the processor {processor.ProcessorDefinition.Type} requires processing");
          }

          if (isRequireProcessing)
          {
            List<Processor> nested = CreateProcessors(processorDefinition._NestedProcessorDefinitions, args, controller);
            processor._NestedProcessors.AddRange(nested);
            processor.Controller = controller;
            yield return processor;
          }
        }
      }
    }
예제 #23
0
        public static List <Processor> CreateProcessors([NotNull] IEnumerable <ProcessorDefinition> processorDefinitions, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller = null)
        {
            Assert.ArgumentNotNull(processorDefinitions, "processorDefinitions");
            Assert.ArgumentNotNull(args, "args");

            return(new List <Processor>(CreateProcessorsPrivate(processorDefinitions, args, controller)));
        }
            public PipelineStartInfo([NotNull] ProcessorArgs processorArgs, [NotNull] List <Step> steps, [CanBeNull] IPipelineController pipelineController = null)
            {
                Assert.ArgumentNotNull(processorArgs, nameof(processorArgs));
                Assert.ArgumentNotNull(steps, nameof(steps));

                ProcessorArgs      = processorArgs;
                PipelineController = pipelineController;
                _Steps             = steps;
            }
            public PipelineStartInfo([NotNull] ProcessorArgs processorArgs, [NotNull] List<Step> steps, [CanBeNull] IPipelineController pipelineController = null)
            {
                Assert.ArgumentNotNull(processorArgs, "processorArgs");
                Assert.ArgumentNotNull(steps, "steps");

                this.ProcessorArgs = processorArgs;
                this.PipelineController = pipelineController;
                this.Steps = steps;
            }
        public Pipeline([NotNull] PipelineDefinition pipelineDefinition, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller = null, bool isAsync = true)
        {
            Assert.ArgumentNotNull(pipelineDefinition, nameof(pipelineDefinition));
            Assert.ArgumentNotNull(args, nameof(args));

            Controller         = controller;
            PipelineDefinition = pipelineDefinition;
            Title   = pipelineDefinition.Title;
            _Steps  = Step.CreateSteps(PipelineDefinition.Steps, args, controller);
            IsAsync = isAsync;

            // Storing args for restarting pipeline
            ProcessorArgs = args;
        }
예제 #27
0
        public static List <Step> CreateSteps([NotNull] List <StepDefinition> stepDefinitions, [NotNull] ProcessorArgs args, [CanBeNull] IPipelineController controller = null)
        {
            Assert.ArgumentNotNull(stepDefinitions, nameof(stepDefinitions));
            Assert.ArgumentNotNull(args, nameof(args));

            return(new List <Step>(CreateStepsPrivate(stepDefinitions, args, controller)));
        }
        public static string ResolveConflict(SqlConnectionStringBuilder defaultConnectionString, ConnectionString connectionString, string databasePath, string databaseName, IPipelineController controller)
        {
            string existingDatabasePath = SqlServerManager.Instance.GetDatabaseFileName(databaseName, defaultConnectionString);

              if (string.IsNullOrEmpty(existingDatabasePath))
              {
            var m = "The database with the same '{0}' name is already exists in the SQL Server metabase but points to non-existing file. ".FormatWith(databaseName);
            if (controller.Confirm(m + "Would you like to delete it?"))
            {
              SqlServerManager.Instance.DeleteDatabase(databaseName, defaultConnectionString);
              return databaseName;
            }

            throw new Exception(m);
              }

              if (existingDatabasePath.EqualsIgnoreCase(databasePath))
              {
            return null;
              }

              // todo: replce this with shiny message box
              string delete = "Delete the '{0}' database".FormatWith(databaseName);
              const string AnotherName = "Use another database name";
              const string Cancel = "Terminate current action";
              string[] options = new[]
              {
            delete, AnotherName, Cancel
              };
              string m2 = "The database with '{0}' name already exists".FormatWith(databaseName);
              string result = controller.Select(m2, options);
              switch (result)
              {
            case Cancel:
              throw new Exception(m2);
            case AnotherName:
              databaseName = ResolveConflictByUnsedName(defaultConnectionString, connectionString, databaseName);
              break;
            default:
              SqlServerManager.Instance.DeleteDatabase(databaseName, defaultConnectionString);
              break;
              }

              return databaseName;
        }
        private static void AddDatabase([NotNull] Instance instance, [NotNull] IEnumerable<XmlElement> databases, [NotNull] Product module, SqlConnectionStringBuilder connectionString, IPipelineController controller)
        {
            Assert.ArgumentNotNull(instance, "instance");
              Assert.ArgumentNotNull(databases, "databases");
              Assert.ArgumentNotNull(module, "module");
              Assert.ArgumentNotNull(connectionString, "connectionString");
              foreach (XmlElement database in databases)
              {
            string name = database.GetAttribute("name");
            string role = database.GetAttribute("role").EmptyToNull() ?? name;
            string fileName = database.GetAttribute("fileName");
            string sourceFileName = database.GetAttribute("sourceFileName");
            string databasesFolder = GetDatabasesFolder(instance, connectionString, controller);
            var locationInPackage = database.GetAttribute("location");
            Assert.IsNotNull(databasesFolder, "databasesFolder");
            FileSystem.FileSystem.Local.Directory.AssertExists(databasesFolder);

            bool skipAttach = false;
            string realDBname = SqlServerManager.Instance.GenerateDatabaseRealName(instance.Name, role);
            string physicalPath = Path.Combine(databasesFolder, fileName);

            var newDatabaseConnectionString = new SqlConnectionStringBuilder(connectionString.ToString());
            newDatabaseConnectionString.InitialCatalog = realDBname;
            if (SqlServerManager.Instance.DatabaseExists(realDBname, newDatabaseConnectionString))
            {
              string databasePath = SqlServerManager.Instance.GetDatabaseFileName(realDBname, newDatabaseConnectionString);
              const string theDatabaseExists = "The database with the same name ('{0}') already exists in the current instance of SQL Server ('{1}')";
              if (string.IsNullOrEmpty(databasePath))
              {
            string message = string.Format(theDatabaseExists + ", but doesn't point to any file(s) and looks like corrupted.", realDBname, newDatabaseConnectionString.DataSource);
            if (!controller.Confirm(message + "  Would you like to delete it? If not then this installation will be interrupted."))
            {
              throw new InvalidOperationException(message);
            }

            SqlServerManager.Instance.DeleteDatabase(realDBname, newDatabaseConnectionString);
              }
              else if (!databasePath.EqualsIgnoreCase(physicalPath))
              {
            throw new InvalidOperationException(string.Format(theDatabaseExists + ", but points to files by another location ('{2}') than was expected ('{3}')", realDBname, newDatabaseConnectionString.DataSource, databasePath, physicalPath));
              }

              skipAttach = true;
            }

            if (!skipAttach)
            {
              if ("data".Equals(locationInPackage, StringComparison.InvariantCulture))
              {
            var sourceMdfFile = Path.Combine(instance.DataFolderPath, fileName);
            var sourceLdfFile = Path.ChangeExtension(sourceMdfFile, "ldf");

            if (!FileSystem.FileSystem.Local.File.Exists(sourceMdfFile) || !FileSystem.FileSystem.Local.File.Exists(sourceLdfFile))
            {
              throw new InvalidOperationException("mdf or ldf database files not found in Data folder");
            }

            var targetLdfFile = Path.ChangeExtension(physicalPath, "ldf");

            FileSystem.FileSystem.Local.File.Move(sourceMdfFile, physicalPath);
            FileSystem.FileSystem.Local.File.Move(sourceLdfFile, targetLdfFile);
              }
              else
              {
            ExtractDatabase(module, fileName, sourceFileName, databasesFolder, locationInPackage);
              }

              SqlServerManager.Instance.AttachDatabase(realDBname, physicalPath, newDatabaseConnectionString);
            }

            instance.Configuration.ConnectionStrings.Add(name, newDatabaseConnectionString);
              }
        }
        public static void Process(IEnumerable <Database> innerDatabases, string rootPath, SqlConnectionStringBuilder connectionString, string instanceName, IPipelineController controller, List <string> done)
        {
            var localDataSource = SqlServerManager.Instance.NormalizeServerName(connectionString.DataSource);

            foreach (Database database in innerDatabases)
            {
                var cstr = database.ConnectionString.ToString();
                if (!SqlServerManager.Instance.IsSqlConnectionString(cstr))
                {
                    continue;
                }

                // if the database is attached to remote SQL Server
                var dataSource = SqlServerManager.Instance.NormalizeServerName(database.ConnectionString.DataSource);
                if (!dataSource.EqualsIgnoreCase(localDataSource))
                {
                    // user doesn't confirm deleting
                    if (controller == null || !controller.Confirm("The '{0}' database seems to be located on the '{1}' remote SQL server instead of the '{2}' local one specified in the Settings dialog. \n\nShould it be deleted as well?".FormatWith(database.RealName, dataSource, localDataSource)))
                    {
                        continue;
                    }
                }

                var fileName = database.FileName;
                if (!string.IsNullOrEmpty(fileName))
                {
                    // database is located out of the rootPath folder
                    if (!fileName.ToLower().Contains(rootPath))
                    {
                        // user doesn't confirm deleting
                        if (controller == null || !controller.Confirm("The '{0}' database with '{1}' file path is located out of the {2} instance's root path '{3}'. \n\nShould it be deleted as well?".FormatWith(database.RealName, fileName, instanceName, rootPath)))
                        {
                            continue;
                        }
                    }
                }

                if (SqlServerManager.Instance.DatabaseExists(database.RealName, connectionString))
                {
                    database.Delete();
                }
            }

            SqlServerManager.Instance.DetectDatabases(rootPath, connectionString, name =>
            {
                if (!done.Contains(name))
                {
                    SqlServerManager.Instance.DeleteDatabase(name,
                                                             connectionString);
                    done.Add(name);
                }
            });
        }
        private static string GetDatabasesFolder(Instance instance, SqlConnectionStringBuilder connectionString, IPipelineController controller)
        {
            string databasesFolder;
              Database mainDatabase = GetMainDatabase(instance, connectionString);

              if (mainDatabase == null)
              {
            while (true)
            {
              databasesFolder = controller.Ask(
            "Can't find any local database of the " + instance +
            " instance to detect the Databases folder. Please specify it manually:",
            instance.RootPath.TrimEnd('\\') + "\\Databases");
              if (string.IsNullOrEmpty(databasesFolder))
              {
            if (controller.Confirm("You didn't input anything - would you like to terminate this installation?"))
            {
              throw new Exception("Aborted.");
            }

            continue;
              }

              if (!FileSystem.FileSystem.Local.Directory.Exists(databasesFolder))
              {
            if (controller.Confirm("The " + databasesFolder + " doesn't exist. Would you like to create the folder?"))
            {
              FileSystem.FileSystem.Local.Directory.CreateDirectory(databasesFolder);
              break;
            }
              }
              else
              {
            break;
              }
            }
              }
              else
              {
            databasesFolder = Path.GetDirectoryName(mainDatabase.FileName).EmptyToNull();
              }

              return databasesFolder;
        }
        private static bool ExecuteSteps([NotNull] ProcessorArgs args, [NotNull] IEnumerable <Step> steps, [CanBeNull] IPipelineController controller = null, bool startThisAndNestedProcessors = true)
        {
            Assert.ArgumentNotNull(args, nameof(args));
            Assert.ArgumentNotNull(steps, nameof(steps));

            using (new ProfileSection("Execute pipeline steps"))
            {
                ProfileSection.Argument("args", args);
                ProfileSection.Argument("steps", steps);
                ProfileSection.Argument("controller", controller);
                ProfileSection.Argument("startThisAndNestedProcessors", startThisAndNestedProcessors);

                foreach (Step step in steps)
                {
                    ProcessorArgs innerArgs = null;

                    /* Use args' member as args for nested pipeline*/
                    var argsName = step.ArgsName.EmptyToNull();
                    if (argsName != null)
                    {
                        Type type = args.GetType();
                        const BindingFlags Flags = BindingFlags.Instance | BindingFlags.NonPublic;
                        FieldInfo          field = type.GetField(argsName) ?? type.GetField(argsName, Flags);
                        if (field != null)
                        {
                            innerArgs = (ProcessorArgs)field.GetValue(args);
                        }
                        else
                        {
                            PropertyInfo property = type.GetProperty(argsName) ?? type.GetProperty(argsName, Flags);
                            if (property != null)
                            {
                                innerArgs = (ProcessorArgs)property.GetValue(args, new object[0]);
                            }
                        }

                        Assert.IsNotNull(innerArgs, "Inner args are null, " + argsName);
                    }

                    startThisAndNestedProcessors = ExecuteProcessors(innerArgs ?? args, step._Processors, controller,
                                                                     startThisAndNestedProcessors);
                }

                return(startThisAndNestedProcessors);
            }
        }
예제 #33
0
        public static void ExtractFile([NotNull] string packagePath, [NotNull] string webRootPath, [NotNull] string databasesFolderPath, [NotNull] string dataFolderPath, bool attachSql, bool installRadControls, bool installDictionaries, [CanBeNull] IPipelineController controller = null)
        {
            Assert.ArgumentNotNull(packagePath, nameof(packagePath));
            Assert.ArgumentNotNull(webRootPath, nameof(webRootPath));
            Assert.ArgumentNotNull(databasesFolderPath, nameof(databasesFolderPath));
            Assert.ArgumentNotNull(dataFolderPath, nameof(dataFolderPath));

            Log.Info($"Extracting {packagePath}");
            var ignore = installRadControls ? ":#!" : RadControls;

            var ignore2           = installDictionaries ? ":#!" : Dictionaries;
            var incrementProgress = controller != null ? new Action <long>(controller.IncrementProgress) : null;

            try
            {
                using (var zip = new ZipFile(packagePath))
                {
                    var prefix = zip.Entries.First(x => x.FileName.StartsWith("Sitecore ")).FileName;
                    prefix = prefix.Substring(0, prefix.IndexOf('/', 1));

                    var webRootPrefix       = prefix + "/Website/";
                    var websitePrefixLength = webRootPrefix.Length;

                    var databasesPrefix       = prefix + "/Databases/";
                    var databasesPrefixLength = databasesPrefix.Length;

                    var databasesPrefix2       = "Databases/";
                    var databasesPrefix2Length = databasesPrefix2.Length;

                    var dataPrefix       = prefix + "/Data/";
                    var dataPrefixLength = dataPrefix.Length;

                    foreach (var entry in zip.Entries)
                    {
                        if (incrementProgress != null)
                        {
                            incrementProgress(1);
                        }

                        var fileName = entry.FileName;
                        if (fileName.StartsWith(webRootPrefix, StringComparison.OrdinalIgnoreCase))
                        {
                            var virtualFilePath = fileName.Substring(websitePrefixLength);
                            if (virtualFilePath.StartsWith(ignore, StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }

                            if (virtualFilePath.StartsWith(ignore2, StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }

                            var filePath = Path.Combine(webRootPath, fileName.Substring(websitePrefixLength));
                            if (entry.IsDirectory)
                            {
                                Directory.CreateDirectory(filePath);
                                continue;
                            }

                            var folder = Path.GetDirectoryName(filePath);
                            if (!Directory.Exists(folder))
                            {
                                Directory.CreateDirectory(folder);
                            }

                            using (var write = new StreamWriter(filePath))
                            {
                                entry.Extract(write.BaseStream);
                            }
                        }
                        else if (fileName.StartsWith(databasesPrefix, StringComparison.OrdinalIgnoreCase))
                        {
                            if (!attachSql)
                            {
                                continue;
                            }

                            if (!fileName.EndsWith(".mdf", StringComparison.OrdinalIgnoreCase) && !fileName.EndsWith(".dacpac", StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }

                            var text = fileName.Substring(databasesPrefixLength);
                            if (text.Contains("Sitecore.Analytics."))
                            {
                                text = text.Replace("Sitecore.Analytics.", "Sitecore.Reporting.");
                            }

                            var filePath = Path.Combine(databasesFolderPath, text);
                            if (entry.IsDirectory)
                            {
                                Directory.CreateDirectory(filePath);
                                continue;
                            }

                            var folder = Path.GetDirectoryName(filePath);
                            if (!Directory.Exists(folder))
                            {
                                Directory.CreateDirectory(folder);
                            }

                            using (var write = new StreamWriter(filePath))
                            {
                                entry.Extract(write.BaseStream);
                            }
                        }
                        else if (fileName.StartsWith(databasesPrefix2, StringComparison.OrdinalIgnoreCase))
                        {
                            if (!attachSql)
                            {
                                continue;
                            }

                            if (!fileName.EndsWith(".mdf", StringComparison.OrdinalIgnoreCase) && !fileName.EndsWith(".dacpac", StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }

                            var text = fileName.Substring(databasesPrefix2Length);
                            if (text.Contains("Sitecore.Analytics."))
                            {
                                text = text.Replace("Sitecore.Analytics.", "Sitecore.Reporting.");
                            }

                            var filePath = Path.Combine(databasesFolderPath, text);
                            if (entry.IsDirectory)
                            {
                                Directory.CreateDirectory(filePath);
                                continue;
                            }

                            var folder = Path.GetDirectoryName(filePath);
                            if (!Directory.Exists(folder))
                            {
                                Directory.CreateDirectory(folder);
                            }

                            using (var write = new StreamWriter(filePath))
                            {
                                entry.Extract(write.BaseStream);
                            }
                        }
                        else if (fileName.StartsWith(dataPrefix, StringComparison.OrdinalIgnoreCase))
                        {
                            var filePath = Path.Combine(dataFolderPath, fileName.Substring(dataPrefixLength));
                            if (entry.IsDirectory)
                            {
                                Directory.CreateDirectory(filePath);
                                continue;
                            }

                            var folder = Path.GetDirectoryName(filePath);
                            if (!Directory.Exists(folder))
                            {
                                Directory.CreateDirectory(folder);
                            }

                            using (var write = new StreamWriter(filePath))
                            {
                                entry.Extract(write.BaseStream);
                            }
                        }
                        else
                        {
                            Log.Warn($"Unexpected file or directory is ignored: {fileName}");
                        }
                    }
                }
            }
            catch (ZipException)
            {
                throw new InvalidOperationException($"The \"{packagePath}\" package seems to be corrupted.");
            }
        }
예제 #34
0
 public abstract IEnumerable <Processor> CreateProcessors(ProcessorArgs args, IPipelineController controller);
        private static bool ExecuteProcessors([NotNull] ProcessorArgs args, [NotNull] IEnumerable <Processor> processorList, [CanBeNull] IPipelineController controller = null, bool startThisAndNestedProcessors = true)
        {
            Assert.ArgumentNotNull(args, nameof(args));
            Assert.ArgumentNotNull(processorList, nameof(processorList));

            using (new ProfileSection("Execute pipeline processors"))
            {
                ProfileSection.Argument("args", args);
                ProfileSection.Argument("processorList", processorList);
                ProfileSection.Argument("controller", controller);
                ProfileSection.Argument("startThisAndNestedProcessors", startThisAndNestedProcessors);

                bool result = startThisAndNestedProcessors;
                foreach (Processor processor in processorList)
                {
                    bool processorResult = startThisAndNestedProcessors;

                    if (processorResult)
                    {
                        processorResult = processor.Execute(args);
                    }
                    else
                    {
                        processor.Skip();
                    }

                    if (controller != null)
                    {
                        controller.IncrementProgress();
                    }

                    // Process nested steps
                    result &= ExecuteProcessors(args, processor._NestedProcessors, controller, processorResult);
                }

                return(ProfileSection.Result(result));
            }
        }
예제 #36
0
        public static string ResolveConflict(SqlConnectionStringBuilder defaultConnectionString, ConnectionString connectionString, string databasePath, string databaseName, IPipelineController controller)
        {
            string existingDatabasePath = SqlServerManager.Instance.GetDatabaseFileName(databaseName, defaultConnectionString);

            if (string.IsNullOrEmpty(existingDatabasePath))
            {
                var m = "The database with the same '{0}' name is already exists in the SQL Server metabase but points to non-existing file. ".FormatWith(databaseName);
                if (controller.Confirm(m + "Would you like to delete it?"))
                {
                    SqlServerManager.Instance.DeleteDatabase(databaseName, defaultConnectionString);
                    return(databaseName);
                }

                throw new Exception(m);
            }

            if (existingDatabasePath.EqualsIgnoreCase(databasePath))
            {
                return(null);
            }

            // todo: replce this with shiny message box
            string       delete      = "Delete the '{0}' database".FormatWith(databaseName);
            const string AnotherName = "Use another database name";
            const string Cancel      = "Terminate current action";

            string[] options = new[]
            {
                delete, AnotherName, Cancel
            };
            string m2     = "The database with '{0}' name already exists".FormatWith(databaseName);
            string result = controller.Select(m2, options);

            switch (result)
            {
            case Cancel:
                throw new Exception(m2);

            case AnotherName:
                databaseName = ResolveConflictByUnsedName(defaultConnectionString, connectionString, databaseName);
                break;

            default:
                SqlServerManager.Instance.DeleteDatabase(databaseName, defaultConnectionString);
                break;
            }

            return(databaseName);
        }
예제 #37
0
        public static void AttachDatabase(string name, string databasesFolderPath, ConnectionString connectionString, SqlConnectionStringBuilder defaultConnectionString, IPipelineController controller)
        {
            SetConnectionStringNode(name, defaultConnectionString, connectionString);

            string databaseName = connectionString.GenerateDatabaseName(name);

            string databasePath =
                DatabaseFilenameHook(Path.Combine(databasesFolderPath, connectionString.DefaultFileName),
                                     connectionString.Name.Replace("yafnet", "forum"), databasesFolderPath);

            if (!FileSystem.FileSystem.Local.File.Exists(databasePath))
            {
                var file = Path.GetFileName(databasePath);
                if (connectionString.Name.EqualsIgnoreCase("reporting"))
                {
                    databasePath = Path.Combine(Path.GetDirectoryName(databasePath), "Sitecore.Analytics.mdf");
                }
                else if (connectionString.Name.EqualsIgnoreCase("exm.dispatch"))
                {
                    databasePath = Path.Combine(Path.GetDirectoryName(databasePath), "Sitecore.Exm.mdf");
                }
                else if (connectionString.Name.EqualsIgnoreCase("session"))
                {
                    databasePath = Path.Combine(Path.GetDirectoryName(databasePath), "Sitecore.Sessions.mdf");
                }
            }

            FileSystem.FileSystem.Local.File.AssertExists(databasePath, databasePath + " file doesn't exist");

            if (SqlServerManager.Instance.DatabaseExists(databaseName, defaultConnectionString))
            {
                databaseName = ResolveConflict(defaultConnectionString, connectionString, databasePath, databaseName, controller);
            }

            if (databaseName != null)
            {
                SqlServerManager.Instance.AttachDatabase(databaseName, databasePath, defaultConnectionString);
            }
        }
예제 #38
0
        public static void ExtractFile([NotNull] string packagePath, [NotNull] string webRootPath, [NotNull] string databasesFolderPath, [NotNull] string dataFolderPath, [CanBeNull] IPipelineController controller = null)
        {
            Assert.ArgumentNotNull(packagePath, "packagePath");
            Assert.ArgumentNotNull(webRootPath, "webRootPath");
            Assert.ArgumentNotNull(databasesFolderPath, "databasesFolderPath");
            Assert.ArgumentNotNull(dataFolderPath, "dataFolderPath");

            Log.Info("Extracting {0}".FormatWith(packagePath), typeof(InstallHelper));
            var ignore = Settings.CoreInstallRadControls.Value ? ":#!" : "sitecore/shell/RadControls";

            var ignore2           = Settings.CoreInstallDictionaries.Value ? ":#!" : "sitecore/shell/Controls/Rich Text Editor/Dictionaries";
            var incrementProgress = controller != null ? new Action <long>(controller.IncrementProgress) : null;

            try
            {
                using (var zip = new ZipFile(packagePath))
                {
                    var prefix = zip.Entries.First().FileName;
                    prefix = prefix.Substring(0, prefix.IndexOf('/', 1));

                    var webRootPrefix       = prefix + "/Website/";
                    var websitePrefixLength = webRootPrefix.Length;

                    var databasesPrefix       = prefix + "/Databases/";
                    var databasesPrefixLength = databasesPrefix.Length;

                    var dataPrefix       = prefix + "/Data/";
                    var dataPrefixLength = dataPrefix.Length;

                    foreach (var entry in zip.Entries)
                    {
                        if (incrementProgress != null)
                        {
                            incrementProgress(1);
                        }

                        var fileName = entry.FileName;
                        if (fileName.StartsWith(webRootPrefix, StringComparison.OrdinalIgnoreCase))
                        {
                            var virtualFilePath = fileName.Substring(websitePrefixLength);
                            if (virtualFilePath.StartsWith(ignore, StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }

                            if (virtualFilePath.StartsWith(ignore2, StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }

                            var filePath = Path.Combine(webRootPath, fileName.Substring(websitePrefixLength));
                            if (entry.IsDirectory)
                            {
                                Directory.CreateDirectory(filePath);
                                continue;
                            }

                            var folder = Path.GetDirectoryName(filePath);
                            if (!Directory.Exists(folder))
                            {
                                Directory.CreateDirectory(folder);
                            }

                            using (var write = new StreamWriter(filePath))
                            {
                                entry.Extract(write.BaseStream);
                            }
                        }
                        else if (fileName.StartsWith(databasesPrefix, StringComparison.OrdinalIgnoreCase))
                        {
                            if (fileName.EndsWith(".ldf"))
                            {
                                continue;
                            }

                            var filePath = Path.Combine(databasesFolderPath, fileName.Substring(databasesPrefixLength));
                            if (entry.IsDirectory)
                            {
                                Directory.CreateDirectory(filePath);
                                continue;
                            }

                            var folder = Path.GetDirectoryName(filePath);
                            if (!Directory.Exists(folder))
                            {
                                Directory.CreateDirectory(folder);
                            }

                            using (var write = new StreamWriter(filePath))
                            {
                                entry.Extract(write.BaseStream);
                            }
                        }
                        else if (fileName.StartsWith(dataPrefix, StringComparison.OrdinalIgnoreCase))
                        {
                            var filePath = Path.Combine(dataFolderPath, fileName.Substring(dataPrefixLength));
                            if (entry.IsDirectory)
                            {
                                Directory.CreateDirectory(filePath);
                                continue;
                            }

                            var folder = Path.GetDirectoryName(filePath);
                            if (!Directory.Exists(folder))
                            {
                                Directory.CreateDirectory(folder);
                            }

                            using (var write = new StreamWriter(filePath))
                            {
                                entry.Extract(write.BaseStream);
                            }
                        }
                        else
                        {
                            Log.Warn("Unexpected file or directory is ignored: " + fileName, typeof(InstallHelper));
                        }
                    }
                }
            }
            catch (ZipException)
            {
                throw new InvalidOperationException(string.Format("The \"{0}\" package seems to be corrupted.", packagePath));
            }
        }