mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-04-04 14:29:45 +00:00
update-grub on update
This commit is contained in:
@@ -18,6 +18,12 @@ use tracing::instrument;
|
|||||||
use ts_rs::TS;
|
use ts_rs::TS;
|
||||||
|
|
||||||
use crate::context::{CliContext, RpcContext};
|
use crate::context::{CliContext, RpcContext};
|
||||||
|
use crate::disk::mount::filesystem::bind::Bind;
|
||||||
|
use crate::disk::mount::filesystem::block_dev::BlockDev;
|
||||||
|
use crate::disk::mount::filesystem::efivarfs::{self, EfiVarFs};
|
||||||
|
use crate::disk::mount::filesystem::overlayfs::OverlayGuard;
|
||||||
|
use crate::disk::mount::filesystem::MountType;
|
||||||
|
use crate::disk::mount::guard::{GenericMountGuard, MountGuard, TmpMountGuard};
|
||||||
use crate::notifications::{notify, NotificationLevel};
|
use crate::notifications::{notify, NotificationLevel};
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use crate::progress::{FullProgressTracker, PhaseProgressTrackerHandle, PhasedProgressBar};
|
use crate::progress::{FullProgressTracker, PhaseProgressTrackerHandle, PhasedProgressBar};
|
||||||
@@ -247,6 +253,7 @@ async fn maybe_do_update(
|
|||||||
asset.validate(SIG_CONTEXT, asset.all_signers())?;
|
asset.validate(SIG_CONTEXT, asset.all_signers())?;
|
||||||
|
|
||||||
let progress = FullProgressTracker::new();
|
let progress = FullProgressTracker::new();
|
||||||
|
let prune_phase = progress.add_phase("Pruning Old OS Images".into(), Some(2));
|
||||||
let mut download_phase = progress.add_phase("Downloading File".into(), Some(100));
|
let mut download_phase = progress.add_phase("Downloading File".into(), Some(100));
|
||||||
download_phase.set_total(asset.commitment.size);
|
download_phase.set_total(asset.commitment.size);
|
||||||
let reverify_phase = progress.add_phase("Reverifying File".into(), Some(10));
|
let reverify_phase = progress.add_phase("Reverifying File".into(), Some(10));
|
||||||
@@ -300,6 +307,7 @@ async fn maybe_do_update(
|
|||||||
asset,
|
asset,
|
||||||
UpdateProgressHandles {
|
UpdateProgressHandles {
|
||||||
progress,
|
progress,
|
||||||
|
prune_phase,
|
||||||
download_phase,
|
download_phase,
|
||||||
reverify_phase,
|
reverify_phase,
|
||||||
sync_boot_phase,
|
sync_boot_phase,
|
||||||
@@ -369,6 +377,7 @@ async fn maybe_do_update(
|
|||||||
|
|
||||||
struct UpdateProgressHandles {
|
struct UpdateProgressHandles {
|
||||||
progress: FullProgressTracker,
|
progress: FullProgressTracker,
|
||||||
|
prune_phase: PhaseProgressTrackerHandle,
|
||||||
download_phase: PhaseProgressTrackerHandle,
|
download_phase: PhaseProgressTrackerHandle,
|
||||||
reverify_phase: PhaseProgressTrackerHandle,
|
reverify_phase: PhaseProgressTrackerHandle,
|
||||||
sync_boot_phase: PhaseProgressTrackerHandle,
|
sync_boot_phase: PhaseProgressTrackerHandle,
|
||||||
@@ -381,12 +390,20 @@ async fn do_update(
|
|||||||
asset: RegistryAsset<Blake3Commitment>,
|
asset: RegistryAsset<Blake3Commitment>,
|
||||||
UpdateProgressHandles {
|
UpdateProgressHandles {
|
||||||
progress,
|
progress,
|
||||||
|
mut prune_phase,
|
||||||
mut download_phase,
|
mut download_phase,
|
||||||
mut reverify_phase,
|
mut reverify_phase,
|
||||||
mut sync_boot_phase,
|
mut sync_boot_phase,
|
||||||
mut finalize_phase,
|
mut finalize_phase,
|
||||||
}: UpdateProgressHandles,
|
}: UpdateProgressHandles,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
|
prune_phase.start();
|
||||||
|
Command::new("/usr/lib/startos/scripts/prune-images")
|
||||||
|
.arg(asset.commitment.size.to_string())
|
||||||
|
.invoke(ErrorKind::Filesystem)
|
||||||
|
.await?;
|
||||||
|
prune_phase.complete();
|
||||||
|
|
||||||
download_phase.start();
|
download_phase.start();
|
||||||
let path = Path::new("/media/startos/images")
|
let path = Path::new("/media/startos/images")
|
||||||
.join(hex::encode(&asset.commitment.hash[..16]))
|
.join(hex::encode(&asset.commitment.hash[..16]))
|
||||||
@@ -420,6 +437,72 @@ async fn do_update(
|
|||||||
.arg("boot")
|
.arg("boot")
|
||||||
.invoke(crate::ErrorKind::Filesystem)
|
.invoke(crate::ErrorKind::Filesystem)
|
||||||
.await?;
|
.await?;
|
||||||
|
if &*PLATFORM != "raspberrypi" {
|
||||||
|
let mountpoint = "/media/startos/next";
|
||||||
|
let root_guard = OverlayGuard::mount(
|
||||||
|
TmpMountGuard::mount(&BlockDev::new(&path), MountType::ReadOnly).await?,
|
||||||
|
mountpoint,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let startos = MountGuard::mount(
|
||||||
|
&Bind::new("/media/startos/root"),
|
||||||
|
root_guard.path().join("media/startos/root"),
|
||||||
|
MountType::ReadOnly,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let boot_guard = MountGuard::mount(
|
||||||
|
&Bind::new("/boot"),
|
||||||
|
root_guard.path().join("boot"),
|
||||||
|
MountType::ReadWrite,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let dev = MountGuard::mount(
|
||||||
|
&Bind::new("/dev"),
|
||||||
|
root_guard.path().join("dev"),
|
||||||
|
MountType::ReadWrite,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let proc = MountGuard::mount(
|
||||||
|
&Bind::new("/proc"),
|
||||||
|
root_guard.path().join("proc"),
|
||||||
|
MountType::ReadWrite,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let sys = MountGuard::mount(
|
||||||
|
&Bind::new("/sys"),
|
||||||
|
root_guard.path().join("sys"),
|
||||||
|
MountType::ReadWrite,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let efivarfs = if tokio::fs::metadata("/sys/firmware/efi").await.is_ok() {
|
||||||
|
Some(
|
||||||
|
MountGuard::mount(
|
||||||
|
&EfiVarFs,
|
||||||
|
root_guard.path().join("sys/firmware/efi/efivars"),
|
||||||
|
MountType::ReadWrite,
|
||||||
|
)
|
||||||
|
.await?,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
Command::new("chroot")
|
||||||
|
.arg(root_guard.path())
|
||||||
|
.arg("update-grub2")
|
||||||
|
.invoke(ErrorKind::Grub)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
if let Some(efivarfs) = efivarfs {
|
||||||
|
efivarfs.unmount(false).await?;
|
||||||
|
}
|
||||||
|
sys.unmount(false).await?;
|
||||||
|
proc.unmount(false).await?;
|
||||||
|
dev.unmount(false).await?;
|
||||||
|
boot_guard.unmount(false).await?;
|
||||||
|
startos.unmount(false).await?;
|
||||||
|
root_guard.unmount(false).await?;
|
||||||
|
}
|
||||||
sync_boot_phase.complete();
|
sync_boot_phase.complete();
|
||||||
|
|
||||||
finalize_phase.start();
|
finalize_phase.start();
|
||||||
@@ -429,6 +512,7 @@ async fn do_update(
|
|||||||
.arg("/media/startos/config/current.rootfs")
|
.arg("/media/startos/config/current.rootfs")
|
||||||
.invoke(crate::ErrorKind::Filesystem)
|
.invoke(crate::ErrorKind::Filesystem)
|
||||||
.await?;
|
.await?;
|
||||||
|
Command::new("sync").invoke(ErrorKind::Filesystem).await?;
|
||||||
finalize_phase.complete();
|
finalize_phase.complete();
|
||||||
|
|
||||||
progress.complete();
|
progress.complete();
|
||||||
|
|||||||
Reference in New Issue
Block a user