# -*- coding:utf-8 -*- # 作者仓库:https://jihulab.com/spiritlhl/qinglong_auto_tools.git # 觉得不错麻烦点个star谢谢 # 频道:https://t.me/qinglong_auto_tools # 根据主青龙同步到副青龙中去,脚本默认同步更新副青龙环境变量的状态和值 # 如果有环境变量在副青龙不存在需要新增,若是JD_COOKIE,请使用二叉树ck分发脚本, # 若是其他名字的变量,本脚本第一次运行自动在副青龙新增,但需要运行第二次才能同步新增变量的启用禁用状态 ''' cron: 1 new Env('二叉树环境变量状态同步'); ''' # 在脚本管理里修改这个文件的配置,然后保存,然后禁用 二叉树环境变量状态同步 这个任务,有需要再点运行 # 主青龙,需要修改环境变量的容器,事先需要在容器里创建应用,给所有权限,然后重启容器,应用设置才会生效, # 副青龙,被同步环境变量的容器,事先需要在容器里创建应用,给所有权限,然后重启容器,应用设置才会生效, # 按照格式有几个写几个,没有的空的删除 ''' # ec_config.txt中填写如下设置 # 二叉树环境变量状态同步 ### 主青龙 cks_sync_able_cilent_id1="xxxxxxxx" cks_sync_able_cilent_secret1="xxxxxxxxxx" cks_sync_able_url1="http://xxxxxxxx:xxxx/" ### 副青龙 cks_sync_able_client_ids=["",""] cks_sync_able_client_secrets=["",""] cks_sync_able_urllist=["http://xxxxxxxxx:xxxx/",""] ''' # client_id1="" # client_secret1="" # url1 = "http://ip:端口/" # client_ids=['','',''] # client_secrets=['','',''] # urllist = ["http://xxxx:xxxx/","",""] import time import json import re 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"cks_sync_able_cilent_id1=\"(.*?)\"", i)[0] client_id1 = temp if client_id1 == "": print("cks_sync_able_cilent_id1 未填写") except: pass except: print("cks_sync_able_cilent_id1 未创建") exit(3) try: for i in t: try: temp = re.findall(r"cks_sync_able_cilent_secret1=\"(.*?)\"", i)[0] client_secret1 = temp if client_secret1 == "": print("cks_sync_able_cilent_secret1 未填写") except: pass except: print("cks_sync_able_cilent_secret1 未创建") exit(3) try: for i in t: try: temp = re.findall(r"cks_sync_able_url1=\"(.*?)\"", i)[0] url1 = temp if url1 == "": print("cks_sync_able_url1 未填写") except: pass except: print("cks_sync_able_url1 未创建") exit(3) except: print("找不到配置文件或配置文件有错误, 请填写ec_config.txt") try: try: for i in t: try: temp = "["+re.findall(r"cks_sync_able_client_ids=\[(.*?)\]", i)[0]+"]" try: client_ids = json.loads(temp) except: print("cks_sync_able_client_ids 填写有误") if client_ids == []: print("cks_sync_able_client_ids 未填写") except: pass except: print("cks_sync_able_client_ids 未创建") exit(3) try: for i in t: try: temp = "["+re.findall(r"cks_sync_able_client_secrets=\[(.*?)\]", i)[0]+"]" try: client_secrets = json.loads(temp) except: print("cks_sync_able_client_secrets 填写有误") if client_secrets == []: print("cks_sync_able_client_secrets 未填写") except: pass except: print("cks_sync_able_client_secrets 未创建") exit(3) try: for i in t: try: temp = "["+re.findall(r"cks_sync_able_urllist=\[(.*?)\]", i)[0]+"]" try: urllist = json.loads(temp) except: print("cks_sync_able_urllist 填写有误") if urllist == []: print("cks_sync_able_urllist 未填写") except: pass except: print("cks_sync_able_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 + "/envs?t=%s" % gettimestamp() r = self.get(url) item = json.loads(r.text)["data"] return item def getenvitem(self, baseurl, value, typ, sm, tm): url = baseurl + typ + "/envs?search=%s&t=%s" % (sm ,gettimestamp()) r = self.get(url) for i in json.loads(r.text)["data"]: if value in i[tm]: return i return [] def getsingleenv(self, baseurl, value, typ): url = baseurl + typ + "/envs?searchValue=%s&t=%s" % (value ,gettimestamp()) r = self.get(url) return r.json() def getenvstatus(self, baseurl, typ, sm): url = baseurl + typ + "/envs?searchValue=%s&t=%s" % (sm ,gettimestamp()) r = self.get(url) for i in json.loads(r.text)["data"]: return i["_id"] def update(self, baseurl, typ, text, qlid, name): url = baseurl + typ + "/envs?t=%s" % gettimestamp() self.headers.update({"Content-Type": "application/json;charset=UTF-8", 'Connection': 'close'}) data = { "name": name, "value": text, "_id": qlid } r = self.put(url, data=json.dumps(data)) if json.loads(r.text)["code"] == 200: return True else: return False def insert(self, baseurl, typ, text, nam): url = baseurl + typ + "/envs?t=%s" % gettimestamp() self.headers.update({"Content-Type": "application/json;charset=UTF-8", 'Connection': 'close'}) data = [] data_json = { "value": text, "name": nam } data.append(data_json) r = self.post(url, json.dumps(data)) if json.loads(r.text)["code"] == 200: return True else: return False def remark(self, baseurl, typ, data): url = baseurl + typ + "/envs?t=%s" % gettimestamp() self.headers.update({"Content-Type": "application/json;charset=UTF-8", 'Connection': 'close'}) r = self.put(url, data=json.dumps(data)) return r.text def enable(self, baseurl, typ, ids): url = baseurl + typ + "/envs/enable?t=%s" % gettimestamp() self.headers.update({"Content-Type": "application/json;charset=UTF-8", 'Connection': 'close'}) r = self.put(url, data=json.dumps(ids)) if json.loads(r.text)["code"] == 200: return True else: return False def disable(self, baseurl, typ, ids): url = baseurl + typ + "/envs/disable?t=%s" % gettimestamp() self.headers.update({"Content-Type": "application/json;charset=UTF-8", 'Connection': 'close'}) r = self.put(url, data=json.dumps(ids)) if json.loads(r.text)["code"] == 200: return True else: return False if __name__ == '__main__': # 不需要新增值的环境变量名 except_list = ["JD_COOKIE"] #主容器 s = requests.session() login(s, url1, client_id1, client_secret1) #获取主青龙信息 print("=========== 主青龙 环境变量信息获取中 =============") env_data = getitem(s, url1, "open") enable_values = [] enable_names = [] disable_values = [] disable_names = [] env_values = [] env_names = [] remarks_list = [] for i in env_data: if i['status'] == 1: if i["name"] == "JD_COOKIE": ptpin = re.findall(r"pt_pin=(.*?);", i["value"])[0] disable_values.append(ptpin) else: disable_values.append(i['value']) disable_names.append(i['name']) else: if i["name"] == "JD_COOKIE": ptpin = re.findall(r"pt_pin=(.*?);", i["value"])[0] enable_values.append(ptpin) else: enable_values.append(i["value"]) enable_names.append(i['name']) try: i["remarks"] print(i["remarks"]) remarks_list.append(i) except: pass env_values.append(i["value"]) env_names.append(i['name']) remarks_pin_or_name = [] for k in remarks_list: try: ptpin = re.findall(r"pt_pin=(.*?);", k["value"])[0] remarks_pin_or_name.append(ptpin) except: remarks_pin_or_name.append(k["name"]) print("环境变量启用:{} 禁用:{}".format(len(enable_values), len(disable_values))) print("=========== 主青龙环境变量获取完毕 =============") print() print("脚本默认同步更新副青龙环境变量的状态和值") print("有环境变量在副青龙不存在需要新增,若是JD_COOKIE,请使用二叉树ck分发脚本,若是其他名字的变量,本脚本自动新增,但需要运行第二次才能同步新增变量的启用禁用状态") print() ucount = 0 for rrr in urllist: print("=========== 副青龙{} 环境变量信息获取中 =============".format(ucount + 1)) print() a = requests.session() url_token = urllist[ucount] + 'open/auth/token?client_id=' + client_ids[ucount] + '&client_secret=' + \ client_secrets[ ucount] gettoken(a, url_token) fenv_data = getitem(a, urllist[ucount], "open") fenv_values = [] fenable_values = [] fenable_names = [] fdisable_values = [] fdisable_names = [] for i in fenv_data: if i['status'] == 1: if i["name"] == "JD_COOKIE": ptpin = re.findall(r"pt_pin=(.*?);", i["value"])[0] fdisable_values.append(ptpin) else: fdisable_values.append(i['value']) fdisable_names.append(i['name']) else: if i["name"] == "JD_COOKIE": ptpin = re.findall(r"pt_pin=(.*?);", i["value"])[0] fenable_values.append(ptpin) else: fenable_values.append(i["value"]) fenable_names.append(i['name']) fenv_values.append(i['value']) print("环境变量启用:{} 禁用:{}".format(len(fenable_values), len(fdisable_values))) print() # 更新环境变量 print("更新环境变量值中") print() co = 0 fpin = [] for k in env_values: name = env_names[co] co += 1 if name not in except_list: item = getenvitem(a, urllist[ucount], name, "open", name, "name") if item != []: qlid = item["_id"] if update(a, urllist[ucount], "open", k, qlid, name): # 更新备注 if name in remarks_pin_or_name: for k in remarks_list: if name == k["name"]: data = { "value": k["value"], "name": k["name"], "remarks": k["remarks"], "_id": qlid } print("更新备注 {}".format(k["remarks"])) remark(a, urllist[ucount], "open", data) print("第%s个环境变量更新成功" % (co)) else: print("第%s个环境变量更新失败" % (co)) else: if insert(a, urllist[ucount], "open", k, name): print("第%s个环境变量添加成功" % co) else: print("第%s个环境变量添加失败" % co) elif name == "JD_COOKIE": continue else: print("无法识别{}".format(name)) print() print("环境变量值更新完毕(不含JD_COOKIE的值更新)") print() print("环境变量同步备注和启用禁用中") print() # 同步启用环境变量 co = 0 enable_ids = [] for k in enable_values: name = enable_names[co] co += 1 if name not in except_list and k in fenv_values: item = getenvitem(a, urllist[ucount], k, "open", name, "value") enable_ids.append(item["_id"]) elif name == "JD_COOKIE" and k in fdisable_values: ptpin = "pt_pin="+k+";" print("{}启用成功".format(k)) item = getenvstatus(a, urllist[ucount], "open", ptpin) enable_ids.append(item) else: pass if name == "JD_COOKIE": ptpin = "pt_pin=" + k + ";" item = getenvstatus(a, urllist[ucount], "open", ptpin) # 修改备注 if k in remarks_pin_or_name: for c in remarks_list: try: if re.findall(r"pt_pin=(.*?);", c["value"])[0] == k: try: data = { "value": getsingleenv(a, urllist[ucount], ptpin, "open")["data"][0]["value"], "name": c["name"], "remarks": c["remarks"], "_id": item } print("更新备注 {}".format(c["remarks"])) remark(a, urllist[ucount], "open", data) except: pass except: pass enable(a, urllist[ucount], "open", enable_ids) print("环境变量状态更新启用完毕") print() # 同步禁用变量 co = 0 disable_ids = [] for k in disable_values: name = disable_names[co] co += 1 if name not in except_list and k in fenv_values: item = getenvitem(a, urllist[ucount], k, "open", name, "value") enable_ids.append(item["_id"]) elif name == "JD_COOKIE" and k in fenable_values: ptpin = "pt_pin="+k+";" print("{}禁用成功".format(k)) item = getenvstatus(a, urllist[ucount], "open", ptpin) disable_ids.append(item) else: pass if name == "JD_COOKIE": ptpin = "pt_pin=" + k + ";" item = getenvstatus(a, urllist[ucount], "open", ptpin) # 修改备注 if k in remarks_pin_or_name: for c in remarks_list: try: if re.findall(r"pt_pin=(.*?);", c["value"])[0] == k: try: data = { "value": getsingleenv(a, urllist[ucount], k, "open")["data"][0]["value"], "name": c["name"], "remarks": c["remarks"], "_id": item } print("更新备注 {}".format(c["remarks"])) remark(a, urllist[ucount], "open", data) except: pass except: pass disable(a, urllist[ucount], "open", disable_ids) print("环境变量状态更新禁用完毕") print() print("环境变量备注同步完毕") print() ucount += 1 print("=========== 副青龙%s更新环境变量完毕 ===========" % ucount) print() print("所有环境变量同步更新完毕")