diff --git a/core/Cargo.lock b/core/Cargo.lock index 46f9083c..54e1d6ce 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "archipelago" -version = "1.7.7-alpha" +version = "1.7.8-alpha" dependencies = [ "anyhow", "archipelago-container", diff --git a/core/archipelago/Cargo.toml b/core/archipelago/Cargo.toml index 7229be2e..95befc3e 100644 --- a/core/archipelago/Cargo.toml +++ b/core/archipelago/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "archipelago" -version = "1.7.7-alpha" +version = "1.7.8-alpha" edition = "2021" description = "Archipelago Bitcoin Node OS - Native backend" authors = ["Archipelago Team"] diff --git a/core/archipelago/src/update.rs b/core/archipelago/src/update.rs index 3cef79a0..bc5e0af2 100644 --- a/core/archipelago/src/update.rs +++ b/core/archipelago/src/update.rs @@ -277,27 +277,31 @@ pub async fn apply_update(data_dir: &Path) -> Result<()> { match name.as_str() { "archipelago" => { - // /usr/local/bin is root-owned; archipelago user can't - // fs::copy into it directly. Use sudo install which handles - // the copy, mode, and ownership atomically. + // We're running FROM /usr/local/bin/archipelago right now, + // so we can't rewrite it in place — `install` / `cp` would + // hit ETXTBSY on the busy executable. Use `mv` instead: + // rename() is atomic and doesn't modify the existing file, + // it just re-points the path at a new inode. The currently + // running process keeps executing off the old inode; new + // invocations (i.e. after the post-apply systemctl + // restart) pick up the new binary. + let staged = src.to_string_lossy().to_string(); + let _ = tokio::process::Command::new("sudo") + .args(["chmod", "0755", &staged]) + .status() + .await; + let _ = tokio::process::Command::new("sudo") + .args(["chown", "root:root", &staged]) + .status() + .await; let status = tokio::process::Command::new("sudo") - .args([ - "install", - "-m", - "0755", - "-o", - "root", - "-g", - "root", - &src.to_string_lossy(), - "/usr/local/bin/archipelago", - ]) + .args(["mv", &staged, "/usr/local/bin/archipelago"]) .status() .await - .with_context(|| format!("Failed to spawn install for {}", name))?; + .with_context(|| format!("Failed to spawn mv for {}", name))?; if !status.success() { anyhow::bail!( - "sudo install failed for {} (exit {:?})", + "sudo mv failed for {} (exit {:?})", name, status.code() ); diff --git a/releases/manifest.json b/releases/manifest.json index bbe449bb..23f7142b 100644 --- a/releases/manifest.json +++ b/releases/manifest.json @@ -1,23 +1,23 @@ { - "version": "1.7.7-alpha", + "version": "1.7.8-alpha", "release_date": "2026-04-20", "changelog": [ - "Over-the-air update test — no feature changes, just a version bump so your node can walk through the whole update flow end-to-end using the new robust installer. Safe to apply; nothing to do afterwards." + "Install Update finally works end-to-end over the air. The installer was trying to overwrite the running backend binary with a tool that fails on in-use files (ETXTBSY) — swapped it for an atomic rename, which the kernel allows on a live executable. Every previous 'Failed to apply update' attempt was this one root cause." ], "components": [ { "name": "archipelago", - "current_version": "1.7.6-alpha", - "new_version": "1.7.7-alpha", - "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.7-alpha/archipelago", - "sha256": "e3f1740dcb008a6fcef1adc7f2c9d2f86bfa8d5397e9b8f425260977c7006025", - "size_bytes": 40373392 + "current_version": "1.7.7-alpha", + "new_version": "1.7.8-alpha", + "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.8-alpha/archipelago", + "sha256": "2753daec113bb4fbbc2a68148ef1579524a26707733eea410faf400b9948094d", + "size_bytes": 40377648 }, { - "name": "archipelago-frontend-1.7.7-alpha.tar.gz", - "current_version": "1.7.6-alpha", - "new_version": "1.7.7-alpha", - "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.7-alpha/archipelago-frontend-1.7.7-alpha.tar.gz", + "name": "archipelago-frontend-1.7.8-alpha.tar.gz", + "current_version": "1.7.7-alpha", + "new_version": "1.7.8-alpha", + "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.8-alpha/archipelago-frontend-1.7.8-alpha.tar.gz", "sha256": "4fb796643cc9dc8469078ca3392f7cc5541071f6849979922b3259e5f20172e9", "size_bytes": 76984615 } diff --git a/releases/v1.7.8-alpha/archipelago b/releases/v1.7.8-alpha/archipelago new file mode 100755 index 00000000..0a5da0d2 Binary files /dev/null and b/releases/v1.7.8-alpha/archipelago differ diff --git a/releases/v1.7.8-alpha/archipelago-frontend-1.7.8-alpha.tar.gz b/releases/v1.7.8-alpha/archipelago-frontend-1.7.8-alpha.tar.gz new file mode 100644 index 00000000..2465942a Binary files /dev/null and b/releases/v1.7.8-alpha/archipelago-frontend-1.7.8-alpha.tar.gz differ