/// <summary>
        /// Создание временной конфигурации для быстрого анализа.
        /// </summary>
        /// <param name="template">шаблон</param>
        /// <param name="product">приложение</param>
        /// <returns></returns>
        internal static Configuration CreateInstant(IISApplication product)
        {
            Template template    = null;
            string   productCode = null;

            foreach (var config in Directory.GetFiles(product.Path, "*.config"))
            {
                var appConfig = XDocument.Load(config);
                productCode = appConfig.Root.Element("NpoComputer.Product")?.Element("Code")?.Value;
                if (string.IsNullOrEmpty(productCode))
                {
                    continue;
                }
                template = TemplateManager.GetByProductCode(productCode, FilterMode.InstantOnly);
                if (template != null)
                {
                    break;
                }
            }

            if (template == null)
            {
                throw new FileNotFoundException("Не найдено подходящих шаблонов для данного приложения.");
            }

            Core.Application.Log(LogLevel.Informational, "Загрузка параметров для сайта \"{0}\"", product);

            var xml        = XDocument.Load(template.ConfigurationPath);
            var p          = xml.XPathSelectElements(@"Configuration/Parameters/Parameter");
            var parameters = new ParameterProvider(p.ToDictionary(k => k.Attribute("name").Value, v => v.Attribute("value").Value));

            parameters.AddParameter("ConfigurationPath", Path.Combine("Templates", template.Name));
            parameters.AddParameter("ReportsPath", Path.Combine(Core.Application.WorkingFolder, "Reports"));
            parameters.AddParameter("Title", product.ToString());
            parameters.AddParameter("SiteLogFile", product.IISLogPath);
            parameters.AddParameter("ApplicationPath", product.Path);

            if (productCode.Contains("NOMAD")) //TODO: Убрать костыль
            {
                var appPath     = product.Path;
                var logSettings = XDocument.Load(Path.Combine(appPath, "LogSettings.config"));
                var path        = ((IEnumerable)logSettings.XPathEvaluate("/*[name()='nlog']/*[name()='variable' and @name='logs-path']/@value")).Cast <XAttribute>().FirstOrDefault()?.Value;
                if (path != null && path.Contains("basedir"))
                {
                    path = Path.Combine(appPath, @"App_Data\Logs\");
                }
                parameters.AddParameter("ApplicationLogsPath", path);
                //TODO: Получать путь
                parameters.AddParameter("ClientsLogPath", Path.Combine(appPath, @"\App_Data\ClientLogs\"));
            }

            var taskNodes = xml.XPathSelectElements(@"Configuration/Tasks/Task");
            var tasks     = taskNodes.Select(t => Tasks.TaskFactory.Create(t)).ToList();

            return(new Configuration(template.Name, tasks, parameters, null));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Создание конфигурации из шаблона
        /// </summary>
        /// <returns></returns>
        static public void CreateConfiguration(Template template)
        {
            Core.Application.Log(LogLevel.Informational, template.Description);
            Core.Application.Log(LogLevel.Informational, "Поиск подходящих продуктов для конфигурации \"{0}\"", template.Name);

            try
            {
                IISApplication currentApp = null;
                var            sites      = IISManager.GetProducts().Where(a => template.ProductCodes.Split(';').Contains(a.Code)).ToList();
                if (sites.Count == 0)
                {
                    Core.Application.Log(LogLevel.Informational, "Не найдены установленные продукты для данной конфигурации");
                }
                if (sites.Count == 1)
                {
                    currentApp = sites.First();
                }

                if (sites.Count > 1)
                {
                    Core.Application.Log(LogLevel.Informational, "Найдено несколько установок. Укажите соответствующий индекс продукта:");

                    while (currentApp == null)
                    {
                        for (var i = 0; i < sites.Count; i++)
                        {
                            Console.WriteLine("{0}: {1}", i, sites[i]);
                        }
                        try
                        {
                            var index = int.Parse(Console.ReadLine());
                            currentApp = sites[index];
                        }
                        catch
                        {
                            Core.Application.Log(LogLevel.Error, "Указан некорректный индекс, повторите попытку:");
                        }
                    }
                }
                if (currentApp != null)
                {
                    Core.Application.Log(LogLevel.Informational, "Загрузка параметров для сайта \"{0}\"", currentApp);
                    template.Parameters.First(x => x.Name == "ApplicationPath").Value = currentApp.Path;
                    template.Parameters.First(x => x.Name == "SiteLogFile").Value     = currentApp.IISLogPath;
                    template.Parameters.First(x => x.Name == "Title").Value           = currentApp.ToString();
                }
                else
                {
                    Core.Application.Log(LogLevel.Warning, "Некоторые параметры необходимо указать вручную.");
                }
            }
            catch (Exception e)
            {
                Core.Application.Log(LogLevel.Error, "Произошла ошибка: {0}", e.Message);
                Core.Application.Log(LogLevel.Warning, "Некоторые параметры необходимо указать вручную.");
            }

            foreach (var parameter in template.Parameters)
            {
                do
                {
                    Core.Application.Log(LogLevel.Informational, "{0}", parameter.Description);
                    Console.ForegroundColor = ConsoleColor.DarkGray;

                    foreach (var param in template.Parameters)
                    {
                        parameter.Value = parameter.Value.Replace(string.Format("%{0}%", param.Name), param.Value);
                    }

                    Console.Write("{0} ", parameter.Value);
                    Console.ResetColor();
                    Console.SetCursorPosition(0, Console.CursorTop);
                    var value = Console.ReadLine();

                    if (!string.IsNullOrEmpty(value))
                    {
                        parameter.Value = value;
                    }
                } while (parameter.Required && string.IsNullOrEmpty(parameter.Value));
            }

            var configName = template.Parameters.First(x => x.Name == "Title").Value;

            configName = configName?.Replace(" ", "_").Replace("/", "_");
            while (string.IsNullOrEmpty(configName) || ConfigurationManager.Get(configName) != null)
            {
                Core.Application.Log(LogLevel.Warning, "Конфигурация с именем \"{0}\" уже существует. Укажите другое имя", configName);
                configName = Console.ReadLine();
                configName = configName?.Replace(" ", "_").Replace("/", "_");
            }

            Core.Application.Log(LogLevel.Informational, "Создание конфигурации \"{0}\"", configName);
            new DirectoryInfo(Path.Combine(TemplatesPath, template.Name)).CopyTo(Path.Combine(ConfigurationManager.ConfigurationPath, configName), true);

            var doc                    = new XDocument();
            var serializer             = new XmlSerializer(typeof(Parameters.ParameterCollection));
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

            ns.Add("", "");
            using (var writer = doc.CreateWriter())
                serializer.Serialize(writer, new Parameters.ParameterCollection()
                {
                    Parameters = template.Parameters.ToList()
                }, ns);

            var configPath = Path.Combine(ConfigurationManager.ConfigurationPath, configName, "application.config");
            var xml        = XDocument.Load(configPath);

            xml.XPathSelectElement(@"Configuration/Parameters").Remove();
            var p = xml.XPathSelectElement(@"Configuration");

            p.AddFirst(doc.Root);
            xml.Save(configPath);
            Core.Application.Log(LogLevel.Informational, "Конфигурация {0} успешно создана", configName);
        }