public CampaignModel Add(CampaignModel campaign) { var addedCampaign = _db.Add(campaign); _db.SaveChanges(); campaign.CampaignId = addedCampaign.Entity.CampaignId; return(campaign); }
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()); }
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(); } }
/// <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); } }
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; }
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; }
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(); } } }
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; }
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; }
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; }
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; }
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; }
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("Задание добавлено на обработку"))); }