99 lines
3.7 KiB
Python
99 lines
3.7 KiB
Python
import telebot
|
|
import subprocess
|
|
import qrcode
|
|
import io
|
|
import json
|
|
import os
|
|
import shlex
|
|
import re
|
|
import time
|
|
import threading
|
|
from dotenv import load_dotenv
|
|
from telebot import types
|
|
from utils.command import *
|
|
|
|
load_dotenv()
|
|
|
|
@bot.message_handler(func=lambda message: is_admin(message.from_user.id) and message.text == '💾 Backup Server')
|
|
def backup_server(message):
|
|
bot.reply_to(message, "Starting backup. This may take a few moments...")
|
|
bot.send_chat_action(message.chat.id, 'typing')
|
|
|
|
backup_command = f"python3 {CLI_PATH} backup-hysteria"
|
|
result = run_cli_command(backup_command)
|
|
|
|
if "Error" in result:
|
|
bot.reply_to(message, f"Backup failed: {result}")
|
|
return
|
|
|
|
# bot.reply_to(message, "Backup completed successfully!")
|
|
|
|
try:
|
|
files = [f for f in os.listdir(BACKUP_DIRECTORY) if f.endswith('.zip')]
|
|
files.sort(key=lambda x: os.path.getctime(os.path.join(BACKUP_DIRECTORY, x)), reverse=True)
|
|
latest_backup_file = files[0] if files else None
|
|
except Exception as e:
|
|
bot.reply_to(message, f"Failed to locate the backup file: {str(e)}")
|
|
return
|
|
|
|
if latest_backup_file:
|
|
backup_file_path = os.path.join(BACKUP_DIRECTORY, latest_backup_file)
|
|
with open(backup_file_path, 'rb') as f:
|
|
bot.send_document(message.chat.id, f, caption=f"Manual backup completed: {latest_backup_file}")
|
|
else:
|
|
bot.reply_to(message, "No backup file found after the backup process.")
|
|
|
|
def perform_and_send_backup():
|
|
# print("Starting automatic backup...")
|
|
|
|
backup_command = f"python3 {CLI_PATH} backup-hysteria"
|
|
result = run_cli_command(backup_command)
|
|
|
|
if "Error" in result:
|
|
print(f"Automatic backup failed: {result}")
|
|
return
|
|
|
|
try:
|
|
files = [f for f in os.listdir(BACKUP_DIRECTORY) if f.endswith('.zip')]
|
|
files.sort(key=lambda x: os.path.getctime(os.path.join(BACKUP_DIRECTORY, x)), reverse=True)
|
|
latest_backup_file = files[0] if files else None
|
|
except Exception as e:
|
|
print(f"Failed to locate the backup file during automatic backup: {str(e)}")
|
|
return
|
|
|
|
if latest_backup_file:
|
|
backup_file_path = os.path.join(BACKUP_DIRECTORY, latest_backup_file)
|
|
admin_ids_str = os.getenv("ADMIN_USER_IDS", "[]").strip('[]')
|
|
admin_ids = [int(uid.strip()) for uid in admin_ids_str.split(',') if uid.strip()]
|
|
|
|
if not admin_ids:
|
|
print("No admin user IDs found for automatic backup.")
|
|
return
|
|
|
|
for admin_id in admin_ids:
|
|
try:
|
|
with open(backup_file_path, 'rb') as f:
|
|
bot.send_document(admin_id, f, caption=f"Automatic hourly backup: {latest_backup_file}")
|
|
print(f"Automatic backup sent to admin: {admin_id}")
|
|
except Exception as e:
|
|
print(f"Failed to send automatic backup to admin {admin_id}: {e}")
|
|
else:
|
|
print("No backup file found after automatic backup process.")
|
|
|
|
|
|
def backup_scheduler():
|
|
interval_hours_str = os.getenv("BACKUP_INTERVAL_HOUR")
|
|
if not interval_hours_str or not interval_hours_str.isdigit() or int(interval_hours_str) <= 0:
|
|
print("Automatic backup interval is not set or is invalid. Scheduler will not run.")
|
|
return
|
|
|
|
interval_hours = int(interval_hours_str)
|
|
interval_seconds = interval_hours * 3600
|
|
print(f"Automatic backup scheduler started. Interval: {interval_hours} hour(s).")
|
|
|
|
while True:
|
|
time.sleep(interval_seconds)
|
|
perform_and_send_backup()
|
|
|
|
scheduler_thread = threading.Thread(target=backup_scheduler, daemon=True)
|
|
scheduler_thread.start() |