diff --git a/tests/test_app.py b/tests/test_app.py index ca301e3..b44c173 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -195,3 +195,34 @@ def test_build_archinstall_creds_uses_archinstall_sentinel_keys(): "groups": [], } ] + + +def test_log_page_done_state_shows_usb_step_before_restart(monkeypatch, tmp_path): + """The 'pull the USB stick' step must be visible *before* the restart + button — after the click the box reboots within seconds (first hardware + bench booted the stick again).""" + import app as app_module + + log_path = tmp_path / "install.log" + log_path.write_text("Installation completed without any errors.\n") + monkeypatch.setattr(app_module, "INSTALL_LOG", log_path) + app_module.settings["hostname"] = "bench" + + html = app_module.app.test_client().get("/install/log").get_data(as_text=True) + + assert '
    ' in html + assert "http://bench.local" in html + assert "USB stick is out" in html + assert html.index("next-steps") < html.index("USB stick is out") + + +def test_log_page_running_state_has_no_restart_button(monkeypatch, tmp_path): + import app as app_module + + log_path = tmp_path / "install.log" + log_path.write_text("Creating partitions: /dev/sda\n") + monkeypatch.setattr(app_module, "INSTALL_LOG", log_path) + + html = app_module.app.test_client().get("/install/log").get_data(as_text=True) + assert "next-steps" not in html + assert "install_reboot" not in html and "restart now" not in html diff --git a/webinstaller/app.py b/webinstaller/app.py index 7210ab2..c0db38f 100644 --- a/webinstaller/app.py +++ b/webinstaller/app.py @@ -642,6 +642,7 @@ def install_log_view(): "install/log.html", log=log, progress=parse_install_progress(log), + hostname=settings["hostname"], ) diff --git a/webinstaller/static/style.css b/webinstaller/static/style.css index 094af5c..b667596 100644 --- a/webinstaller/static/style.css +++ b/webinstaller/static/style.css @@ -421,3 +421,11 @@ select:focus { outline-offset: 3px; border-radius: 2px; } + +/* "Furtka is ready" — the two steps before the restart button (log.html). */ +.next-steps { + margin: 1.5rem 0 1rem; + padding-left: 1.4rem; + line-height: 1.5; +} +.next-steps li { margin-bottom: 0.6rem; } diff --git a/webinstaller/templates/install/log.html b/webinstaller/templates/install/log.html index 00e530d..2d1953b 100644 --- a/webinstaller/templates/install/log.html +++ b/webinstaller/templates/install/log.html @@ -17,16 +17,25 @@ {% else %}Installing Furtka{% endif %}

    -{% if progress.status == "done" %}Installation finished. Remove the installer USB / eject the ISO, then click Reboot. +{% if progress.status == "done" %}Installation finished. Two more steps and Furtka is running from its own disk. {% elif progress.status == "error" %}Something went wrong. Open the details below and share them so we can help. {% else %}This takes a few minutes. Don't close this page or power off the machine.{% endif %}

    {% if progress.status == "done" %} +{# The USB-stick step has to be read *before* the click: the machine reboots + 3 s after it, and most BIOSes boot the stick before the disk — so the + installer would just come back. Seen on the first hardware bench. #} +
      +
    1. Pull out the USB stick (or eject the installer ISO in your VM). + If it stays in, the computer will start this installer again instead of Furtka.
    2. +
    3. Click the button below. The computer restarts and comes back as + http://{{ hostname }}.local in about a minute.
    4. +
    + onsubmit="return confirm('USB stick removed? Click OK to restart the computer.');">
    - +
    {% endif %}