11"""Custom types"""
22
3- from typing import Final , Literal
3+ from typing import Annotated , Final , Literal
44
55from pydantic import BaseModel , Field , ValidationInfo , field_validator
66
7+ SystemUser = Annotated [str , Field (pattern = r"^[a-z0-9_][a-z0-9_-]*[a-z0-9]$" )]
8+ ServiceUnit = Annotated [str , Field (pattern = r"^[a-z0-9][a-z0-9_-]*[a-z0-9]\.service$" )]
9+ FwdZone = Annotated [str , Field (pattern = r"^([a-z0-9][a-z0-9-]+[a-z0-9]\.)+[a-z]+$" )]
10+ Ptr4Zone = Annotated [str , Field (pattern = r"^[0-9/]+\.([0-9]+\.)+in-addr\.arpa$" )]
11+ Ptr6Zone = Annotated [str , Field (pattern = r"^([a-f0-9]\.)+ip6\.arpa$" )]
12+ Zone = FwdZone | Ptr4Zone | Ptr6Zone
13+
714SERVICE_DEFAULTS : Final [dict [str , dict [str , str ]]] = {
815 "bind" : {
916 "unit" : "named.service" ,
1623}
1724
1825
19- class SystemConf (BaseModel ):
26+ class SystemConf (BaseModel , extra = "forbid" , frozen = True ):
2027 """
2128 Subset of ZoneHandlerConf
2229 """
2330
24- log_access_user : str
31+ log_access_user : SystemUser
2532 server_type : Literal ["bind" , "knot" ]
26- server_user : str = Field (default = "" , validate_default = True )
27- systemd_unit : str = Field (default = "" , validate_default = True )
33+ server_user : SystemUser = Field (default = "" , validate_default = True )
34+ systemd_unit : ServiceUnit = Field (default = "" , validate_default = True )
2835
29- @field_validator ("server_user" , mode = "after " )
36+ @field_validator ("server_user" , mode = "before " )
3037 def _default_user (cls , user : str , values : ValidationInfo ) -> str :
3138 if not user :
3239 try :
@@ -35,7 +42,7 @@ def _default_user(cls, user: str, values: ValidationInfo) -> str:
3542 user = "nobody"
3643 return user
3744
38- @field_validator ("systemd_unit" , mode = "after " )
45+ @field_validator ("systemd_unit" , mode = "before " )
3946 def _default_unit (cls , systemd_unit : str , values : ValidationInfo ) -> str :
4047 if not systemd_unit :
4148 try :
@@ -45,10 +52,10 @@ def _default_unit(cls, systemd_unit: str, values: ValidationInfo) -> str:
4552 return systemd_unit
4653
4754
48- class ZoneHandlerConf (BaseModel ):
55+ class ZoneHandlerConf (BaseModel , extra = "forbid" , frozen = True ):
4956 """
50- zone-handler.json structure
57+ zone-handler.yaml structure
5158 """
5259
5360 system : SystemConf
54- zones : dict [str , list [str ]]
61+ zones : dict [str , list [Zone ]]
0 commit comments