public static void CronMinutes(object ob) { if (StartCronTime > DateTime.Now.AddMinutes(-1)) { return; } try { using (CoreDB coreDB = Service.Get <CoreDB>()) { JsonDB jsonDB = Service.Get <JsonDB>(); var memoryCache = Service.Get <IMemoryCache>(); Engine.Cron.Project.Run(coreDB, jsonDB, memoryCache); // Получение новостей и списка изменений Engine.Cron.UpdateAV.Run(coreDB, jsonDB, memoryCache); // Обновление антивируса Engine.Cron.WhitePtrIP.Run(coreDB, memoryCache); // Удаляем из базы старые IP адреса Engine.RequestsFilter.Access.AccessIP.Clear(); // Очистка списка IP с разрешенным доступом Engine.Cron.Home.Run(coreDB, memoryCache); // Очистка журнала посещений Engine.Cron.Auth.Run(coreDB, jsonDB, memoryCache); // Очистка сессий Engine.Cron.AntiDdos.Run(coreDB, jsonDB, memoryCache); // Сбор статистики && очистка базы и правил IPTables Engine.Cron.Monitoring.Run(coreDB, memoryCache); // Статистика "/isp/monitoring" Engine.Base.SqlAndCache.WriteLogTo.CloseFiles(); // Закрытие потоков на файлах которые не используются Engine.Base.SqlAndCache.WriteLogTo.ZipFiles(); // Сжатие логов Engine.Cron.Notifications.Run(coreDB, jsonDB, memoryCache); // Уведомления Engine.Cron.AntiVirus.Run(coreDB); // Проверка доменов антивирусом Engine.Cron.SyncBackup.Database.Run(coreDB, memoryCache); // SyncBackup - DB Engine.Cron.SyncBackup.Files.Run(coreDB, memoryCache); // SyncBackup - IO Engine.Cron.SyncBackup.Files.ClearingTemp(memoryCache); // Очистка временных файлов } } catch (Exception ex) { Log.Write(Folders.File.SystemErrorLog, ex.ToString()); } }
public static void Run(CoreDB coreDB, JsonDB jsonDB, IMemoryCache memoryCache) { // Очистка базы от старых уведомлений if (memoryCache.TryGetValue("CronNoteClearDB", out DateTime CronDate)) { // Если дата отличается от текущей if (CronDate.Day != DateTime.Now.Day) { // Меняем режим доступа к SQL SqlToMode.SetMode(SqlMode.Read); // Создаем кеш memoryCache.Set("CronNoteClearDB", DateTime.Now); // Удаляем записи старше 180 дней foreach (var item in coreDB.Notations.AsNoTracking()) { if (DateTime.Now > item.Time.AddDays(180)) { // Удаляем заметку coreDB.Notations.RemoveAttach(coreDB, item.Id); } } // Меняем режим доступа к SQL SqlToMode.SetMode(SqlMode.ReadOrWrite); // Раз в день GC.Collect(GC.MaxGeneration); } } else { // Создаем кеш задним числом memoryCache.Set("CronNoteClearDB", DateTime.Now.AddDays(-1)); } }
// Use this for initialization void Start() { string json = "{\"db\":[{\"id\":82,\"name\":\"BEQ1530\",\"shape\":\"1\",\"size\":\"1\",\"frame\":\"0\",\"color\":\"0\",\"price\":112000,\"priceidx\":2,\"rate\":70,\"url\":\"https://s3.ap-northeast-2.amazonaws.com/cliegh2/testimage.png\"},{\"id\":83,\"name\":\"RFE2300\",\"shape\":\"1\",\"size\":\"1\",\"frame\":\"0\",\"color\":\"0\",\"price\":67000,\"priceidx\":1,\"rate\":73,\"url\":\"https://s3.ap-northeast-2.amazonaws.com/cliegh2/testimage.png\"},{\"id\":85,\"name\":\"AZD1002\",\"shape\":\"1\",\"size\":\"1\",\"frame\":\"0\",\"color\":\"0\",\"price\":30000,\"priceidx\":0,\"rate\":66,\"url\":\"/home/ubuntu/opt/pyshell/img/85.jpg\"}],\"gender\":{\"value\":\"female\",\"confidence\":0.999801},\"age\":{\"value\":\"15~19\",\"confidence\":0.565172}}"; JsonResponse response = JsonUtility.FromJson <JsonResponse>(json); for (int i = 0; i < response.db.Length; i++) { JsonDB db = response.db[i]; Debug.Log("DB " + i); Debug.Log("DB.id " + db.id); Debug.Log("DB.name " + db.name); Debug.Log("DB.shape " + db.shape); Debug.Log("DB.size " + db.size); Debug.Log("DB.frame " + db.frame); Debug.Log("DB.color " + db.color); Debug.Log("DB.price " + db.price); Debug.Log("DB.priceidx" + db.priceidx); Debug.Log("DB.rate " + db.rate); Debug.Log("DB.url " + db.url); } Debug.Log("Age: " + response.age.value + " (" + response.age.confidence + ")"); Debug.Log("Gender: " + response.gender.value + " (" + response.age.confidence + ")"); }
public DataReference(string fullID, string targetSheet, string targetId, JsonDB db) : base(fullID) { TargetSheet = targetSheet; TargetID = targetId; _db = db; }
public DataReference(string id, DataEntry owner, string targetSheet, string targetId, JsonDB db) : base(id, owner) { TargetSheet = targetSheet; TargetID = targetId; _db = db; }
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 ApiEditSettingsToService() { jsonDB = Service.Get <JsonDB>(); }
public ApiCommonAV() { jsonDB = Service.Get <JsonDB>(); }
public static void RunBlocked(JsonDB jsonDB, IMemoryCache memoryCache) { if (IsRunBlocked || BlockedIP.IsEmpty) { return; } IsRunBlocked = true; // bool BlockToIPtables = jsonDB.AntiDdos.BlockToIPtables; #region Получаем текущий список заблокированных IP string IPv4 = string.Empty; string IPv6 = string.Empty; if (BlockToIPtables) { IPv4 = new Bash().Run("iptables -L -n -v | grep \"ISPCore_\" | awk '{print $8}'"); IPv6 = new Bash().Run("ip6tables -L -n -v | grep \"ISPCore_\" | awk '{print $8}'"); } #endregion // Блокируем IP Parallel.For(0, BlockedIP.Count, new ParallelOptions { MaxDegreeOfParallelism = jsonDB.Base.CountParallel }, (index, state) => { try { if (BlockedIP.TryDequeue(out string IP)) { // IP уже заблокирован if (IPv4.Contains(IP) || IPv6.Contains(IP)) { return; } #region DNSLookup string HostName = null; try { if (jsonDB.AntiDdos.DNSLookupEnabled) { // Получаем имя хоста по IP var host = Dns.GetHostEntryAsync(IP).Result; // Получаем IP хоста по имени host = Dns.GetHostEntryAsync(host.HostName).Result; // Проверяем имя хоста и IP на совпадение if (host.AddressList.Where(i => i.ToString() == IP).FirstOrDefault() != null) { HostName = host.HostName; // Проверяем имя хоста на белый список DNSLookup if (Regex.IsMatch(host.HostName, WhiteUserList.PtrRegex, RegexOptions.IgnoreCase)) { // Добовляем IP в белый список на неделю WhitePtr.Add(IP, host.HostName, DateTime.Now.AddDays(7)); Trigger.OnAddToWhitePtr((IP, HostName, 7)); // Удаляем временное значение с кеша memoryCache.Remove($"AntiDdosCheckBlockedIP-{IP}"); return; } } } } catch { } #endregion // Добовляем IP в IPtables if (BlockToIPtables) { string comandTables = IP.Contains(":") ? "ip6tables" : "iptables"; new Bash().Run($"{comandTables} -A INPUT -s {IP} -m comment --comment \"ISPCore_{DateTime.Now.AddMinutes(jsonDB.AntiDdos.BlockingTime).ToString("yyy-MM-ddTHH:mm:00")}\" -j REJECT"); } // Trigger.OnBlockedIP((IP, HostName, jsonDB.AntiDdos.BlockingTime)); // Пишем IP в базу if (jsonDB.AntiDdos.Jurnal) { (string Country, string City, string Region)geo = ("Disabled", "Disabled", "Disabled"); if (jsonDB.AntiDdos.GeoIP) { geo = GeoIP2.City(IP); } WriteLogTo.SQL(new Jurnal() { City = geo.City, Country = geo.Country, Region = geo.Region, HostName = HostName, IP = IP, Time = DateTime.Now }); } // Обновляем кеш int BlockingTime = jsonDB.AntiDdos.BlockingTime > 10 ? 10 : jsonDB.AntiDdos.BlockingTime; memoryCache.Set($"AntiDdosCheckBlockedIP-{IP}", (byte)0, TimeSpan.FromMinutes(BlockingTime)); } }
public static void RunSecond(JsonDB jsonDB, IMemoryCache memoryCache) { if (IsRunSecond) { return; } IsRunSecond = true; try { Bash bash = new Bash(); byte second = (byte)DateTime.Now.Second; #region Максимальное значение TCP/UPD за текущий час int MaxTcpOrUpd = int.Parse(bash.Run("ss -ntu | wc -l")); // Записываем данные в кеш if (memoryCache.TryGetValue(KeyToMemoryCache.AntiDdosNumberOfRequestDay(DateTime.Now), out dataHour)) { Trigger.OnCountTcpOrUpd((MaxTcpOrUpd, dataHour.value)); if (MaxTcpOrUpd > dataHour.value) { dataHour.value = MaxTcpOrUpd; memoryCache.Set(KeyToMemoryCache.AntiDdosNumberOfRequestDay(DateTime.Now), dataHour); } } else { dataHour = new NumberOfRequestDay() { value = MaxTcpOrUpd, Time = DateTime.Now }; memoryCache.Set(KeyToMemoryCache.AntiDdosNumberOfRequestDay(DateTime.Now), dataHour); Trigger.OnCountTcpOrUpd((MaxTcpOrUpd, dataHour.value)); } #endregion #region Получаем список IP которые нужно заблокировать List <string> MassIP = new List <string>(); // Количиство активных соеденений MassIP.AddRange(bash.Run(@"ss -ntu | awk '{print $6}' | sed 's%\:[0-9]*$%%g' | sed 's%\:\:ffff\:\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)%\1%g' | sort | uniq -ic | awk '{if ($1 >= " + jsonDB.AntiDdos.MaximumBurstSize + ") {print $2}}'").Split('\n')); // Максимальное количество запросов за 120 секунд if (!memoryCache.TryGetValue("Cron_AntiDdos-tcpdump", out _)) { // Создаем кеш на 120 секунд memoryCache.Set("Cron_AntiDdos-tcpdump", (byte)0, TimeSpan.FromSeconds(120)); // Убиваем tcpdump bash.Run("pkill tcpdump"); // Считываем файл MassIP.AddRange(bash.Run(@"awk '{if ($6 > 0) {print $2}}' " + Folders.Log + @"/tcpdump.log | sed 's%\.[0-9]*$%%g' | sed 's%\:\:ffff\:\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)%\1%g' | sort | uniq -ic | awk '{if ($1 >= " + jsonDB.AntiDdos.NumberOfRequestsIn120Second + ") {print $2}}'").Split('\n')); // Запускаем tcpdump bash.Run($"tcpdump -i {jsonDB.AntiDdos.Interface} -nnpqSt dst port {string.Join(" or dst port ", jsonDB.AntiDdos.CheckPorts.Split(','))} > {Folders.Log}/tcpdump.log 2> /dev/null &"); } #endregion #region Блокируем IP foreach (var IP in MassIP) { // IP в белом списке if (string.IsNullOrWhiteSpace(IP) || IsWhiteIP(jsonDB, memoryCache, IP)) { continue; } // Блокируем IP Blocked(memoryCache, Regex.Replace(IP, "[\n\r\t ]+", "")); } #endregion } catch { } IsRunSecond = false; }
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 ApiEditAntiBot() { jsonDB = Service.Get <JsonDB>(); }
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; }