mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-04-04 14:29:45 +00:00
fix: Add in the sub repos
This commit is contained in:
@@ -324,11 +324,11 @@ async fn perform_backup<Db: DbHandle>(
|
|||||||
.await
|
.await
|
||||||
.with_kind(ErrorKind::Filesystem)?;
|
.with_kind(ErrorKind::Filesystem)?;
|
||||||
|
|
||||||
let luks_folder_old = backup_guard.as_ref().join("luks.old");
|
let luks_folder_old = backup_guard.lock().await.as_ref().join("luks.old");
|
||||||
if tokio::fs::metadata(&luks_folder_old).await.is_ok() {
|
if tokio::fs::metadata(&luks_folder_old).await.is_ok() {
|
||||||
tokio::fs::remove_dir_all(&luks_folder_old).await?;
|
tokio::fs::remove_dir_all(&luks_folder_old).await?;
|
||||||
}
|
}
|
||||||
let luks_folder_bak = backup_guard.as_ref().join("luks");
|
let luks_folder_bak = backup_guard.lock().await.as_ref().join("luks");
|
||||||
if tokio::fs::metadata(&luks_folder_bak).await.is_ok() {
|
if tokio::fs::metadata(&luks_folder_bak).await.is_ok() {
|
||||||
tokio::fs::rename(&luks_folder_bak, &luks_folder_old).await?;
|
tokio::fs::rename(&luks_folder_bak, &luks_folder_old).await?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -344,14 +344,22 @@ fn configure(
|
|||||||
.config_actions
|
.config_actions
|
||||||
.get(db, id)
|
.get(db, id)
|
||||||
.await?
|
.await?
|
||||||
.ok_or_else(not_found)?;
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
let dependencies = receipts
|
let dependencies = receipts
|
||||||
.dependencies
|
.dependencies
|
||||||
.get(db, id)
|
.get(db, id)
|
||||||
.await?
|
.await?
|
||||||
.ok_or_else(not_found)?;
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
let volumes = receipts.volumes.get(db, id).await?.ok_or_else(not_found)?;
|
let volumes = receipts
|
||||||
let version = receipts.version.get(db, id).await?.ok_or_else(not_found)?;
|
.volumes
|
||||||
|
.get(db, id)
|
||||||
|
.await?
|
||||||
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
|
let version = receipts
|
||||||
|
.version
|
||||||
|
.get(db, id)
|
||||||
|
.await?
|
||||||
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
|
|
||||||
// get current config and current spec
|
// get current config and current spec
|
||||||
let ConfigRes {
|
let ConfigRes {
|
||||||
@@ -370,7 +378,11 @@ fn configure(
|
|||||||
)?
|
)?
|
||||||
};
|
};
|
||||||
|
|
||||||
let manifest = receipts.manifest.get(db, id).await?.ok_or_else(not_found)?;
|
let manifest = receipts
|
||||||
|
.manifest
|
||||||
|
.get(db, id)
|
||||||
|
.await?
|
||||||
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
|
|
||||||
spec.validate(&manifest)?;
|
spec.validate(&manifest)?;
|
||||||
spec.matches(&config)?; // check that new config matches spec
|
spec.matches(&config)?; // check that new config matches spec
|
||||||
@@ -389,7 +401,7 @@ fn configure(
|
|||||||
.system_pointers
|
.system_pointers
|
||||||
.get(db, id)
|
.get(db, id)
|
||||||
.await?
|
.await?
|
||||||
.ok_or_else(not_found)?;
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
sys.truncate(0);
|
sys.truncate(0);
|
||||||
let mut current_dependencies: CurrentDependencies = CurrentDependencies(
|
let mut current_dependencies: CurrentDependencies = CurrentDependencies(
|
||||||
dependencies
|
dependencies
|
||||||
@@ -498,7 +510,7 @@ fn configure(
|
|||||||
.dependency_errors
|
.dependency_errors
|
||||||
.get(db, &id)
|
.get(db, &id)
|
||||||
.await?
|
.await?
|
||||||
.ok_or_else(not_found)?;
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
tracing::warn!("Dependency Errors: {:?}", errs);
|
tracing::warn!("Dependency Errors: {:?}", errs);
|
||||||
let errs = DependencyErrors::init(
|
let errs = DependencyErrors::init(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -520,7 +532,7 @@ fn configure(
|
|||||||
.current_dependents
|
.current_dependents
|
||||||
.get(db, id)
|
.get(db, id)
|
||||||
.await?
|
.await?
|
||||||
.ok_or_else(not_found)?;
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
for (dependent, _dep_info) in dependents.0.iter().filter(|(dep_id, _)| dep_id != &id) {
|
for (dependent, _dep_info) in dependents.0.iter().filter(|(dep_id, _)| dep_id != &id) {
|
||||||
let dependent_container = receipts.docker_containers.get(db, dependent).await?;
|
let dependent_container = receipts.docker_containers.get(db, dependent).await?;
|
||||||
let dependent_container = &dependent_container;
|
let dependent_container = &dependent_container;
|
||||||
@@ -534,7 +546,7 @@ fn configure(
|
|||||||
.manifest
|
.manifest
|
||||||
.get(db, dependent)
|
.get(db, dependent)
|
||||||
.await?
|
.await?
|
||||||
.ok_or_else(not_found)?;
|
.ok_or_else(|| not_found!(&*id))?;
|
||||||
if let Err(error) = cfg
|
if let Err(error) = cfg
|
||||||
.check(
|
.check(
|
||||||
ctx,
|
ctx,
|
||||||
|
|||||||
@@ -557,7 +557,7 @@ mod tests {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.canonicalize()
|
.canonicalize()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let package_id = "test-package".parse().unwrap();
|
let package_id = "test-package".parse::<PackageId>().unwrap();
|
||||||
let package_version: Version = "0.3.0.3".parse().unwrap();
|
let package_version: Version = "0.3.0.3".parse().unwrap();
|
||||||
let name = ProcedureName::Action("test-rename".parse().unwrap());
|
let name = ProcedureName::Action("test-rename".parse().unwrap());
|
||||||
let volumes: Volumes = serde_json::from_value(json!({
|
let volumes: Volumes = serde_json::from_value(json!({
|
||||||
@@ -608,7 +608,7 @@ mod tests {
|
|||||||
timeout,
|
timeout,
|
||||||
ProcessGroupId(0),
|
ProcessGroupId(0),
|
||||||
None,
|
None,
|
||||||
None,
|
Arc::new(OsApiMock::default()),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@@ -654,7 +654,7 @@ mod tests {
|
|||||||
timeout,
|
timeout,
|
||||||
ProcessGroupId(0),
|
ProcessGroupId(0),
|
||||||
None,
|
None,
|
||||||
None,
|
Arc::new(OsApiMock::default()),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@@ -700,7 +700,7 @@ mod tests {
|
|||||||
timeout,
|
timeout,
|
||||||
ProcessGroupId(0),
|
ProcessGroupId(0),
|
||||||
None,
|
None,
|
||||||
None,
|
Arc::new(OsApiMock::default()),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@@ -746,7 +746,7 @@ mod tests {
|
|||||||
timeout,
|
timeout,
|
||||||
ProcessGroupId(0),
|
ProcessGroupId(0),
|
||||||
None,
|
None,
|
||||||
None,
|
Arc::new(OsApiMock::default()),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@@ -800,52 +800,6 @@ mod tests {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn js_action_test_deep_dir_escape() {
|
|
||||||
let js_action = JsProcedure { args: vec![] };
|
|
||||||
let path: PathBuf = "test/js_action_execute/"
|
|
||||||
.parse::<PathBuf>()
|
|
||||||
.unwrap()
|
|
||||||
.canonicalize()
|
|
||||||
.unwrap();
|
|
||||||
let package_id = "test-package".parse().unwrap();
|
|
||||||
let package_version: Version = "0.3.0.3".parse().unwrap();
|
|
||||||
let name = ProcedureName::Action("test-deep-dir-escape".parse().unwrap());
|
|
||||||
let volumes: Volumes = serde_json::from_value(json!({
|
|
||||||
"main": {
|
|
||||||
"type": "data"
|
|
||||||
},
|
|
||||||
"compat": {
|
|
||||||
"type": "assets"
|
|
||||||
},
|
|
||||||
"filebrowser" :{
|
|
||||||
"package-id": "filebrowser",
|
|
||||||
"path": "data",
|
|
||||||
"readonly": true,
|
|
||||||
"type": "pointer",
|
|
||||||
"volume-id": "main",
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
.unwrap();
|
|
||||||
let input: Option<serde_json::Value> = None;
|
|
||||||
let timeout = Some(Duration::from_secs(10));
|
|
||||||
js_action
|
|
||||||
.execute::<serde_json::Value, serde_json::Value>(
|
|
||||||
&path,
|
|
||||||
&package_id,
|
|
||||||
&package_version,
|
|
||||||
name,
|
|
||||||
&volumes,
|
|
||||||
input,
|
|
||||||
timeout,
|
|
||||||
ProcessGroupId(0),
|
|
||||||
None,
|
|
||||||
Arc::new(OsApiMock::default()),
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.unwrap()
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
#[tokio::test]
|
|
||||||
async fn js_permissions_and_own() {
|
async fn js_permissions_and_own() {
|
||||||
let js_action = JsProcedure { args: vec![] };
|
let js_action = JsProcedure { args: vec![] };
|
||||||
let path: PathBuf = "test/js_action_execute/"
|
let path: PathBuf = "test/js_action_execute/"
|
||||||
@@ -891,52 +845,6 @@ mod tests {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
#[tokio::test]
|
|
||||||
async fn js_action_test_zero_dir() {
|
|
||||||
let js_action = JsProcedure { args: vec![] };
|
|
||||||
let path: PathBuf = "test/js_action_execute/"
|
|
||||||
.parse::<PathBuf>()
|
|
||||||
.unwrap()
|
|
||||||
.canonicalize()
|
|
||||||
.unwrap();
|
|
||||||
let package_id = "test-package".parse().unwrap();
|
|
||||||
let package_version: Version = "0.3.0.3".parse().unwrap();
|
|
||||||
let name = ProcedureName::Action("test-zero-dir".parse().unwrap());
|
|
||||||
let volumes: Volumes = serde_json::from_value(json!({
|
|
||||||
"main": {
|
|
||||||
"type": "data"
|
|
||||||
},
|
|
||||||
"compat": {
|
|
||||||
"type": "assets"
|
|
||||||
},
|
|
||||||
"filebrowser" :{
|
|
||||||
"package-id": "filebrowser",
|
|
||||||
"path": "data",
|
|
||||||
"readonly": true,
|
|
||||||
"type": "pointer",
|
|
||||||
"volume-id": "main",
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
.unwrap();
|
|
||||||
let input: Option<serde_json::Value> = None;
|
|
||||||
let timeout = Some(Duration::from_secs(10));
|
|
||||||
js_action
|
|
||||||
.execute::<serde_json::Value, serde_json::Value>(
|
|
||||||
&path,
|
|
||||||
&package_id,
|
|
||||||
&package_version,
|
|
||||||
name,
|
|
||||||
&volumes,
|
|
||||||
input,
|
|
||||||
timeout,
|
|
||||||
ProcessGroupId(0),
|
|
||||||
None,
|
|
||||||
Arc::new(OsApiMock::default()),
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.unwrap()
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn js_rsync() {
|
async fn js_rsync() {
|
||||||
@@ -1048,50 +956,51 @@ mod tests {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
spawned.await.unwrap();
|
spawned.await.unwrap();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn js_disk_usage() {
|
async fn js_disk_usage() {
|
||||||
let js_action = JsProcedure { args: vec![] };
|
let js_action = JsProcedure { args: vec![] };
|
||||||
let path: PathBuf = "test/js_action_execute/"
|
let path: PathBuf = "test/js_action_execute/"
|
||||||
.parse::<PathBuf>()
|
.parse::<PathBuf>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.canonicalize()
|
.canonicalize()
|
||||||
|
.unwrap();
|
||||||
|
let package_id = "test-package".parse().unwrap();
|
||||||
|
let package_version: Version = "0.3.0.3".parse().unwrap();
|
||||||
|
let name = ProcedureName::Action("test-disk-usage".parse().unwrap());
|
||||||
|
let volumes: Volumes = serde_json::from_value(serde_json::json!({
|
||||||
|
"main": {
|
||||||
|
"type": "data"
|
||||||
|
},
|
||||||
|
"compat": {
|
||||||
|
"type": "assets"
|
||||||
|
},
|
||||||
|
"filebrowser" :{
|
||||||
|
"package-id": "filebrowser",
|
||||||
|
"path": "data",
|
||||||
|
"readonly": true,
|
||||||
|
"type": "pointer",
|
||||||
|
"volume-id": "main",
|
||||||
|
}
|
||||||
|
}))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let package_id = "test-package".parse().unwrap();
|
let input: Option<serde_json::Value> = None;
|
||||||
let package_version: Version = "0.3.0.3".parse().unwrap();
|
let timeout = Some(Duration::from_secs(10));
|
||||||
let name = ProcedureName::Action("test-disk-usage".parse().unwrap());
|
dbg!(js_action
|
||||||
let volumes: Volumes = serde_json::from_value(serde_json::json!({
|
.execute::<serde_json::Value, serde_json::Value>(
|
||||||
"main": {
|
&path,
|
||||||
"type": "data"
|
&package_id,
|
||||||
},
|
&package_version,
|
||||||
"compat": {
|
name,
|
||||||
"type": "assets"
|
&volumes,
|
||||||
},
|
input,
|
||||||
"filebrowser" :{
|
timeout,
|
||||||
"package-id": "filebrowser",
|
ProcessGroupId(0),
|
||||||
"path": "data",
|
None,
|
||||||
"readonly": true,
|
Arc::new(OsApiMock::default()),
|
||||||
"type": "pointer",
|
)
|
||||||
"volume-id": "main",
|
.await
|
||||||
}
|
.unwrap()
|
||||||
}))
|
.unwrap());
|
||||||
.unwrap();
|
}
|
||||||
let input: Option<serde_json::Value> = None;
|
|
||||||
let timeout = Some(Duration::from_secs(10));
|
|
||||||
dbg!(js_action
|
|
||||||
.execute::<serde_json::Value, serde_json::Value>(
|
|
||||||
&path,
|
|
||||||
&package_id,
|
|
||||||
&package_version,
|
|
||||||
name,
|
|
||||||
&volumes,
|
|
||||||
input,
|
|
||||||
timeout,
|
|
||||||
ProcessGroupId(0),
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.unwrap()
|
|
||||||
.unwrap());
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -247,22 +247,18 @@ mod tests {
|
|||||||
|
|
||||||
fn versions() -> impl Strategy<Value = Version> {
|
fn versions() -> impl Strategy<Value = Version> {
|
||||||
prop_oneof![
|
prop_oneof![
|
||||||
<<<<<<< HEAD
|
em_version().prop_map(|v| if v < v0_3_4_3::Version::new().semver() {
|
||||||
Just(Version::V0_3_4_3(Wrapper(v0_3_4_3::Version::new()))),
|
Version::LT0_3_4_3(LTWrapper(v0_3_4_3::Version::new(), v))
|
||||||
=======
|
} else {
|
||||||
em_version().prop_map(|v| if v < v0_3_4_1::Version::new().semver() {
|
Version::LT0_3_4_3(LTWrapper(
|
||||||
Version::LT0_3_4_1(LTWrapper(v0_3_4_1::Version::new(), v))
|
v0_3_4_3::Version::new(),
|
||||||
} else {
|
emver::Version::new(0, 3, 0, 0),
|
||||||
Version::LT0_3_4_1(LTWrapper(
|
))
|
||||||
v0_3_4_1::Version::new(),
|
}),
|
||||||
emver::Version::new(0, 3, 0, 0),
|
Just(Version::V0_3_4_3(Wrapper(v0_3_4_3::Version::new()))),
|
||||||
))
|
Just(Version::V0_4_0(Wrapper(v0_4_0::Version::new()))),
|
||||||
}),
|
em_version().prop_map(Version::Other),
|
||||||
Just(Version::V0_3_4_1(Wrapper(v0_3_4_1::Version::new()))),
|
]
|
||||||
Just(Version::V0_3_4_2(Wrapper(v0_3_4_2::Version::new()))),
|
|
||||||
>>>>>>> e83250f1 (integration/refactors)
|
|
||||||
em_version().prop_map(Version::Other),
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
proptest! {
|
proptest! {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use emver::VersionRange;
|
use emver::VersionRange;
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ pub struct Version;
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl VersionT for Version {
|
impl VersionT for Version {
|
||||||
type Previous = v0_3_4_2::Version;
|
type Previous = Self;
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Version
|
Version
|
||||||
}
|
}
|
||||||
@@ -30,12 +31,6 @@ impl VersionT for Version {
|
|||||||
&*V0_3_0_COMPAT
|
&*V0_3_0_COMPAT
|
||||||
}
|
}
|
||||||
async fn up<Db: DbHandle>(&self, db: &mut Db, _secrets: &PgPool) -> Result<(), Error> {
|
async fn up<Db: DbHandle>(&self, db: &mut Db, _secrets: &PgPool) -> Result<(), Error> {
|
||||||
crate::db::DatabaseModel::new()
|
|
||||||
.server_info()
|
|
||||||
.get_mut(db)
|
|
||||||
.await?
|
|
||||||
.save(db)
|
|
||||||
.await?;
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
async fn down<Db: DbHandle>(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> {
|
async fn down<Db: DbHandle>(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ pub struct Version;
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl VersionT for Version {
|
impl VersionT for Version {
|
||||||
type Previous = v0_3_4::Version;
|
type Previous = v0_3_4_3::Version;
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Version
|
Version
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -212,24 +212,3 @@ impl RpcMethod for SignalGroup {
|
|||||||
"signal-group"
|
"signal-group"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn example_echo_line() {
|
|
||||||
let input = r#"{"id":0,"jsonrpc":"2.0","method":"command","params":{"command":"echo","args":["world I am here"]}}"#;
|
|
||||||
let new_input = JsonRpc::<Input>::maybe_parse(input);
|
|
||||||
assert!(new_input.is_some());
|
|
||||||
assert_eq!(input, &serde_json::to_string(&new_input.unwrap()).unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn example_input_line() {
|
|
||||||
let output = JsonRpc::new(RpcId::UInt(0), Output::Line("world I am here".to_string()));
|
|
||||||
let output_str = output.maybe_serialize();
|
|
||||||
assert!(output_str.is_some());
|
|
||||||
let output_str = output_str.unwrap();
|
|
||||||
assert_eq!(
|
|
||||||
&output_str,
|
|
||||||
r#"{"id":0,"jsonrpc":"2.0","method":"line","params":"world I am here"}"#
|
|
||||||
);
|
|
||||||
assert_eq!(output, serde_json::from_str(&output_str).unwrap());
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user