{% extends "base.html" %} {% block title %}Hub Management — {{ config.BBS_NAME }}{% endblock %} {% block content %}

Hub Management

Manage downstream BinkP nodes and QWK nodes connected to this BBS as a hub.

{{ binkp_nodes|length }}
BinkP Nodes
{{ qwk_nodes|length }}
QWK Nodes
{{ pending_hold }}
Hold Queue (pending)
Hub Mode
{% if identities|length > 1 %}
Hub Identities
{% for i in identities %} {% endfor %}
Identity BinkP Nodes QWK Nodes Status
{{ i.name }} {% if i.is_default %}default{% endif %} {{ binkp_nodes|selectattr('hub_identity_id', 'equalto', i.id)|list|length }} {{ qwk_nodes|selectattr('hub_identity_id', 'equalto', i.id)|list|length }} {% if i.is_active %}active {% else %}inactive{% endif %} Edit
{% endif %}
Generation & Distribution
{% if gen_tab == 'nodelist' %}

Publishes the ANotherNetwork nodelist into the ANN.FILES.NODELIST file area, replacing the prior copy, so peers can pull it like any other file-echo entry (BinkP/FTP/web).

{% if nodelist_event %} {% if nodelist_event.row.last_output %} {% endif %}
Schedule {{ nodelist_event.schedule_human }} {% if not nodelist_event.row.is_enabled %}disabled{% endif %} — edit schedule
Last run {% if nodelist_event.row.last_run_at %} {{ nodelist_event.row.last_run_at|eastern('%Y-%m-%d %H:%M %Z') }} {% if nodelist_event.row.last_status == 'ok' %}ok {% else %}{{ nodelist_event.row.last_status }}{% endif %} {% else %} never {% endif %}
Last output{{ nodelist_event.row.last_output }}
{% else %}
No nodelist-generation event found — enable REGISTRY_MODE_ENABLED and restart to seed it.
{% endif %}

Direct Download

Auto-publishing into the file area above only covers the default hub identity. Every active identity's nodelist is always available directly here:

    {% for i in identities if i.is_active %}
  • {{ i.name }} {% if i.is_default %}default{% endif %} — download
  • {% endfor %}
{% elif gen_tab == 'qwk' %}

QWK packets are already built fresh automatically every time a node's FTP client connects or hits the download URL — nothing to schedule. Use "Preview" to build and download a packet on demand for testing; this does not mark messages as sent, so the node's real next download is unaffected.

{% if qwk_nodes %} {% for node in qwk_nodes %} {% endfor %}
Packet IDNameStatus
{{ node.packet_id }} {{ node.name }} {% if node.is_active %}active {% else %}inactive{% endif %} Preview
{% else %}
No QWK nodes registered yet.
{% endif %} {% elif gen_tab == 'tic' %}

Files uploaded to any ANN.FILES.* area are automatically queued for TIC distribution to subscribed peers — no manual step needed. This shows the outbound queue's current state; delivery happens on the next BinkP poll per peer.

{{ hatch_pending }}
Pending
{{ hatch_failed }}
Failed
{% elif gen_tab == 'join' %}

Lets anyone apply to join your network from a public web page — read the rules, download the full infopack, check a box confirming they read the rules, then submit. Applications land in Join Requests for you to review.

{% if identities|length > 1 %}
{% endif %}
Both set: auto-assign sequential node numbers ({{ join_cfg.binkp_zone or 'Z' }}:{{ join_cfg.binkp_net or 'N' }}/2, /3, ...) at approval, node 1 reserved for the hub. Leave blank to use whatever BinkP address the applicant typed in, unchanged.

Infopack
{% if join_cfg.infopack_filename %}

Current: {{ join_cfg.infopack_original_filename }} ({{ join_cfg.infopack_size }} bytes, uploaded {{ join_cfg.infopack_uploaded_at|eastern('%Y-%m-%d %H:%M %Z', '?') }}) — download

{% if join_txt_members %}
{% endif %} {% if join_cfg.rules_text %}
Rules preview (from {{ join_cfg.rules_member_name }})
{{ join_cfg.rules_text }}
{% endif %} {% else %}

No infopack uploaded yet.

{% endif %}
{% endif %}
BinkP Nodes
{% if binkp_nodes %} {% for node in binkp_nodes %} {% endfor %}
AddressNameStatusLast Seen
{{ node.ftn_address }} {{ node.name }} {% if node.is_active %}active {% else %}inactive{% endif %} {% if node.last_seen_at %}{{ node.last_seen_at|eastern('%Y-%m-%d %H:%M') }}{% else %}—{% endif %}
{% else %}
No BinkP nodes registered yet.
{% endif %}
QWK Nodes
{% if qwk_nodes %} {% for node in qwk_nodes %} {% endfor %}
Packet IDNameStatusLast Poll
{{ node.packet_id }} {{ node.name }} {% if node.is_active %}active {% else %}inactive{% endif %} {% if node.last_poll_at %}{{ node.last_poll_at|eastern('%Y-%m-%d %H:%M') }}{% else %}—{% endif %}
{% else %}
No QWK nodes registered yet.
{% endif %}
{% endblock %}