mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-26 02:11:53 +00:00
* retry file copies during migration up to 10x * fix build * readonly mounts, and validation on v2 recovery * banish booleans
51 lines
1.3 KiB
Rust
51 lines
1.3 KiB
Rust
use std::path::Path;
|
|
|
|
use async_trait::async_trait;
|
|
use digest::generic_array::GenericArray;
|
|
use digest::Digest;
|
|
use sha2::Sha256;
|
|
|
|
use super::{FileSystem, MountType, ReadOnly};
|
|
use crate::util::Invoke;
|
|
use crate::Error;
|
|
|
|
pub async fn mount_label(
|
|
label: &str,
|
|
mountpoint: impl AsRef<Path>,
|
|
mount_type: MountType,
|
|
) -> Result<(), Error> {
|
|
tokio::fs::create_dir_all(mountpoint.as_ref()).await?;
|
|
let mut cmd = tokio::process::Command::new("mount");
|
|
cmd.arg("-L").arg(label).arg(mountpoint.as_ref());
|
|
if mount_type == ReadOnly {
|
|
cmd.arg("-o").arg("ro");
|
|
}
|
|
cmd.invoke(crate::ErrorKind::Filesystem).await?;
|
|
Ok(())
|
|
}
|
|
|
|
pub struct Label<S: AsRef<str>> {
|
|
label: S,
|
|
}
|
|
impl<S: AsRef<str>> Label<S> {
|
|
pub fn new(label: S) -> Self {
|
|
Label { label }
|
|
}
|
|
}
|
|
#[async_trait]
|
|
impl<S: AsRef<str> + Send + Sync> FileSystem for Label<S> {
|
|
async fn mount<P: AsRef<Path> + Send + Sync>(
|
|
&self,
|
|
mountpoint: P,
|
|
mount_type: MountType,
|
|
) -> Result<(), Error> {
|
|
mount_label(self.label.as_ref(), mountpoint, mount_type).await
|
|
}
|
|
async fn source_hash(&self) -> Result<GenericArray<u8, <Sha256 as Digest>::OutputSize>, Error> {
|
|
let mut sha = Sha256::new();
|
|
sha.update("Label");
|
|
sha.update(self.label.as_ref().as_bytes());
|
|
Ok(sha.finalize())
|
|
}
|
|
}
|