From 60cd669d2cee2a17d4e6ab6fce9101069d311e23 Mon Sep 17 00:00:00 2001 From: Nataliia Solomko Date: Fri, 11 Oct 2024 13:24:43 +0300 Subject: T6695: Machine-readable operational mode support for traceroute --- src/services/api/rest/models.py | 14 ++++++++++++++ src/services/api/rest/routers.py | 24 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+) (limited to 'src/services/api/rest') diff --git a/src/services/api/rest/models.py b/src/services/api/rest/models.py index 23ae9be9d..27d9fb5ee 100644 --- a/src/services/api/rest/models.py +++ b/src/services/api/rest/models.py @@ -279,6 +279,20 @@ class PoweroffModel(ApiModel): } +class TracerouteModel(ApiModel): + op: StrictStr + host: StrictStr + + class Config: + schema_extra = { + 'example': { + 'key': 'id_key', + 'op': 'traceroute', + 'host': 'host', + } + } + + class Success(BaseModel): success: bool data: Union[str, bool, Dict] diff --git a/src/services/api/rest/routers.py b/src/services/api/rest/routers.py index da981d5bf..47d06b7e9 100644 --- a/src/services/api/rest/routers.py +++ b/src/services/api/rest/routers.py @@ -68,6 +68,7 @@ from .models import RebootModel from .models import ResetModel from .models import ImportPkiModel from .models import PoweroffModel +from .models import TracerouteModel if TYPE_CHECKING: @@ -209,6 +210,7 @@ class MultipartRequest(Request): '/container-image', '/image', '/configure-section', + '/traceroute', ): if 'path' not in c: self.form_err = ( @@ -742,6 +744,28 @@ def poweroff_op(data: PoweroffModel): return success(res) +@router.post('/traceroute') +def traceroute_op(data: TracerouteModel): + state = SessionState() + session = state.session + + op = data.op + host = data.host + + try: + if op == 'traceroute': + res = session.traceroute(host) + else: + return error(400, f"'{op}' is not a valid operation") + except ConfigSessionError as e: + return error(400, str(e)) + except Exception: + LOG.critical(traceback.format_exc()) + return error(500, 'An internal error occurred. Check the logs for details.') + + return success(res) + + def rest_init(app: 'FastAPI'): if all(r in app.routes for r in router.routes): return -- cgit v1.2.3