コード例 #1
0
ファイル: Project.cs プロジェクト: loreps-all-site/ISPCore
        public static void Run(CoreDB coreDB, JsonDB jsonDB, IMemoryCache memoryCache)
        {
            if (IsRun)
            {
                return;
            }
            IsRun = true;

            if (!memoryCache.TryGetValue("Cron-ProjectInfo", out _))
            {
                memoryCache.Set("Cron-ProjectInfo", (byte)0, Startup.AbsoluteExpirationToAPI);

                #region Получаем новости проекта
                try
                {
                    HttpClient client  = new HttpClient();
                    var        newsAPI = JsonConvert.DeserializeObject <List <ProjectNews> >(client.GetStringAsync("http://api.core-system.org/isp/news").Result);
                    if (newsAPI.Count > 0)
                    {
                        jsonDB.ProjectNews = newsAPI;
                        jsonDB.Save();
                    }
                }
                catch { }
                #endregion

                #region Получаем список изменений проекта
                try
                {
                    HttpClient client        = new HttpClient();
                    var        ProjectChange = JsonConvert.DeserializeObject <List <ProjectChange> >(client.GetStringAsync("http://api.core-system.org/isp/change").Result);
                    if (ProjectChange.Count > 0)
                    {
                        jsonDB.ProjectChange = ProjectChange;
                        jsonDB.Save();
                    }
                }
                catch { }
                #endregion

                #region Сравниваем версию ISPCore
                try
                {
                    HttpClient client = new HttpClient();
                    var        result = JsonConvert.DeserializeObject <LatestVersion>(client.GetStringAsync("http://api.core-system.org/isp/LatestVersion").Result);

                    // Сверяем версии ISPCore
                    if (result.Version > 0 && (result.Version > Startup.version.Version || (result.Version == Startup.version.Version && result.Patch > Startup.version.Patch)))
                    {
                        #region Автоматическое обновление ISPCore
                        if (jsonDB.Base.AutoUpdate && (Platform.Get == PlatformOS.Docker || Platform.Get == PlatformOS.Unix))
                        {
                            // Если метод auto-update.sh еще не вызывался для этой версии ISPCore
                            if (!File.Exists($"{Folders.AutoUpdate}/{Startup.version.ToString()}.ok"))
                            {
                                // Проверяем можно ли текущею версию обновлять
                                if (client.GetStringAsync($"http://api.core-system.org/isp/UpdateSupport?Version={Startup.version.Version}&Patch={Startup.version.Patch}&os={PlatformOS.Unix.ToString()}").Result == "ok")
                                {
                                    // Записываем версию ISPCore с которой был вызван auto-update.sh
                                    File.WriteAllText($"{Folders.AutoUpdate}/{Startup.version.ToString()}.ok", string.Empty);

                                    // Обновляем
                                    Bash   bash = new Bash();
                                    string os   = Platform.Get == PlatformOS.Docker ? "docker" : "linux";
                                    bash.Run($"curl -fsSL http://cdn.core-system.org/isp/{os}/auto-update.sh | sh");
                                    return;
                                }
                            }
                        }
                        #endregion

                        // Уведомление
                        var note = new Notation()
                        {
                            Category = "Система",
                            Msg      = jsonDB.Base.AutoUpdate ? "Доступна новая версия ISPCore, требуется ручное обновление" : "Доступна новая версия ISPCore",
                            Time     = DateTime.Now,
                            More     = new List <More>()
                            {
                                new More("Текущая версия", Startup.version.ToString()),
                                new More("Доступна версия", result.ToString())
                            }
                        };

                        // HashData
                        note.HashData = Notation.CreateHashData(note);

                        // Если в базе нету HashData
                        if (coreDB.Notations.AsNoTracking().FirstOrDefault(it => it.HashData == note.HashData) == null)
                        {
                            // Добовляем в базу
                            coreDB.Notations.Add(note);

                            // Сохраняем базу
                            coreDB.SaveChanges();

                            // Обновляем CountNotification
                            jsonDB.Base.CountNotification++;
                            jsonDB.Save();
                        }
                    }
                }
                catch { }
                #endregion
            }

            IsRun = false;
        }