Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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),
    )
Exemple #4
0
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),
    )
Exemple #5
0
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),
    )
Exemple #6
0
 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)
Exemple #7
0
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
Exemple #8
0
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,
    )
Exemple #9
0
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__)
Exemple #10
0
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
Exemple #11
0
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},
    )
Exemple #12
0
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()
Exemple #13
0
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
Exemple #14
0
 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)