# -*- coding:utf-8 -*-
#作者仓库:https://jihulab.com/spiritlhl/qinglong_auto_tools.git
#觉得不错麻烦点个star谢谢
# 频道:https://t.me/qinglong_auto_tools
#根据主青龙同步到副青龙中去,不存在于副青龙中的任务和对应脚本会自动新增,无脑同步所有

# 这是给空容器脚本迁移用的,日常请使用 tasks_sync_all 和 tasks_sync_scripts_able ,一个同步任务状态,一个同步启用的任务的对应脚本

'''
cron: 1
new Env('任务 二叉树脚本无脑全同步');
'''

#在脚本管理里修改这个文件的配置,然后保存,然后禁用 二叉树脚本无脑全同步 这个任务,有需要再点运行


# 主青龙,需要修改任务的容器,事先需要在容器里创建应用,给所有权限,然后重启容器,应用设置才会生效,
# 副青龙,被同步的任务容器,事先需要在容器里创建应用,给所有权限,然后重启容器,应用设置才会生效,
# 按照格式有几个写几个,没有的空的删除
'''
# ec_config.txt中填写如下设置

# 二叉树脚本无脑全同步
### 主青龙
tasks_sync_all_cilent_id1="xxxxxxxx"
tasks_sync_all_cilent_secret1="xxxxxxxxxx"
tasks_sync_all_url1="http://xxxxxxxx:xxxx/"

### 副青龙
tasks_sync_all_client_ids=["",""]
tasks_sync_all_client_secrets=["",""]
tasks_sync_all_urllist=["http://xxxxxxxxx:xxxx/",""]

'''

#client_id1=""
#client_secret1=""
#url1 = "http://ip:端口/"
#client_ids=['','','','']
#client_secrets=['','','','']
#urllist = ["http://xxxx:xxxx/","","",""]


import re
import json
import time


try:
    import requests
except Exception as e:
    print(e, "\n缺少requests 模块,请执行命令安装:python3 -m pip install requests")
    exit(3)

try:
    with open("ec_config.txt", "r", encoding="utf-8") as fp:
        t = fp.readlines()
    try:
        for i in t:
            try:
                temp = re.findall(r"tasks_sync_all_cilent_id1=\"(.*?)\"", i)[0]
                client_id1 = temp
                if client_id1 == "":
                    print("tasks_sync_all_cilent_id1 未填写")
            except:
                pass
    except:
        print("tasks_sync_all_cilent_id1 未创建")
        exit(3)

    try:
        for i in t:
            try:
                temp = re.findall(r"tasks_sync_all_cilent_secret1=\"(.*?)\"", i)[0]
                client_secret1 = temp
                if client_secret1 == "":
                    print("tasks_sync_all_cilent_secret1 未填写")
            except:
                pass
    except:
        print("tasks_sync_all_cilent_secret1 未创建")
        exit(3)

    try:
        for i in t:
            try:
                temp = re.findall(r"tasks_sync_all_url1=\"(.*?)\"", i)[0]
                url1 = temp
                if url1 == "":
                    print("tasks_sync_all_url1 未填写")
            except:
                pass
    except:
        print("tasks_sync_all_url1 未创建")
        exit(3)
except:
    print("找不到配置文件或配置文件有错误, 请填写ec_config.txt")


try:
    try:
        for i in t:
            try:
                temp = "["+re.findall(r"tasks_sync_all_client_ids=\[(.*?)\]", i)[0]+"]"
                try:
                    client_ids = json.loads(temp)
                except:
                    print("tasks_sync_all_client_ids 填写有误")
                if client_ids == []:
                    print("tasks_sync_all_client_ids 未填写")
            except:
                pass
    except:
        print("tasks_sync_all_client_ids 未创建")
        exit(3)

    try:
        for i in t:
            try:
                temp = "["+re.findall(r"tasks_sync_all_client_secrets=\[(.*?)\]", i)[0]+"]"
                try:
                    client_secrets = json.loads(temp)
                except:
                    print("tasks_sync_all_client_secrets 填写有误")
                if client_secrets == []:
                    print("tasks_sync_all_client_secrets 未填写")
            except:
                pass
    except:
        print("tasks_sync_all_client_secrets 未创建")
        exit(3)

    try:
        for i in t:
            try:
                temp = "["+re.findall(r"tasks_sync_all_urllist=\[(.*?)\]", i)[0]+"]"
                try:
                    urllist = json.loads(temp)
                except:
                    print("tasks_sync_all_urllist 填写有误")
                if urllist == []:
                    print("tasks_sync_all_urllist 未填写")
            except:
                pass
    except:
        print("tasks_sync_all_urllist 未创建")
        exit(3)
except:
    print("找不到配置文件或配置文件有错误, 请填写ec_config.txt")



requests.packages.urllib3.disable_warnings()


def gettimestamp():
    return str(int(time.time() * 1500))


def gettoken(self, url_token):
    r = requests.get(url_token).text
    res = json.loads(r)["data"]["token"]
    self.headers.update({"Authorization": "Bearer " + res})


def login(self, baseurl, client_id_temp, client_secret_temp):
    url_token = baseurl + 'open/auth/token?client_id=' + client_id_temp + '&client_secret=' + client_secret_temp
    gettoken(self, url_token)


def getitem(self, baseurl, typ):
    url = baseurl + typ + "/scripts/files?t={}".format(gettimestamp())
    r = self.get(url)
    item = json.loads(r.text)["data"]
    return item


def getscript(self, baseurl, typ, filename, path):
    url = baseurl + typ + "/scripts/" + filename + "?t=%s" % gettimestamp()
    r = self.get(url)
    response = json.loads(r.text)["code"]
    if response == 500:
        url = baseurl + typ + "/scripts/" + filename + "?path=" + path
        r = self.get(url)
    script = json.loads(r.text)["data"]
    return script


def pushscript(self, baseurl, typ, data, path):
    url = baseurl + typ + "/scripts?t=%s" % gettimestamp()
    self.headers.update({"Content-Type": "application/json;charset=UTF-8", 'Connection': 'close'})
    r = self.put(url, data=json.dumps(data))
    response = json.loads(r.text)["code"]
    if response == 500:
        data["path"] = path
        r = self.put(url, data=json.dumps(data))
    return r.text


def getcrons(self, baseurl, typ):
    url = baseurl + typ + "/crons?t=%s" % gettimestamp()
    r = self.get(url)
    item = json.loads(r.text)["data"]
    return item


def addcron(self, baseurl, typ, data):
    url = baseurl + typ + "/crons?t=%s" % gettimestamp()
    self.headers.update({"Content-Type": "application/json;charset=UTF-8", 'Connection': 'close'})
    r = self.post(url, data=json.dumps(data))
    if json.loads(r.text)["code"] == 200:
        return True
    else:
        return r.text


if __name__ == '__main__':
    # 主容器
    s = requests.session()
    login(s, url1, client_id1, client_secret1)

    # 获取主青龙任务
    print("=========== 主青龙 信息获取中 =============")
    print()
    ztasks = getcrons(s, url1, "open")
    zenable_list = []
    zdisable_list = []
    for i in ztasks:
        zenable_list.append(i)
    # enable_tlid = []
    zenable_tname = []
    zenable_tcommand = []
    zenable_tschedule = []
    for j in zenable_list:
        # enable_tlid.append(j['_id'])
        zenable_tname.append(j['name'])
        zenable_tcommand.append(j['command'])
        zenable_tschedule.append(j['schedule'])
    print("主青龙任务数量:{},启用任务{}".format(len(ztasks), len(zenable_tname)))
    print()

    # 获取主青龙的脚本名
    ## 根目录
    zscripts = getitem(s, url1, "open")
    zscripts_list = []
    for i in zscripts:
        zscripts_list.append(i["key"])

    # script根目录默认存在的文件夹,放入其中的文件夹不再检索
    or_list = ['node_modules', '__pycache__', 'utils', '.pnpm-store', 'function', 'tools', 'backUp', '.git', '.idea']
    zpath_list = []
    zpath_scripts_list = []
    for i in zscripts:
        try:
            i["children"]
            if i["title"] not in or_list:
                zpath_list.append(i["title"])
                zpath_scripts_list.append(i["children"])
        except:
            pass

    print("主青龙根目录脚本文件数量:{},".format(len(zscripts_list)))
    print("主青龙任务拉取的仓库对应目录文件夹数量:{},".format(len(zpath_list)))
    print()
    print()

    # 创建对应文件夹字典
    dict_z = {}
    for i in zpath_list:
        dict_z[i] = []

    # 主青龙的任务对应的脚本
    zscripts_enable = []
    for i in zenable_tcommand:
        if i[-2:] == "js" or i[-2:] == "py":
            ti = i.replace("task ", "").split("/")
            if len(ti) == 1:
                zscripts_enable.append(ti[0])
            elif len(ti) == 2:
                dict_z[ti[0]].append(ti[1])

    t = 0
    for k in urllist:
        # 分容器
        print("=========== 副青龙{} 信息获取中 =============".format(t + 1))
        print()
        a = requests.session()
        login(a, urllist[t], client_ids[t], client_secrets[t])

        tasks = getcrons(a, urllist[t], "open")

        # 增加新任务
        enable_list = []
        disable_list = []
        for i in tasks:
            if i['isDisabled'] == 0:
                enable_list.append(i)
            else:
                continue
        # enable_tlid = []
        enable_tname = []
        enable_tcommand = []
        enable_tschedule = []
        for j in enable_list:
            # enable_tlid.append(j['_id'])
            enable_tname.append(j['name'])
            enable_tcommand.append(j['command'])
            enable_tschedule.append(j['schedule'])
        print("副青龙任务数量:{}".format(len(tasks)))
        print()

        print("同步任务中")
        print()

        count = 0
        ct = 0

        for i in zenable_tname:
            if zenable_tname[count] not in enable_tname and zenable_tcommand[count] not in enable_tcommand:
                data_cron = {
                    "command": zenable_tcommand[count],
                    "schedule": zenable_tschedule[count],
                    "name": zenable_tname[count]
                }
                addcron(a, urllist[t], "open", data_cron)
            else:
                ct += 1
            count += 1
        xc = count - ct
        print("新增启用任务数量:{}".format(xc))
        print()

        # 获取副青龙根目录脚本名
        scripts = getitem(a, urllist[t], "open")
        scripts_list = []
        for i in scripts:
            scripts_list.append(i["key"])

        # 获取副青龙仓库目录脚本名字典
        dict_cs_name = {}
        for i in zpath_list:
            dict_cs_name[i] = []
            for j in scripts:
                if j["key"] == i:
                    for k in j["children"]:
                        dict_cs_name[i].append(k["value"])

        # 筛选需要添加或更改的脚本名
        ## 根目录
        add_list = []
        change_list = []
        for j in zscripts_enable:
            if j not in scripts_list:
                add_list.append(j)
            else:
                change_list.append(j)

        ## 仓库目录
        dict_add_f = {}
        dict_change_f = {}
        for j in dict_z:
            dict_add_f[j] = []
            dict_change_f[j] = []
            for k in dict_z[j]:  # 在主青龙
                if k not in dict_cs_name[j]:  # 不在副青龙的文件
                    dict_add_f[j].append(k)
                else:
                    dict_change_f[j].append(k)

        print(dict_add_f)
        print(dict_change_f)

        print("同步脚本文件中")
        print()

        # 查询新增脚本内容
        ## 根目录
        data_script_list = []
        for i in add_list:
            content = getscript(s, url1, "open", i, "")
            data_script = {
                "filename": i,
                "content": content,
            }
            data_script_list.append(data_script)

        ## 仓库文件夹
        data_script_add_dict = {}
        for i in dict_add_f:
            data_script_add_dict[i] = []
            for j in dict_add_f[i]:  # j是文件名,i 是文件夹名
                content = getscript(s, url1, "open", j, i)
                data_script = {
                    "filename": j,
                    "content": content,
                    "path": i
                }
                data_script_add_dict[i].append(data_script)

        # 写入新增内容
        ## 根目录更新
        for i in data_script_list:
            pushscript(a, urllist[t], "open", i, "")

        ## 仓库文件夹更新
        cotu = 0
        for i in data_script_add_dict:
            for j in data_script_add_dict[i]:
                rc = pushscript(a, urllist[t], "open", j, j["path"])
                print(rc)
                cotu += 1
        print("新增启用任务对应脚本文件数量:{}".format(xc))
        print("新增启用任务对应仓库文件脚本数量:{}".format(cotu))
        print()

        print("同步脚本文件中")
        print()

        # 查询需要更改的脚本内容
        ## 根目录
        change_script_list = []
        for i in change_list:
            content = getscript(s, url1, "open", i, "")
            data_script = {
                "filename": i,
                "content": content,
            }
            change_script_list.append(data_script)

        origin_script_list = []
        for i in change_list:
            content = getscript(a, urllist[t], "open", i, "")
            data_script = {
                "filename": i,
                "content": content,
            }
            origin_script_list.append(data_script)

        ## 仓库文件字典
        change_script_dict = {}
        for i in dict_change_f:
            change_script_dict[i] = []
            for j in dict_change_f[i]:  # j是文件名,i 是文件夹名
                content = getscript(s, url1, "open", j, i)
                data_script = {
                    "filename": j,
                    "content": content,
                    "path": i
                }
                change_script_dict[i].append(data_script)

        origin_script_dict = {}
        for i in dict_change_f:
            origin_script_dict[i] = []
            for j in dict_change_f[i]:  # j是文件名,i 是文件夹名
                content = getscript(a, urllist[t], "open", j, i)
                data_script = {
                    "filename": j,
                    "content": content,
                    "path": i
                }
                origin_script_dict[i].append(data_script)

        # 比较后更新
        ## 根目录
        count = 0
        ct = 0
        while True:
            if count <= (len(change_script_list) - 1):
                if change_script_list[count] != origin_script_list[count]:
                    pushscript(a, urllist[t], "open", change_script_list[count], "")
                    print("更新脚本文件  {}".format(change_script_list[count]["filename"]))
                else:
                    ct += 1
                count += 1
            else:
                break
        ## 仓库文件
        for i, k in zip(change_script_dict, origin_script_dict):
            for j, l in zip(change_script_dict[i], origin_script_dict[k]):
                if j != l:
                    pushscript(a, urllist[t], "open", j, j["path"])
                    print("更新脚本文件  {}".format(j["filename"]))

        print()

        print("同步脚本文件完毕")
        t += 1

        print('========= 副青龙{} 同步信息完毕 ============='.format(t))
        print()