From 287302df7f92db9e6279795192afdc0f7343a141 Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Sat, 23 Mar 2024 04:51:59 +0800 Subject: [PATCH] cleanup check --- app/Console/Kernel.php | 15 ++++ .../SettingResource/Pages/EditSetting.php | 4 + app/Http/Middleware/Locale.php | 6 ++ app/Jobs/CheckCleanup.php | 39 +++++++++ app/Models/Avp.php | 8 ++ app/Models/User.php | 2 +- app/Providers/EventServiceProvider.php | 3 - app/Repositories/CleanupRepository.php | 79 ++++++++++++++++++- ...ange_secret_and_edit_secret_to_varchar.php | 33 ++++++++ include/constants.php | 2 +- nexus/Install/Update.php | 13 ++- resources/lang/en/cleanup.php | 2 + resources/lang/en/label.php | 2 + resources/lang/zh_CN/cleanup.php | 2 + resources/lang/zh_CN/label.php | 2 + resources/lang/zh_TW/cleanup.php | 2 + resources/lang/zh_TW/label.php | 2 + 17 files changed, 207 insertions(+), 9 deletions(-) create mode 100644 app/Jobs/CheckCleanup.php create mode 100644 app/Models/Avp.php create mode 100644 database/migrations/2024_03_23_044831_alter_table_users_change_secret_and_edit_secret_to_varchar.php diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 353f70c5..689e3e50 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,6 +2,7 @@ namespace App\Console; +use App\Jobs\CheckCleanup; use Carbon\Carbon; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -37,6 +38,8 @@ class Kernel extends ConsoleKernel })->withoutOverlapping(); $schedule->command('meilisearch:import')->weeklyOn(1, "03:00")->withoutOverlapping(); $schedule->command('torrent:load_pieces_hash')->dailyAt("01:00")->withoutOverlapping(); + + $this->registerScheduleCleanup($schedule); } /** @@ -50,4 +53,16 @@ class Kernel extends ConsoleKernel require base_path('routes/console.php'); } + + private function registerScheduleCleanup(Schedule $schedule): void + { + $interval = get_setting("main.autoclean_interval_one"); + if (!$interval || $interval < 60) { + $interval = 7200; + } + $interval = 60; + $schedule->job(new CheckCleanup()) + ->cron(sprintf("*/%d * * * *", intval($interval/60))) + ->withoutOverlapping(); + } } diff --git a/app/Filament/Resources/System/SettingResource/Pages/EditSetting.php b/app/Filament/Resources/System/SettingResource/Pages/EditSetting.php index afb71cd7..92c1d511 100644 --- a/app/Filament/Resources/System/SettingResource/Pages/EditSetting.php +++ b/app/Filament/Resources/System/SettingResource/Pages/EditSetting.php @@ -161,6 +161,10 @@ class EditSetting extends Page implements Forms\Contracts\HasForms ->label(__('label.setting.system.access_admin_class_min')) ->helperText(__('label.setting.system.access_admin_class_min_help')) , + Forms\Components\TextInput::make('system.alarm_email_receiver') + ->label(__('label.setting.system.alarm_email_receiver')) + ->helperText(__('label.setting.system.alarm_email_receiver_help')) + , ])->columns(2); $tabs = apply_filter('nexus_setting_tabs', $tabs); diff --git a/app/Http/Middleware/Locale.php b/app/Http/Middleware/Locale.php index 756cecd6..83094d73 100644 --- a/app/Http/Middleware/Locale.php +++ b/app/Http/Middleware/Locale.php @@ -59,4 +59,10 @@ class Locale return self::$languageMaps[$lang] ?? null; } + public static function getDefault() + { + $defaultLang = get_setting("main.defaultlang"); + return self::$languageMaps[$defaultLang] ?? null; + } + } diff --git a/app/Jobs/CheckCleanup.php b/app/Jobs/CheckCleanup.php new file mode 100644 index 00000000..570f002a --- /dev/null +++ b/app/Jobs/CheckCleanup.php @@ -0,0 +1,39 @@ + 'datetime', ]; - public static $commonFields = [ + public static array $commonFields = [ 'id', 'username', 'email', 'class', 'status', 'added', 'avatar', 'passkey', 'uploaded', 'downloaded', 'seedbonus', 'seedtime', 'leechtime', 'invited_by', 'enabled', 'seed_points', 'last_access', 'invites', diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index c8df45a3..cb9e776a 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -36,9 +36,6 @@ class EventServiceProvider extends ServiceProvider TorrentCreated::class => [ FetchTorrentImdb::class, ], - UserDestroyed::class => [ - RemoveOauthTokens::class, - ], UserDisabled::class => [ RemoveOauthTokens::class, ], diff --git a/app/Repositories/CleanupRepository.php b/app/Repositories/CleanupRepository.php index 5aaa614d..19a35a08 100644 --- a/app/Repositories/CleanupRepository.php +++ b/app/Repositories/CleanupRepository.php @@ -1,6 +1,9 @@ getTimestamp(); + $toolRep = new ToolRepository(); + $arvToLevel = [ + "lastcleantime" => "one", + "lastcleantime2" => "two", + "lastcleantime3" => "three", + "lastcleantime4" => "four", + "lastcleantime5" => "five", + ]; + $avps = Avp::query()->get()->keyBy("arg"); + foreach ($arvToLevel as $arg => $level) { + /** @var NexusModel $value */ + $value = $avps->get($arg); + $interval = self::getInterval($level); + if ($interval <= 0) { + do_log(sprintf("level: %s not set cleanup interval", $level), "error"); + continue; + } + $lastTime = 0; + if ($value && $value->value_u) { + $lastTime = $value->value_u; + } + if ($timestamp < $lastTime + $interval * 2) { + continue; + } + $receiverUid = get_setting("system.alarm_email_receiver"); + if (empty($receiverUid)) { + $locale = Locale::getDefault(); + $subject = self::getAlarmEmailSubject($locale); + $msg = self::getAlarmEmailBody($now, $level, $lastTime, $interval, $locale); + do_log(sprintf("%s - %s", $subject, $msg), "error"); + } else { + $receiverUidArr = preg_split("/\s+/", $receiverUid); + $users = User::query()->whereIn("id", $receiverUidArr)->get(User::$commonFields); + foreach ($users as $user) { + $locale = $user->locale; + $subject = self::getAlarmEmailSubject($locale); + $msg = self::getAlarmEmailBody($now, $level, $lastTime, $interval, $locale); + $result = $toolRep->sendMail($user->email, $subject, $msg); + do_log(sprintf("send msg: %s result: %s", $msg, var_export($result, true)), $result ? "info" : "error"); + } + } + return; + } + } + + private static function getAlarmEmailSubject(string|null $locale = null) + { + return nexus_trans("cleanup.alarm_email_subject", ["site_name" => get_setting("basic.SITENAME")], $locale); + } + + private static function getAlarmEmailBody(Carbon $now, string $level, int $lastTime, int $interval, string|null $locale = null) + { + return nexus_trans("cleanup.alarm_email_body", [ + "now_time" => $now->toDateTimeString(), + "level" => $level, + "last_time" => $lastTime > 0 ? Carbon::createFromTimestamp($lastTime)->toDateTimeString() : "", + "elapsed_seconds" => $lastTime > 0 ? $now->getTimestamp() - $lastTime : "", + "interval" => $interval, + ], $locale); + } } diff --git a/database/migrations/2024_03_23_044831_alter_table_users_change_secret_and_edit_secret_to_varchar.php b/database/migrations/2024_03_23_044831_alter_table_users_change_secret_and_edit_secret_to_varchar.php new file mode 100644 index 00000000..c5cc3392 --- /dev/null +++ b/database/migrations/2024_03_23_044831_alter_table_users_change_secret_and_edit_secret_to_varchar.php @@ -0,0 +1,33 @@ +string("secret")->default("")->nullable(false)->change(); + $table->string("editsecret")->default("")->nullable(false)->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + // + }); + } +}; diff --git a/include/constants.php b/include/constants.php index a1411b7f..9609d04e 100644 --- a/include/constants.php +++ b/include/constants.php @@ -1,6 +1,6 @@ firstOrCreate( + ["name" => "system.alarm_email_receiver"], + ["value" => User::query()->where("class", User::CLASS_STAFF_LEADER)->first(["id"])->id] + ); + } + } public function runExtraMigrate() diff --git a/resources/lang/en/cleanup.php b/resources/lang/en/cleanup.php index f747be84..8dc3bd56 100644 --- a/resources/lang/en/cleanup.php +++ b/resources/lang/en/cleanup.php @@ -8,4 +8,6 @@ return [ 'disable_user_not_parked' => 'Disable inactive user accounts, not parked.', 'disable_user_parked' => 'Disable inactive user accounts, parked.', 'destroy_disabled_account' => 'Timed physical deletion of disabled accounts', + 'alarm_email_subject' => '[:site_name] background cleanup task exception', + 'alarm_email_body' => 'Current time: :now_time, level :level, Last run time was: :last_time, it has been more than: :elapsed_seconds seconds since it was run, the set run interval is: :interval seconds, please check!', ]; diff --git a/resources/lang/en/label.php b/resources/lang/en/label.php index 273b2a4d..9a694305 100644 --- a/resources/lang/en/label.php +++ b/resources/lang/en/label.php @@ -108,6 +108,8 @@ return [ 'is_invite_pre_email_and_username_help' => "Default: 'No'. If pre-booked, email and username may not be changed when the user registers.", 'access_admin_class_min' => 'Minimum class for logging into admin backend', 'access_admin_class_min_help' => 'Default: administrator, users with a user class greater than or equal to the set value can log into the admin backend', + 'alarm_email_receiver' => 'Alarm email receiver', + 'alarm_email_receiver_help' => "Fill in the UID of the user, separated by space, and the alarm email will be sent to the corresponding user's email address. If you don't fill it in, it will be written to the runtime log, and the log level will be error", ], ], 'user' => [ diff --git a/resources/lang/zh_CN/cleanup.php b/resources/lang/zh_CN/cleanup.php index e74ced00..83db57f8 100644 --- a/resources/lang/zh_CN/cleanup.php +++ b/resources/lang/zh_CN/cleanup.php @@ -8,4 +8,6 @@ return [ 'disable_user_not_parked' => '定时封禁未挂起的非活跃账号.', 'disable_user_parked' => '定时封禁已挂起的非活跃账号.', 'destroy_disabled_account' => '定时物理删除已封禁账号', + 'alarm_email_subject' => '[:site_name]后台清理任务异常', + 'alarm_email_body' => '当前时间::now_time, 级别 :level 上次运行时间是::last_time,已经超过::elapsed_seconds 秒没有运行,设置的运行间隔是::interval 秒,请检查!', ]; diff --git a/resources/lang/zh_CN/label.php b/resources/lang/zh_CN/label.php index 30fc0381..339faf3c 100644 --- a/resources/lang/zh_CN/label.php +++ b/resources/lang/zh_CN/label.php @@ -108,6 +108,8 @@ return [ 'is_invite_pre_email_and_username_help' => "默认: 'No'。若预定,用户注册时不可修改邮箱和用户名", 'access_admin_class_min' => '登录管理后台最小等级', 'access_admin_class_min_help' => '默认:管理员,用户等级大于等于设定值的用户可以登录管理后台', + 'alarm_email_receiver' => '告警邮件接收者', + 'alarm_email_receiver_help' => '填写用户 UID,多个空格隔开,系统异常告警邮件将会发到对应用户的邮箱。如果不填会写到运行日志中,日志级别为 error', ], ], 'user' => [ diff --git a/resources/lang/zh_TW/cleanup.php b/resources/lang/zh_TW/cleanup.php index 86de0547..17de221c 100644 --- a/resources/lang/zh_TW/cleanup.php +++ b/resources/lang/zh_TW/cleanup.php @@ -8,4 +8,6 @@ return [ 'disable_user_not_parked' => '定時封禁未掛起的非活躍賬號.', 'disable_user_parked' => '定時封禁已掛起的非活躍賬號.', 'destroy_disabled_account' => '定時物理刪除已封禁賬號', + 'alarm_email_subject' => '[:site_name]後臺清理任務異常', + 'alarm_email_body' => '當前時間::now_time, 級別 :level 上次運行時間是::last_time,已經超過::elapsed_seconds 秒沒有運行,設置的運行間隔是::interval 秒,請檢查!', ]; diff --git a/resources/lang/zh_TW/label.php b/resources/lang/zh_TW/label.php index 258b87d1..663d26bf 100644 --- a/resources/lang/zh_TW/label.php +++ b/resources/lang/zh_TW/label.php @@ -108,6 +108,8 @@ return [ 'is_invite_pre_email_and_username_help' => "默認: 'No'。若預定,用戶註冊時不可修改郵箱和用戶名", 'access_admin_class_min' => '登錄管理後臺最小等級', 'access_admin_class_min_help' => '默認:管理員,用戶等級大於等於設定值的用戶可以登錄管理後臺', + 'alarm_email_receiver' => '告警郵件接收者', + 'alarm_email_receiver_help' => '填寫用戶 UID,多個空格隔開,系統異常告警郵件將會發到對應用戶的郵箱。如果不填會寫到運行日誌中,日誌級別為 error', ], ], 'user' => [