gonets/SRV/api/v1/ufw.py
2025-06-26 17:49:21 +05:00

156 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import APIRouter, HTTPException
from typing import List
from pydantic import BaseModel, Field
from models.ufw import UFWRulesResponse, UFWStatus, UFWRule
from services.ufw_service import UFWService
router = APIRouter()
class RuleNumbers(BaseModel):
numbers: List[int] = Field(
..., description="Список номеров правил для удаления")
@router.get("/rules", response_model=UFWRulesResponse)
async def get_ufw_rules():
"""
Получает все правила UFW с помощью сервиса UFWService и возвращает их в формате JSON.
"""
ufw_service = UFWService()
try:
return ufw_service.get_ufw_rules()
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
@router.get("/status", response_model=UFWStatus)
async def get_ufw_status():
"""
Получает текущий статус UFW.
"""
ufw_service = UFWService()
try:
return ufw_service.get_ufw_status()
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
@router.post("/enable")
async def enable_ufw():
"""
Включает UFW.
"""
ufw_service = UFWService()
try:
success = ufw_service.enable_ufw()
if success:
return {"status": "success", "message": "UFW успешно включен"}
else:
raise HTTPException(status_code=500,
detail="Не удалось включить UFW")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
@router.post("/disable")
async def disable_ufw():
"""
Выключает UFW.
"""
ufw_service = UFWService()
try:
success = ufw_service.disable_ufw()
if success:
return {"status": "success", "message": "UFW успешно выключен"}
else:
raise HTTPException(status_code=500,
detail="Не удалось выключить UFW")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
@router.post("/rules/in")
async def add_ufw_in_rules(rules: List[UFWRule]):
"""
Добавляет входящие (in) правила UFW.
"""
ufw_service = UFWService()
try:
# Проверяем статус UFW
status = ufw_service.get_ufw_status()
if not status.enabled:
raise HTTPException(
status_code=400,
detail="UFW отключен. Включите UFW перед добавлением правил.",
)
result = ufw_service.add_rules(rules)
if result["success"]:
successful_rules = len(
[r for r in result["results"] if r["success"]])
total_rules = len(result["results"])
return {
"status": "success",
"message":
f"Добавлено {successful_rules} из {total_rules} правил",
"details": result,
}
else:
raise HTTPException(
status_code=500,
detail=result.get("error", "Не удалось добавить правила"),
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
@router.post("/rules/out")
async def add_ufw_out_rules(rules: List[UFWRule]):
"""
Добавляет исходящие (out) правила UFW.
"""
ufw_service = UFWService()
try:
# Проверяем статус UFW
status = ufw_service.get_ufw_status()
if not status.enabled:
raise HTTPException(
status_code=400,
detail="UFW отключен. Включите UFW перед добавлением правил.",
)
success = ufw_service.add_ufw_out_rules(rules)
if success:
return {
"status": "success",
"message": "Исходящие правила UFW успешно добавлены",
}
else:
raise HTTPException(
status_code=500,
detail="Не удалось добавить исходящие правила UFW")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
@router.delete("/rules")
async def delete_ufw_rules(rule_numbers: RuleNumbers):
"""
Удаляет правила UFW по их номерам.
"""
ufw_service = UFWService()
try:
result = ufw_service.delete_rules(rule_numbers.numbers)
if result["success"]:
return {
"status": "success",
"message":
f"Удалено {result['successful']} из {result['total']} правил",
"details": result,
}
else:
raise HTTPException(status_code=500, detail=result["error"])
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")