fix(handoff): print the shard screen's real path
All checks were successful
PR Checks / rust-gates (pull_request) Successful in 1m39s
All checks were successful
PR Checks / rust-gates (pull_request) Successful in 1m39s
The end-of-run block told operators to paste the four values at `<site>/admin/shard`. That page moved when the shard screens became part of the `uo` module: a module owns one path segment wherever it appears (website `MODULE_SYSTEM.md` §2.8), so it is `/admin/uo/link`, labelled "Shard (uo-link)". The old path is worse than a 404. The SPA has no route for it, so it sends the operator to the dashboard — the link looks like it worked, and the values they were told to paste have nowhere to go. - The path is now a named constant, `ADMIN_SHARD_PATH`, carrying why it is not the obvious string and the fact that API routes are NOT affected by the module namespacing rule (they keep `/api/v1/admin/shard/*`). - Both handoff tests assert the new path, so this cannot regress quietly. - The two user-facing labels that name the screen — the `--site-url` help text and `update`'s protocol-change instruction — say "Admin → Shard (uo-link)", matching what the sidebar actually reads. Found while writing the runicgateway.com installation journey, by pasting the printed link into a real deployment and landing on the dashboard. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -77,7 +77,7 @@ pub struct Cli {
|
||||
pub patches_unsupported_servuo: bool,
|
||||
/// `--host <name>`: the hostname to print in the website URLs.
|
||||
pub host: Option<String>,
|
||||
/// `--site-url <url>`: the site's base URL, for the Admin → Shard link.
|
||||
/// `--site-url <url>`: the site's base URL, for the Admin → Shard (uo-link) link.
|
||||
pub site_url: Option<String>,
|
||||
/// `--yes`: assume the default answer to every prompt.
|
||||
pub assume_yes: bool,
|
||||
@@ -137,7 +137,7 @@ Options:
|
||||
--host <NAME> install. The hostname to print in the
|
||||
website URLs.
|
||||
--site-url <URL> install. Your site's base URL, for the
|
||||
Admin → Shard link.
|
||||
Admin → Shard (uo-link) link.
|
||||
--yes Assume the default answer to every prompt.
|
||||
On uninstall it means yes: that prompt
|
||||
defaults to no, and typing `uninstall
|
||||
|
||||
@@ -294,6 +294,18 @@ fn port_of(bind: &str) -> &str {
|
||||
}
|
||||
}
|
||||
|
||||
/// Where the shard settings live in the website's admin panel.
|
||||
///
|
||||
/// NOT `/admin/shard`, which is what this printed until 2026-08-24 and what an operator who ran
|
||||
/// an older build still has in their scrollback. Those screens belong to the `uo` MODULE now, and
|
||||
/// a module owns one path segment wherever it appears (website `MODULE_SYSTEM.md` §2.8), so the
|
||||
/// page moved. The old path does not 404 — the SPA sends it to the dashboard, which is the worst
|
||||
/// way for a link in a handoff to be wrong, because it looks like it worked.
|
||||
///
|
||||
/// API routes are NOT affected by that rule and keep `/api/v1/admin/shard/*`. This is the SPA URL
|
||||
/// a person types.
|
||||
const ADMIN_SHARD_PATH: &str = "/admin/uo/link";
|
||||
|
||||
/// The end-of-run block from PLAN.md §6 — the one manual step the installer cannot do.
|
||||
///
|
||||
/// Returned as a string rather than printed so it can be tested, and so the caller decides where it
|
||||
@@ -312,12 +324,13 @@ pub fn handoff(doc: &ConfigDoc, host: &str, site_url: Option<&str>) -> String {
|
||||
Protocol version {protocol}\n \
|
||||
Auth token {token}\n \
|
||||
(also in {config})\n\n\
|
||||
Paste these into Admin → Shard on your Runic Gateway site:\n \
|
||||
{site}/admin/shard\n\n\
|
||||
Paste these into Admin → Shard (uo-link) on your Runic Gateway site:\n \
|
||||
{site}{admin_path}\n\n\
|
||||
The token is write-only once saved — the site will never show it back to you.\n",
|
||||
protocol = doc.protocol,
|
||||
token = doc.web.auth_token,
|
||||
config = doc.config_path,
|
||||
admin_path = ADMIN_SHARD_PATH,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -401,7 +414,7 @@ mod tests {
|
||||
assert!(block.contains(&doc.web.auth_token), "{block}");
|
||||
// The trailing slash on the site URL must not produce a double slash in the link.
|
||||
assert!(
|
||||
block.contains("https://my-site.example/admin/shard"),
|
||||
block.contains("https://my-site.example/admin/uo/link"),
|
||||
"{block}"
|
||||
);
|
||||
assert!(block.contains("/etc/runicgateway/sidecar.toml"), "{block}");
|
||||
@@ -412,7 +425,10 @@ mod tests {
|
||||
// An unattended run has nobody to ask, and the token is far too useful to withhold over a
|
||||
// link the operator does not need.
|
||||
let block = handoff(&doc(), "shard", None);
|
||||
assert!(block.contains("https://<your-site>/admin/shard"), "{block}");
|
||||
assert!(
|
||||
block.contains("https://<your-site>/admin/uo/link"),
|
||||
"{block}"
|
||||
);
|
||||
assert!(block.contains("4f9c"), "{block}");
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ pub fn closing(prior: Option<&InstallRecord>, bundle: &Bundle, now: &InstallReco
|
||||
println!();
|
||||
ui::warn(&format!(
|
||||
"The protocol version changed: {} → {}.\n \
|
||||
Update the Protocol version field in Admin → Shard on your website. Nothing else \
|
||||
Update the Protocol version field in Admin → Shard (uo-link) on your website. Nothing else \
|
||||
changed —\n the URLs and the auth token are the same, and the sidecar answers a \
|
||||
website still set to\n {} with 409 rather than mis-parsing it.",
|
||||
previous_protocol.unwrap_or(bundle.protocol),
|
||||
|
||||
Reference in New Issue
Block a user