""" MikrotikGetConfigAction — exports the full RouterOS configuration via SSH and saves it as a config snapshot. Uses `/export compact` which produces a minimal, parseable RouterOS script. """ from app.models.device import Device from app.models.object import Object from app.plugins.base import ActionResult, BaseAction, Emitter from app.services import snapshot as snapshot_service from app.services import ssh as ssh_service class MikrotikGetConfigAction(BaseAction): name = "mikrotik_get_config" display_name = "Mikrotik: Export Config" compatible_categories = ["mikrotik"] params_schema = [] async def execute( self, device: Device, obj: Object, params: dict, emit: Emitter ) -> ActionResult: await emit(f"[{device.ip}] Running /export compact", "info") result = await ssh_service.run_command( device, obj, "/export compact", timeout=60 ) if not result.success and not result.stdout: msg = result.error or result.stderr or f"exit code {result.exit_code}" await emit(f"[{device.ip}] Export failed: {msg}", "error") return ActionResult( success=False, stdout=result.stdout, stderr=result.stderr, exit_code=result.exit_code, error=msg, ) # RouterOS export always returns exit 0 but may print errors to stdout content = result.stdout snap_id, sha256, size = await snapshot_service.save_snapshot( device_id=device.id, content=content, label="routeros-export", ) await emit( f"[{device.ip}] Config snapshot saved: {sha256[:12]}… ({size} bytes, id={snap_id})", "info", ) return ActionResult( success=True, stdout=content, exit_code=0, data={"snapshot_id": snap_id, "sha256": sha256, "size": size}, )