Examples

This page contains practical examples for using the Pi-hole Python library.

Quick Start

from pihole_lib import PiHoleClient

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    # Get system info
    login_info = client.info.get_login_info()
    print(f"Pi-hole version: {login_info.version}")

    # Update gravity
    for line in client.actions.update_gravity():
        print(line.strip())

System Information

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    # Login info
    login_info = client.info.get_login_info()
    print(f"DNS Status: {login_info.dns}")

    # Version info
    version = client.info.get_version_info()
    print(f"Core: {version.version.core.local.version}")

    # System resources
    system = client.info.get_system_info()
    print(f"RAM: {system.system.memory.ram.percent_used:.1f}%")

DNS Management

from pihole_lib import PiHoleClient

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    dns = client.dns

    # Get DNS config
    config = dns.get_config()
    print(f"Blocking active: {config.blocking_active}")

    # Add/remove A records
    dns.add_a_record("server.local", "192.168.1.100")
    dns.remove_a_record("server.local", "192.168.1.100")

    # Add/remove CNAME records
    dns.add_cname_record("www.local", "server.local")
    dns.remove_cname_record("www.local", "server.local")

    # Blocking control
    dns.disable_blocking(timer=300)  # Disable for 5 minutes
    dns.enable_blocking()

Domain Lists

from pihole_lib import PiHoleClient, ListType

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    # Get lists
    all_lists = client.lists.get_lists()
    block_lists = client.lists.get_lists(list_type=ListType.BLOCK)

    # Add a blocklist
    client.lists.add_list(
        address="https://example.com/blocklist.txt",
        list_type=ListType.BLOCK,
        comment="Example blocklist"
    )

    # Search domains
    results = client.lists.search_domains("example.com")
    print(f"Found {results.search.results.total} matches")

    # Delete a list
    client.lists.delete_list("https://example.com/blocklist.txt", ListType.BLOCK)

Domain Management

from pihole_lib import PiHoleClient, DomainType, DomainKind

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    domains = client.domains

    # Get domains
    all_domains = domains.get_domains()
    blocked = domains.get_domains(domain_type=DomainType.DENY)

    # Add a blocked domain
    domains.add_domain(
        domain="badsite.com",
        domain_type=DomainType.DENY,
        domain_kind=DomainKind.EXACT,
        comment="Malicious site"
    )

    # Add a regex pattern
    domains.add_domain(
        domain=r".*\.ads\..*",
        domain_type=DomainType.DENY,
        domain_kind=DomainKind.REGEX
    )

    # Delete a domain
    domains.delete_domain("badsite.com", DomainType.DENY, DomainKind.EXACT)

Groups

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    groups = client.groups

    # Get all groups
    all_groups = groups.get_groups()

    # Create a group
    groups.create_group(name="family_devices", comment="Family devices")

    # Update a group
    groups.update_group(name="family_devices", comment="Updated comment")

    # Delete a group
    groups.delete_group("family_devices")

Client Management

from pihole_lib import PiHoleClient

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    clients = client.clients

    # Get all clients
    all_clients = clients.get_clients()

    # Add a client
    clients.add_client(
        client="192.168.1.100",
        comment="John's laptop",
        groups=[0]
    )

    # Get suggestions (unconfigured clients)
    suggestions = clients.get_client_suggestions()

    # Delete a client
    clients.delete_client("192.168.1.100")

Configuration

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    config = client.config

    # Get configuration
    current = config.get_config()
    dns_only = config.get_config("dns")

    # Update configuration
    config.update_config({
        "dns": {
            "upstreams": ["1.1.1.1", "1.0.0.1"],
            "queryLogging": True
        }
    })

    # Add/remove config items
    config.add_config_item("dns/upstreams", "8.8.8.8")
    config.remove_config_item("dns/upstreams", "8.8.8.8")

Actions & Maintenance

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    actions = client.actions

    # Update gravity
    for line in actions.update_gravity():
        print(line.strip())

    # Restart DNS
    actions.restart_dns()

    # Flush logs
    actions.flush_logs()

    # Flush network table
    actions.flush_network()

Backup & Restore

from pihole_lib import PiHoleClient, TeleporterImportOptions, TeleporterGravityOptions

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    backup = client.backup

    # Export backup
    backup_file = backup.export_backup("/path/to/backups")

    # Import with options
    options = TeleporterImportOptions(
        config=True,
        dhcp_leases=False,
        gravity=TeleporterGravityOptions(group=True, adlist=True)
    )
    backup.import_backup(backup_file, options)

Statistics

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    stats = client.stats

    # Summary
    summary = stats.get_summary()
    print(f"Blocked: {summary.queries.percent_blocked}%")

    # Top domains/clients
    top_domains = stats.get_top_domains(count=10)
    top_clients = stats.get_top_clients(count=10)

    # Recent blocked
    blocked = stats.get_recent_blocked(count=10)

    # Query history
    history = stats.get_history()

DHCP

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    dhcp = client.dhcp

    # Get leases
    leases = dhcp.get_leases()
    for lease in leases.leases:
        print(f"{lease.name}: {lease.ip}")

    # Delete a lease
    dhcp.delete_lease("192.168.1.50")

Network

with PiHoleClient("http://192.168.1.100", password="your-password") as client:
    network = client.network

    # Get devices
    devices = network.get_devices(max_devices=10)

    # Get gateway info
    gateway = network.get_gateway()

    # Get interfaces
    interfaces = network.get_interfaces()

    # Get routes
    routes = network.get_routes()

Error Handling

from pihole_lib import (
    PiHoleClient,
    PiHoleAuthenticationError,
    PiHoleConnectionError,
    PiHoleServerError
)

try:
    with PiHoleClient("http://192.168.1.100", password="wrong") as client:
        pass
except PiHoleAuthenticationError:
    print("Authentication failed")
except PiHoleConnectionError:
    print("Connection failed")
except PiHoleServerError:
    print("Server error")

Manual Session Control

from pihole_lib import PiHoleClient

client = PiHoleClient("http://192.168.1.100", password="your-password")

try:
    client._ensure_session()
    client._authenticate()

    if client.is_authenticated():
        print(f"Session: {client.get_session_id()}")
finally:
    client.close()