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()