Пример #1
0
        private void InitUpdateManager()
        {
            Logger.WriteToTrace($"Включение слежения за обновлениями в директории \"{Context.Settings.Registry.UpdatesPath}\"...");
            UpdateManager = new ETLUpdateManager(Pumps, Context.Settings.Registry);

            Logger.WriteToTrace("Проверка наличия обновлений.");
            UpdateManager.CheckUpdates();

            UpdateManager.OnReceiveUpdate += async(s, a) => {
                await Broadcast.Send(new ETLBroadcastAction {
                    Action = "receiveUpdate",
                    Data   = a.UpdateInfo
                });
            };

            UpdateManager.OnUpdate += async(s, a) => {
                // Обновлённая закачка
                ETLProcess prc = Pumps.FirstOrDefault(p => p.ProgramID == a.UpdateInfo.ProgramID);
                if (prc == null)
                {
                    return;
                }

                await Broadcast.Send(new ETLBroadcastAction
                {
                    Action = "update",
                    Data   = new Dictionary <string, object> {
                        { "Info", a.UpdateInfo },
                        { "Config", prc.ConfigData }
                    }
                });
            };
        }
Пример #2
0
        /// <summary>
        /// Функция запуска закачки
        /// </summary>
        public decimal Execute(string id, string config)
        {
            ETLProcess prc = Pumps.FirstOrDefault(p => p.ProgramID == id);

            // Проверка наличия в реестре
            if (prc == null)
            {
                throw new Exception("Закачка с заданным идентификатором отсутствует.");
            }

            // Проверка среди запущенных
            if (prc.IsExecuting)
            {
                return(-1);
            }

            // Для запуска процесса версия БД должна быть выше
            if (prc.Version > Context.Version)
            {
                throw new Exception("Версия системы ниже необходимой для запуска.");
            }

            decimal sessNo = Context.History.AddRecord(prc.ProgramID, Context.Version, prc.Version, "user", config);

            // При запуске добавляем в список запущенных
            prc.OnStart += async(s, a) => {
                await Broadcast.Send(new ETLBroadcastAction {
                    Action = "startPump",
                    Data   = new Dictionary <string, object> {
                        { "id", id }
                    }
                });
            };

            // При закрытии процесса удаляем его из запущенных
            prc.OnExit += async(s, a) => {
                await Broadcast.Send(new ETLBroadcastAction {
                    Action = "endPump",
                    Data   = new Dictionary <string, object> {
                        { "id", id },
                        { "status", ((ETLProcess)s).LastStatus.ToString() }
                    }
                });
            };

            prc.Start(sessNo);
            return(sessNo);
        }
Пример #3
0
        public int ApplyUpdates(string[] updates)
        {
            int count = UpdateManager.Updates.Count;

            foreach (ETLUpdateRecord rec in updates.Select(u => UpdateManager.Updates[u]))
            {
                // Обновление невозможно применить при запущенном процессе закачки
                ETLProcess prc = Pumps.FirstOrDefault(p => p.ProgramID == rec.ProgramID);
                if (prc != null && prc.IsExecuting)
                {
                    continue;
                }

                UpdateManager.ApplyUpdate(rec, Context.History);
            }

            return(count - UpdateManager.Updates.Count);
        }
Пример #4
0
        /// <summary>
        /// Инициализация списка закачек
        /// </summary>
        private void InitPumpsList()
        {
            Logger.WriteToTrace("Формирование списка закачек.");

            Pumps = new List <ETLProcess>();

            string[]      pumpConfigs = Directory.GetFiles(Context.Settings.Registry.ProgramsPath);
            List <string> ids         = new List <string>();

            foreach (string pumpConfig in pumpConfigs)
            {
                try
                {
                    string  fileName = Path.GetFileName(pumpConfig);
                    JObject data     = JsonCommon.Load(pumpConfig);
                    string  id       = data["id"].ToString();

                    // Если уже существует закачка с таким ID
                    if (ids.Contains(id))
                    {
                        Logger.WriteToTrace($"Закачка с ID = \"{id}\" (\"{fileName}\") уже существует.", TraceMessageKind.Warning);
                        continue;
                    }

                    // Процесс инициализируется данными конфигурации
                    ETLProcess prc = new ETLProcess(pumpConfig, Context.History);

                    // Сохраняется конфиг закачки с описанием
                    Pumps.Add(prc);
                    ids.Add(id);
                }
                catch (Exception ex)
                {
                    Logger.WriteToTrace($"Ошибка при формировании реестра закачек: {ex}.", TraceMessageKind.Error);
                }
            }
        }
Пример #5
0
        /// <summary>
        /// Аварийное завершение закачки
        /// </summary>
        public void Terminate(string id)
        {
            ETLProcess pump = Pumps.FirstOrDefault(p => p.IsExecuting && p.ProgramID == id);

            pump?.Terminate();
        }