def gost_runner( port_id: int, server_id: int, port_num: int, gost_config: t.Dict, remote_ip: str = None, update_gost: bool = False, update_status: bool = False, ): server = get_server(SessionLocal(), server_id) priv_data_dir = prepare_priv_dir(server) with open(f"ansible/project/roles/gost/files/{port_id}.json", "w") as f: f.write(json.dumps(gost_config, indent=4)) extra_vars = { "host": server.ansible_name, "port_id": port_id, "local_port": port_num, "remote_ip": remote_ip, "update_gost": update_gost, "update_status": update_status, } r = ansible_runner.run_async( private_data_dir=priv_data_dir, project_dir="ansible/project", playbook="gost.yml", extravars=extra_vars, status_handler=lambda s, **k: gost_status_handler.delay( port_id, s, update_status ), finished_callback=iptables_finished_handler(server, True) if update_status else lambda r: None, ) return r[1].config.artifact_dir
def iptables_runner( port_id: int, server_id: int, local_port: int, remote_ip: str = None, remote_port: int = None, forward_type: str = None, update_status: bool = False, ): if not update_status: return server = get_server(SessionLocal(), server_id) priv_data_dir = prepare_priv_dir(server) if not forward_type: args = f" delete {local_port}" elif remote_ip and remote_port: args = f" -t={forward_type} forward {local_port} {remote_ip} {remote_port}" else: args = f" list {local_port}" extra_vars = { "host": server.ansible_name, "local_port": local_port, "iptables_args": args, } t = ansible_runner.run_async( private_data_dir=priv_data_dir, project_dir="ansible/project", playbook="iptables.yml", extravars=extra_vars, status_handler=lambda s, **k: forward_rule_status_handler.delay( port_id, s, update_status), finished_callback=iptables_finished_handler(server, True), ) return t[1].config.artifact_dir
def connect_runner(server_id: int, ): with db_session() as db: server = get_server(db, server_id) return run( server=server, playbook="connect.yml", finished_callback=finished_handler(server), )
def connect_runner(server_id: int, ): with db_session() as db: server = get_server(db, server_id) run( server=server, playbook="connect.yml", event_handler=server_facts_event_handler(server.id), finished_callback=finished_handler(server.id), )
def server_runner(server_id: int, **kwargs): init_md5 = get_md5_for_file("ansible/project/server.yml") with db_session() as db: server = get_server(db, server_id) run( server=server, playbook="server.yml", extravars=kwargs, event_handler=server_facts_event_handler(server.id), finished_callback=finished_handler(server, init_md5), )
def wrapper(runner): with db_session() as db: server = get_server(db, server_id) facts = runner.get_fact_cache(server.ansible_name) if facts: if facts.get("traffic", "") and update_traffic_bool: update_traffic(server, facts.get("traffic", ""), accumulate=accumulate) if port_id is not None and (facts.get("error") or facts.get("systemd_error")): update_rule_error(server.id, port_id, facts) update_facts(server.id, facts)
async def detailed_server_get( response: Response, server_id: int, db=Depends(get_db), user=Depends(get_current_active_user), ): """ Get detailed server by id """ server = get_server(db, server_id) if not server: raise HTTPException(status_code=404, detail="Server not found") if (not user.is_superuser and not user.is_ops and not any(user.id == u.user_id for u in server.allowed_users)): raise HTTPException(status_code=404, detail="Server not found") return server
def iptables_reset_runner( server_id: int, port_num: int, ): with db_session() as db: server = get_server(db, server_id) extravars = { "host": server.ansible_name, "local_port": port_num, "iptables_args": f" reset {port_num}", } run( server=server, playbook="iptables.yml", extravars=extravars, )
async def server_get( response: Response, server_id: int, db=Depends(get_db), user=Depends(get_current_active_user), ): """ Get server by id """ server = get_server(db, server_id) if not server: raise HTTPException(status_code=404, detail="Server not found") if user.is_admin(): return ServerOpsOut(**server.__dict__) if not any(user.id == u.user_id for u in server.allowed_users): raise HTTPException(status_code=404, detail="Server not found") return ServerOut(**server.__dict__)
def iptables_reset_runner( server_id: int, port_num: int, ): server = get_server(SessionLocal(), server_id) priv_data_dir = prepare_priv_dir(server) extra_vars = { "host": server.ansible_name, "local_port": port_num, "iptables_args": f" reset {port_num}", } t = ansible_runner.run_async( private_data_dir=priv_data_dir, project_dir="ansible/project", playbook="iptables.yml", extravars=extra_vars, ) return t[1].config.artifact_dir
def tc_runner( server_id: int, port_num: int, egress_limit: int = None, ingress_limit: int = None ): with db_session() as db: server = get_server(db, server_id) args = "" if egress_limit: args += f' -e={egress_limit}kbit' if ingress_limit: args += f' -i={ingress_limit}kbit' args += f' {port_num}' run( server=server, playbook="tc.yml", extravars={"host": server.ansible_name, "tc_args": args}, )
def update_facts(server_id: int, facts: t.Dict, md5: str = None): with db_session() as db: db_server = get_server(db, server_id) if facts.get("ansible_os_family"): db_server.config["system"] = { "os_family": facts.get("ansible_os_family"), "architecture": facts.get("ansible_architecture"), "distribution": facts.get("ansible_distribution"), "distribution_version": facts.get("ansible_distribution_version"), "distribution_release": facts.get("ansible_distribution_release"), } elif facts.get("msg"): db_server.config["system"] = {"msg": facts.get("msg")} if "services" in facts: db_server.config["services"] = facts.get("services") # TODO: Add disable feature for func in [ "brook", "caddy", "ehco", "gost", "iperf", "iptables", "node_exporter", "shadowsocks", "socat", "tiny_port_mapper", "v2ray", "wstunnel", "realm", "haproxy", ]: if func in facts: db_server.config[func] = facts.get(func) if md5 is not None: db_server.config["init"] = md5 db.add(db_server) db.commit()
def tc_runner(server_id: int, port_num: int, egress_limit: int = None, ingress_limit: int = None): server = get_server(SessionLocal(), server_id) priv_data_dir = prepare_priv_dir(server) args = "" if egress_limit: args += f' -e={egress_limit}kbit' if ingress_limit: args += f' -i={ingress_limit}kbit' args += f' {port_num}' t = ansible_runner.run_async( private_data_dir=priv_data_dir, project_dir="ansible/project", playbook="tc.yml", extravars={ "host": server.ansible_name, "tc_args": args }, ) return t[1].config.artifact_dir
def wrapper(runner): with db_session() as db: server = get_server(db, server_id) facts = runner.get_fact_cache(server.ansible_name) update_facts(server.id, facts, md5=md5)