{% extends "base.html" %} {% block content %}

System

Hostname, uptime, WAN status, and service health.

{% if flash_msg %}
{{ flash_msg }}{% if flash_extra %} {{ flash_extra }}{% endif %}
{% endif %} {% if error_msg %}
{{ error_msg }}
{% endif %} {% if data.wan_collision and data.wan_collision.collision %}
⚠ Your internet and your customer network are on the same IP range

Your modem gave the internet port (WAN) {{ data.wan_collision.wan_ip }}, which overlaps {% for c in data.wan_collision.conflicts %}{{ c.subnet }} ({{ c.label }}){% if not loop.last %}, {% endif %}{% endfor %}. With the same range on both sides the SBC can't reach the internet — so no customer can either. Change your customer LAN subnet to a different range (for example 10.0.20.0/24).

Change LAN subnet →
{% endif %}
{# Top quick stats: hostname, uptime, WAN mode, internet reachability #}
Hostname
{{ data.hostname }}
{{ data.kernel }}
Uptime
{{ data.uptime }}
since last boot
Internet
{% if data.internet_ok %}Reachable{% else %}Unreachable{% endif %}
ping 1.1.1.1 (2s timeout)

WAN (eth0)

Active profile {% if data.wan.profile %} {{ data.wan.profile }} {% else %} — (no eth0 profile active) {% endif %}
Address {% if data.wan.address %} {{ data.wan.address }} {% else %} {% endif %}
Gateway {% if data.wan.gateway %} {{ data.wan.gateway }} {% else %} {% endif %}
DNS {% if data.wan.dns %} {% for ip in data.wan.dns %} {{ ip }}{% if not loop.last %}, {% endif %} {% endfor %} {% else %} {% endif %}

WAN Mode Editor

Switch between DHCP, Static, or PPPoE. Applies immediately; if it breaks the internet this admin page stays reachable so you can fix it.

{% set current_mode = data.wan.mode %}
{# ============================================================ #} {# Timezone (post-1.5.2) #} {# Drives every "Asia/Manila"-style local-time display + the #} {# sales-day rollover. Fresh flashes bake Asia/Manila; operators #} {# can change here for a deployed device. #} {# ============================================================ #}

Timezone

Sets the local clock for displays + the sales day rollover. Current: {{ data.timezone.current }}.

Saving restarts the portal + admin briefly to load the new zone. Customer sessions stay authorized.

{# ============================================================ #} {# Remote Access (ADR-0022 part 2) — admin from the WAN, toggle #} {# ============================================================ #}

Remote Access

Let the admin be reached from your internet (WAN) network — e.g. your modem's LAN — instead of only the customer network. For safety this only works when your WAN is a private network; it stays off on a public internet address.

{% if data.wan_admin.active and data.wan_admin.reason == 'degraded' %}
⚠ Remote admin is currently open automatically because the customer LAN port is missing (recovery mode) — reachable at {{ data.wan_admin.url }}. It closes on its own when the port is back, independent of the toggle below.
{% elif data.wan_admin.enabled and data.wan_admin.active %}
🛟 Reachable now at {{ data.wan_admin.url }} from your modem's network. Turn this OFF when you're done.
{% elif data.wan_admin.blocked %}
🔒 Turned ON, but your internet address{% if data.wan_admin.wan_ip %} ({{ data.wan_admin.wan_ip }}){% endif %} is public, so remote admin is BLOCKED for safety — the admin login is never exposed to the internet. It switches on automatically if the box is ever on a private modem network.
{% endif %}
Status: {% if data.wan_admin.enabled %}ON{% else %}OFF (admin is LAN-only){% endif %}

Sub-vendo and PPPoE customers are on separate networks from your own. By default they can't open this admin — only buy WiFi (their portal) and, for ESPs, pair. Turn this on only if you manage the box from one of those networks.

{% if not data.sub_vendo_admin.has_segments %}

No sub-vendos or PPPoE configured yet, so this has no effect right now.

{% endif %}
Sub-vendo / PPPoE admin access: {% if data.sub_vendo_admin.allowed %}ALLOWED{% else %}BLOCKED (recommended){% endif %}
{# ============================================================ #} {# Updates (OTA) — v1.x SBC-side UX #} {# Check + install vendora-sbc package updates from the apt repo #} {# at apt.vendorawifi.com. Trust chain baked at image build. #} {# ============================================================ #}

Updates

Check for and install Vendora SBC updates. Only updates signed by Vendora are accepted.

v{{ data.current_version }}
{% if data.ota.last_check_at %} {{ data.ota.last_check_at | localtime }} {% else %} — never checked {% endif %}
{# Result summary based on last check #} {% if data.ota.result == "update_available" and data.ota.available_version %}
Update available: v{{ data.current_version }} → v{{ data.ota.available_version }}. Click Install Update Now to apply it. Services restart briefly during the install; customer sessions may see a 1–2 second blip.
{% elif data.ota.result == "up_to_date" %}
Up to date. Installed version v{{ data.current_version }} is the current release.
{% elif data.ota.result == "installing" %}
Install in progress. The most recent update install hasn't finished yet (or its admin restart hasn't completed). Refresh in a few seconds.
{% elif data.ota.result == "error" %}
Last check failed: {{ data.ota.error or "unknown error" }}
{% endif %}
{% if data.ota.result == "update_available" and data.ota.available_version %}
{% endif %}

Heads up: Check Updates takes a few seconds. Install Update Now applies it in the background and shows a wait screen until it finishes.

GPIO Pin Map

Which GPIO lines this SBC uses for the coin slot. Defaults match the standard board — change only for a different custom board.

Heads up: saving restarts the coin service (the relay blips off ~1 s). Don't change pins mid-payment.

Default: PA{{ data.gpio.pulse_default }} (physical pin {% if data.gpio.pulse_default == 12 %}3 {%- elif data.gpio.pulse_default == 7 %}12 {%- else %}custom pin{% endif %}).

Default: PA{{ data.gpio.slot_default }} (physical pin {% if data.gpio.slot_default == 11 %}5 {%- elif data.gpio.slot_default == 10 %}35 {%- else %}custom pin{% endif %}).

Not sure which pins? Use the GPIO Hardware Tools to find them.

Services

{% for s in data.services %} {% endfor %}
Unit Status Actions
{{ s.unit }} {% if s.active == 'active' %} active {% elif s.active == 'failed' %} failed {% elif s.active == 'inactive' %} inactive {% else %} {{ s.active }} {% endif %}

Resources

CPU
{{ data.cpu.used_pct }}%
{% if data.cpu.temp_c is not none %}{{ data.cpu.temp_c }}°C{% else %}current usage{% endif %}
Memory
{{ data.mem.used_pct }}%
{{ data.mem.available_h }} free of {{ data.mem.total_h }}
Disk
{{ data.disk.used_pct }}%
{{ data.disk.free_h }} free of {{ data.disk.total_h }}
{% if data.conntrack %}
Connections
{{ data.conntrack.pct }}%
{{ data.conntrack.count }} / {{ data.conntrack.max }} tracked{% if data.conntrack.pct >= 80 %} · near full{% endif %}
{% endif %}
{% endblock %}