Skip to main content

HFortix - Python SDK for Fortinet products (FortiOS, FortiManager, FortiAnalyzer)

Project description

HFortix - Fortinet Python SDK

Python client library for Fortinet products including FortiOS, FortiManager, and FortiAnalyzer.

PyPI version Python 3.8+ License: Proprietary

๐ŸŽฏ Current Status

โš ๏ธ BETA STATUS: All implementations are functional but in beta. APIs work correctly but may have incomplete parameter coverage or undiscovered edge cases.

FortiOS 7.6.5 Coverage (December 17, 2025):

  • CMDB API: 23 of 40 categories (57.5% coverage) - 200+ endpoints ๐Ÿ”ท Beta
  • Monitor API: 6 of 33 categories (18% coverage) - 50+ endpoints ๐Ÿ”ท Beta
  • Log API: 5 of 5 categories (100% coverage) - Log reading functionality ๐Ÿ”ท Beta
  • Service API: 3 of 3 categories (100% coverage) - 21 methods ๐Ÿ”ท Beta
  • Overall: 37 of 77 categories (48% coverage) - 250+ API methods

Note: All implementations remain in beta until version 1.0.0 with comprehensive unit test coverage.

๐Ÿ”ฅ Recent Highlights:

  • โœจ Advanced HTTP Features (v0.3.13): Request correlation tracking, circuit breaker, connection metrics, per-endpoint timeouts, structured logging
  • โœจ Enhanced Reliability (v0.3.12): Automatic retry logic with exponential backoff, HTTP/2 support, connection pooling
  • โœจ httpx Migration (v0.3.12): Modern HTTP client with better performance and async-ready architecture
  • โœจ Monitor API (v0.3.11): 6 categories with 50+ monitoring endpoints (firewall stats, sessions, EMS, etc.)
  • โœจ Log Configuration (v0.3.11): 56 endpoints for comprehensive logging setup
  • โœจ Firewall Expansion (v0.3.11): FTP proxy, ICAP, IPS, DoS policies, access-proxy (WAF)
  • โœจ Configurable Timeouts (v0.3.10): Customize connection and read timeouts for slow networks
  • โœจ URL Encoding (v0.3.10): Automatic handling of special characters in object names
  • โœจ Full Response Access (v0.3.9): raw_json=True parameter on all 250+ API methods
  • โœจ Advanced Logging (v0.3.9): Global and per-instance logging with automatic data sanitization

๐Ÿ“– Full release notes: See CHANGELOG.md for complete version history.

Latest Features (v0.3.13):

  • โœจ Request ID / Correlation Tracking: Auto-generated or custom request IDs for distributed tracing
  • โœจ Circuit Breaker Pattern: Automatic fail-fast to prevent cascading failures (opens after 5 failures, auto-recovers)
  • โœจ Connection Pool Metrics: Monitor HTTP client health with get_connection_stats() method
  • โœจ Per-Endpoint Timeouts: Configure custom timeouts per endpoint with wildcard pattern support
  • โœจ Structured Logging: Machine-readable logs with extra fields (request_id, endpoint, method, status_code, duration)
  • โœจ 100% Backwards Compatible: All existing code works unchanged

Previous Release (v0.3.12):

  • โœจ HTTP/2 Support: Modern httpx library with connection multiplexing for improved performance
  • โœจ Automatic Retry Logic: Exponential backoff (1s, 2s, 4s, 8s, 30s max) for transient failures
  • โœจ Enhanced Reliability: Retries on connection errors, timeouts, rate limits (429), server errors (500-504)
  • โœจ Context Manager Support: Use with HTTPClient(...) as client: for automatic cleanup
  • โœจ Retry Statistics: Track retry attempts by reason and endpoint
  • โœจ Better Error Handling: Graceful fallback for non-JSON responses, improved logging

Previous Release (v0.3.11):

  • โœจ FTP Proxy Category: FTP proxy configuration (1 endpoint)
    • explicit: FTP proxy explicit configuration with SSL/TLS support
    • FTPS support, SSL certificate management, custom encryption
    • 10 parameters: status, ports, IPs, security actions, SSL settings
    • Test coverage: 5 test sections with comprehensive validation
  • โœจ Monitor API Categories: 6 categories implemented (18% coverage)
    • firewall/: 39 endpoints for firewall monitoring
    • Policy statistics, session monitoring, ACL counters
    • Address objects, traffic shapers, GTP stats
    • Special endpoints: policy-lookup (callable), clearpass-address (actions)
    • endpoint-control/: 7 endpoints for FortiClient EMS monitoring
    • azure/, casb/, extender-controller/, extension-controller/: Additional monitoring
    • Test coverage: 39 firewall tests with 100% pass rate
    • All endpoints support explicit parameters (no **kwargs)
  • โœจ Log Configuration Category: 56 endpoints for comprehensive logging setup
    • Nested object pattern: fgt.api.cmdb.log.disk.filter.get()
    • Multiple FortiAnalyzer, syslog, TACACS+ server support
    • Custom fields, event filters, threat weights
  • โœจ ICAP Category: Complete ICAP integration (3 endpoints, 30+ parameters)
  • โœจ IPS Category: Full IPS management (8 endpoints)
    • Custom signatures, sensors, decoders, rules
  • โœจ Monitoring & Report Categories: NPU-HPE monitoring, report layouts
  • โœจ Firewall Category Expansion: 29 endpoints with nested objects
    • DoS policies, access-proxy (reverse proxy/WAF)
    • Schedule, service, shaper, SSH/SSL configurations

Previous Release (v0.3.10):

  • โœจ Configurable Timeouts: Customize connection and read timeouts
    • connect_timeout: Connection establishment timeout (default: 10.0s)
    • read_timeout: Response read timeout (default: 300.0s)
    • Example: FortiOS(host='...', token='...', connect_timeout=30.0, read_timeout=600.0)
  • โœจ URL Encoding for Special Characters: Automatic encoding of special characters in object names
    • Handles /, @, :, spaces, and other special characters
    • Works with objects like Test_NET_192.0.2.0/24 (IP addresses with CIDR notation)
    • Applied to all 145 CMDB endpoint files automatically
  • โœ… Bug Fix: Fixed 404 errors when object names contain special characters

Previous Release (v0.3.9):

  • โœจ raw_json Parameter: All 200+ API methods now support raw_json=True for full response access
  • โœจ Logging System: Global and per-instance logging control
  • โœ… Code Quality: 100% PEP 8 compliance (black + isort + flake8)
  • โœ… Comprehensive Tests: 200+ test files covering all endpoints

Previous Releases:

  • v0.3.8: Dual-pattern interface for all create/update methods
  • v0.3.7: Packaging and layout improvements
  • v0.3.6: Hidden internal CRUD methods for cleaner autocomplete
  • v0.3.5: Enhanced IDE autocomplete with PEP 561 type hints
  • v0.3.4: Unified import syntax documentation
  • v0.3.0: Firewall endpoints expansion

๐ŸŽฏ Features

  • Unified Package: Import all Fortinet products from a single package
  • Enhanced IDE Support: Full type hints with PEP 561 compliance for excellent autocomplete
  • Modular Architecture: Each product module can be used independently
  • PyPI Installation: pip install hfortix - simple and straightforward
  • Comprehensive Exception Handling: 387+ FortiOS error codes with detailed descriptions
  • Automatic Retry Logic: Built-in retry mechanism with exponential backoff for transient failures
  • HTTP/2 Support: Modern HTTP client with connection multiplexing for improved performance
  • Type-Safe: Proper exception hierarchy and error handling
  • Simplified APIs: Auto-conversion for common patterns (e.g., address group members)
  • Well-Documented: Extensive API documentation and examples
  • Modern Python: Type hints, PEP 585 compliance, Python 3.8+

๐Ÿ“ฆ Available Modules

Module Status Description
FortiOS โœ… Active FortiGate firewall management API
FortiManager โธ๏ธ Planned Centralized management for FortiGate devices
FortiAnalyzer โธ๏ธ Planned Log analysis and reporting platform

๐Ÿš€ Installation

From PyPI (Recommended)

pip install hfortix

๐Ÿ“– Quick Start

Basic Usage

from hfortix import FortiOS

# Initialize with API token (recommended)
fgt = FortiOS(
    host='192.168.1.99',
    token='your-api-token',
    verify=False  # Use True in production with valid SSL cert
)

# List firewall addresses
addresses = fgt.api.cmdb.firewall.address.list()
print(f"Found {len(addresses['results'])} addresses")

# Create a new address
result = fgt.api.cmdb.firewall.address.create(
    name='web-server',
    subnet='192.168.10.50/32',
    comment='Production web server'
)

Raw JSON Response โœจ

All API methods support raw_json parameter for full response access:

# Default behavior - returns just the results
addresses = fgt.api.cmdb.firewall.address.list()
print(addresses)  # ['obj1', 'obj2', 'obj3']

# With raw_json=True - returns complete API response
response = fgt.api.cmdb.firewall.address.list(raw_json=True)
print(response['http_status'])  # 200
print(response['status'])       # 'success'
print(response['results'])      # ['obj1', 'obj2', 'obj3']
print(response['serial'])       # 'FGT60FTK19000001'
print(response['version'])      # 'v7.6.5'

# Useful for error checking
result = fgt.api.cmdb.firewall.address.get('web-server', raw_json=True)
if result['http_status'] == 200:
    print(f"Object found: {result['results']}")
else:
    print(f"Error: {result.get('error', 'Unknown error')}")

Available on: All 45+ API methods (100% coverage)

Logging Control โœจ

Control logging output globally or per-instance:

import hfortix
from hfortix import FortiOS

# Enable detailed logging globally for all instances
hfortix.set_log_level('DEBUG')  # Very verbose - all requests/responses
hfortix.set_log_level('INFO')   # Normal - request summaries
hfortix.set_log_level('WARNING') # Quiet - only warnings (default)
hfortix.set_log_level('ERROR')   # Silent - only errors
hfortix.set_log_level('OFF')     # No logging output

# Or enable logging for a specific instance
fgt = FortiOS('192.168.1.99', token='your-token', debug='info')

# Automatic sensitive data sanitization
# Tokens, passwords, and API keys are automatically masked in logs

Features:

  • 5 log levels (DEBUG, INFO, WARNING, ERROR, OFF)
  • Automatic sensitive data sanitization
  • Request/response logging with timing
  • Hierarchical loggers for fine-grained control

Advanced HTTP Features โœจ NEW in v0.3.13

Enterprise-grade reliability and observability features:

from hfortix import FortiOS

fgt = FortiOS('192.168.1.99', token='your-token', verify=False)

# 1. Request correlation tracking (auto-generated or custom)
result = fgt._client.request(
    "GET", "monitor", "system/status",
    request_id="batch-update-2025-12-17"
)

# 2. Monitor connection pool health
stats = fgt._client.get_connection_stats()
print(f"Circuit breaker: {stats['circuit_breaker_state']}")
print(f"HTTP/2 enabled: {stats['http2_enabled']}")

# 3. Circuit breaker pattern (automatic fail-fast)
# Opens after 5 consecutive failures, auto-recovers after 60s
try:
    result = fgt.api.monitor.system.status.get()
except RuntimeError as e:
    if "Circuit breaker is OPEN" in str(e):
        print("Service is down - failing fast")
        fgt._client.reset_circuit_breaker()  # Manual reset

# 4. Per-endpoint timeouts (custom timeouts for slow endpoints)
fgt._client.configure_endpoint_timeout('monitor/*', read=10.0)
fgt._client.configure_endpoint_timeout('cmdb/firewall/policy', read=600.0)

# 5. Structured logging (machine-readable logs with extra fields)
# All logs include: request_id, endpoint, method, status_code, duration
# Compatible with Elasticsearch, Splunk, CloudWatch

Benefits:

  • Request Tracking: Trace requests across distributed systems
  • Circuit Breaker: Prevent cascading failures during outages
  • Metrics: Monitor connection pool health and performance
  • Fine-tuned Timeouts: Different timeouts for fast/slow endpoints
  • Structured Logs: Machine-readable for log aggregation tools

๐Ÿ“– Full documentation: docs/ADVANCED_HTTP_FEATURES.md

Dual-Pattern Interface โœจ

HFortix supports flexible dual-pattern syntax - use dictionaries, keywords, or mix both:

# Pattern 1: Dictionary-based (great for templates)
config = {
    'name': 'web-server',
    'subnet': '192.168.10.50/32',
    'comment': 'Production web server'
}
fgt.api.cmdb.firewall.address.create(data_dict=config)

# Pattern 2: Keyword-based (great for readability)
fgt.api.cmdb.firewall.address.create(
    name='web-server',
    subnet='192.168.10.50/32',
    comment='Production web server'
)

# Pattern 3: Mixed (template + overrides)
base_config = load_template('address_template.json')
fgt.api.cmdb.firewall.address.create(
    data_dict=base_config,
    name=f'server-{site_id}',  # Override name
    comment=f'Site: {site_name}'
)

Available on: 43 methods across 13 categories (100% coverage)

  • All CMDB create/update operations (38 endpoints)
  • Service operations (5 methods)

Exception Handling

from hfortix import (
    FortiOS,
    APIError,
    ResourceNotFoundError,
    DuplicateEntryError
)

try:
    result = fgt.api.cmdb.firewall.address.create(
        name='test-address',
        subnet='10.0.0.0/24'
    )
except DuplicateEntryError as e:
    print(f"Address already exists: {e}")
except ResourceNotFoundError as e:
    print(f"Resource not found: {e}")
except APIError as e:
    print(f"API Error: {e.message}")
    print(f"HTTP Status: {e.http_status}")
    print(f"Error Code: {e.error_code}")

๐Ÿ—๏ธ Project Structure

fortinet/
โ”œโ”€โ”€ hfortix/                  # Main package
โ”‚   โ”œโ”€โ”€ __init__.py           # Public API exports
โ”‚   โ”œโ”€โ”€ exceptions.py         # Base exceptions
โ”‚   โ”œโ”€โ”€ exceptions_forti.py   # FortiOS-specific error codes/helpers
โ”‚   โ”œโ”€โ”€ py.typed              # PEP 561 marker
โ”‚   โ””โ”€โ”€ FortiOS/
โ”‚       โ”œโ”€โ”€ __init__.py
โ”‚       โ”œโ”€โ”€ fortios.py        # FortiOS client
โ”‚       โ”œโ”€โ”€ http_client.py    # Internal HTTP client
โ”‚       โ”œโ”€โ”€ exceptions.py     # FortiOS re-exports
โ”‚       โ””โ”€โ”€ api/
โ”‚           โ””โ”€โ”€ v2/
โ”‚               โ”œโ”€โ”€ cmdb/     # Configuration endpoints
โ”‚               โ”œโ”€โ”€ log/      # Log reading endpoints
โ”‚               โ”œโ”€โ”€ service/  # Service operations
โ”‚               โ””โ”€โ”€ monitor/  # Monitoring endpoints
โ”œโ”€โ”€ setup.py                  # Package configuration
โ”œโ”€โ”€ pyproject.toml            # Build system config
โ”œโ”€โ”€ README.md                 # This file
โ”œโ”€โ”€ QUICKSTART.md             # Quick reference guide
โ”œโ”€โ”€ API_COVERAGE.md           # API implementation status
โ””โ”€โ”€ CHANGELOG.md              # Version history

๐Ÿ” Module Discovery

Check which modules are available:

from hfortix import get_available_modules

modules = get_available_modules()
print(modules)
# {'FortiOS': True, 'FortiManager': False, 'FortiAnalyzer': False}

๐ŸŽ“ Examples

FortiOS - Firewall Address Management

from hfortix import FortiOS

fgt = FortiOS(host='192.168.1.99', token='your-token', verify=False)

# List addresses
addresses = fgt.api.cmdb.firewall.address.list()

# Create address
result = fgt.api.cmdb.firewall.address.create(
    name='web-server',
    subnet='10.0.1.100/32',
    comment='Production web server'
)

# Update address
result = fgt.api.cmdb.firewall.address.update(
    name='web-server',
    comment='Updated comment'
)

# Delete address
result = fgt.api.cmdb.firewall.address.delete(name='web-server')

FortiOS - DoS Protection (NEW!)

# Create IPv4 DoS policy with simplified API
result = fgt.api.cmdb.firewall.dos_policy.create(
    policyid=1,
    name='protect-web-servers',
    interface='port3',              # Simple string format
    srcaddr=['all'],                # Simple list format
    dstaddr=['web-servers'],
    service=['HTTP', 'HTTPS'],
    status='enable',
    comments='Protect web farm from DoS attacks'
)

# API automatically converts to FortiGate format:
# interface='port3' โ†’ {'q_origin_key': 'port3'}
# service=['HTTP'] โ†’ [{'name': 'HTTP'}]

# Custom anomaly detection thresholds
result = fgt.api.cmdb.firewall.dos_policy.create(
    policyid=2,
    name='strict-dos-policy',
    interface='wan1',
    srcaddr=['all'],
    dstaddr=['all'],
    service=['ALL'],
    anomaly=[
        {'name': 'tcp_syn_flood', 'threshold': 500, 'action': 'block'},
        {'name': 'udp_flood', 'threshold': 1000, 'action': 'block'}
    ]
)

FortiOS - Reverse Proxy/WAF (NEW!)

# Create access proxy (requires VIP with type='access-proxy')
result = fgt.api.cmdb.firewall.access_proxy.create(
    name='web-proxy',
    vip='web-vip',                    # VIP must be type='access-proxy'
    auth_portal='enable',
    log_blocked_traffic='enable',
    http_supported_max_version='2.0',
    svr_pool_multiplex='enable'
)

# Create virtual host with simplified API
result = fgt.api.cmdb.firewall.access_proxy_virtual_host.create(
    name='api-vhost',
    host='*.api.example.com',
    host_type='wildcard',
    ssl_certificate='Fortinet_Factory'  # String auto-converts to list
)

# API automatically converts:
# ssl_certificate='cert' โ†’ [{'name': 'cert'}]

FortiOS - Address & Address Group Management (NEW!)

# Create IPv4 address (subnet)
result = fgt.api.cmdb.firewall.address.create(
    name='internal-net',
    type='ipmask',
    subnet='192.168.1.0/24',
    comment='Internal network'
)

# Create IPv4 address (IP range)
result = fgt.api.cmdb.firewall.address.create(
    name='dhcp-range',
    type='iprange',
    start_ip='192.168.1.100',
    end_ip='192.168.1.200'
)

# Create IPv4 address (FQDN)
result = fgt.api.cmdb.firewall.address.create(
    name='google-dns',
    type='fqdn',
    fqdn='dns.google.com'
)

# Create IPv6 address
result = fgt.api.cmdb.firewall.address6.create(
    name='ipv6-internal',
    type='ipprefix',
    ip6='2001:db8::/32',
    comment='IPv6 internal network'
)

# Create address group with simplified API
result = fgt.api.cmdb.firewall.addrgrp.create(
    name='internal-networks',
    member=['subnet1', 'subnet2', 'subnet3'],  # Simple string list!
    comment='All internal networks'
)

# API automatically converts:
# member=['addr1', 'addr2'] โ†’ [{'name': 'addr1'}, {'name': 'addr2'}]

# Create IPv6 address group
result = fgt.api.cmdb.firewall.addrgrp6.create(
    name='ipv6-internal-networks',
    member=['ipv6-subnet1', 'ipv6-subnet2'],
    comment='All internal IPv6 networks'
)

# Create IPv6 address template
result = fgt.api.cmdb.firewall.address6_template.create(
    name='ipv6-subnet-template',
    ip6='2001:db8::/32',
    subnet_segment_count=2,
    comment='IPv6 subnet template'
)

FortiOS - Schedule Management

# Create recurring schedule
result = fgt.api.cmdb.firewall.schedule.recurring.create(
    name='business-hours',
    day=['monday', 'tuesday', 'wednesday', 'thursday', 'friday'],
    start='08:00',
    end='18:00'
)

# Create one-time schedule
from datetime import datetime, timedelta
tomorrow = datetime.now() + timedelta(days=1)
start = f"09:00 {tomorrow.strftime('%Y/%m/%d')}"
end = f"17:00 {tomorrow.strftime('%Y/%m/%d')}"

result = fgt.api.cmdb.firewall.schedule.onetime.create(
    name='maintenance-window',
    start=start,
    end=end,
    color=5
)

Exception Hierarchy

Exception
โ””โ”€โ”€ FortinetError (base)
    โ”œโ”€โ”€ AuthenticationError
    โ”œโ”€โ”€ AuthorizationError
    โ””โ”€โ”€ APIError
        โ”œโ”€โ”€ ResourceNotFoundError (404)
        โ”œโ”€โ”€ BadRequestError (400)
        โ”œโ”€โ”€ MethodNotAllowedError (405)
        โ”œโ”€โ”€ RateLimitError (429)
        โ”œโ”€โ”€ ServerError (500)
        โ”œโ”€โ”€ DuplicateEntryError (-5, -15, -100)
        โ”œโ”€โ”€ EntryInUseError (-23, -94, -95)
        โ”œโ”€โ”€ InvalidValueError (-651, -1, -50)
        โ””โ”€โ”€ PermissionDeniedError (-14, -37)

๐Ÿงช Testing

Note: This SDK is currently in beta (v0.3.x). All endpoints are functional but will remain in beta status until version 1.0.0 with comprehensive unit test coverage.

Current Status:

  • All implemented endpoints are tested against live FortiGate devices
  • Integration testing performed during development
  • Unit test framework planned for v1.0.0 release

๐Ÿ“ Version

Current version: 0.3.12 (See CHANGELOG.md for release notes)

from hfortix import get_version
print(get_version())

๐Ÿค Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Run tests
  5. Submit a pull request

๐Ÿ“„ License

Proprietary License - Free for personal, educational, and business use.

You may:

  • Use for personal projects and learning
  • Use in your business operations
  • Deploy in client environments
  • Use in managed services and technical support

You may not:

  • Sell the software itself as a standalone product
  • Redistribute as your own product

See CHANGELOG.md v0.2.0 for details.

๐Ÿ”— Links

๐Ÿ’ก Tips

  • Use API Tokens: Only token-based authentication is supported for FortiOS REST API
  • Error Handling: Always catch specific exceptions for better error handling
  • Verify SSL: Set verify=True in production (requires valid certificates)
  • Automatic Retries: Built-in retry logic handles transient failures (429, 500, 502, 503, 504)
  • Connection Pooling: HTTP/2 support with connection multiplexing for better performance
  • Timeout Configuration: Customize connect_timeout and read_timeout for your environment
  • Logging: Use hfortix.set_log_level('INFO') for request/response debugging

โš™๏ธ Configuration

Environment Variables

export FGT_HOST="192.168.1.99"
export FGT_TOKEN="your-api-token"
export FGT_VERIFY_SSL="false"

Using .env File

from dotenv import load_dotenv
import os

load_dotenv()

fgt = FortiOS(
    host=os.getenv('FGT_HOST'),
    token=os.getenv('FGT_TOKEN'),
    verify=os.getenv('FGT_VERIFY_SSL', 'false').lower() == 'true'
)

๐ŸŽฏ Roadmap

  • [๐Ÿšง] FortiOS API implementation (In Development)
    • Exception handling system (387 error codes)
    • Base client architecture
    • [๐Ÿ”ท] CMDB endpoints (Beta - partial coverage)
      • Firewall (address, policy, service, etc.)
      • System (interface, admin, global, etc.)
      • Router (static, policy, etc.)
      • VPN (IPsec, SSL, etc.)
    • [๐Ÿ”ท] Service endpoints (Beta)
      • Sniffer, Security Rating, etc.
    • [๐Ÿ”ท] Log endpoints (Beta)
      • Traffic, Event, Virus, etc.
    • Monitor endpoints (Not Started)
    • Complete API coverage
  • Modular package architecture
  • FortiManager module (Not Started)
  • FortiAnalyzer module (Not Started)
  • PyPI package publication
  • Async support
  • CLI tool

๐Ÿ‘ค Author

Herman W. Jacobsen


Built with โค๏ธ for the Fortinet community

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hfortix-0.3.13.tar.gz (316.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hfortix-0.3.13-py3-none-any.whl (626.7 kB view details)

Uploaded Python 3

File details

Details for the file hfortix-0.3.13.tar.gz.

File metadata

  • Download URL: hfortix-0.3.13.tar.gz
  • Upload date:
  • Size: 316.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for hfortix-0.3.13.tar.gz
Algorithm Hash digest
SHA256 18b210195ef568e9fa3f019b83b00915ce5b452f0b4cc1fedab9f656e58bb5e4
MD5 f26b08bdf6e76bac0af3d1de72c915a7
BLAKE2b-256 89a9fa980b08a067942fc863bb04ae78d78aa62f11882cd5700d44e9b6dddd21

See more details on using hashes here.

File details

Details for the file hfortix-0.3.13-py3-none-any.whl.

File metadata

  • Download URL: hfortix-0.3.13-py3-none-any.whl
  • Upload date:
  • Size: 626.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for hfortix-0.3.13-py3-none-any.whl
Algorithm Hash digest
SHA256 0558fea06ce54164778a481c6795872d8ac3bc31e6119802e7d61679d8d12ced
MD5 2bd5539ec67a77454b98b7531215975c
BLAKE2b-256 67703882db51124c6c6cbb7e24e88098e10234da4e9af2100a9b7d646e10c3ba

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page