Skip to content

Rulebase Queries

Reads access and NAT rules from the cache, filtered to enabled access rules only as an example of the enabled_only filter shared by all rulebase helper methods.

examples/05_rulebase_queries.py
"""Query access and NAT rulebases from the cache.

Run: uv run examples/05_rulebase_queries.py
"""

import asyncio
import os

# Load environment variables BEFORE importing arodonata modules
from dotenv import load_dotenv

load_dotenv(".env.lib", override=True)
load_dotenv(".env.secrets", override=True)

import time

from sqlalchemy.ext.asyncio import create_async_engine

from arodonata import ArodonataClient, ArodonataSettings


def _settings_from_env() -> ArodonataSettings:
    api_key_vars = os.getenv("API_KEY_VARS", "").split(",")
    api_keys = ",".join(os.getenv(var, "") for var in api_key_vars)
    return ArodonataSettings(
        mgmt_names=os.getenv("MGMT_NAMES", "mgmt1"),
        mgmt_servers=os.getenv("MGMT_SERVERS", "10.0.0.1"),
        api_keys=api_keys,
    )


async def main() -> None:
    engine = create_async_engine(os.getenv("DATABASE_URL", "sqlite+aiosqlite:///:memory:"))
    client = ArodonataClient(engine=engine, settings=_settings_from_env())

    start_time = time.perf_counter()

    try:
        async with client:
            access_rules = await client.get_access_rules(enabled_only=True)
            print(f"Enabled access rules: {len(access_rules)}")
            for rule in access_rules[:5]:
                print(f"  #{rule.rule_number}: {rule.name}")

            nat_rules = await client.get_nat_rules()
            print(f"\nNAT rules: {len(nat_rules)}")
            for nat_rule in nat_rules[:5]:
                print(f"  #{nat_rule.rule_number}: {nat_rule.name}")
    finally:
        await engine.dispose()

    duration = time.perf_counter() - start_time
    print(f"\nTotal time: {duration:.2f}s")


if __name__ == "__main__":
    asyncio.run(main())

Run it:

uv run examples/05_rulebase_queries.py