{% extends "admin/_layout.html" %} {% from "_macros.html" import icon %} {% set section = "updates" %} {% block title %}{{ t("Updates") }} - {{ brand.name }}{% endblock %} {% block heading %}{{ t("Updates") }}{% endblock %} {% block admin_content %}
{% if state.channel == "stable" %}
{{ tm("This host follows the stable channel — the newest release tag.") }}
{% else %}
{{ tm("This host follows the edge channel — the tip of %(branch)s, which is whatever was pushed most
recently and may be half finished.", branch=state.branch) }}
{% endif %}
{{ t("Checking reaches the remote; opening this page does not.") }}
{{ state.head.short }} {{ state.head.subject }}
{% if state.dirty %}{{ t("uncommitted changes") }}{% endif %}
{{ state.checkout }}{{ t("This was not installed from a git checkout — a container image, or a wheel — so there is nothing here to compare or update. Pull a new image instead.") }}
{% else %} {% endif %}
{{ tm("Nothing on %(branch)s has been tagged as a release yet,
so the stable channel has nothing to offer. Switch this host to
edge in lembas.env to follow the branch instead.", branch=state.branch) }}
{{ t("Nothing known about the remote yet. Check it above.") }}
{% elif state.up_to_date %}{{ tm("%(label)s is what is running.", label=state.available.label) }}
{% else %}{{ state.available.label }} — {{ state.available.subject }}
{# Release notes, out of the annotated tag itself. Escaped and preformatted, never through services/markdown.py: this comes from a tag object rather than from a template, and markdown is the one path allowed to emit HTML. #} {% if state.between | length > 1 %} {# Every release this update brings, newest first: skipping three releases means reading three sets of notes, not one. #} {% for release in state.between %}{{ release.notes }}{% endif %}
{{ state.available.notes }}
{% endif %}
{{ t("Harness spec: %(have)s here", have=spec) }}{% if state.target_spec and state.target_spec != spec %} · {{ t("%(want)s in %(label)s", want=state.target_spec, label=state.available.label) }}{% endif %}
{# The commits between, not just a count. "3 behind" is a number somebody has to go and look up; the subjects are what decides whether this is worth restarting for right now. #} {% if state.behind %}{{ commit.short }} {{ commit.subject }}
{{ t("LLeMbas %(label)s, a new major version, is out. It is not offered here: moving to a new major version is done by hand.", label=state.newer_major) }}
{% endif %}lembas.env and the systemd unit); re-run the installer with
INSTALL_UPDATE_HELPER=1 and the channel you want, which
writes both.", channel=state.channel, helper=state.helper_channel) }}
INSTALL_UPDATE_HELPER=1 to replace it.") }}
{{ tm("This host has the update helper installed, so the button below writes a request that a systemd unit picks up and runs as root. It always deploys the %(channel)s channel — the request carries no ref and no channel, so pressing it is never “deploy something else”.", channel=state.channel) }}
{% if auto.wanted and not state.requested %}{{ t("Every restart ends every open terminal session — a command still running on the far side is cut off. A reply being written is saved with whatever it has.") }}
{% else %}%(command)s", command=command) }}
{{ tm("To install it, re-run the installer with
INSTALL_UPDATE_HELPER=1. Doing so means anybody who can
administer this web interface can deploy the %(channel)s
channel — which is the point, and worth deciding on purpose rather than
arriving at.", channel=state.channel) }}
{{ t("Check for releases on a schedule and install the ones the policy allows — only when nothing is running and nobody has been active for a while, and always after a backup. Off by default.") }}