def get(self): logger.info("HOSTLIST") product_id = request.args.get("product_id") db = DB() status, result = db.select( "host", "where data -> '$.product_id'='%s'" % product_id) if status is True: host_list = result else: db.close_mysql() return {"status": False, "message": result}, 500 status, result = db.select( "groups", "where data -> '$.product_id'='%s'" % product_id) if status is True: groups_list = result else: db.close_mysql() return {"status": False, "message": result}, 500 for host in host_list: for group in groups_list: for minion in group["minion"]: if host["minion_id"] == minion: host["groups"].append(group["name"]) db.close_mysql() return {"data": host_list, "status": True, "message": ""}, 200
def get(self): args = parser.parse_args() db = DB() status, result = db.select( "cmd_history", "where data -> '$.product_id'='%s' and " "data -> '$.type'='%s' " "order by data -> '$.time' desc" % (args["product_id"], args["type"])) history_list = [] user_status, user_result = db.select("user", "") if user_status is True and user_result: user_list = user_result else: return {"status": False, "message": user_result}, 500 db.close_mysql() if status is True: if result: for history in result: for user in user_list: if history["user_id"] == user["id"]: history["username"] = user["username"] history_list.append(history) else: return {"status": False, "message": result}, 500 return {"data": history_list, "status": True, "message": ""}, 200
def post(self): logger.info("PingList") args = parser.parse_args() db = DB() host_id = args['host_id'] cipher = args['cipher'] state, result = db.select('host', "where data -> '$.id'='%s'" % host_id) minion_id = result[0]['minion_id'] logger.info('minion_id:' + minion_id) product_id = result[0]['product_id'] salt_api = salt_api_for_product(product_id) state, targets = db.select('target', "where data -> '$.host_id'='%s'" % host_id) targets_not = [] thread_pool = ThreadPoolExecutor(max_workers=10, thread_name_prefix="target_") futures = [] for target in targets: future = thread_pool.submit(pingTarget, target, minion_id, salt_api, cipher) futures.append(future) thread_pool.shutdown(wait=True) for future in futures: result = future.result() logger.info(str(result['status'])) if str(result['status']).__contains__("Timeout") | str( result['status']).__contains__("Unknown"): targets_not.append(result["target"]) return {"status": True, "message": '配置发送成功', "data": targets_not}, 200
def get(self): product_id = request.args.get("product_id") scheduler_type = request.args.get("scheduler_type") db = DB() task = [] if scheduler_type: sql = "where data -> '$.product_id'='%s' and data -> '$.scheduler'!='%s' " \ "order by data -> '$.timestamp' desc" % (product_id, scheduler_type) else: sql = "where data -> '$.product_id'='%s' order by data -> '$.timestamp' desc" % product_id status, result = db.select("period_task", sql) if status is True: for period in result: target = [] for group_id in period.get("target"): group_status, group_result = db.select_by_id( "groups", group_id) if group_status is True: target.append({ "id": group_id, "name": group_result.get("name") }) period["target"] = target period_audit_status, period_audit_result = db.select( "period_audit", "where data -> '$.id'='%s' order by data -> '$.result.timestamp' desc limit 1" % period["id"]) period["audit"].extend(period_audit_result) task.append(period) db.close_mysql() return {"data": task, "status": True, "message": ""}, 200 else: return {"status": False, "message": task}, 500
def get(self): logger.info("ProductListConfig") db = DB() user_info = g.user_info role_sql = [] if user_info["role"]: for role in user_info["role"]: role_sql.append("data -> '$.id'='%s'" % role) sql = " or ".join(role_sql) role_status, role_result = db.select("role", "where %s" % sql) if role_status and role_result: for role in role_result: if role["tag"] == 0: status, result = db.select( "product", "where data -> '$.name'='%s'" % 'config') db.close_mysql() product_list = [] if status is True: if result: product_list = result else: return {"status": False, "message": result}, 500 return { "data": product_list, "status": True, "message": "" }, 200 sql_list = [] product_list = [] if user_info["product"]: for product in user_info["product"]: sql_list.append("data -> '$.id'='%s'" % product) sql = " or ".join(sql_list) status, result = db.select( "product", "where data -> '$.name'='%s'" % 'config') db.close_mysql() if status is True: if result: product_list = result return { "data": product_list, "status": True, "message": "" }, 200 else: return { "status": False, "message": "Group does not exist" }, 404 else: return {"status": False, "message": result}, 500 return {"data": product_list, "status": True, "message": ""}, 200
def get(self): db = DB() user_info = g.user_info role_sql = [] if user_info["role"]: for role in user_info["role"]: role_sql.append("data -> '$.id'='%s'" % role) sql = " or ".join(role_sql) role_status, role_result = db.select("role", "where %s" % sql) if role_status and role_result: for role in role_result: user_list = [] if role["tag"] == 0: status, result = db.select("user", "") else: status, result = db.select_by_list_list( "user", "product", user_info["product"]) if status is True: if result: for user in result: user.pop("password") user_list.append(user) else: return { "data": user_list, "status": True, "message": "" }, 200 else: return {"status": False, "message": result}, 500 for item in user_list: for attr in item.keys(): if attr not in ["id", "username", "mail"]: if item[attr]: tmp = [] status, result = db.select_by_list( attr, "id", item[attr]) if status is True: for info in result: tmp.append({ "id": info["id"], "name": info["name"] }) item[attr] = tmp else: db.close_mysql() return {"status": False, "message": result}, 500 db.close_mysql() return {"data": user_list, "status": True, "message": ""}, 200
def get(self): product_id = request.args.get("product_id") db = DB() status, result = db.select( "groups", "where data -> '$.product_id'='%s'" % product_id) db.close_mysql() groups_list = [] if status is True: if result: for i in result: try: groups_list.append(eval(i[0])) except Exception as e: return {"status": False, "message": str(e)}, 500 else: return { "groups": { "group": groups_list }, "status": True, "message": "" }, 200 else: return {"status": False, "message": result}, 500 return { "groups": { "group": groups_list }, "status": True, "message": "" }, 200
def update_user_privilege(table, privilege): db = DB() status, result = db.select("user", "") if status is True: if result: for i in result: try: info = eval(i[0]) if table in info: if privilege in info[table]: info[table].remove(privilege) db.update_by_id("user", json.dumps(info, ensure_ascii=False), info["id"]) except Exception as e: db.close_mysql() logger.error("Update user privilege error: %s" % str(e)) return {"status": False, "message": str(e)} db.close_mysql() return {"status": True, "message": ""} else: db.close_mysql() return {"status": False, "message": "User does not exist"} else: db.close_mysql() logger.error("Update user privilege error: %s" % result) return {"status": False, "message": result}
def create_grains(minion_list, product_id, user): salt_api = salt_api_for_product(product_id) if isinstance(salt_api, dict): return salt_api, 500 db = DB() for minion in minion_list: select_status, select_result = db.select( "grains", "where data -> '$.id'='%s' and data -> " "'$.product_id'='%s'" % (minion, product_id)) grains = salt_api.grains(minion) grains[minion].update({"product_id": product_id}) if select_status is True: if len(select_result) > 1: for m in select_result: db.delete_by_id("grains", m["id"]) insert_status, insert_result = db.insert( "grains", json.dumps(grains[minion], ensure_ascii=False)) if insert_status is not True: logger.error("Add Grains error: %s" % insert_result) elif len(select_result) == 1: update_status, update_result = db.update_by_id( "grains", json.dumps(grains[minion], ensure_ascii=False), select_result[0]["id"]) if update_status is not True: logger.error("Update Grains error: %s" % update_result) else: insert_status, insert_result = db.insert( "grains", json.dumps(grains[minion], ensure_ascii=False)) if insert_status is not True: logger.error("Add Grains error: %s" % insert_result) db.close_mysql()
def get(self): args = parser.parse_args() action = args["action"] if action == "start": db = DB() status, result = db.select("product", "") db.close_mysql() if status is True: if result: for product in result: event_to_mysql.delay(product['id']) return {"data": "", "status": True, "message": ""}, 200 else: return { "data": "", "status": False, "message": "Product does not exist" }, 404 else: return {"data": "", "status": False, "message": result}, 500 if action == "stop": echo = os.popen("celery -A app.celery inspect active --json") info = echo.readline() try: result = eval( info.replace("true", "'true'").replace("false", "'false'")) for k, v in result.items(): for w in v: os.popen("kill -9 %s" % w.get("worker_pid")) return {"data": "", "status": True, "message": ""}, 200 except Exception as e: logger.error("Stop celery error: %s" % e) return {"data": "", "status": False, "message": "%s" % e}, 200
def create_git_project(product_id, project_name): logger.info("create_git_project1") db = DB() status, result = db.select( 'projects', "where data -> '$.gitlab_name'='%s'" % project_name) if status is True: if len(result) == 0: logger.info('project_name:' + project_name) gl = get_gitlab(product_id) try: gl.projects.create({'name': project_name}) except Exception as e: raise Exception('该gitlab项目名已被占用') projects = gl.projects.list(all=True) for pr in projects: if str(pr.__dict__.get('_attrs').get( 'path_with_namespace')).replace('root/', '') == project_name: project = gl.projects.get( pr.__dict__.get('_attrs').get('id')) commit_init_file(project) return True else: db.close_mysql() return False else: db.close_mysql() raise Exception('mysql select from projects error')
def menu_list(username): db = DB() status, result = db.select("user", "where data -> '$.username'='%s'" % username) menu = [] if status is True and result: try: roles = result[0].get("role") for role in roles: status, result = db.select_by_id("role", role) if status is True and result: if result["tag"] == role_dict["superuser"]: # 100 放到最后以保证系统管理在最后 menu = [ 1, 10, 11, 12, 2, 20, 21, 22, 3, 30, 4, 40, 5, 50, 6, 60, 61, 62, 63, 7, 70, 8, 80, 100, 101, 102, 103, 104 ] break elif result["tag"] == role_dict["product"]: menu = [ 1, 10, 11, 12, 2, 20, 21, 22, 3, 30, 4, 40, 5, 50, 6, 60, 61, 62, 63, 7, 70, 8, 80, 100, 103 ] break else: menu = [ 1, 10, 11, 12, 2, 20, 22, 3, 30, 5, 50, 6, 60, 61, 62, 63 ] except Exception as e: logger.error("Menu list error: %s" % e) db.close_mysql() return menu
def put(self, user_id): args = parser.parse_args() user = g.user_info["username"] if not args["mail"]: return { "status": False, "message": "The specified mail parameter does not exist" }, 200 db = DB() select_status, select_result = db.select( "user", "where data -> '$.username'='%s'" % args["username"]) if select_status is True and select_result: if select_result[0]["id"] != user_id: db.close_mysql() return { "status": False, "message": "The user name already exists" }, 200 status, result = db.select_by_id("user", user_id) if status is True and result: result["username"] = args["username"] result["mail"] = args["mail"] update_status, update_result = db.update_by_id( "user", json.dumps(result, ensure_ascii=False), user_id) db.close_mysql() if update_status is not True: logger.error("Change %s user info error: %s" % (user_id, update_result)) return {"status": False, "message": update_result}, 500 audit_log(user, user_id, "", "user", "change user info") return {"status": True, "message": ""}, 201 else: db.close_mysql() logger.error("Select user error: %s" % result) return {"status": False, "message": result}, 500
def put(self, period_id): user = g.user_info["username"] args = parser.parse_args() args["id"] = period_id period_task = args db = DB() # 判断是否存在 select_status, select_result = db.select_by_id("period_task", period_id) if select_status is not True: db.close_mysql() logger.error("Modify period_task error: %s" % select_result) return {"status": False, "message": select_result}, 500 if not select_result: db.close_mysql() return { "status": False, "message": "%s does not exist" % period_id }, 404 # 判断名字否已经存在 status, result = db.select( "period_task", "where data -> '$.name'='%s' and data -> '$.product_id'='%s'" % (args["name"], args["product_id"])) if status is True and result: if period_id != result[0].get("id"): db.close_mysql() return { "status": False, "message": "The period_task name already exists" }, 200 period_task["result"] = select_result["result"] period_task["timestamp"] = select_result["timestamp"] period_task["status"] = select_result["status"] period_task["action"] = select_result["action"] period_task["executed_minion"] = select_result["executed_minion"] period_task["count"] = select_result["count"] period_task["step"] = select_result["step"] period_task["audit"] = select_result["audit"] if args["once"]["date"]: args["once"]["date"] = utc_to_local(args["once"]["date"]) status, result = db.update_by_id( "period_task", json.dumps(period_task, ensure_ascii=False), period_id) db.close_mysql() # 修改调度任务 if args["scheduler"] == "once" and args["once"]["type"] == "timing": run_date = args["once"]["date"].split( " ")[0] + " " + args["once"]["time"] scheduler_timing_modify(args["id"], args["product_id"], user, run_date) if args["scheduler"] == "period": scheduler_interval_modify(args["id"], args["product_id"], user, args["period"]["interval"], args["period"]["type"]) if status is not True: logger.error("Modify period_task error: %s" % result) return {"status": False, "message": result}, 500 audit_log(user, period_id, "", "period_task", "edit") return {"status": True, "message": ""}, 200
def get(self): db = DB() user_info = g.user_info sql_list = [] groups_list = [] if user_info["groups"]: for group in user_info["groups"]: sql_list.append("data -> '$.id'='%s'" % group) sql = " or ".join(sql_list) status, result = db.select("groups", "where %s" % sql) db.close_mysql() if status is True: if result: for i in result: try: groups_list.append(eval(i[0])) except Exception as e: return {"status": False, "message": str(e)}, 500 else: return { "status": False, "message": "Group does not exist" }, 404 else: return {"status": False, "message": result}, 500 return {"groups": {"groups": groups_list}}, 200 else: return {"groups": {"groups": groups_list}}, 200
def post(self): user = g.user_info["username"] args = parser.parse_args() args["id"] = uuid_prefix("u") db = DB() status, result = db.select( "user", "where data -> '$.username'='%s'" % args["username"]) if status is True: if len(result) == 0: # 默认新添加的用户都是默认用户 role_id = get_common_user() if isinstance(role_id, dict): return role_id args["role"].append(role_id) insert_status, insert_result = db.insert( "user", json.dumps(args, ensure_ascii=False)) db.close_mysql() if insert_status is not True: logger.error("Add user error: %s" % insert_result) return {"status": False, "message": insert_result}, 500 audit_log(user, args["id"], "", "user", "add") return {"status": True, "message": ""}, 201 else: db.close_mysql() return { "status": False, "message": "The user name already exists" }, 200 else: db.close_mysql() logger.error("Select user error: %s" % result) return {"status": False, "message": result}, 500
def get(self): product_id = request.args.get("product_id") db = DB() user_info = g.user_info sql_list = [] groups_list = [] if user_info["groups"]: for group in user_info["groups"]: sql_list.append( "data -> '$.id'='%s' and data -> '$.product_id'='%s'" % (group, product_id)) sql = " or ".join(sql_list) status, result = db.select("groups", "where %s" % sql) db.close_mysql() if status is True: if result: groups_list = result return { "data": groups_list, "status": True, "message": "" }, 200 else: return { "status": False, "message": "Group does not exist" }, 404 else: return {"status": False, "message": result}, 500 else: return {"data": groups_list, "status": True, "message": ""}, 200
def get(self): db = DB() status, result = db.select("product", "") db.close_mysql() product_list = [] if status is True: if result: for i in result: try: product_list.append(eval(i[0])) except Exception as e: return {"status": False, "message": str(e)}, 500 else: return { "status": False, "message": "Product does not exist" }, 404 else: return {"status": False, "message": result}, 500 return { "products": { "product": product_list }, "status": True, "message": "" }, 200
def get(self): user = g.user_info["username"] args = parser.parse_args() salt_api = salt_api_for_product(args["product_id"]) minions = [] minions_mysql = [] if isinstance(salt_api, dict): return salt_api, 500 else: result = salt_api.list_all_key() if result: if result.get("status") is False: return result, 500 for minion in result.get("minions"): minions.append(minion) # 同步产品线下的Grains Grains.create_grains(minions, args["product_id"], user) db = DB() status, result = db.select("grains", "where data -> '$.product_id'='%s'" % args["product_id"]) db.close_mysql() if status is True and result: for i in result: minions_mysql.append(i.get("id")) # 对比数据库中的minion与已经同意的minion的不同,删掉数据库中多余的minion diff = list(set(minions_mysql).difference(minions)) Grains.delete_grains(diff, args["product_id"], user) return {"status": True, "message": ""}, 200
def put(self, role_id): user = g.user_info["username"] args = parser.parse_args() args["id"] = role_id role = args db = DB() status, result = db.select( "role", "where data -> '$.name'='%s'" % args["name"]) if status is True: if len(result) != 0: info = eval(result[0][0]) if role_id != info.get("id"): return { "status": False, "message": "The role name already exists" }, 200 status, result = db.update_by_id("role", json.dumps(role, ensure_ascii=False), role_id) db.close_mysql() if status is not True: logger.error("Modify role error: %s" % result) return {"status": False, "message": result}, 500 audit_log(user, role_id, "", "role", "edit") return {"status": True, "message": ""}, 200
def delete(self, groups_id): db = DB() # 首先获得所需项目 status, result = db.select_by_id("groups", groups_id) if status: group = result else: return {"status": False, "message": str(result)}, 500 # 执行删除 status, result = db.delete_by_id("groups", groups_id) if status is not True: return {"status": False, "message": result}, 500 if result is 0: return { "status": False, "message": "%s does not exist" % groups_id }, 404 # 完成数据的统一,将project中的组类别删除 project_list = group['projects'] for project_name in project_list: status, result = db.select( 'projects', "where data -> '$.name'='%s'" % project_name) project_origion = dict(result[0]) group_list = list(project_origion['groups']) group_list.remove(groups_id) project_origion['groups'] = group_list db.update_by_id("projects", json.dumps(project_origion, ensure_ascii=False), result[0]['id']) db.close_mysql() return {"status": True, "message": ""}, 200
def post(self): args = parser.parse_args() args["id"] = uuid_prefix("p") user = g.user_info["username"] product = args db = DB() status, result = db.select( "product", "where data -> '$.name'='%s'" % args["name"]) if status is True: if len(result) == 0: insert_status, insert_result = db.insert( "product", json.dumps(product, ensure_ascii=False)) db.close_mysql() if insert_status is not True: logger.error("Add product error: %s" % insert_result) return {"status": False, "message": insert_result}, 500 audit_log(user, args["id"], "", "product", "add") return {"status": True, "message": ""}, 201 else: return { "status": False, "message": "The product name already exists" }, 200 else: logger.error("Select product name error: %s" % result) return {"status": False, "message": result}, 500
def post(self): args = parser.parse_args() args["id"] = uuid_prefix("project") db = DB() project = transfer_args_to_project(args) # 如果是创建,group们必然是增加此项目名 status, result = db.select( "projects", "where data -> '$.name'='%s' and data -> '$.product_id'='%s'" % (args["name"], args["product_id"])) if status is True: if len(result) == 0: try: create_git_project(args['product_id'], args['gitlab_name']) git_clone(args['product_id'], args['gitlab_name']) except Exception as e: return {"status": False, "message": str(e)}, 500 insert_status, insert_result = db.insert( "projects", json.dumps(project, ensure_ascii=False)) update_group_for_create_project(project['name'], project['groups']) db.close_mysql() if insert_status is not True: return {"status": False, "message": insert_result}, 500 return {"status": True, "message": ""}, 200 else: db.close_mysql() return { "status": False, "message": "The projects name already exists" }, 500 else: db.close_mysql() return {"status": False, "message": result}, 500
def get(self, host_id): logger.info("HOST") db = DB() status, result = db.select_by_id("host", host_id) if status is True: if result: host = result else: return { "status": False, "message": "%s does not exist" % host_id }, 404 else: return {"status": False, "message": result}, 500 status, result = db.select( "groups", "where data -> '$.product_id'='%s'" % host["product_id"]) if status is True: groups_list = result else: db.close_mysql() return {"status": False, "message": result}, 500 for group in groups_list: for minion in group["minion"]: if host["minion_id"] == minion: host["groups"].append(group["name"]) db.close_mysql() return {"data": host, "status": True, "message": ""}, 200
def reject_host(minion_list, product_id, user): db = DB() for minion_id in minion_list: select_status, select_result = db.select( "host", "where data -> '$.minion_id'='%s' " "and data -> '$.product_id'='%s'" % (minion_id, product_id)) if select_status is False: logger.error("Reject %s host error: %s" % (minion_id, select_result)) if select_result: for host in select_result: try: # 拒绝后添加拒绝标签 host["tag"].append({"name": "reject", "color": "red"}) status, result = db.update_by_id( "host", json.dumps(host, ensure_ascii=False), host["id"]) if status is False: logger.error("Reject %s host error: %s" % (minion_id, result)) else: audit_log(user, host["id"], product_id, "host", "reject") except Exception as e: logger.error("Reject %s host error: %s" % (minion_id, e)) else: logger.error("Select %s host does not exist" % minion_id) db.close_mysql()
def add_host(minion_list, product_id, user): db = DB() for minion_id in minion_list: select_status, select_result = db.select( "host", "where data -> '$.minion_id'='%s' " "and data -> '$.product_id'='%s'" % (minion_id, product_id)) if select_status is False: logger.error("Add %s host error: %s" % (minion_id, select_result)) continue if not select_result: id = uuid_prefix("h") host = { "id": id, "minion_id": minion_id, "product_id": product_id, "groups": [], "tag": [], } insert_status, insert_result = db.insert( "host", json.dumps(host, ensure_ascii=False)) if insert_status is False: logger.error("Add %s host error: %s" % (minion_id, insert_result)) else: audit_log(user, id, product_id, "host", "add") db.close_mysql()
def post(self): logger.info("HOSTLIST") args = parser.parse_args() args["id"] = uuid_prefix("h") user = g.user_info["username"] host = args db = DB() status, result = db.select( "host", "where data -> '$.minion_id'='%s'" % args["minion_id"]) if status is True: if len(result) == 0: insert_status, insert_result = db.insert( "host", json.dumps(host, ensure_ascii=False)) db.close_mysql() if insert_status is not True: logger.error("Add host error: %s" % insert_result) return {"status": False, "message": insert_result}, 500 audit_log(user, args["id"], args["product_id"], "host", "add") return {"status": True, "message": ""}, 201 else: db.close_mysql() return { "status": False, "message": "The host name already exists" }, 200 else: db.close_mysql() logger.error("Select host name error: %s" % result) return {"status": False, "message": result}, 500
def verify_acl(acl_list, command): if acl_list: db = DB() sql_list = [] for acl_id in acl_list: sql_list.append("data -> '$.id'='%s'" % acl_id) sql = " or ".join(sql_list) status, result = db.select("acl", "where %s" % sql) db.close_mysql() if status is True: if result: for i in result: try: acl = eval(i[0]) for deny in acl["deny"]: deny_pattern = re.compile(deny) if deny_pattern.search(command): return { "status": False, "message": "Deny Warning : You don't have permission run [ %s ]" % command } except Exception as e: return {"status": False, "message": str(e)} return {"status": True, "message": ""} else: return {"status": False, "message": "acl does not exist"} else: return {"status": False, "message": result} else: return {"status": True, "message": ""}
def get(self): db = DB() status, result = db.select("role", "") db.close_mysql() if status is True: return {"data": result, "status": True, "message": ""}, 200 else: return {"status": False, "message": result}, 500
def get(self): db = DB() state, hosts_list = db.select('host', '') if state: db.close_mysql() return {"status": True, "message": "", "data": hosts_list}, 200 else: db.close_mysql() return {"status": False, "message": str(state)}, 500