{% extends 'generic/object.html' %} {% load helpers %} {% load i18n %} {% block title %}{{ object }} - {% trans "Scope Reconciliation" %}{% endblock %} {% block extra_controls %}  {% trans "Sync" %} {% endblock extra_controls %} {% block content %}
{% if report_error %} {% trans "Failed" %} {{ report_error }} {% elif report_pending %} {% trans "Not run" %} {% trans "This report queries Forward for every device and endpoint, so it runs in the background rather than on page load." %} {% else %} {% trans "Report ready" %} {% trans "Generated" %} {{ report_generated_at }} {% endif %}
{% csrf_token %}
{% trans "Device Scope Reconciliation" %}
{% if payload.forward_in_scope_endpoints %} {% endif %}
{% trans "Include tags" %} {{ payload.include_tags|join:", "|placeholder }}
{% trans "NetBox devices" %} {{ payload.netbox_device_count }}
{% trans "In scope (collected)" %} {{ payload.forward_in_scope_completed }}
{% trans "In scope (SNMP endpoints)" %} {{ payload.forward_in_scope_endpoints }}
{% trans "Tagged but backfilled" %} {{ payload.forward_tagged_backfilled }} {% if payload.netbox_present_backfilled %}  {% blocktrans with count=payload.netbox_present_backfilled %}view {{ count }} tagged{% endblocktrans %} {% endif %}
{% trans "Out of scope (orphans)" %} {% if payload.netbox_out_of_scope %} {{ payload.netbox_out_of_scope }} {% else %} 0 {% endif %}
{% trans "Empty orphan sites" %} {% if payload.netbox_empty_orphan_site_count %} {{ payload.netbox_empty_orphan_site_count }} {% else %} 0 {% endif %}
{% trans "In scope, missing from NetBox" %} {{ payload.forward_missing_in_netbox }}
{% trans "Out-of-Scope Sample" %}
{% if payload.out_of_scope_sample %} {% if payload.out_of_scope_absence.available %} {# Which kind of absence, because all three look identical here and only one of them means the device really left. #}

{% if payload.out_of_scope_absence.absent_from_snapshot %} {% blocktrans count counter=payload.out_of_scope_absence.absent_from_snapshot %}{{ counter }} gone from Forward{% plural %}{{ counter }} gone from Forward{% endblocktrans %} {% endif %} {% if payload.out_of_scope_absence.present_untagged %} {% blocktrans count counter=payload.out_of_scope_absence.present_untagged %}{{ counter }} in Forward but untagged{% plural %}{{ counter }} in Forward but untagged{% endblocktrans %} {% endif %} {% if payload.out_of_scope_absence.vendor_excluded %} {% blocktrans count counter=payload.out_of_scope_absence.vendor_excluded %}{{ counter }} custom-command source{% plural %}{{ counter }} custom-command source{% endblocktrans %} {% endif %}

{% if payload.out_of_scope_absence.present_untagged %}

{% trans "Devices Forward still has but no longer reports under these tags. A Forward-side tag edit and a narrowed query look identical here — confirm in Forward before pruning." %}

{% endif %} {% endif %}
    {% for name in payload.out_of_scope_sample %}
  • {{ name }}
  • {% endfor %}
{% if payload.netbox_out_of_scope > payload.out_of_scope_sample|length %}

{% blocktrans with shown=payload.out_of_scope_sample|length total=payload.netbox_out_of_scope %}Showing {{ shown }} of {{ total }}.{% endblocktrans %}

{% endif %} {% else %}

{% trans "No out-of-scope devices." %}

{% endif %}
{% trans "Post-Upgrade Catalog Reconciliation" %}
{% if upgrade_reconciliation.dlm.available %} {% endif %}
{% trans "Mode" %} {% trans "Read only" %}
{% trans "Platforms with manufacturer" %} {{ upgrade_reconciliation.platforms.with_manufacturer }} / {{ upgrade_reconciliation.platforms.total }}
{% trans "Platforms without manufacturer" %} {{ upgrade_reconciliation.platforms.without_manufacturer }}
{% trans "Stale endpoint DeviceTypes" %} {% if upgrade_reconciliation.stale_endpoint_device_types.candidate_count %} {{ upgrade_reconciliation.stale_endpoint_device_types.candidate_count }} {% else %} 0 {% endif %}
{% trans "DLM status" %} {{ upgrade_reconciliation.dlm.status }}
{% trans "Software versions" %} {{ upgrade_reconciliation.dlm.software_versions.total }}
{% trans "Versions without devices" %} {{ upgrade_reconciliation.dlm.software_versions.without_devices }}
{% trans "Protected versions without devices" %} {{ upgrade_reconciliation.dlm.software_versions.protected_without_devices }}
{% trans "Unreferenced version candidates" %} {% if upgrade_reconciliation.dlm.software_versions.unreferenced_without_devices %} {{ upgrade_reconciliation.dlm.software_versions.unreferenced_without_devices }} {% else %} 0 {% endif %}
{% trans "CVEs" %} {{ upgrade_reconciliation.dlm.cves.total }}
{% trans "CVEs with vulnerabilities" %} {{ upgrade_reconciliation.dlm.cves.with_vulnerabilities }}
{% trans "CVEs with affected software" %} {{ upgrade_reconciliation.dlm.cves.with_affected_software }}
{% trans "Unlinked CVEs" %} {{ upgrade_reconciliation.dlm.cves.unlinked }}
{% trans "Review Candidates" %}
{% if upgrade_reconciliation.stale_endpoint_device_types.sample %}
{% trans "Stale endpoint DeviceTypes" %}
    {% for item in upgrade_reconciliation.stale_endpoint_device_types.sample %}
  • {{ item.manufacturer__name }} / {{ item.model }}
  • {% endfor %}
{% endif %} {% if upgrade_reconciliation.dlm.software_versions.unreferenced_sample %}
{% trans "Unreferenced software versions" %}
    {% for item in upgrade_reconciliation.dlm.software_versions.unreferenced_sample %}
  • {{ item.platform__name }} / {{ item.version }}
  • {% endfor %}
{% endif %} {% if upgrade_reconciliation.dlm.software_versions.protected_sample %}
{% trans "Protected software versions without devices" %}
    {% for item in upgrade_reconciliation.dlm.software_versions.protected_sample %}
  • {{ item.platform__name }} / {{ item.version }} ({{ item.protected_by }})
  • {% endfor %}
{% endif %} {% if not upgrade_reconciliation.stale_endpoint_device_types.sample and not upgrade_reconciliation.dlm.software_versions.unreferenced_sample and not upgrade_reconciliation.dlm.software_versions.protected_sample %}

{% trans "No post-upgrade review candidates." %}

{% endif %}
{% trans "Backfill Reason Breakdown" %}
{% if payload.backfilled_reason_breakdown %}

{% trans "Why these in-scope devices were not freshly collected by Forward. This is a Forward collection-health signal, not a sync error — fix collection in Forward (rotate credentials for AUTHENTICATION_FAILED, check reachability for CONNECTION_TIMEOUT, finish onboarding for INCOMPLETE_SETUP)." %}

{% for reason, count in payload.backfilled_reason_breakdown.items %} {% endfor %}
{{ reason }} {{ count }}
{% else %}

{% trans "No backfilled devices in the latest snapshot." %}

{% endif %}
{% trans "Tagged-but-Backfilled Sample" %}
{% if payload.present_backfilled_detail_sample %}

{% trans "In NetBox but not freshly collected in the latest snapshot (serving last-known-good data). Days = how stale the served data is." %}

{% for item in payload.present_backfilled_detail_sample %} {% endfor %}
{% trans "Device" %}{% trans "Reason" %}{% trans "Stale" %}
{{ item.name }} {{ item.reason }} {% if item.stale_days is not None %}{% blocktrans count days=item.stale_days %}{{ days }} day{% plural %}{{ days }} days{% endblocktrans %}{% else %}{% endif %}
{% if payload.netbox_present_backfilled > payload.present_backfilled_detail_sample|length %}

{% blocktrans with shown=payload.present_backfilled_detail_sample|length total=payload.netbox_present_backfilled %}Showing {{ shown }} of {{ total }}.{% endblocktrans %}

{% endif %} {% else %}

{% trans "No backfilled devices in NetBox." %}

{% endif %}
{% endblock content %}