"""FTL and database models."""
from pydantic import Field
from pihole_lib.models.base import StrictModel
[docs]
class DatabaseUser(StrictModel):
"""Database file user information."""
uid: int = Field(..., description="User ID")
name: str = Field(..., description="User name")
info: str = Field(..., description="Additional user information")
[docs]
class DatabaseGroup(StrictModel):
"""Database file group information."""
gid: int = Field(..., description="Group ID")
name: str = Field(..., description="Group name")
[docs]
class DatabaseOwner(StrictModel):
"""Database file ownership information."""
user: DatabaseUser = Field(..., description="User information")
group: DatabaseGroup = Field(..., description="Group information")
[docs]
class DatabaseInfo(StrictModel):
"""Pi-hole database information."""
size: int = Field(..., description="Database file size in bytes")
type: str = Field(..., description="File type description")
mode: str = Field(..., description="File permissions")
atime: int = Field(..., description="Last access time (Unix timestamp)")
mtime: int = Field(..., description="Last modification time (Unix timestamp)")
ctime: int = Field(..., description="Creation time (Unix timestamp)")
owner: DatabaseOwner = Field(..., description="File ownership information")
queries: int = Field(..., description="Number of queries in memory")
earliest_timestamp: int = Field(
..., description="Earliest query timestamp in memory"
)
queries_disk: int = Field(..., description="Number of queries on disk")
earliest_timestamp_disk: int = Field(
..., description="Earliest query timestamp on disk"
)
sqlite_version: str = Field(..., description="SQLite version")
[docs]
class FTLDatabaseStats(StrictModel):
"""FTL database statistics."""
gravity: int = Field(..., description="Number of gravity domains")
groups: int = Field(..., description="Number of groups")
lists: int = Field(..., description="Number of lists")
clients: int = Field(..., description="Number of clients")
domains: dict = Field(..., description="Domain statistics")
regex: dict = Field(..., description="Regex statistics")
[docs]
class FTLClientStats(StrictModel):
"""FTL client statistics."""
total: int = Field(..., description="Total number of clients")
active: int = Field(..., description="Number of active clients")
[docs]
class FTLDnsmasqStats(StrictModel):
"""FTL dnsmasq statistics."""
dns_cache_inserted: int = Field(..., description="DNS cache insertions")
dns_cache_live_freed: int = Field(..., description="DNS cache live freed")
dns_queries_forwarded: int = Field(..., description="DNS queries forwarded")
dns_auth_answered: int = Field(..., description="DNS authoritative answers")
dns_local_answered: int = Field(..., description="DNS local answers")
dns_stale_answered: int = Field(..., description="DNS stale answers")
dns_unanswered: int = Field(..., description="DNS unanswered queries")
dnssec_max_crypto_use: int = Field(..., description="DNSSEC max crypto use")
dnssec_max_sig_fail: int = Field(..., description="DNSSEC max signature failures")
dnssec_max_work: int = Field(..., description="DNSSEC max work")
bootp: int = Field(..., description="BOOTP requests")
pxe: int = Field(..., description="PXE requests")
dhcp_ack: int = Field(..., description="DHCP ACK messages")
dhcp_decline: int = Field(..., description="DHCP decline messages")
dhcp_discover: int = Field(..., description="DHCP discover messages")
dhcp_inform: int = Field(..., description="DHCP inform messages")
dhcp_nak: int = Field(..., description="DHCP NAK messages")
dhcp_offer: int = Field(..., description="DHCP offer messages")
dhcp_release: int = Field(..., description="DHCP release messages")
dhcp_request: int = Field(..., description="DHCP request messages")
noanswer: int = Field(..., description="No answer queries")
leases_allocated_4: int = Field(..., description="IPv4 leases allocated")
leases_pruned_4: int = Field(..., description="IPv4 leases pruned")
leases_allocated_6: int = Field(..., description="IPv6 leases allocated")
leases_pruned_6: int = Field(..., description="IPv6 leases pruned")
tcp_connections: int = Field(..., description="TCP connections")
dhcp_leasequery: int = Field(..., description="DHCP lease queries")
dhcp_lease_unassigned: int = Field(..., description="DHCP unassigned leases")
dhcp_lease_actve: int = Field(..., description="DHCP active leases")
dhcp_lease_unknown: int = Field(..., description="DHCP unknown leases")
[docs]
class FTLStats(StrictModel):
"""FTL statistics."""
database: FTLDatabaseStats = Field(..., description="Database statistics")
privacy_level: int = Field(..., description="Privacy level")
query_frequency: int = Field(..., description="Query frequency")
clients: FTLClientStats = Field(..., description="Client statistics")
pid: int = Field(..., description="Process ID of FTL")
uptime: float = Field(..., description="FTL uptime in seconds")
mem_percent: float = Field(..., alias="%mem", description="Memory usage percentage")
cpu_percent: float = Field(..., alias="%cpu", description="CPU usage percentage")
allow_destructive: bool = Field(
..., description="Whether destructive operations are allowed"
)
dnsmasq: FTLDnsmasqStats = Field(..., description="Dnsmasq statistics")
[docs]
class FTLInfo(StrictModel):
"""Pi-hole FTL information wrapper."""
ftl: FTLStats = Field(..., description="FTL statistics and runtime information")