File size: 3,243 Bytes
3a5cf48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import os
import time
import sys
import re  # 引入正则表达式模块
sys.path.insert(0, "/www/server/panel/class/")
import public

def initialize_backup_folder(src_folder):
    print(src_folder)
    file_names_in_db = set()
    src_folder_name = os.path.basename(src_folder)  # 提取源文件夹的名称
    backup_path = public.M('config').where("id=?", ('1',)).getField('backup_path')
    if not backup_path.endswith('/'):
        backup_path += '/'
    target_directory = '{}/backup_site_file'.format(backup_path)  # 备份文件所在的文件夹
    backup_folder = os.path.join(target_directory, src_folder_name)
    init_marker = os.path.join(backup_folder, 'initialized.pl')
    if os.path.exists(backup_folder):        
        data = public.M('crontab').where('sName=?', (src_folder,)).select()
        if data:
            cron_id = data[0]['id']
            backupTo = "localhost"
            # 定义正则表达式,匹配形如 20240906150534_all_444444444444.com.zip 的文件
            pattern = re.compile(r'^\d{14}_(all_)?' + re.escape(src_folder_name) + r'\.zip$')
        
            # 初始化:检查是否存在标记文件
            if not os.path.exists(init_marker):
                print("正在进行初始化...")

                # 扫描文件夹中的备份文件,并写入数据库
                if os.path.exists(backup_folder):
                    for filename in os.listdir(backup_folder):
                        print(filename)
                        # 使用正则表达式匹配文件名,并确保包含 src_folder_name
                        if pattern.match(filename) and src_folder_name in filename:


                            file_path = os.path.join(backup_folder, filename)
                            file_stat = os.stat(file_path)
                            size_in_kb = file_stat.st_size
                            # 修正后的上传路径拼接
                            upload_path = os.path.join(backup_path, "backup_site_file", src_folder_name, filename)
                            cloud_backup_path = upload_path
                            # 查询数据库,看是否已存在该文件名
                            existing_record = public.M('backup_site_file').where('name=?', (cloud_backup_path,)).find()
                            if existing_record:
                                
                                print(f"文件 {filename} 已存在,跳过插入。")
                                continue
                            # 插入数据库
                            public.M('backup_site_file').add(
                                'cron_id, type, name, filename, size, addtime, src_folder, backupTo', 
                                (cron_id, 1 if 'all' in filename else 0, cloud_backup_path, cloud_backup_path, '{:.2f}'.format(size_in_kb), public.format_date(), src_folder, backupTo)
                            )
    public.writeFile(init_marker,"")
    print("初始化完成")

# 主入口
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("请提供备份的源目录路径!")
        sys.exit(1)

    # 从命令行获取参数
    src_folder = sys.argv[1]
    initialize_backup_folder(src_folder)