Версия 0.0.3

This commit is contained in:
parent 413e9c57be
commit 8c7d0609df
189 changed files with 52063 additions and 2769 deletions

View file

@ -31,7 +31,9 @@ class SuccessResponse(BaseModel):
@router.get(
"/zones",
response_model=List[str],
responses={500: {"model": ErrorResponse}},
responses={500: {
"model": ErrorResponse
}},
summary="Get all available zones",
)
async def get_zones() -> List[str]:
@ -53,7 +55,9 @@ async def get_zones() -> List[str]:
@router.get(
"/zones/default",
response_model=str,
responses={500: {"model": ErrorResponse}},
responses={500: {
"model": ErrorResponse
}},
summary="Get default zone",
)
async def get_default_zone() -> str:
@ -75,7 +79,14 @@ async def get_default_zone() -> str:
@router.put(
"/zones/default/{zone}",
response_model=SuccessResponse,
responses={404: {"model": ErrorResponse}, 500: {"model": ErrorResponse}},
responses={
404: {
"model": ErrorResponse
},
500: {
"model": ErrorResponse
}
},
summary="Set default zone",
)
async def set_default_zone(
@ -94,9 +105,8 @@ async def set_default_zone(
firewalld.set_default_zone(zone)
return SuccessResponse(message=f"Default zone set to {zone}")
except ValueError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail=f"Zone '{zone}' not found"
)
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f"Zone '{zone}' not found")
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
@ -107,10 +117,18 @@ async def set_default_zone(
@router.get(
"/zones/{zone}",
response_model=FirewallZone,
responses={404: {"model": ErrorResponse}, 500: {"model": ErrorResponse}},
responses={
404: {
"model": ErrorResponse
},
500: {
"model": ErrorResponse
}
},
summary="Get zone configuration",
)
async def get_zone(zone: str = Path(..., description="Zone name")) -> FirewallZone:
async def get_zone(zone: str = Path(...,
description="Zone name")) -> FirewallZone:
"""
Get detailed configuration for a specific zone.
@ -122,16 +140,13 @@ async def get_zone(zone: str = Path(..., description="Zone name")) -> FirewallZo
"""
try:
zone_info = firewalld.get_zone_settings(zone)
return FirewallZone(
name=zone,
target=FirewallTarget.DEFAULT,
interfaces=[],
**zone_info
)
return FirewallZone(name=zone,
target=FirewallTarget.DEFAULT,
interfaces=[],
**zone_info)
except ValueError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail=f"Zone '{zone}' not found"
)
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f"Zone '{zone}' not found")
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
@ -142,10 +157,13 @@ async def get_zone(zone: str = Path(..., description="Zone name")) -> FirewallZo
@router.get(
"/zones/{zone}/services",
response_model=List[str],
responses={500: {"model": ErrorResponse}},
responses={500: {
"model": ErrorResponse
}},
summary="Get services in zone",
)
async def get_services(zone: str = Path(..., description="Zone name")) -> List[str]:
async def get_services(zone: str = Path(...,
description="Zone name")) -> List[str]:
"""
Get all services in a zone.
@ -167,7 +185,14 @@ async def get_services(zone: str = Path(..., description="Zone name")) -> List[s
@router.post(
"/zones/{zone}/services",
response_model=SuccessResponse,
responses={404: {"model": ErrorResponse}, 500: {"model": ErrorResponse}},
responses={
404: {
"model": ErrorResponse
},
500: {
"model": ErrorResponse
}
},
summary="Add service to zone",
)
async def add_service(
@ -186,11 +211,11 @@ async def add_service(
"""
try:
firewalld.add_service(zone, rule.name, rule.timeout)
return SuccessResponse(message=f"Service {rule.name} added to zone {zone}")
return SuccessResponse(
message=f"Service {rule.name} added to zone {zone}")
except ValueError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail=f"Zone '{zone}' not found"
)
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f"Zone '{zone}' not found")
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
@ -201,12 +226,19 @@ async def add_service(
@router.delete(
"/zones/{zone}/services/{service}",
response_model=SuccessResponse,
responses={404: {"model": ErrorResponse}, 500: {"model": ErrorResponse}},
responses={
404: {
"model": ErrorResponse
},
500: {
"model": ErrorResponse
}
},
summary="Remove service from zone",
)
async def remove_service(
zone: str = Path(..., description="Zone name"),
service: str = Path(..., description="Service name"),
zone: str = Path(..., description="Zone name"),
service: str = Path(..., description="Service name"),
) -> SuccessResponse:
"""
Remove a service from a zone.
@ -220,7 +252,8 @@ async def remove_service(
"""
try:
firewalld.remove_service(zone, service)
return SuccessResponse(message=f"Service {service} removed from zone {zone}")
return SuccessResponse(
message=f"Service {service} removed from zone {zone}")
except ValueError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
@ -236,10 +269,13 @@ async def remove_service(
@router.get(
"/zones/{zone}/ports",
response_model=List[str],
responses={500: {"model": ErrorResponse}},
responses={500: {
"model": ErrorResponse
}},
summary="Get ports in zone",
)
async def get_ports(zone: str = Path(..., description="Zone name")) -> List[str]:
async def get_ports(zone: str = Path(...,
description="Zone name")) -> List[str]:
"""
Get all ports in a zone.
@ -262,9 +298,15 @@ async def get_ports(zone: str = Path(..., description="Zone name")) -> List[str]
"/zones/{zone}/ports",
response_model=SuccessResponse,
responses={
400: {"model": ErrorResponse},
404: {"model": ErrorResponse},
500: {"model": ErrorResponse},
400: {
"model": ErrorResponse
},
404: {
"model": ErrorResponse
},
500: {
"model": ErrorResponse
},
},
summary="Add port to zone",
)
@ -285,10 +327,11 @@ async def add_port(
try:
firewalld.add_port(zone, rule.port, rule.protocol.value, rule.timeout)
return SuccessResponse(
message=f"Port {rule.port}/{rule.protocol.value} added to zone {zone}"
)
message=
f"Port {rule.port}/{rule.protocol.value} added to zone {zone}")
except ValueError as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e))
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
@ -299,7 +342,14 @@ async def add_port(
@router.delete(
"/zones/{zone}/ports",
response_model=SuccessResponse,
responses={404: {"model": ErrorResponse}, 500: {"model": ErrorResponse}},
responses={
404: {
"model": ErrorResponse
},
500: {
"model": ErrorResponse
}
},
summary="Remove port from zone",
)
async def remove_port(
@ -319,12 +369,11 @@ async def remove_port(
try:
firewalld.remove_port(zone, rule.port, rule.protocol.value)
return SuccessResponse(
message=f"Port {rule.port}/{rule.protocol.value} removed from zone {zone}"
)
message=
f"Port {rule.port}/{rule.protocol.value} removed from zone {zone}")
except ValueError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail=f"Zone '{zone}' not found"
)
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f"Zone '{zone}' not found")
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
@ -335,10 +384,13 @@ async def remove_port(
@router.get(
"/zones/{zone}/sources",
response_model=List[str],
responses={500: {"model": ErrorResponse}},
responses={500: {
"model": ErrorResponse
}},
summary="Get sources in zone",
)
async def get_sources(zone: str = Path(..., description="Zone name")) -> List[str]:
async def get_sources(zone: str = Path(...,
description="Zone name")) -> List[str]:
"""
Get all sources in a zone.
@ -360,7 +412,14 @@ async def get_sources(zone: str = Path(..., description="Zone name")) -> List[st
@router.post(
"/zones/{zone}/sources",
response_model=SuccessResponse,
responses={404: {"model": ErrorResponse}, 500: {"model": ErrorResponse}},
responses={
404: {
"model": ErrorResponse
},
500: {
"model": ErrorResponse
}
},
summary="Add source to zone",
)
async def add_source(
@ -379,11 +438,11 @@ async def add_source(
"""
try:
firewalld.add_source(zone, rule.address)
return SuccessResponse(message=f"Source {rule.address} added to zone {zone}")
return SuccessResponse(
message=f"Source {rule.address} added to zone {zone}")
except ValueError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail=f"Zone '{zone}' not found"
)
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f"Zone '{zone}' not found")
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
@ -394,7 +453,14 @@ async def add_source(
@router.delete(
"/zones/{zone}/sources/{source}",
response_model=SuccessResponse,
responses={404: {"model": ErrorResponse}, 500: {"model": ErrorResponse}},
responses={
404: {
"model": ErrorResponse
},
500: {
"model": ErrorResponse
}
},
summary="Remove source from zone",
)
async def remove_source(
@ -413,7 +479,8 @@ async def remove_source(
"""
try:
firewalld.remove_source(zone, source)
return SuccessResponse(message=f"Source {source} removed from zone {zone}")
return SuccessResponse(
message=f"Source {source} removed from zone {zone}")
except ValueError:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
@ -429,7 +496,9 @@ async def remove_source(
@router.post(
"/reload",
response_model=SuccessResponse,
responses={500: {"model": ErrorResponse}},
responses={500: {
"model": ErrorResponse
}},
summary="Reload firewall rules",
)
async def reload_firewall() -> SuccessResponse: