Source code for hfortix_fortios.api

"""
FortiOS REST API v2 Interface

Provides access to all FortiOS REST API endpoints organized by category:
- CMDB (Configuration Management Database): Create/read/update/delete
configuration
- Monitor: Real-time status and monitoring data
- Log: Historical log retrieval and search
- Service: System services and operations

Example Usage:
    >>> from hfortix_fortios import FortiOS
    >>> fgt = FortiOS(host="192.168.1.99", token="your-api-token")
    >>>
    >>> # CMDB: Configuration operations (POST/PUT/GET/DELETE)
    >>> fgt.api.cmdb.firewall.address.post(name="Server", subnet="10.1.1.5/32")
    >>> fgt.api.cmdb.firewall.address.put(name="Server", subnet="10.1.1.6/32")
    >>> fgt.api.cmdb.system.interface.get(name="port1")
    >>>
    >>> # Monitor: Real-time data (GET only, read-only)
    >>> fgt.api.monitor.system.resource.get()
    >>> fgt.api.monitor.firewall.session.get()
    >>> fgt.api.monitor.router.ipv4.get()
    >>>
    >>> # Log: Historical logs (GET only, read-only)
    >>> fgt.api.log.disk.traffic.get()
    >>> fgt.api.log.memory.event.get()

See Also:
    - CMDB documentation: help(fgt.api.cmdb)
    - Monitor documentation: help(fgt.api.monitor)
    - FortiOS REST API: https://docs.fortinet.com/
"""

from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from typing import Optional

    from hfortix_core.http.interface import IHTTPClient

    from .utils import Utils
    from .v2.cmdb import CMDB
    from .v2.log import Log
    from .v2.monitor import Monitor
    from .v2.service import Service

__all__ = ["API"]


[docs] class API: """ FortiOS REST API v2 Interface. Organizes all FortiOS API endpoints into logical categories for easy access. Attributes: cmdb: Configuration Management Database (CRUD operations on config) - Create objects with POST - Update objects with PUT - Read objects with GET - Delete objects with DELETE - Example: fgt.api.cmdb.firewall.address.post(...) monitor: Real-time monitoring and status (read-only, GET operations) - System resources, interfaces, sessions - Firewall statistics and connections - Routing tables, VPN status - Example: fgt.api.monitor.system.resource.get() log: Historical log retrieval (read-only, GET operations) - Traffic logs, event logs, security logs - Disk, memory, FortiAnalyzer logs - Example: fgt.api.log.disk.traffic.get() service: System services and operations - Special service endpoints - Example: fgt.api.service.system.get() utils: Utility functions for testing and diagnostics - Performance testing and benchmarking - Connection pool validation - Device profiling and recommendations - Example: fgt.api.utils.performance_test() HTTP Method Guidelines: - **POST**: Create new configuration objects (returns 404 if already exists) - **PUT**: Update existing configuration objects (returns 404 if not found) - **GET**: Retrieve data (config, monitoring, logs) - read-only - **DELETE**: Remove configuration objects (returns 404 if not found) Example: >>> from hfortix_fortios import FortiOS >>> fgt = FortiOS(host="192.168.1.99", token="your-token") >>> >>> # CMDB: Manage configuration >>> fgt.api.cmdb.firewall.address.post(name="WebServer", subnet="10.0.0.5/32") >>> fgt.api.cmdb.firewall.policy.get(policyid=1) >>> >>> # Monitor: Real-time data >>> fgt.api.monitor.system.interface.get() >>> fgt.api.monitor.firewall.session.get() >>> >>> # Log: Historical data >>> fgt.api.log.disk.traffic.get(count=100) """ # Type hints for attributes (helps IDE autocomplete) cmdb: "CMDB" log: "Log" monitor: "Monitor" service: "Service" utils: ( "Optional[Utils]" # None when using custom IHTTPClient implementations )
[docs] def __init__(self, client: "IHTTPClient") -> None: """ Initialize API namespace with HTTP client implementing IHTTPClient protocol. Note: Utils requires concrete HTTPClient for internal access. When a protocol-only client is provided, Utils will be unavailable (set to None). """ # Keep a reference to the internal HTTP client for advanced usage and # for the repository's script-style harnesses under X/tests. self._client = client from .utils import Utils from .v2.cmdb import CMDB from .v2.log import Log from .v2.monitor import Monitor from .v2.service import Service self.cmdb = CMDB(client) self.log = Log(client) self.monitor = Monitor(client) self.service = Service(client) # Utils requires concrete HTTPClient for access to internal attributes # Check if client is the concrete HTTPClient type, or if it wraps one from hfortix_core.http.client import HTTPClient # Get the underlying client (might be wrapped in ResponseProcessingClient) underlying_client = getattr(client, "_wrapped_client", client) if isinstance(underlying_client, HTTPClient): self.utils = Utils(underlying_client) else: # Custom protocol implementations won't have utils self.utils = None
[docs] def __dir__(self) -> list[str]: """Control autocomplete to show only public attributes""" return ["cmdb", "log", "monitor", "service", "utils"]