Backup.php 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Command;
  4. use App\Models\Setting;
  5. use App\Services\Mail;
  6. use App\Utils\Telegram;
  7. use Exception;
  8. use RuntimeException;
  9. class Backup extends Command
  10. {
  11. public $description = ''
  12. . '├─=: php xcat Backup [选项]' . PHP_EOL
  13. . '│ ├─ full - 整体数据备份' . PHP_EOL
  14. . '│ ├─ simple - 只备份核心数据' . PHP_EOL;
  15. public function boot(): void
  16. {
  17. if (count($this->argv) === 2) {
  18. echo $this->description;
  19. } else {
  20. $methodName = $this->argv[2];
  21. if ($methodName === 'full') {
  22. $this->backup(true);
  23. } else {
  24. $this->backup(false);
  25. }
  26. }
  27. }
  28. public function backup($full = false)
  29. {
  30. $configs = Setting::getClass('backup');
  31. ini_set('memory_limit', '-1');
  32. $to = $configs['auto_backup_email'];
  33. if ($to === null) {
  34. return false;
  35. }
  36. if (! mkdir('/tmp/ssmodbackup/') && ! is_dir('/tmp/ssmodbackup/')) {
  37. throw new RuntimeException(sprintf('Directory "%s" was not created', '/tmp/ssmodbackup/'));
  38. }
  39. $db_address_array = explode(':', $_ENV['db_host']);
  40. if ($full) {
  41. system('mysqldump --user=' . $_ENV['db_username'] . ' --password=' . $_ENV['db_password'] . ' --host=' . $db_address_array[0] . ' ' . (isset($db_address_array[1]) ? '-P ' . $db_address_array[1] : '') . ' ' . $_ENV['db_database'] . ' > /tmp/ssmodbackup/mod.sql');
  42. } else {
  43. system(
  44. 'mysqldump --user=' . $_ENV['db_username'] . ' --password=' . $_ENV['db_password'] . ' --host=' . $db_address_array[0] . ' ' . (isset($db_address_array[1]) ? '-P ' . $db_address_array[1] : '') . ' ' . $_ENV['db_database'] . ' announcement blockip bought code coupon link login_ip payback shop user_invite_code node user_password_reset ticket unblockip user user_token email_verify detect_list paylist > /tmp/ssmodbackup/mod.sql',
  45. $ret
  46. );
  47. system(
  48. 'mysqldump --opt --user=' . $_ENV['db_username'] . ' --password=' . $_ENV['db_password'] . ' --host=' . $db_address_array[0] . ' ' . (isset($db_address_array[1]) ? '-P ' . $db_address_array[1] : '') . ' -d ' . $_ENV['db_database'] . ' alive_ip node_info node_online_log detect_log telegram_session >> /tmp/ssmodbackup/mod.sql',
  49. $ret
  50. );
  51. }
  52. system('cp ' . BASE_PATH . '/config/.config.php /tmp/ssmodbackup/configbak.php', $ret);
  53. echo $ret;
  54. $backup_passwd = $configs['auto_backup_password'] === '' ? '' : ' -P ' . $configs['auto_backup_password'];
  55. system('zip -r /tmp/ssmodbackup.zip /tmp/ssmodbackup/* ' . $backup_passwd, $ret);
  56. $subject = $_ENV['appName'] . '-备份成功';
  57. $text = '您好,系统已经为您自动备份,请查看附件,用您设定的密码解压。';
  58. try {
  59. Mail::send($to, $subject, 'news/backup.tpl', [
  60. 'text' => $text,
  61. ], [
  62. '/tmp/ssmodbackup.zip',
  63. ]);
  64. } catch (Exception $e) {
  65. echo $e->getMessage();
  66. }
  67. system('rm -rf /tmp/ssmodbackup', $ret);
  68. system('rm /tmp/ssmodbackup.zip', $ret);
  69. if ($configs['auto_backup_notify'] === true) {
  70. Telegram::Send('备份工作已经完成');
  71. }
  72. }
  73. }