{% extends 'base/layout.html' %} {% load form_helpers %} {% load i18n %} {% load proxbox_tags %} {% block title %}{% trans "Proxbox Settings" %}{% endblock %} {% block content %}

{% trans "Plugin Settings" %}

{% include "netbox_proxbox/partials/bootstrap_status_card.html" %}
{% csrf_token %} {# Sync Settings Card #}
{% trans "Sync Settings" %}

{% blocktrans trimmed %} Configure runtime behavior for Proxbox synchronization. {% endblocktrans %}

{% render_field form.vm_interface_sync_strategy %} {% render_field form.use_guest_agent_interface_name %} {% render_field form.proxbox_fetch_max_concurrency %} {% render_field form.ignore_ipv6_link_local_addresses %} {% render_field form.ensure_netbox_objects %} {% render_field form.delete_orphans %} {% render_field form.custom_fields_enabled %} {% render_field form.primary_ip_preference %} {% render_field form.parse_description_metadata %} {% render_field form.embed_description_metadata %} {% render_field form.default_role_qemu %} {% render_field form.default_role_lxc %} {% render_field form.backend_log_file_path %}
{# Sync Mode Controls #}
{% trans "Sync Mode Controls" %}

{% blocktrans trimmed %} Control whether each resource type syncs every run, only bootstraps new records, or is skipped entirely. Individual Proxmox endpoints can override these global defaults. {% endblocktrans %}

{% if netbox_bgp_status %}
{{ netbox_bgp_status.message }}
{% endif %} {% for group_label, group_fields in sync_mode_field_groups %}
{{ group_label }}
{% for field_name in group_fields %} {% render_field form|form_field:field_name %} {% endfor %} {% endfor %}
{# NetBox Integration Card #}
{% trans "NetBox Integration" %}

{% blocktrans trimmed %} Configure NetBox API connection behavior, caching, and bulk operation parameters. {% endblocktrans %}

{% render_field form.netbox_max_concurrent %} {% render_field form.netbox_timeout %} {% render_field form.netbox_write_concurrency %} {% render_field form.proxmox_fetch_concurrency %} {% render_field form.netbox_max_retries %} {% render_field form.netbox_retry_delay %} {% render_field form.netbox_get_cache_ttl %} {% render_field form.netbox_get_cache_max_entries %} {% render_field form.netbox_get_cache_max_bytes %} {% render_field form.bulk_batch_size %} {% render_field form.bulk_batch_delay_ms %} {% render_field form.backup_batch_size %} {% render_field form.backup_batch_delay_ms %} {% render_field form.vm_sync_max_concurrency %} {% render_field form.interface_batch_size %} {% render_field form.interface_batch_delay_ms %} {% render_field form.reconciliation_engine %} {% render_field form.reconciliation_compare_strict %} {% render_field form.custom_fields_request_delay %}
{# Sync Overwrite Behavior — one card per resource category #}
{% trans "Sync Overwrite Behavior" %}

{% blocktrans trimmed %} Control whether sync overwrites specific fields on existing NetBox objects. These are the global defaults; individual Proxmox endpoints can override each value from their Settings tab. {% endblocktrans %}

{% for group_label, group_fields in overwrite_field_groups %}
{{ group_label }}
{% for field_name in group_fields %} {% render_field form|form_field:field_name %} {% endfor %}
{% endfor %} {# Tenant Assignment Card #}
{% trans "Tenant Assignment" %}

{% blocktrans trimmed %} Configure optional post-sync Tenant assignment for synced virtual machines. Existing Tenant values are preserved. {% endblocktrans %}

{% render_field form.enable_tenant_name_regex %} {% render_field form.tenant_name_regex_rules %} {% render_field form.enable_tenant_tag_assignment %} {% render_field form.enable_tenant_from_cluster %}
{# Cloud Customer Network Card #}
{% trans "Cloud customer network" %}

{% blocktrans trimmed %} Designate the NetBox IPAM network that proxbox-api and nms-backend use for customer-facing cloud instance interfaces. {% endblocktrans %}

{% render_field form.cloud_network_lock_enabled %} {% render_field form.cloud_customer_prefix_id %} {% render_field form.cloud_customer_bridge %} {% render_field form.cloud_customer_vlan_tag %} {% render_field form.cloud_customer_gateway %}
{# Proxmox API Card #}
{% trans "Proxmox API" %}

{% blocktrans trimmed %} Configure default timeout and retry behavior for Proxmox API requests. Individual endpoints can override these values. {% endblocktrans %}

{% render_field form.proxmox_timeout %} {% render_field form.proxmox_max_retries %} {% render_field form.proxmox_retry_backoff %}
{# Ceph Control Plane Card #}
{% trans "Ceph Control Plane" %}

{% blocktrans trimmed %} Configure the bounded task polling and durable operation lease timings used by the proxbox-api Ceph write control plane. {% endblocktrans %}

{% render_field form.ceph_task_timeout %} {% render_field form.ceph_task_poll_interval %} {% render_field form.ceph_run_lease_seconds %}
{# SSRF Protection Card #}
{% trans "SSRF Protection" %}

{% blocktrans trimmed %} Configure Server-Side Request Forgery (SSRF) protection for endpoint validation. Endpoints registered in the database are automatically allowed. {% endblocktrans %}

{% render_field form.ssrf_protection_enabled %} {% render_field form.allow_private_ips %} {% render_field form.additional_allowed_ip_ranges %} {% render_field form.explicitly_blocked_ip_ranges %}
{# Diagnostics Card #}
{% trans "Diagnostics" %}

{% blocktrans trimmed %} Toggle diagnostic logging and error-detail behavior on the proxbox-api service. {% endblocktrans %}

{% render_field form.debug_cache %} {% render_field form.expose_internal_errors %}
{# Schema Resolution Card #}
{% trans "Schema resolution" %}

{% blocktrans trimmed %} Control whether proxbox-api caches the resolved NetBox OpenAPI schema on disk. Disable to run schema resolution fully in-memory for read-only filesystems or no-disk-write deployments. {% endblocktrans %}

{% render_field form.netbox_openapi_persist %}
{# NetBox Branching Integration Card #}
{% trans "NetBox Branching Integration" %}

{% blocktrans trimmed %} Auto-create a NetBox branch per Proxbox sync job and merge it back into main on success. Requires the netbox_branching plugin to be installed and listed last in PLUGINS. {% endblocktrans %}

{% render_field form.branching_enabled %} {% render_field form.branch_name_prefix %} {% render_field form.branch_on_conflict %}

{% trans "NetBox → Proxmox intent direction (advanced)" %}
{% blocktrans trimmed %} Enabling these settings allows merging a NetBox branch flagged apply_to_proxmox=True to dispatch CREATE / UPDATE writes to Proxmox via proxbox-api. DELETE still requires a separate DeletionRequest authorization chain. Off by default. {% endblocktrans %}

{% render_field form.netbox_to_proxmox_enabled %} {% render_field form.netbox_to_proxmox_typed_confirmation %} {% render_field form.intent_warn_plaintext_password %} {% render_field form.apply_destroy_confirmed %} {% render_field form.intent_apply_authorization_self_approve_allowed %} {% render_field form.intent_deletion_request_ttl_days %}
{# Hardware Discovery Card #}
{% trans "Hardware Discovery" %}

{% blocktrans trimmed %} Enable the opt-in SSH discovery pass that reflects chassis and NIC hardware facts onto NetBox custom fields during Proxmox sync. {% endblocktrans %}

{% render_field form.hardware_discovery_enabled %} {% render_field form.hardware_discovery_sync_nic_macs %}
{# Encryption Card #}
{% trans "Plugin database encryption" %}

{% blocktrans trimmed %} This key protects only netbox-proxbox ciphertext stored in the NetBox database. It is separate from proxbox-api's PROXBOX_ENCRYPTION_KEY and separate from the FastAPI endpoint key used to authenticate API requests. {% endblocktrans %}

{% if encryption_recovery_required %} {% elif encryption_payloads_exist %}
{% trans "The key is protected because encrypted values exist. Use verified rotation below to change it." %}
{% endif %} {% render_field form.encryption_enabled %} {% render_field form.encryption_key %} {% if encryption_family_statuses %}
{% for status in encryption_family_statuses %} {% endfor %}
{% trans "Encrypted family" %} {% trans "Rows" %} {% trans "State" %}
{{ status.label }} {{ status.rows_with_ciphertext }} {% if status.recovery_required %} {% trans "Recovery required" %} {% elif status.rows_with_ciphertext %} {% trans "Configured" %} {% else %} {% trans "Not configured" %} {% endif %}
{% endif %}
{% if encryption_rotation_form %}
{% trans "Verified plugin key rotation" %}

{% trans "Rotation first verifies every registered ciphertext with the current key. It then re-encrypts every value and updates the key in one database transaction. Any wrong key or corrupt row aborts without partial writes." %}

{% csrf_token %} {% render_field encryption_rotation_form.old_key %} {% render_field encryption_rotation_form.new_key %} {% render_field encryption_rotation_form.confirm_new_key %}
{% endif %} {% if can_reset_encrypted_secrets and encrypted_secret_reset_form %}
{% trans "Destructive encrypted-secret reset" %}

{% trans "Use only when the old key is unavailable. The selected ciphertext and associated trust fingerprints are permanently cleared using non-signaling database updates. Endpoint synchronization remains blocked until credentials are re-entered." %}

{% csrf_token %} {% render_field encrypted_secret_reset_form.families %} {% render_field encrypted_secret_reset_form.acknowledge_data_loss %} {% render_field encrypted_secret_reset_form.confirmation %}
{% endif %}
{% endblock %}