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

System

Hostname, uptime, WAN status, and the state of the five Vendora services. Reboot, per-service restart, and WAN-mode editor available below.

{% if flash_msg %}
{{ flash_msg }}{% if flash_extra %} {{ flash_extra }}{% endif %}
{% endif %} {% if error_msg %}
{{ error_msg }}
{% 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 IPv4, or PPPoE. The new profile activates immediately — if you typo something, internet will fail but this admin page stays reachable on the LAN (10.0.10.1:8080) so you can correct it. Every change is recorded in the audit log.

{% set current_mode = data.wan.mode %}
{# ============================================================ #} {# 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. Updates ship via the apt repo at apt.vendorawifi.com; the signing key for that repo is baked into every Vendora SBC image. Apt rejects any package not signed by the correct key.

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 runs apt update against the Vendora repo (5–30 seconds depending on network). Install Update Now spawns a background apt upgrade; the page will redirect to a "Updating" wait screen and auto-refresh here when the install finishes.

GPIO Pin Map

Which Allwinner H3 GPIO lines this SBC uses for the coin slot. Defaults match the production custom-board wiring. If your custom board lands the coin signal or relay trigger on different GPIOs, change them here.

Heads up: saving any change here restarts vendora-coin. The slot relay drops to OFF for ~1 second during the restart. Don't change pins while a customer is 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 %}).

Bringing up a new custom board and don't know which pins to set above? Use the GPIO Hardware Tools — a tester, a sweep looper, and a pulse-pin finder that listens on all PA pins at once.

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

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 }}
{% endblock %}