| 1 | from fastapi import APIRouter |
| 2 | from fastapi import Security |
| 3 | from loguru import logger |
| 4 | |
| 5 | from app.auth.utils import AuthHandler |
| 6 | from app.stack_provisioning.graylog.schema.provision import ( |
| 7 | AvailableContentPacksResponse, |
| 8 | ) |
| 9 | from app.stack_provisioning.graylog.schema.provision import AvailbleContentPacksOverview |
| 10 | from app.stack_provisioning.graylog.schema.provision import ProvisionContentPackRequest |
| 11 | from app.stack_provisioning.graylog.schema.provision import ProvisionGraylogResponse |
| 12 | from app.stack_provisioning.graylog.services.provision import check_pipeline_rules |
| 13 | from app.stack_provisioning.graylog.services.provision import provision_content_pack |
| 14 | from app.stack_provisioning.graylog.services.utils import does_content_pack_exist |
| 15 | from app.stack_provisioning.graylog.services.utils import system_version_check |
| 16 | |
| 17 | stack_provisioning_graylog_router = APIRouter() |
| 18 | |
| 19 | |
| 20 | @stack_provisioning_graylog_router.get( |
| 21 | "/graylog/available/content_packs", |
| 22 | response_model=AvailableContentPacksResponse, |
| 23 | description="Get the available content packs for provisioning in Graylog", |
| 24 | dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))], |
| 25 | ) |
| 26 | async def get_available_content_packs_route() -> AvailableContentPacksResponse: |
| 27 | """ |
| 28 | Get the available content packs for provisioning in Graylog |
| 29 | """ |
| 30 | logger.info("Getting available content packs...") |
| 31 | return AvailableContentPacksResponse( |
| 32 | available_content_packs=[{"name": pack.name, "description": pack.value} for pack in AvailbleContentPacksOverview], |
| 33 | success=True, |
| 34 | message="Available content packs retrieved successfully", |
| 35 | ) |
| 36 | |
| 37 | |
| 38 | @stack_provisioning_graylog_router.post( |
| 39 | "/graylog/provision/content_pack", |
| 40 | response_model=ProvisionGraylogResponse, |
| 41 | description="Provision the Content Pack in the Graylog instance", |
| 42 | dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))], |
| 43 | ) |
| 44 | async def provision_content_pack_route( |
| 45 | content_pack_request: ProvisionContentPackRequest, |
| 46 | ) -> ProvisionGraylogResponse: |
| 47 | """ |
| 48 | Provision the Content Pack in the Graylog instance |
| 49 | """ |
| 50 | logger.info(f"Provisioning content pack {content_pack_request.content_pack_name.name}...") |
| 51 | await system_version_check(compatible_version="5.0.13+083613e") |
| 52 | await does_content_pack_exist(content_pack_name=content_pack_request.content_pack_name.name) |
| 53 | await provision_content_pack(content_pack_request) |
| 54 | await check_pipeline_rules() |
| 55 | return ProvisionGraylogResponse( |
| 56 | success=True, |
| 57 | message=f"{content_pack_request.content_pack_name.name} Content Pack provisioned successfully", |
| 58 | ) |