From 2022a7fc1dd924595c4f6ff95f02674299d877a8 Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Thu, 14 Jan 2021 15:00:17 -0700 Subject: [PATCH] appmgr: backup restore metadata --- appmgr/src/backup.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/appmgr/src/backup.rs b/appmgr/src/backup.rs index da6e0380e..bb100d228 100644 --- a/appmgr/src/backup.rs +++ b/appmgr/src/backup.rs @@ -1,15 +1,24 @@ use std::path::Path; use argonautica::{Hasher, Verifier}; +use emver::Version; use futures::try_join; use futures::TryStreamExt; +use serde::Serialize; -use crate::apps; use crate::util::from_yaml_async_reader; +use crate::util::to_yaml_async_writer; use crate::util::Invoke; +use crate::version::VersionT; use crate::Error; use crate::ResultExt; +#[derive(Debug, Clone, Serialize)] +pub struct Metadata { + pub app_version: Version, + pub os_version: &'static Version, +} + pub async fn create_backup>( path: P, app_id: &str, @@ -21,6 +30,7 @@ pub async fn create_backup>( crate::error::FILESYSTEM_ERROR, "Backup Path Must Be Directory" ); + let metadata_path = path.join("metadata.yaml"); let pw_path = path.join("password"); let data_path = path.join("data"); let tor_path = path.join("tor"); @@ -56,6 +66,16 @@ pub async fn create_backup>( f.flush().await?; } + let info = crate::apps::info(app_id).await?; + to_yaml_async_writer( + tokio::fs::File::create(metadata_path).await?, + &Metadata { + app_version: info.version, + os_version: crate::version::Current::new().semver(), + }, + ) + .await?; + let status = crate::apps::status(app_id, false).await?; let exclude = if volume_path.is_dir() { let ignore_path = volume_path.join(".backupignore"); @@ -124,6 +144,7 @@ pub async fn restore_backup>( crate::error::FILESYSTEM_ERROR, "Backup Path Must Be Directory" ); + let metadata_path = path.join("metadata.yaml"); let pw_path = path.join("password"); let data_path = path.join("data"); let tor_path = path.join("tor"); @@ -181,12 +202,21 @@ pub async fn restore_backup>( ); // Fix the tor address in apps.yaml - let mut yhdl = apps::list_info_mut().await?; + let mut yhdl = crate::apps::list_info_mut().await?; if let Some(app_info) = yhdl.get_mut(app_id) { app_info.tor_address = Some(crate::tor::read_tor_address(app_id, None).await?); } yhdl.commit().await?; + tokio::fs::copy( + metadata_path, + Path::new(crate::VOLUMES) + .join(app_id) + .join("start9") + .join("restore.yaml"), + ) + .await?; + // Attempt to configure the service with the config coming from restoration let cfg_path = Path::new(crate::VOLUMES) .join(app_id)