Пример #1
0
async def authdb_start() -> None:
    """Initialize database connection."""
    log.debug("Opening database connection")
    await Tortoise.init(
        db_url=f"sqlite:///{str(params.api.dbmain_path)}",
        modules={"models": ["stats.auth.models"]},
    )
    await Tortoise.generate_schemas()
Пример #2
0
async def authenticate_user(username: str, password: str) -> bool:
    """Authenticate a user."""
    user = await get_user(username)
    valid = argon2.verify(password, user.password)
    if valid:
        log.debug("Authentication succeeded for user {}", username)
    if not valid:
        log.error("Authentication failed for user {}", username)
    return valid
Пример #3
0
async def job_status(
        job_id: int,
        x_48ix_api_user: Optional[str] = Header(None),
        x_48ix_api_key: Optional[str] = Header(None),
):
    """Get the status of a job by ID."""
    await _verify_auth(x_48ix_api_user, x_48ix_api_key, "/job/*")
    job = await get_job(job_id)
    await job.fetch_related("requestor")

    response = UpdatePolicyResponse(
        id=job.id,
        request_time=job.request_time,
        complete_time=job.complete_time,
        requestor=job.requestor.username,
        detail=job.detail,
        in_progress=job.in_progress,
    )
    log.debug("Job {} status: {}", job.id, response)
    return response.dict()
Пример #4
0
async def authorize_route(username: str, route: str) -> bool:
    """Verify if a user has access to an API route."""
    is_authorized = False
    try:
        user = await get_user(username)
        await user.fetch_related("routes")
        async for user_route in user.routes:
            if route == user_route.name:
                is_authorized = True
                break
    except DoesNotExist:
        raise AuthError("User '{u}' does not exist.",
                        u=username,
                        status_code=401) from None

    if is_authorized:
        log.debug("{} is authorized to access {}", username, route)
    if not is_authorized:
        log.error("{} is not authorized to access {}", username, route)

    return is_authorized
Пример #5
0
async def port_utilization(
    port_id: str,
    period: int = None,
    start: str = None,
    end: str = None,
):
    """Get utilization statistics for a port."""
    if start is not None:
        data_in = await port_utilization_range(
            port_id=port_id,
            direction="in",
            start=start,
            end=end,
            limit=params.api.default_limit,
        )
        data_out = await port_utilization_range(
            port_id=port_id,
            direction="out",
            start=start,
            end=end,
            limit=params.api.default_limit,
        )
        avg_in = await port_average_range(
            port_id=port_id,
            direction="in",
            start=start,
            end=end,
            limit=params.api.default_limit,
        )
        avg_out = await port_average_range(
            port_id=port_id,
            direction="out",
            start=start,
            end=end,
            limit=params.api.default_limit,
        )
    else:
        period = period or params.api.default_period
        data_in = await port_utilization_period(
            port_id=port_id,
            direction="in",
            period=period,
            limit=params.api.default_limit,
        )
        data_out = await port_utilization_period(
            port_id=port_id,
            direction="out",
            period=period,
            limit=params.api.default_limit,
        )
        avg_in = await port_average_period(
            port_id=port_id,
            direction="in",
            period=period,
            limit=params.api.default_limit,
        )
        avg_out = await port_average_period(
            port_id=port_id,
            direction="out",
            period=period,
            limit=params.api.default_limit,
        )

    location, participant_id, _ = parse_port_id(port_id)

    response = {
        "ingress": data_in.get("values", [[]]),
        "egress": data_out.get("values", [[]]),
        "participant_id": participant_id,
        "location": location,
        "port_id": port_id,
        "ingress_average": avg_in.get("values", [["", 0]])[0][1],
        "egress_average": avg_out.get("values", [["", 0]])[0][1],
    }

    log.debug("Response for query: {}", response)

    return response
Пример #6
0
async def authdb_stop() -> None:
    """Close database connection."""
    log.debug("Closing database connection")
    await Tortoise.close_connections()