Пример #1
0
        public CampaignModel Add(CampaignModel campaign)
        {
            var addedCampaign = _db.Add(campaign);

            _db.SaveChanges();
            campaign.CampaignId = addedCampaign.Entity.CampaignId;

            return(campaign);
        }
Пример #2
0
        public ProductModel Add(ProductModel product)
        {
            var addedProduct = _db.Add(product);

            _db.SaveChanges();
            //product.ProductCode = addedProduct.Entity.ProductCode;

            return(product);
        }
        public override IHttpActionResult Patch(Guid id, [FromBody] JObject model)
        {
            using (CoreDB db = new CoreDB(UserK))
            {
                db.SaveChanges();
            }

            return(Ok());
        }
Пример #4
0
        public void OrderLogic(OrderModel order)
        {
            var product = _productRepository.GetByProductCode(order.ProductCode);

            if (product == null)
            {
                //null id
            }
            else
            {
                if (product.Stock > order.Quantity)
                {
                    product.Stock = product.Stock - order.Quantity;
                    order.Status  = true;

                    //first campaign picked.
                    var campaign = _db.Campaign.SingleOrDefault(x => x.ProductCode == product.ProductCode && x.Status == true);
                    if (campaign == null)
                    {
                        //productPrice is same.
                        //order has no campaign
                        order.CampaignId = 0;
                    }
                    else
                    {
                        //productPrice decreased with campaign's limit.
                        product.Price    = product.Price - (product.Price / campaign.PriceManipulationLimit);
                        order.CampaignId = campaign.CampaignId;
                    }
                    _productRepository.Update(product);
                }
                else
                {
                    //productStock is insufficient.
                    order.Status = false;
                }
                order.Price = product.Price;
                _db.Add(order);
                _db.SaveChanges();
            }
        }
Пример #5
0
        /// <summary>
        /// Удалить запись
        /// </summary>
        /// <typeparam name="T">Тип данных</typeparam>
        /// <param name="db">Таблица</param>
        /// <param name="coreDB">База</param>
        /// <param name="Id">Id записи</param>
        public static bool RemoveAttach <T>(this DbSet <T> db, CoreDB coreDB, int Id) where T : class, IId, new()
        {
            try
            {
                // Получаем данные
                var item = new T()
                {
                    Id = Id
                };
                db.Attach(item);

                // Удаляем данные
                db.Remove(item);

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

                // Отдаем результат
                return(true);
            }
            catch { return(false); }
        }
Пример #6
0
        public static void Run(CoreDB coreDB, IMemoryCache memoryCache)
        {
            if (IsRun)
            {
                return;
            }
            IsRun = true;

            #region IspNumberOfRequestToHour
            // Если есть кеш за прошлый час
            var TimeIspNumberOfRequestDay = DateTime.Now.AddHours(-1);
            if (memoryCache.TryGetValue(KeyToMemoryCache.IspNumberOfRequestToHour(TimeIspNumberOfRequestDay), out IDictionary <string, NumberOfRequestHour> DataNumberOfRequestToHour))
            {
                SqlToMode.SetMode(SqlMode.Read);
                coreDB.ChangeTracker.AutoDetectChangesEnabled = false;

                // Записываем данные в базу
                foreach (var item in DataNumberOfRequestToHour)
                {
                    coreDB.RequestsFilter_NumberOfRequestDay.Add(new NumberOfRequestDay()
                    {
                        Host     = item.Key,
                        Time     = TimeIspNumberOfRequestDay,
                        Count200 = item.Value.Count200,
                        Count303 = item.Value.Count303,
                        Count401 = item.Value.Count401,
                        Count403 = item.Value.Count403,
                        Count500 = item.Value.Count500,
                        Count2FA = item.Value.Count2FA,
                    });
                }

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

                // Разрешаем записывать данные в SQL
                SqlToMode.SetMode(SqlMode.ReadOrWrite);
                coreDB.ChangeTracker.AutoDetectChangesEnabled = true;

                // Сносим кеш (статистика за час)
                memoryCache.Remove(KeyToMemoryCache.IspNumberOfRequestToHour(TimeIspNumberOfRequestDay));

                // Раз в час
                GC.Collect(GC.MaxGeneration);
            }
            #endregion

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

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

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

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

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

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

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

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

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

                    #region Переносим NumberOfRequestDay в NumberOfRequestMonth
                    // Хранимм дату и значение
                    Dictionary <int, NumberOfRequestBase> NumberOfRequestMonth = new Dictionary <int, NumberOfRequestBase>();

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

                        #region Переносим значения в NumberOfRequestMonth
                        if (NumberOfRequestMonth.TryGetValue(item.Time.Day, out NumberOfRequestBase it))
                        {
                            it.Count200 += item.Count200;
                            it.Count303 += item.Count303;
                            it.Count403 += item.Count403;
                            it.Count401 += item.Count401;
                            it.Count500 += item.Count500;
                            it.Count2FA += item.Count2FA;
                        }
                        else
                        {
                            NumberOfRequestMonth.Add(item.Time.Day, item);
                        }
                        #endregion

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

                    // Переносим временные данные с NumberOfRequestMonth в базу
                    foreach (var item in NumberOfRequestMonth)
                    {
                        // Добовляем в базу
                        coreDB.RequestsFilter_NumberOfRequestMonth.Add(new NumberOfRequestMonth()
                        {
                            Time        = item.Value.Time,
                            allRequests = item.Value.Count200 + item.Value.Count303 + item.Value.Count403 + item.Value.Count500 + item.Value.Count401 + item.Value.Count2FA,
                            Count200    = item.Value.Count200,
                            Count303    = item.Value.Count303,
                            Count401    = item.Value.Count401,
                            Count403    = item.Value.Count403,
                            Count500    = item.Value.Count500,
                            Count2FA    = item.Value.Count2FA,
                        });
                    }
                    #endregion

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

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

            IsRun = false;
        }
Пример #7
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;
        }
Пример #8
0
        public static void ISPCore()
        {
            using (CoreDB coreDB = Service.Get <CoreDB>())
            {
                // Версия базы
                if (coreDB.Version.AsNoTracking().LastOrDefault() is LatestVersion vSql)
                {
                    // Версия базы совпадает
                    if (vSql.ToString() == Startup.vSql.ToString())
                    {
                        return;
                    }


                    #region Миграция SQL
                    switch (vSql.Version)
                    {
                        #region Первая версия базы
                    case 1.9:
                    {
                        coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_Aliases] ADD [Folder] TEXT NULL ;");
                        vSql.Patch = 1;
                        goto case 0.0;
                    }
                        #endregion

                        #region case 0.0
                    case 0.0:
                    {
                        switch (vSql.Patch)
                        {
                        case 1:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_ConfToLog] ADD [Jurn200] BIGINT DEFAULT 0 NOT NULL ;");
                            goto case 2;
                        }

                            #region case 2
                        case 2:
                        {
                            #region Журнал 200
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [RequestsFilter_Jurnals200] (
  [Id] INTEGER  NOT NULL
, [City] text NULL
, [Country] text NULL
, [FormData] text NULL
, [Host] text NULL
, [IP] text NULL
, [Method] text NULL
, [Referer] text NULL
, [Region] text NULL
, [Time] text NOT NULL
, [Uri] text NULL
, [UserAgent] text NULL
, [typeJurn] bigint  NOT NULL
, CONSTRAINT [sqlite_master_PK_RequestsFilter_Jurnals200] PRIMARY KEY ([Id])
);");
                            #endregion

                            // Удаляем старые базы
                            coreDB.Database.ExecuteSqlCommand("DROP TABLE [RequestsFilter_NumberOfRequestDay];");
                            coreDB.Database.ExecuteSqlCommand("DROP TABLE [RequestsFilter_NumberOfRequestMonth];");

                            #region Статистика запросов - сутки
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [RequestsFilter_NumberOfRequestDay] (
  [Id] INTEGER  NOT NULL
, [Count200] bigint  NOT NULL
, [Count2FA] bigint  NOT NULL
, [Count303] bigint  NOT NULL
, [Count401] bigint  NOT NULL
, [Count403] bigint  NOT NULL
, [Count500] bigint  NOT NULL
, [Host] text NULL
, [Time] text NOT NULL
, CONSTRAINT [sqlite_master_PK_RequestsFilter_NumberOfRequestDay] PRIMARY KEY ([Id])
);");
                            #endregion

                            #region Статистика запросов - месяц
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [RequestsFilter_NumberOfRequestMonth] (
  [Id] INTEGER  NOT NULL
, [Count200] bigint  NOT NULL
, [Count2FA] bigint  NOT NULL
, [Count303] bigint  NOT NULL
, [Count401] bigint  NOT NULL
, [Count403] bigint  NOT NULL
, [Count500] bigint  NOT NULL
, [Time] text NOT NULL
, [allRequests] bigint  NOT NULL
, CONSTRAINT [sqlite_master_PK_RequestsFilter_NumberOfRequestMonth] PRIMARY KEY ([Id])
);");
                            #endregion

                            // Успех
                            goto case 3;
                        }
                            #endregion

                            #region case 3
                        case 3:
                        {
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [WhitePtrIPs] (
  [Id] INTEGER  NOT NULL
, [Expires] text NOT NULL
, [IPv4Or6] text NULL
, CONSTRAINT [sqlite_master_PK_WhitePtrIPs] PRIMARY KEY ([Id])
);");
                            goto case 4;
                        }
                            #endregion

                        case 4:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_LimitRequest] ADD [UseGlobalConf] BIGINT DEFAULT 0 NOT NULL ;");
                            goto case 5;
                        }

                        case 5:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domains] ADD [Auth2faToAccess] BIGINT DEFAULT 0 NOT NULL ;");
                            goto case 6;
                        }

                            #region case 6
                        case 6:
                        {
                            #region Новая таблица AntiBot
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [RequestsFilter_Domain_AntiBot] (
                                                      [Id] INTEGER  NOT NULL
                                                    , [AddCodeToHtml] text NULL
                                                    , [DomainId] bigint  NOT NULL
                                                    , [UseGlobalConf] bigint  NOT NULL
                                                    , [FirstSkipToBot] bigint  NOT NULL
                                                    , [HourCacheToBot] bigint  NOT NULL
                                                    , [HourCacheToUser] bigint  NOT NULL
                                                    , [RewriteToOriginalDomain] bigint  NOT NULL
                                                    , [WaitUser] bigint  NOT NULL
                                                    , [type] bigint  NOT NULL
                                                    , CONSTRAINT [sqlite_master_PK_RequestsFilter_Domain_AntiBot] PRIMARY KEY ([Id])
                                                    , FOREIGN KEY ([DomainId]) REFERENCES [RequestsFilter_Domains] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION
                                                    );
                                                    CREATE UNIQUE INDEX [IX_RequestsFilter_Domain_AntiBot_DomainId] ON [RequestsFilter_Domain_AntiBot] ([DomainId] ASC);
                                                ");
                            #endregion

                            #region Удаляем поле AntiBot в таблице RequestsFilter_Domain
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [table_temp_05032018] (
                                                      [Id] INTEGER  NOT NULL
                                                    , [Protect] bigint  NOT NULL
                                                    , [StopBruteForce] bigint  NOT NULL
                                                    , [host] text NULL
                                                    , [typeBlockIP] bigint  NOT NULL
                                                    , [Auth2faToAccess] bigint DEFAULT 0  NOT NULL
                                                    , CONSTRAINT [sqlite_master_PK_RequestsFilter_Domains] PRIMARY KEY ([Id])
                                                    );

                                                    INSERT INTO [table_temp_05032018] SELECT [id], [Protect], [StopBruteForce], [host], [typeBlockIP], [Auth2faToAccess] FROM [RequestsFilter_Domains];
                                                    ALTER TABLE [RequestsFilter_Domains] RENAME TO [migrate_05032018];
                                                    ALTER TABLE [table_temp_05032018] RENAME TO [RequestsFilter_Domains];
                                                ");
                            #endregion

                            #region Делаем привязку к таблице AntiBot
                            int ColumnId = 1;
                            foreach (var domain in coreDB.RequestsFilter_Domains.AsNoTracking())
                            {
                                coreDB.Database.ExecuteSqlCommand($@"INSERT INTO [RequestsFilter_Domain_AntiBot]
                                                        ([Id]
                                                        ,[AddCodeToHtml]
                                                        ,[DomainId]
                                                        ,[UseGlobalConf]
                                                        ,[FirstSkipToBot]
                                                        ,[HourCacheToBot]
                                                        ,[HourCacheToUser]
                                                        ,[RewriteToOriginalDomain]
                                                        ,[WaitUser]
                                                        ,[type]) 
                                                        VALUES ({ColumnId},null,{domain.Id},0,1,216,12,1,2800,0);
                                                    ");

                                ColumnId++;
                            }
                            #endregion

                            goto case 7;
                        }
                            #endregion

                            #region case 7
                        case 7:
                        {
                            coreDB.Database.ExecuteSqlCommand("UPDATE SQLITE_SEQUENCE SET SEQ=200 WHERE NAME='RequestsFilter_Domains';");
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [RequestsFilter_Domain_RuleReplaces] (
                                                      [Id] INTEGER  NOT NULL
                                                    , [ContentType] text NULL
                                                    , [DomainId] bigint  NOT NULL
                                                    , [GetArgs] text NULL
                                                    , [IsActive] bigint  NOT NULL
                                                    , [PostArgs] text NULL
                                                    , [RegexWhite] text NULL
                                                    , [ResponceUri] text NULL
                                                    , [TypeResponse] bigint  NOT NULL
                                                    , [kode] text NULL
                                                    , [uri] text NULL
                                                    , CONSTRAINT [sqlite_master_PK_RequestsFilter_Domain_RuleReplaces] PRIMARY KEY ([Id])
                                                    , FOREIGN KEY ([DomainId]) REFERENCES [RequestsFilter_Domains] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION
                                                    );
                                                    CREATE INDEX [IX_RequestsFilter_Domain_RuleReplaces_DomainId] ON [RequestsFilter_Domain_RuleReplaces] ([DomainId] ASC);
                                                ");
                            goto case 8;
                        }
                            #endregion

                            #region case 8
                        case 8:
                        {
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [RequestsFilter_Template_RuleReplaces] (
                                                  [Id] INTEGER  NOT NULL
                                                , [ContentType] text NULL
                                                , [GetArgs] text NULL
                                                , [IsActive] bigint  NOT NULL
                                                , [PostArgs] text NULL
                                                , [RegexWhite] text NULL
                                                , [ResponceUri] text NULL
                                                , [TemplateId] bigint  NOT NULL
                                                , [TypeResponse] bigint  NOT NULL
                                                , [kode] text NULL
                                                , [uri] text NULL
                                                , CONSTRAINT [sqlite_master_PK_RequestsFilter_Template_RuleReplaces] PRIMARY KEY ([Id])
                                                , FOREIGN KEY ([TemplateId]) REFERENCES [RequestsFilter_Templates] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION
                                                );
                                                CREATE INDEX [IX_RequestsFilter_Template_RuleReplaces_TemplateId] ON [RequestsFilter_Template_RuleReplaces] ([TemplateId] ASC);
                                            ");

                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [RequestsFilter_Template_RuleOverrides] (
                                                  [Id] INTEGER  NOT NULL
                                                , [IsActive] bigint  NOT NULL
                                                , [Method] bigint  NOT NULL
                                                , [TemplateId] bigint  NOT NULL
                                                , [order] bigint  NOT NULL
                                                , [rule] text NULL
                                                , CONSTRAINT [sqlite_master_PK_RequestsFilter_Template_RuleOverrides] PRIMARY KEY ([Id])
                                                , FOREIGN KEY ([TemplateId]) REFERENCES [RequestsFilter_Templates] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION
                                                );
                                                CREATE INDEX [IX_RequestsFilter_Template_RuleOverrides_TemplateId] ON [RequestsFilter_Template_RuleOverrides] ([TemplateId] ASC);
                                            ");

                            goto case 9;
                        }
                            #endregion

                        case 9:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_AntiBot] ADD [BackgroundCheck] BIGINT DEFAULT 0 NOT NULL ;");
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_AntiBot] ADD [CountBackgroundRequest] BIGINT DEFAULT 2 NOT NULL ;");
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_AntiBot] ADD [BackgroundCheckToAddExtensions] TEXT NULL ;");
                            break;
                        }
                        }

                        // Миграция на 0.1.*
                        vSql.Patch = 0;
                        goto case 0.1;
                    }
                        #endregion

                    case 0.1:
                    {
                        switch (vSql.Patch)
                        {
                        case 0:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_AntiBot] ADD [BackgroundHourCacheToIP] BIGINT DEFAULT 0 NOT NULL ;");
                            goto case 1;
                        }

                        case 1:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_LimitRequest] ADD [BlockType] BIGINT DEFAULT 0 NOT NULL ;");
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_LimitRequest] ADD [MaxRequestToAgainСheckingreCAPTCHA] BIGINT DEFAULT 300 NOT NULL ;");
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domains] ADD [Auth2faToPasswd] TEXT NULL ;");
                            goto case 2;
                        }

                        case 2:
                        {
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [Auth_Sessions] (
                                                  [Id] INTEGER  NOT NULL
                                                , [Confirm2FA] bigint  NOT NULL
                                                , [Expires] text NOT NULL
                                                , [HashPasswdToRoot] text NULL
                                                , [IP] text NULL
                                                , [Session] text NULL
                                                , CONSTRAINT [sqlite_master_PK_Auth_Sessions] PRIMARY KEY ([Id])
                                                );
                                            ");
                            goto case 3;
                        }

                        case 3:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [Auth_Sessions] ADD [CreateTime] TEXT DEFAULT [2018-04-24 10:57:30.9735464] NOT NULL ;");
                            goto case 4;
                        }

                            #region case 4
                        case 4:
                        {
                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [SyncBackup_db_Tasks] (
                                                  [Id] INTEGER  NOT NULL
                                                , [Description] text NULL
                                                , [JobStatus] bigint  NOT NULL
                                                , [LastSync] text NOT NULL
                                                , [SuncTime] bigint  NOT NULL
                                                , [TypeDb] bigint  NOT NULL
                                                , CONSTRAINT [sqlite_master_PK_SyncBackup_db_Tasks] PRIMARY KEY ([Id])
                                                );
                                            ");

                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [SyncBackup_db_Task_Conf] (
                                                  [Id] INTEGER  NOT NULL
                                                , [AddBackupTime] bigint  NOT NULL
                                                , [Compression] bigint  NOT NULL
                                                , [DumpDatabases] text NULL
                                                , [IgnoreDatabases] text NULL
                                                , [TaskId] bigint  NOT NULL
                                                , [Whence] text NULL
                                                , CONSTRAINT [sqlite_master_PK_SyncBackup_db_Task_Conf] PRIMARY KEY ([Id])
                                                , FOREIGN KEY ([TaskId]) REFERENCES [SyncBackup_db_Tasks] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION
                                                );
                                                CREATE UNIQUE INDEX [IX_SyncBackup_db_Task_Conf_TaskId] ON [SyncBackup_db_Task_Conf] ([TaskId] ASC);
                                            ");

                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [SyncBackup_db_Task_MySQL] (
                                                  [Id] INTEGER  NOT NULL
                                                , [Host] text NULL
                                                , [Password] text NULL
                                                , [Port] bigint  NOT NULL
                                                , [TaskId] bigint  NOT NULL
                                                , [User] text NULL
                                                , CONSTRAINT [sqlite_master_PK_SyncBackup_db_Task_MySQL] PRIMARY KEY ([Id])
                                                , FOREIGN KEY ([TaskId]) REFERENCES [SyncBackup_db_Tasks] ([Id]) ON DELETE CASCADE ON UPDATE NO ACTION
                                                );
                                                CREATE UNIQUE INDEX [IX_SyncBackup_db_Task_MySQL_TaskId] ON [SyncBackup_db_Task_MySQL] ([TaskId] ASC);
                                            ");

                            coreDB.Database.ExecuteSqlCommand(@"CREATE TABLE [SyncBackup_db_Reports] (
                                                  [Id] INTEGER  NOT NULL
                                                , [Category] text NULL
                                                , [ErrorMsg] text NULL
                                                , [Msg] text NULL
                                                , [Status] text NULL
                                                , [TaskId] bigint  NOT NULL
                                                , [Time] text NOT NULL
                                                , CONSTRAINT [sqlite_master_PK_SyncBackup_db_Reports] PRIMARY KEY ([Id])
                                                );
                                            ");

                            goto case 5;
                        }
                            #endregion

                        case 5:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE SyncBackup_db_Task_MySQL RENAME TO SyncBackup_db_Task_ConnectionConf;");
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE SyncBackup_db_Task_Conf RENAME TO SyncBackup_db_Task_DumpConf;");
                            goto case 6;
                        }

                        case 6:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [WhitePtrIPs] ADD [PTR] TEXT NULL ;");
                            goto case 7;
                        }

                        case 7:
                        {
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_NumberOfRequestDay] ADD [CountIPtables] BIGINT DEFAULT 0 NOT NULL ;");
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_NumberOfRequestMonth] ADD [CountIPtables] BIGINT DEFAULT 0 NOT NULL ;");
                            coreDB.Database.ExecuteSqlCommand("ALTER TABLE [RequestsFilter_Domain_AntiBot] ADD [HashKey] TEXT NULL ;");
                            goto case 8;
                        }

                        case 8:
                        {
                            // Миграция на 9
                            //goto case 9;
                            break;
                        }
                        }
                        break;
                    }
                    }
                    #endregion

                    // Сохраняем версию базы
                    coreDB.Version.Add(Startup.vSql);
                    coreDB.SaveChanges();
                }
            }
        }
Пример #9
0
        public static void Run(CoreDB coreDB, IMemoryCache memoryCache)
        {
            if (IsRun)
            {
                return;
            }
            IsRun = true;

            #region Очистка базы 'Операции' и папки 'ReportSync'
            if (memoryCache.TryGetValue("CronSyncBackupIO:ClearDB", out DateTime CronSyncBackupClearDB))
            {
                // Если дата отличается от текущей
                if (CronSyncBackupClearDB.Day != DateTime.Now.Day)
                {
                    // Меняем режим доступа к SQL
                    SqlToMode.SetMode(SqlMode.Read);

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

                    // Чистим базу
                    foreach (var note in coreDB.SyncBackup_Notations.AsNoTracking())
                    {
                        // Если записи больше 90 дней
                        if ((DateTime.Now - note.Time).TotalDays > 90)
                        {
                            // Удаляем заметку
                            coreDB.SyncBackup_Notations.RemoveAttach(coreDB, note.Id);
                        }
                    }

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

                    // Удаляем старые файлы
                    foreach (var intFile in Directory.GetFiles(Folders.ReportSync, "*.*"))
                    {
                        try
                        {
                            if ((DateTime.Now - File.GetLastWriteTime(intFile)).TotalDays > 90)
                            {
                                File.Delete(intFile);
                            }
                        }
                        catch { }
                    }

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

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

            // Получаем весь список заданий
            var Alltasks = coreDB.SyncBackup_Tasks.Include(f => f.FTP).Include(o => o.OneDrive).Include(dav => dav.WebDav).Include(ignr => ignr.IgnoreFileOrFolders).ToList();

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

            // Проходим задания
            foreach (var task in Alltasks)
            {
                // Пропускаем задания которые не требуют выполнения
                if (task.JobStatus != JobStatus.on || task.LastSync > DateTime.Now.AddMinutes(-task.SuncTime))
                {
                    continue;
                }

                // Кеш
                DateTime NewCacheSync = DateTime.Now;
                bool     IsOk         = false;

                #region Добовляем задание в WorkNote
                CancellationToken cancellationToken = new CancellationToken();
                var WorkNoteNotation = new Notation()
                {
                    TaskId   = task.Id,
                    Category = "Бэкап",
                    Msg      = $"Задание: {task.Description}",
                    Time     = DateTime.Now,
                    More     = new List <More>()
                    {
                        new More("Состояние", "Выполняется")
                    }
                };
                CoreDB.SyncBackupWorkNote.Add(WorkNoteNotation, cancellationToken);
                #endregion

                // Обновляем CacheSync
                if (task.CacheSync > task.CacheExpires)
                {
                    SqlToMode.SetMode(SqlMode.Read);
                    task.CacheSync    = default(DateTime);
                    task.CacheExpires = DateTime.Now.AddDays(12);
                    coreDB.SaveChanges();
                    SqlToMode.SetMode(SqlMode.ReadOrWrite);
                }

                //
                Trigger.OnStartJob((task.Id, task.TypeSunc));

                // Создание отчета по ошибкам
                Report report = new Report(task);

                // Выполняем задание
                Sync(task, new RemoteServer(task.TypeSunc, task.FTP, task.WebDav, task.OneDrive, report, out string NewRefreshTokenToOneDrive), WorkNoteNotation, out List <More> ResponseNameAndValue, ref IsOk);

                // Сохраняем отчет об ошибках (если есть ошибки)
                report.SaveAndDispose(ref ResponseNameAndValue);

                // Чистим WorkNote
                CoreDB.SyncBackupWorkNote.Take(cancellationToken);

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

                // Добовляем задание в список завершеных операций
                coreDB.SyncBackup_Notations.Add(new Notation()
                {
                    TaskId   = task.Id,
                    Category = "Бэкап",
                    Msg      = $"Задание: {task.Description}",
                    Time     = DateTime.Now,
                    More     = ResponseNameAndValue,
                });

                // Завершаем задание
                if (IsOk)
                {
                    task.LastSync  = DateTime.Now;
                    task.CacheSync = NewCacheSync;
                }

                // Меняем токен
                if (!string.IsNullOrWhiteSpace(NewRefreshTokenToOneDrive))
                {
                    task.OneDrive.RefreshToken = NewRefreshTokenToOneDrive;
                }

                coreDB.SaveChanges();

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

                //
                Trigger.OnStopJob((task.Id, task.TypeSunc, IsOk));
            }

            IsRun = false;
        }
Пример #10
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;
        }
Пример #11
0
        public static void Run(CoreDB coreDB, IMemoryCache memoryCache)
        {
            if (IsRun)
            {
                return;
            }
            IsRun = true;

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

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

                    // Чистим базу
                    foreach (var note in coreDB.SyncBackup_db_Reports.AsNoTracking())
                    {
                        // Если записи больше 90 дней
                        if ((DateTime.Now - note.Time).TotalDays > 90)
                        {
                            // Удаляем отчет
                            coreDB.SyncBackup_db_Reports.RemoveAttach(coreDB, note.Id);
                        }
                    }

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

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

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

            // Получаем весь список заданий
            var Alltasks = coreDB.SyncBackup_db_Tasks.Include(i => i.DumpConf).Include(i => i.ConnectionConf).ToList();

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

            // Проходим задания
            foreach (Task task in Alltasks)
            {
                // Пропускаем задания которые не требуют выполнения
                if (task.JobStatus != JobStatus.on || task.LastSync > DateTime.Now.AddMinutes(-task.SuncTime))
                {
                    continue;
                }

                //
                Trigger.OnStartJob((task.Id, task.TypeDb));

                // Выполняем задание
                Dump(task, out bool IsOk, out string ErrorMsg);

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

                // Добовляем задание в список завершеных операций
                coreDB.SyncBackup_db_Reports.Add(new Report()
                {
                    TaskId   = task.Id,
                    Category = $"{task.TypeDb.ToString()}",
                    Msg      = $"Задание: {task.Description}",
                    Time     = DateTime.Now,
                    Status   = IsOk ? "Задание выполнено без ошибок" : "Задание выполнено с ошибками",
                    ErrorMsg = ErrorMsg,
                });

                // Завершаем задание
                task.LastSync = DateTime.Now;
                coreDB.SaveChanges();

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

                //
                Trigger.OnStopJob((task.Id, task.TypeDb, IsOk, ErrorMsg));
            }

            IsRun = false;
        }
Пример #12
0
        public static void Run(CoreDB coreDB)
        {
            if (IsRun)
            {
                return;
            }
            IsRun = true;

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

            // Получаем весь список заданий
            var Alltasks = coreDB.RequestsFilter_Domains.Where(i => i.av.JobStatus == JobStatus.on && DateTime.Now.AddMinutes(-i.av.CheckEveryToMinute) > i.av.LastRun).Include(i => i.av).Include(i => i.Aliases).ToList();

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

            // Проходим задания
            foreach (var task in Alltasks)
            {
                // Нету PHP
                if (!File.Exists(task.av.php))
                {
                    continue;
                }

                #region Локальный метод - "RunAV"
                void RunAV(string progress_id)
                {
                    #region Создаем команду
                    StringBuilder comand = new StringBuilder();
                    comand.Append($"--path={task.av.path} ");

                    if (!string.IsNullOrWhiteSpace(task.av.skip))
                    {
                        comand.Append($"--skip={task.av.skip} ");
                    }

                    if (!string.IsNullOrWhiteSpace(task.av.scan))
                    {
                        comand.Append($"--scan={task.av.scan} ");
                    }

                    comand.Append($"--mode={task.av.mode} ");
                    comand.Append($"--memory={task.av.memory}M ");
                    comand.Append($"--size={task.av.size}K ");
                    comand.Append($"--delay={task.av.delay} ");
                    #endregion

                    // Имя отчета
                    string report = $"{Models.Security.AntiVirus.name}_{Models.Security.AntiVirus.vers}_{DateTime.Now.ToString("HH-mm_dd-MM-yyy")}{task.av.path.Replace("/", "_-_")}";

                    // Запускаем процесс bash
                    Bash bash = new Bash();
                    bash.Run($"{task.av.php} {Folders.AV}/ai-bolit.php {comand.ToString()} --progress={Folders.AV}/progress_id-{progress_id}.json --report={Folders.ReportsAV}/{report}.html >/dev/null 2>/dev/null");
                }

                #endregion

                // Проверяем папки алиасов
                foreach (var alias in task.Aliases)
                {
                    if (string.IsNullOrWhiteSpace(alias.Folder))
                    {
                        continue;
                    }

                    RunAV($"{task.Id}.{alias.Id}");
                }

                // Задание самого домена
                RunAV(task.Id.ToString());

                // Обновляем LastRun
                SqlToMode.SetMode(SqlMode.Read);
                task.av.LastRun = DateTime.Now;
                coreDB.SaveChanges();
                SqlToMode.SetMode(SqlMode.ReadOrWrite);
            }

            IsRun = false;
        }
Пример #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;
        }
Пример #14
0
        public JsonResult Recovery(Task task, TypeRecovery typeRecovery, IDictionary <string, string> nameAndValue, bool IsAPI = false)
        {
            #region Демо режим
            if (Platform.IsDemo)
            {
                return(Json(new Text("Операция недоступна в демо-режиме")));
            }
            #endregion

            DateTime DateRecovery = default(DateTime);

            #region Проверка данных
            if (string.IsNullOrWhiteSpace(task.Description))
            {
                return(Json(new Text("Имя задания не может быть пустым")));
            }

            if (string.IsNullOrWhiteSpace(task.Whence))
            {
                return(Json(new Text("Локальный каталог не может быть пустым")));
            }

            if (string.IsNullOrWhiteSpace(task.Where))
            {
                return(Json(new Text("Удаленный каталог не может быть пустым")));
            }

            switch (task.TypeSunc)
            {
            case TypeSunc.SFTP:
            case TypeSunc.FTP:
            {
                if (string.IsNullOrWhiteSpace(task.FTP.HostOrIP) || string.IsNullOrWhiteSpace(task.FTP.Login) || string.IsNullOrWhiteSpace(task.FTP.Passwd))
                {
                    return(Json(new Text("Настройки 'FTP/SFTP' имеют недопустимое значение")));
                }
                break;
            }

            case TypeSunc.WebDav:
            {
                if (string.IsNullOrWhiteSpace(task.WebDav.url) || string.IsNullOrWhiteSpace(task.WebDav.Login) || string.IsNullOrWhiteSpace(task.WebDav.Passwd))
                {
                    return(Json(new Text("Настройки 'WebDav' имеют недопустимое значение")));
                }
                break;
            }

            case TypeSunc.OneDrive:
            {
                if (string.IsNullOrWhiteSpace(task.OneDrive.ApplicationId) || string.IsNullOrWhiteSpace(task.OneDrive.RefreshToken))
                {
                    return(Json(new Text("Настройки 'OneDrive' имеют недопустимое значение")));
                }
                break;
            }
            }

            if (task.EncryptionAES && string.IsNullOrWhiteSpace(task.PasswdAES))
            {
                return(Json(new Text("Пароль для шифрования файлов не может быть пустым")));
            }

            if (typeRecovery == TypeRecovery.Date && nameAndValue.TryGetValue("TypeRecoveryToDate", out string DateRecoveryTostring) && !DateTime.TryParse(DateRecoveryTostring, out DateRecovery))
            {
                return(Json(new Text("Отметка бэкапа имеет неправильный формат")));
            }
            #endregion

            // Искать файлы только в текущем каталоге
            bool SearchToCurrentDirectory = false;
            if (nameAndValue.TryGetValue("SearchOption", out string SearchOption) && SearchOption == "CurrentDirectory")
            {
                SearchToCurrentDirectory = true;
            }

            // Выполняем задание в потоке
            ThreadPool.QueueUserWorkItem(ob =>
            {
                #region Добовляем задание в WorkNote
                CancellationToken cancellationToken = new CancellationToken();
                var WorkNoteNotation = new Notation()
                {
                    TaskId   = task.Id,
                    Category = "Восстановление",
                    Msg      = $"Задание: {task.Description}",
                    Time     = DateTime.Now,
                    More     = new List <More>()
                    {
                        new More("Состояние", "Выполняется поиск всех папок")
                    }
                };
                CoreDB.SyncBackupWorkNote.Add(WorkNoteNotation, cancellationToken);
                #endregion

                // Создание отчета по ошибкам
                Report report = new Report(task);

                // Выполняем задание
                Tools.Recovery(task, new RemoteServer(task.TypeSunc, task.FTP, task.WebDav, task.OneDrive, report, out _), WorkNoteNotation, out List <More> ResponseNameAndValue, typeRecovery, DateRecovery, SearchToCurrentDirectory);

                // Сохраняем отчет об ошибках (если есть ошибки)
                report.SaveAndDispose(ref ResponseNameAndValue);

                // Чистим WorkNote
                CoreDB.SyncBackupWorkNote.Take(cancellationToken);

                #region Сохраняем данные задание в базе
                SqlToMode.SetMode(SqlMode.Read);
                using (CoreDB coreDB = Service.Get <CoreDB>())
                {
                    // Добовляем задание в список завершеных операций
                    coreDB.SyncBackup_Notations.Add(new Notation()
                    {
                        TaskId   = task.Id,
                        Category = "Восстановление",
                        Msg      = $"Задание: {task.Description}",
                        Time     = DateTime.Now,
                        More     = ResponseNameAndValue,
                    });

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

            // Отдаем ответ
            if (IsAPI)
            {
                return(Json(new TrueOrFalse(true)));
            }
            return(Json(new Text("Задание добавлено на обработку")));
        }