Пример #1
0
        public static void CronMinutes(object ob)
        {
            if (StartCronTime > DateTime.Now.AddMinutes(-1))
            {
                return;
            }

            try
            {
                using (CoreDB coreDB = Service.Get <CoreDB>())
                {
                    JsonDB jsonDB      = Service.Get <JsonDB>();
                    var    memoryCache = Service.Get <IMemoryCache>();

                    Engine.Cron.Project.Run(coreDB, jsonDB, memoryCache);           // Получение новостей и списка изменений
                    Engine.Cron.UpdateAV.Run(coreDB, jsonDB, memoryCache);          // Обновление антивируса

                    Engine.Cron.WhitePtrIP.Run(coreDB, memoryCache);                // Удаляем из базы старые IP адреса
                    Engine.RequestsFilter.Access.AccessIP.Clear();                  // Очистка списка IP с разрешенным доступом
                    Engine.Cron.Home.Run(coreDB, memoryCache);                      // Очистка журнала посещений
                    Engine.Cron.Auth.Run(coreDB, jsonDB, memoryCache);              // Очистка сессий
                    Engine.Cron.AntiDdos.Run(coreDB, jsonDB, memoryCache);          // Сбор статистики && очистка базы и правил IPTables

                    Engine.Cron.Monitoring.Run(coreDB, memoryCache);                // Статистика "/isp/monitoring"
                    Engine.Base.SqlAndCache.WriteLogTo.CloseFiles();                // Закрытие потоков на файлах которые не используются
                    Engine.Base.SqlAndCache.WriteLogTo.ZipFiles();                  // Сжатие логов

                    Engine.Cron.Notifications.Run(coreDB, jsonDB, memoryCache);     // Уведомления
                    Engine.Cron.AntiVirus.Run(coreDB);                              // Проверка доменов антивирусом

                    Engine.Cron.SyncBackup.Database.Run(coreDB, memoryCache);       // SyncBackup - DB
                    Engine.Cron.SyncBackup.Files.Run(coreDB, memoryCache);          // SyncBackup - IO
                    Engine.Cron.SyncBackup.Files.ClearingTemp(memoryCache);         // Очистка временных файлов
                }
            }
            catch (Exception ex)
            {
                Log.Write(Folders.File.SystemErrorLog, ex.ToString());
            }
        }
Пример #2
0
        public static void Run(CoreDB coreDB, JsonDB jsonDB, IMemoryCache memoryCache)
        {
            // Очистка базы от старых уведомлений
            if (memoryCache.TryGetValue("CronNoteClearDB", out DateTime CronDate))
            {
                // Если дата отличается от текущей
                if (CronDate.Day != DateTime.Now.Day)
                {
                    // Меняем режим доступа к SQL
                    SqlToMode.SetMode(SqlMode.Read);

                    // Создаем кеш
                    memoryCache.Set("CronNoteClearDB", DateTime.Now);

                    // Удаляем  записи старше 180 дней
                    foreach (var item in coreDB.Notations.AsNoTracking())
                    {
                        if (DateTime.Now > item.Time.AddDays(180))
                        {
                            // Удаляем заметку
                            coreDB.Notations.RemoveAttach(coreDB, item.Id);
                        }
                    }

                    // Меняем режим доступа к SQL
                    SqlToMode.SetMode(SqlMode.ReadOrWrite);

                    // Раз в день
                    GC.Collect(GC.MaxGeneration);
                }
            }
            else
            {
                // Создаем кеш задним числом
                memoryCache.Set("CronNoteClearDB", DateTime.Now.AddDays(-1));
            }
        }
Пример #3
0
    // Use this for initialization
    void Start()
    {
        string       json     = "{\"db\":[{\"id\":82,\"name\":\"BEQ1530\",\"shape\":\"1\",\"size\":\"1\",\"frame\":\"0\",\"color\":\"0\",\"price\":112000,\"priceidx\":2,\"rate\":70,\"url\":\"https://s3.ap-northeast-2.amazonaws.com/cliegh2/testimage.png\"},{\"id\":83,\"name\":\"RFE2300\",\"shape\":\"1\",\"size\":\"1\",\"frame\":\"0\",\"color\":\"0\",\"price\":67000,\"priceidx\":1,\"rate\":73,\"url\":\"https://s3.ap-northeast-2.amazonaws.com/cliegh2/testimage.png\"},{\"id\":85,\"name\":\"AZD1002\",\"shape\":\"1\",\"size\":\"1\",\"frame\":\"0\",\"color\":\"0\",\"price\":30000,\"priceidx\":0,\"rate\":66,\"url\":\"/home/ubuntu/opt/pyshell/img/85.jpg\"}],\"gender\":{\"value\":\"female\",\"confidence\":0.999801},\"age\":{\"value\":\"15~19\",\"confidence\":0.565172}}";
        JsonResponse response = JsonUtility.FromJson <JsonResponse>(json);

        for (int i = 0; i < response.db.Length; i++)
        {
            JsonDB db = response.db[i];
            Debug.Log("DB " + i);
            Debug.Log("DB.id      " + db.id);
            Debug.Log("DB.name    " + db.name);
            Debug.Log("DB.shape   " + db.shape);
            Debug.Log("DB.size    " + db.size);
            Debug.Log("DB.frame   " + db.frame);
            Debug.Log("DB.color   " + db.color);
            Debug.Log("DB.price   " + db.price);
            Debug.Log("DB.priceidx" + db.priceidx);
            Debug.Log("DB.rate    " + db.rate);
            Debug.Log("DB.url     " + db.url);
        }

        Debug.Log("Age: " + response.age.value + " (" + response.age.confidence + ")");
        Debug.Log("Gender: " + response.gender.value + " (" + response.age.confidence + ")");
    }
Пример #4
0
 public DataReference(string fullID, string targetSheet, string targetId, JsonDB db) : base(fullID)
 {
     TargetSheet = targetSheet;
     TargetID    = targetId;
     _db         = db;
 }
Пример #5
0
 public DataReference(string id, DataEntry owner, string targetSheet, string targetId, JsonDB db) : base(id, owner)
 {
     TargetSheet = targetSheet;
     TargetID    = targetId;
     _db         = db;
 }
Пример #6
0
        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;
        }
Пример #7
0
 public ApiEditSettingsToService()
 {
     jsonDB = Service.Get <JsonDB>();
 }
Пример #8
0
 public ApiCommonAV()
 {
     jsonDB = Service.Get <JsonDB>();
 }
Пример #9
0
        public static void RunBlocked(JsonDB jsonDB, IMemoryCache memoryCache)
        {
            if (IsRunBlocked || BlockedIP.IsEmpty)
            {
                return;
            }
            IsRunBlocked = true;

            //
            bool BlockToIPtables = jsonDB.AntiDdos.BlockToIPtables;

            #region Получаем текущий список заблокированных IP
            string IPv4 = string.Empty;
            string IPv6 = string.Empty;

            if (BlockToIPtables)
            {
                IPv4 = new Bash().Run("iptables -L -n -v | grep \"ISPCore_\" | awk '{print $8}'");
                IPv6 = new Bash().Run("ip6tables -L -n -v | grep \"ISPCore_\" | awk '{print $8}'");
            }
            #endregion

            // Блокируем IP
            Parallel.For(0, BlockedIP.Count, new ParallelOptions {
                MaxDegreeOfParallelism = jsonDB.Base.CountParallel
            }, (index, state) =>
            {
                try
                {
                    if (BlockedIP.TryDequeue(out string IP))
                    {
                        // IP уже заблокирован
                        if (IPv4.Contains(IP) || IPv6.Contains(IP))
                        {
                            return;
                        }

                        #region DNSLookup
                        string HostName = null;
                        try
                        {
                            if (jsonDB.AntiDdos.DNSLookupEnabled)
                            {
                                // Получаем имя хоста по IP
                                var host = Dns.GetHostEntryAsync(IP).Result;

                                // Получаем IP хоста по имени
                                host = Dns.GetHostEntryAsync(host.HostName).Result;

                                // Проверяем имя хоста и IP на совпадение
                                if (host.AddressList.Where(i => i.ToString() == IP).FirstOrDefault() != null)
                                {
                                    HostName = host.HostName;

                                    // Проверяем имя хоста на белый список DNSLookup
                                    if (Regex.IsMatch(host.HostName, WhiteUserList.PtrRegex, RegexOptions.IgnoreCase))
                                    {
                                        // Добовляем IP в белый список на неделю
                                        WhitePtr.Add(IP, host.HostName, DateTime.Now.AddDays(7));
                                        Trigger.OnAddToWhitePtr((IP, HostName, 7));

                                        // Удаляем временное значение с кеша
                                        memoryCache.Remove($"AntiDdosCheckBlockedIP-{IP}");
                                        return;
                                    }
                                }
                            }
                        }
                        catch { }
                        #endregion

                        // Добовляем IP в IPtables
                        if (BlockToIPtables)
                        {
                            string comandTables = IP.Contains(":") ? "ip6tables" : "iptables";
                            new Bash().Run($"{comandTables} -A INPUT -s {IP} -m comment --comment \"ISPCore_{DateTime.Now.AddMinutes(jsonDB.AntiDdos.BlockingTime).ToString("yyy-MM-ddTHH:mm:00")}\" -j REJECT");
                        }

                        //
                        Trigger.OnBlockedIP((IP, HostName, jsonDB.AntiDdos.BlockingTime));

                        // Пишем IP в базу
                        if (jsonDB.AntiDdos.Jurnal)
                        {
                            (string Country, string City, string Region)geo = ("Disabled", "Disabled", "Disabled");
                            if (jsonDB.AntiDdos.GeoIP)
                            {
                                geo = GeoIP2.City(IP);
                            }

                            WriteLogTo.SQL(new Jurnal()
                            {
                                City     = geo.City,
                                Country  = geo.Country,
                                Region   = geo.Region,
                                HostName = HostName,
                                IP       = IP,
                                Time     = DateTime.Now
                            });
                        }

                        // Обновляем кеш
                        int BlockingTime = jsonDB.AntiDdos.BlockingTime > 10 ? 10 : jsonDB.AntiDdos.BlockingTime;
                        memoryCache.Set($"AntiDdosCheckBlockedIP-{IP}", (byte)0, TimeSpan.FromMinutes(BlockingTime));
                    }
                }
Пример #10
0
        public static void RunSecond(JsonDB jsonDB, IMemoryCache memoryCache)
        {
            if (IsRunSecond)
            {
                return;
            }
            IsRunSecond = true;

            try
            {
                Bash bash   = new Bash();
                byte second = (byte)DateTime.Now.Second;

                #region Максимальное значение TCP/UPD за текущий час

                int MaxTcpOrUpd = int.Parse(bash.Run("ss -ntu | wc -l"));

                // Записываем данные в кеш
                if (memoryCache.TryGetValue(KeyToMemoryCache.AntiDdosNumberOfRequestDay(DateTime.Now), out dataHour))
                {
                    Trigger.OnCountTcpOrUpd((MaxTcpOrUpd, dataHour.value));

                    if (MaxTcpOrUpd > dataHour.value)
                    {
                        dataHour.value = MaxTcpOrUpd;
                        memoryCache.Set(KeyToMemoryCache.AntiDdosNumberOfRequestDay(DateTime.Now), dataHour);
                    }
                }
                else
                {
                    dataHour = new NumberOfRequestDay()
                    {
                        value = MaxTcpOrUpd,
                        Time  = DateTime.Now
                    };

                    memoryCache.Set(KeyToMemoryCache.AntiDdosNumberOfRequestDay(DateTime.Now), dataHour);
                    Trigger.OnCountTcpOrUpd((MaxTcpOrUpd, dataHour.value));
                }
                #endregion

                #region Получаем список IP которые нужно заблокировать
                List <string> MassIP = new List <string>();

                // Количиство активных соеденений
                MassIP.AddRange(bash.Run(@"ss -ntu | awk '{print $6}' | sed 's%\:[0-9]*$%%g' | sed 's%\:\:ffff\:\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)%\1%g' | sort | uniq -ic | awk '{if ($1 >= " + jsonDB.AntiDdos.MaximumBurstSize + ") {print $2}}'").Split('\n'));

                // Максимальное количество запросов за 120 секунд
                if (!memoryCache.TryGetValue("Cron_AntiDdos-tcpdump", out _))
                {
                    // Создаем кеш на 120 секунд
                    memoryCache.Set("Cron_AntiDdos-tcpdump", (byte)0, TimeSpan.FromSeconds(120));

                    // Убиваем tcpdump
                    bash.Run("pkill tcpdump");

                    // Считываем файл
                    MassIP.AddRange(bash.Run(@"awk '{if ($6 > 0) {print $2}}' " + Folders.Log + @"/tcpdump.log | sed 's%\.[0-9]*$%%g' | sed 's%\:\:ffff\:\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)%\1%g' | sort | uniq -ic | awk '{if ($1 >= " + jsonDB.AntiDdos.NumberOfRequestsIn120Second + ") {print $2}}'").Split('\n'));

                    // Запускаем tcpdump
                    bash.Run($"tcpdump -i {jsonDB.AntiDdos.Interface} -nnpqSt dst port {string.Join(" or dst port ", jsonDB.AntiDdos.CheckPorts.Split(','))} > {Folders.Log}/tcpdump.log 2> /dev/null &");
                }
                #endregion

                #region Блокируем IP
                foreach (var IP in MassIP)
                {
                    // IP в белом списке
                    if (string.IsNullOrWhiteSpace(IP) || IsWhiteIP(jsonDB, memoryCache, IP))
                    {
                        continue;
                    }

                    // Блокируем IP
                    Blocked(memoryCache, Regex.Replace(IP, "[\n\r\t ]+", ""));
                }
                #endregion
            }
            catch { }

            IsRunSecond = false;
        }
Пример #11
0
        public static void Run(CoreDB coreDB, JsonDB jsonDB, IMemoryCache memoryCache)
        {
            if (IsRun || !jsonDB.AntiDdos.IsActive || Platform.Get != PlatformOS.Unix)
            {
                return;
            }
            IsRun = true;

            #region Переносим данные TCP/UPD с кеша в базу (за прошлый час)
            var TimeAntiDdosNumberOfRequestDay = DateTime.Now.AddHours(-1);
            if (memoryCache.TryGetValue(KeyToMemoryCache.AntiDdosNumberOfRequestDay(TimeAntiDdosNumberOfRequestDay), out NumberOfRequestDay dataLastHour))
            {
                // Меняем режим доступа к SQL
                SqlToMode.SetMode(SqlMode.Read);

                // Записываем данные в базу
                coreDB.AntiDdos_NumberOfRequestDays.Add(dataLastHour);

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

                // Меняем режим доступа к SQL
                SqlToMode.SetMode(SqlMode.ReadOrWrite);

                // Сносим кеш (статистика за час)
                memoryCache.Remove(KeyToMemoryCache.AntiDdosNumberOfRequestDay(TimeAntiDdosNumberOfRequestDay));
            }
            #endregion

            #region Очистка баз + перенос NumberOfRequestDay в NumberOfRequestMonth
            if (memoryCache.TryGetValue("CronAntiDdosClearDB", out DateTime CronClearDB))
            {
                // Если дата отличается от текущей
                if (CronClearDB.Day != DateTime.Now.Day)
                {
                    // Меняем режим доступа к SQL
                    SqlToMode.SetMode(SqlMode.Read);

                    // Обновляем кеш
                    memoryCache.Set("CronAntiDdosClearDB", DateTime.Now);

                    #region Очищаем NumberOfRequestMonth
                    foreach (var item in coreDB.AntiDdos_NumberOfRequestMonths.AsNoTracking())
                    {
                        // Если записи больше 90 дней
                        if ((DateTime.Now - item.Time).TotalDays > 90)
                        {
                            coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.AntiDdos_NumberOfRequestMonths), item.Id));
                        }
                    }
                    #endregion

                    #region Очищаем Jurnals
                    foreach (var item in coreDB.AntiDdos_Jurnals.AsNoTracking())
                    {
                        // Если записи больше 90 дней
                        if ((DateTime.Now - item.Time).TotalDays > 90)
                        {
                            coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.AntiDdos_Jurnals), item.Id));
                        }
                    }
                    #endregion

                    #region Очищаем NumberOfRequestDay + Переносим NumberOfRequestDay в NumberOfRequestMonth
                    // Хранимм дату и значение
                    var NumberOfRequestMonth = new Dictionary <int, (DateTime time, long value, int CountBlocked)>();

                    // Собираем статистику за прошлые дни
                    foreach (var item in coreDB.AntiDdos_NumberOfRequestDays.AsNoTracking())
                    {
                        // Пропускаем статистику за сегодня
                        if (item.Time.Day == DateTime.Now.Day && item.Time.Month == DateTime.Now.Month)
                        {
                            continue;
                        }

                        #region Переносим значения в NumberOfRequestMonth
                        if (NumberOfRequestMonth.TryGetValue(item.Time.Day, out (DateTime time, long value, int CountBlocked)it))
                        {
                            NumberOfRequestMonth[item.Time.Day] = (it.time, (item.value > it.value ? item.value : it.value), (item.CountBlocked + it.CountBlocked));
                        }
                        else
                        {
                            NumberOfRequestMonth.Add(item.Time.Day, (item.Time, item.value, item.CountBlocked));
                        }
                        #endregion

                        // Удаляем значения из базы
                        coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.AntiDdos_NumberOfRequestDays), item.Id));
                    }

                    // Переносим временные данные с NumberOfRequestMonth в базу
                    foreach (var item in NumberOfRequestMonth)
                    {
                        // Добовляем в базу
                        coreDB.AntiDdos_NumberOfRequestMonths.Add(new NumberOfRequestMonth()
                        {
                            Time         = item.Value.time,
                            value        = item.Value.value,
                            CountBlocked = item.Value.CountBlocked
                        });
                    }
                    #endregion

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

                    // Меняем режим доступа к SQL
                    SqlToMode.SetMode(SqlMode.ReadOrWrite);

                    // Раз в сутки
                    GC.Collect(GC.MaxGeneration);
                }
            }
            else
            {
                // Создаем кеш задним числом
                memoryCache.Set("CronAntiDdosClearDB", DateTime.Now.AddDays(-1));
            }
            #endregion

            #region Очистка IPTables/IP6Tables
            if (jsonDB.AntiDdos.BlockToIPtables)
            {
                Bash bash = new Bash();

                foreach (var comandTables in "iptables,ip6tables".Split(','))
                {
                    // Список IP
                    foreach (var line in bash.Run(comandTables + " -L INPUT -v --line-numbers | awk '{print $1,$2,$9,$12}'").Split('\n').Reverse())
                    {
                        // Разбираем строку
                        var gr = new Regex("^([0-9]+) ([^ ]+) [^ ]+ ISPCore_([^\n\r]+)$").Match(line).Groups;
                        if (string.IsNullOrWhiteSpace(gr[1].Value) || !DateTime.TryParse(gr[3].Value, out DateTime time))
                        {
                            continue;
                        }

                        // Если время блокировки истекло
                        if (DateTime.Now > time)
                        {
                            if (jsonDB.AntiDdos.ActiveLockMode)
                            {
                                if (gr[2].Value == "0")
                                {
                                    bash.Run($"{comandTables} -D INPUT {gr[1].Value}");
                                }
                                else
                                {
                                    bash.Run($"{comandTables} -Z INPUT {gr[1].Value}");
                                }
                            }
                            else
                            {
                                bash.Run($"{comandTables} -D INPUT {gr[1].Value}");
                            }
                        }
                    }
                }
            }
            #endregion

            IsRun = false;
        }
Пример #12
0
 public ApiEditAntiBot()
 {
     jsonDB = Service.Get <JsonDB>();
 }
Пример #13
0
        public static void Run(CoreDB coreDB, JsonDB jsonDB, IMemoryCache memoryCache)
        {
            if (IsRun)
            {
                return;
            }
            IsRun = true;

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

                try
                {
                    HttpClient client   = new HttpClient();
                    string     vers     = client.GetStringAsync("http://cdn.core-system.org/isp/av/vers.txt").Result;
                    string     old_vers = File.ReadAllText($"{Folders.AV}/vers.txt");
                    if (Regex.IsMatch(vers, "^[0-9]+-[0-9]+-[0-9]+([\n\r]+)?$") && vers != old_vers)
                    {
                        if (Download("ai-bolit.php", "new_ai-bolit.php") && Download("AIBOLIT-WHITELIST.db", "new_AIBOLIT-WHITELIST.db"))
                        {
                            if (File.Exists($"{Folders.AV}/ai-bolit.php"))
                            {
                                File.Delete($"{Folders.AV}/ai-bolit.php");
                            }

                            if (File.Exists($"{Folders.AV}/AIBOLIT-WHITELIST.db"))
                            {
                                File.Delete($"{Folders.AV}/AIBOLIT-WHITELIST.db");
                            }

                            File.Move($"{Folders.AV}/new_ai-bolit.php", $"{Folders.AV}/ai-bolit.php");
                            File.Move($"{Folders.AV}/new_AIBOLIT-WHITELIST.db", $"{Folders.AV}/AIBOLIT-WHITELIST.db");
                            File.WriteAllText($"{Folders.AV}/vers.txt", vers);

                            // Добовляем данные в базу
                            SqlToMode.SetMode(SqlMode.Read);
                            coreDB.Notations.Add(new Notation()
                            {
                                Category = "Обновления",
                                Msg      = "Обновлен антивирус AI-Bolit",
                                Time     = DateTime.Now,
                                More     = new List <More>()
                                {
                                    new More("Предыдущая версия", old_vers.Replace('-', '.')),
                                    new More("Текущая версия", vers.Replace('-', '.'))
                                }
                            });

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

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

            IsRun = false;
        }